mirror of
https://github.com/kepler155c/opus
synced 2024-11-15 13:14:49 +00:00
106 lines
2.6 KiB
Lua
106 lines
2.6 KiB
Lua
local Event = require('event')
|
|
local Logger = require('logger')
|
|
|
|
local Message = { }
|
|
|
|
local messageHandlers = {}
|
|
|
|
function Message.enable()
|
|
if not device.wireless_modem.isOpen(os.getComputerID()) then
|
|
device.wireless_modem.open(os.getComputerID())
|
|
end
|
|
if not device.wireless_modem.isOpen(60000) then
|
|
device.wireless_modem.open(60000)
|
|
end
|
|
end
|
|
|
|
if device and device.wireless_modem then
|
|
Message.enable()
|
|
end
|
|
|
|
Event.addHandler('device_attach', function(event, deviceName)
|
|
if deviceName == 'wireless_modem' then
|
|
Message.enable()
|
|
end
|
|
end)
|
|
|
|
function Message.addHandler(type, f)
|
|
table.insert(messageHandlers, {
|
|
type = type,
|
|
f = f,
|
|
enabled = true
|
|
})
|
|
end
|
|
|
|
function Message.removeHandler(h)
|
|
for k,v in pairs(messageHandlers) do
|
|
if v == h then
|
|
messageHandlers[k] = nil
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
Event.addHandler('modem_message',
|
|
function(event, side, sendChannel, replyChannel, msg, distance)
|
|
if msg and msg.type then -- filter out messages from other systems
|
|
local id = replyChannel
|
|
Logger.log('modem_receive', { id, msg.type })
|
|
--Logger.log('modem_receive', msg.contents)
|
|
for k,h in pairs(messageHandlers) do
|
|
if h.type == msg.type then
|
|
-- should provide msg.contents instead of message - type is already known
|
|
h.f(h, id, msg, distance)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
)
|
|
|
|
function Message.send(id, msgType, contents)
|
|
if not device.wireless_modem then
|
|
error('No modem attached', 2)
|
|
end
|
|
|
|
if id then
|
|
Logger.log('modem_send', { tostring(id), msgType })
|
|
device.wireless_modem.transmit(id, os.getComputerID(), {
|
|
type = msgType, contents = contents
|
|
})
|
|
else
|
|
Logger.log('modem_send', { 'broadcast', msgType })
|
|
device.wireless_modem.transmit(60000, os.getComputerID(), {
|
|
type = msgType, contents = contents
|
|
})
|
|
end
|
|
end
|
|
|
|
function Message.broadcast(t, contents)
|
|
if not device.wireless_modem then
|
|
error('No modem attached', 2)
|
|
end
|
|
|
|
Message.send(nil, t, contents)
|
|
-- Logger.log('rednet_send', { 'broadcast', t })
|
|
-- rednet.broadcast({ type = t, contents = contents })
|
|
end
|
|
|
|
function Message.waitForMessage(msgType, timeout, fromId)
|
|
local timerId = os.startTimer(timeout)
|
|
repeat
|
|
local e, side, _id, id, msg, distance = os.pullEvent()
|
|
if e == 'modem_message' then
|
|
if msg and msg.type and msg.type == msgType then
|
|
if not fromId or id == fromId then
|
|
return e, id, msg, distance
|
|
end
|
|
end
|
|
end
|
|
until e == 'timer' and side == timerId
|
|
end
|
|
|
|
function Message.enableWirelessLogging()
|
|
Logger.setWirelessLogging()
|
|
end
|
|
|
|
return Message |