mirror of
https://github.com/kepler155c/opus
synced 2025-01-12 08:40:26 +00:00
peripheral overhaul
This commit is contained in:
parent
911fec9118
commit
13ec8ea04f
@ -92,8 +92,8 @@ function Peripheral.get(args)
|
|||||||
args = { type = args }
|
args = { type = args }
|
||||||
end
|
end
|
||||||
|
|
||||||
if args.device then
|
if args.name then
|
||||||
return _G.device[args.device]
|
return _G.device[args.name]
|
||||||
end
|
end
|
||||||
|
|
||||||
if args.type then
|
if args.type then
|
||||||
@ -157,7 +157,9 @@ local function getProxy(pi)
|
|||||||
if not queue then
|
if not queue then
|
||||||
queue = { }
|
queue = { }
|
||||||
Event.onTimeout(0, function()
|
Event.onTimeout(0, function()
|
||||||
socket:write({ fn = 'fastBlit', args = { queue } })
|
if not socket:write({ fn = 'fastBlit', args = { queue } }) then
|
||||||
|
error("Timed out communicating with peripheral: " .. pi.uri)
|
||||||
|
end
|
||||||
queue = nil
|
queue = nil
|
||||||
socket:read()
|
socket:read()
|
||||||
end)
|
end)
|
||||||
@ -192,26 +194,26 @@ end
|
|||||||
Parse a uri into it's components
|
Parse a uri into it's components
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
monitor = { device = 'monitor' }
|
monitor = { name = 'monitor' }
|
||||||
side/top = { side = 'top' }
|
side/top = { side = 'top' }
|
||||||
method/list = { method = 'list' }
|
method/list = { method = 'list' }
|
||||||
12://device/monitor = { host = 12, device = 'monitor' }
|
12://name/monitor = { host = 12, name = 'monitor' }
|
||||||
]]--
|
]]--
|
||||||
local function parse(uri)
|
local function parse(uri)
|
||||||
local pi = Util.split(uri:gsub('^%d*://', ''), '(.-)/')
|
local pi = Util.split(uri:gsub('^%d*://', ''), '(.-)/')
|
||||||
|
|
||||||
if #pi == 1 then
|
if #pi == 1 then
|
||||||
pi = {
|
pi = {
|
||||||
'device',
|
'name',
|
||||||
pi[1],
|
pi[1],
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
host = uri:match('^(%d*)%:'), -- 12
|
host = uri:match('^(%d*)%:'), -- 12
|
||||||
uri = uri, -- 12://device/monitor
|
uri = uri, -- 12://name/monitor
|
||||||
path = uri:gsub('^%d*://', ''), -- device/monitor
|
path = uri:gsub('^%d*://', ''), -- name/monitor
|
||||||
[ pi[1] ] = pi[2], -- device = 'monitor'
|
[ pi[1] ] = pi[2], -- name = 'monitor'
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@ function socketClass:read(timeout)
|
|||||||
break
|
break
|
||||||
end
|
end
|
||||||
timerId = os.startTimer(5)
|
timerId = os.startTimer(5)
|
||||||
|
self:ping()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -54,10 +55,7 @@ end
|
|||||||
|
|
||||||
function socketClass:ping()
|
function socketClass:ping()
|
||||||
if self.connected then
|
if self.connected then
|
||||||
_G.transport.write(self, {
|
_G.transport.ping(self)
|
||||||
type = 'PING',
|
|
||||||
seq = self.wseq,
|
|
||||||
})
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -149,8 +149,8 @@ function Terminal.mirror(ct, dt)
|
|||||||
ct[k] = function(...)
|
ct[k] = function(...)
|
||||||
local ret = { f(...) }
|
local ret = { f(...) }
|
||||||
if dt[k] then
|
if dt[k] then
|
||||||
dt[k](...)
|
dt[k](...)
|
||||||
end
|
end
|
||||||
return unpack(ret)
|
return unpack(ret)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1600,7 +1600,9 @@ function UI.Grid:setPage(pageNo)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function UI.Grid:eventHandler(event)
|
function UI.Grid:eventHandler(event)
|
||||||
if event.type == 'mouse_click' or event.type == 'mouse_doubleclick' then
|
if event.type == 'mouse_click' or
|
||||||
|
event.type == 'mouse_rightclick' or
|
||||||
|
event.type == 'mouse_doubleclick' then
|
||||||
if not self.disableHeader then
|
if not self.disableHeader then
|
||||||
if event.y == 1 then
|
if event.y == 1 then
|
||||||
local col = 2
|
local col = 2
|
||||||
@ -1628,6 +1630,8 @@ function UI.Grid:eventHandler(event)
|
|||||||
self:setIndex(row)
|
self:setIndex(row)
|
||||||
if event.type == 'mouse_doubleclick' then
|
if event.type == 'mouse_doubleclick' then
|
||||||
self:emit({ type = 'key_enter' })
|
self:emit({ type = 'key_enter' })
|
||||||
|
elseif event.type == 'mouse_rightclick' then
|
||||||
|
self:emit({ type = 'grid_select_right', selected = self.selected, element = self })
|
||||||
end
|
end
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
@ -6,3 +6,6 @@ _G.device = Peripheral.getList()
|
|||||||
|
|
||||||
-- register the main term in the devices list
|
-- register the main term in the devices list
|
||||||
_G.device.terminal = _G.term.current()
|
_G.device.terminal = _G.term.current()
|
||||||
|
_G.device.terminal.side = 'terminal'
|
||||||
|
_G.device.terminal.type = 'terminal'
|
||||||
|
_G.device.terminal.name = 'terminal'
|
||||||
|
@ -8,8 +8,8 @@ local Socket = require('socket')
|
|||||||
local Util = require('util')
|
local Util = require('util')
|
||||||
|
|
||||||
Event.addRoutine(function()
|
Event.addRoutine(function()
|
||||||
|
print('peripheral: listening on port 189')
|
||||||
while true do
|
while true do
|
||||||
print('peripheral: listening on port 189')
|
|
||||||
local socket = Socket.server(189)
|
local socket = Socket.server(189)
|
||||||
|
|
||||||
print('peripheral: connection from ' .. socket.dhost)
|
print('peripheral: connection from ' .. socket.dhost)
|
||||||
@ -19,7 +19,9 @@ Event.addRoutine(function()
|
|||||||
if uri then
|
if uri then
|
||||||
local peripheral = Peripheral.lookup(uri)
|
local peripheral = Peripheral.lookup(uri)
|
||||||
|
|
||||||
if peripheral then
|
if not peripheral then
|
||||||
|
print('peripheral: invalid peripheral ' .. uri)
|
||||||
|
else
|
||||||
print('peripheral: proxing ' .. uri)
|
print('peripheral: proxing ' .. uri)
|
||||||
local proxy = {
|
local proxy = {
|
||||||
methods = { }
|
methods = { }
|
||||||
|
@ -31,11 +31,10 @@ function transport.read(socket)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function transport.write(socket, data)
|
function transport.write(socket, data)
|
||||||
|
|
||||||
--debug('>> ' .. Util.tostring({ type = 'DATA', seq = socket.wseq }))
|
--debug('>> ' .. Util.tostring({ type = 'DATA', seq = socket.wseq }))
|
||||||
socket.transmit(socket.dport, socket.dhost, data)
|
socket.transmit(socket.dport, socket.dhost, data)
|
||||||
|
|
||||||
local timerId = os.startTimer(2)
|
local timerId = os.startTimer(3)
|
||||||
|
|
||||||
transport.timers[timerId] = socket
|
transport.timers[timerId] = socket
|
||||||
socket.timers[socket.wseq] = timerId
|
socket.timers[socket.wseq] = timerId
|
||||||
@ -43,6 +42,18 @@ function transport.write(socket, data)
|
|||||||
socket.wseq = socket.wseq + 1
|
socket.wseq = socket.wseq + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function transport.ping(socket)
|
||||||
|
--debug('>> ' .. Util.tostring({ type = 'DATA', seq = socket.wseq }))
|
||||||
|
socket.transmit(socket.dport, socket.dhost, {
|
||||||
|
type = 'PING',
|
||||||
|
seq = -1,
|
||||||
|
})
|
||||||
|
|
||||||
|
local timerId = os.startTimer(3)
|
||||||
|
transport.timers[timerId] = socket
|
||||||
|
socket.timers[-1] = timerId
|
||||||
|
end
|
||||||
|
|
||||||
function transport.close(socket)
|
function transport.close(socket)
|
||||||
transport.sockets[socket.sport] = nil
|
transport.sockets[socket.sport] = nil
|
||||||
end
|
end
|
||||||
@ -54,6 +65,7 @@ while true do
|
|||||||
|
|
||||||
if e == 'timer' then
|
if e == 'timer' then
|
||||||
local socket = transport.timers[timerId]
|
local socket = transport.timers[timerId]
|
||||||
|
|
||||||
if socket and socket.connected then
|
if socket and socket.connected then
|
||||||
print('transport timeout - closing socket ' .. socket.sport)
|
print('transport timeout - closing socket ' .. socket.sport)
|
||||||
socket:close()
|
socket:close()
|
||||||
@ -72,11 +84,12 @@ while true do
|
|||||||
socket:close()
|
socket:close()
|
||||||
|
|
||||||
elseif msg.type == 'ACK' then
|
elseif msg.type == 'ACK' then
|
||||||
local timerId = socket.timers[msg.seq]
|
local ackTimerId = socket.timers[msg.seq]
|
||||||
|
if ackTimerId then
|
||||||
os.cancelTimer(timerId)
|
os.cancelTimer(ackTimerId)
|
||||||
socket.timers[msg.seq] = nil
|
socket.timers[msg.seq] = nil
|
||||||
transport.timers[timerId] = nil
|
transport.timers[ackTimerId] = nil
|
||||||
|
end
|
||||||
|
|
||||||
elseif msg.type == 'PING' then
|
elseif msg.type == 'PING' then
|
||||||
socket.transmit(socket.dport, socket.dhost, {
|
socket.transmit(socket.dport, socket.dhost, {
|
||||||
|
Loading…
Reference in New Issue
Block a user