Move pulling into network

Signed-off-by: Rahix <rahix@rahix.de>
dev
rahix 7 years ago
parent 0eed392d6e
commit 3b290e6853

@ -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

@ -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

Loading…
Cancel
Save