Move pulling into network

Signed-off-by: Rahix <rahix@rahix.de>
This commit is contained in:
rahix 2019-04-16 01:55:32 +02:00
parent 0eed392d6e
commit 3b290e6853
2 changed files with 57 additions and 33 deletions

View file

@ -2,9 +2,7 @@ local network = require("network")
local component = require("component") local component = require("component")
local event = {} local event = {}
local addr_num = 0 local addr_num = 0
local last_msg = nil
function event.listen(event, callback) function event.listen(event, callback)
if event ~= "modem_message" then if event ~= "modem_message" then
@ -12,18 +10,10 @@ function event.listen(event, callback)
end end
addr = "A"..addr_num addr = "A"..addr_num
addr_num = addr_num + 1 addr_num = addr_num + 1
function ev_callback(ev, addr1, addr2, port, dist, msg) function ev_callback(ev, local_addr, ...)
last_msg = {
ev=ev,
addr1=addr1,
addr2=addr2,
port=port,
dist=dist,
msg=msg,
}
-- Inject local address so the check passes -- Inject local address so the check passes
component.modem.address = addr1 component.modem.address = local_addr
callback(ev, addr1, addr2, port, dist, msg) callback(ev, local_addr, ...)
end end
network.register(addr, ev_callback) network.register(addr, ev_callback)
end end
@ -35,27 +25,14 @@ function event.ignore(event, callback)
network.deregister(network.get_scene()) network.deregister(network.get_scene())
end end
function event.pull(event)
-- Just return the last message and hope it is the
-- right one ...
if last_msg == nil then
return nil
end
local lmsg = last_msg
last_msg = nil
return lmsg.ev, lmsg.addr1, lmsg.addr2, lmsg.port, lmsg.dist, lmsg.msg
end
function event.pullFiltered(timeout, filter) function event.pullFiltered(timeout, filter)
if last_msg == nil then while true do
return nil local msg = table.pack(network.pull())
end if msg == nil then
local lmsg = last_msg return nil
last_msg = nil elseif filter(table.unpack(msg)) then
if filter(lmsg.ev, lmsg.addr1, lmsg.addr2, lmsg.port, lmsg.dist, lmsg.msg) then return table.unpack(msg)
return lmsg.ev, lmsg.addr1, lmsg.addr2, lmsg.port, lmsg.dist, lmsg.msg end
else
return nil
end end
end end

View file

@ -4,6 +4,8 @@ local network = {
local nodes = {} local nodes = {}
local active_node = {} local active_node = {}
local latest_message = {}
local inject_message = {}
function network.register(addr, callback) function network.register(addr, callback)
if nodes[addr] ~= nil then if nodes[addr] ~= nil then
@ -31,9 +33,16 @@ function network.send(addr, port, msg)
local current_node = active_node[#active_node] local current_node = active_node[#active_node]
-- Push target onto node-stack -- Push target onto node-stack
table.insert(active_node, addr) table.insert(active_node, addr)
-- print("Sending from "..current_node.." to "..addr..": "..msg) -- print("Sending from "..current_node.." to "..addr..": "..msg)
-- print(require("inspect").inspect(active_node)) -- print(require("inspect").inspect(active_node))
latest_message[addr] = {
from=current_node,
port=port,
msg=msg,
}
callback("modem_message", addr, current_node, port, 0, msg) callback("modem_message", addr, current_node, port, 0, msg)
-- Remove again -- Remove again
active_node[#active_node] = nil active_node[#active_node] = nil
end end
@ -48,6 +57,33 @@ function network.broadcast(port, msg)
end end
end end
function network.pull()
local current_node = active_node[#active_node]
if inject_message[current_node] ~= nil and #inject_message[current_node] > 0 then
local message = inject_message[current_node][1]
table.remove(inject_message[current_node], 1)
-- print("pulled "..require("serialization").serialize(message))
-- Actually send the injected message now
table.insert(active_node, message.from)
network.send(current_node, message.port, message.msg)
active_node[#active_node] = nil
return "modem_message", current_node, message.from, message.port, 0, message.msg
end
if latest_message[current_node] == nil then
error("Tried to pull while no message was available")
end
local message = latest_message[current_node]
-- Delete message
latest_message[current_node] = nil
return "modem_message", current_node, message.from, message.port, 0, message.msg
end
function network.set_scene(addr) function network.set_scene(addr)
active_node = {} active_node = {}
table.insert(active_node, addr) table.insert(active_node, addr)
@ -57,4 +93,15 @@ function network.get_scene(addr)
return active_node[#active_node] return active_node[#active_node]
end end
function network.inject(addr, from, port, msg)
if inject_message[addr] == nil then
inject_message[addr] = {}
end
table.insert(inject_message[addr], {
from=from,
port=port,
msg=msg,
})
end
return network return network