Move pulling into network
Signed-off-by: Rahix <rahix@rahix.de>
This commit is contained in:
parent
0eed392d6e
commit
3b290e6853
2 changed files with 57 additions and 33 deletions
43
event.lua
43
event.lua
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
47
network.lua
47
network.lua
|
|
@ -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…
Add table
Add a link
Reference in a new issue