opus/sys/network/peripheral.lua

71 lines
1.8 KiB
Lua

--[[
Allow sharing of local peripherals.
]]--
local Event = require('event')
local Peripheral = require('peripheral')
local Socket = require('socket')
local Util = require('util')
Event.addRoutine(function()
print('peripheral: listening on port 189')
while true do
local socket = Socket.server(189)
print('peripheral: connection from ' .. socket.dhost)
Event.addRoutine(function()
local uri = socket:read(2)
if uri then
local peripheral = Peripheral.lookup(uri)
if not peripheral then
print('peripheral: invalid peripheral ' .. uri)
else
print('peripheral: proxing ' .. uri)
local proxy = {
methods = { }
}
if peripheral.blit then
peripheral = Util.shallowCopy(peripheral)
peripheral.fastBlit = function(data)
for _,v in ipairs(data) do
peripheral[v.fn](unpack(v.args))
end
end
end
for k,v in pairs(peripheral) do
if type(v) == 'function' then
table.insert(proxy.methods, k)
else
proxy[k] = v
end
end
socket:write(proxy)
if proxy.type == 'monitor' then
local h
h = Event.on('monitor_touch', function(...)
if not socket:write({ ... }) then
Event.off(h)
end
end)
end
while true do
local data = socket:read()
if not data then
print('peripheral: lost connection from ' .. socket.dhost)
break
end
socket:write({ peripheral[data.fn](table.unpack(data.args)) })
end
end
end
end)
end
end)