Signed-off-by: Rahix <rahix@rahix.de>
dev
rahix 7 years ago
parent c3ce5b0ac8
commit 3c4920489a
Signed by: rahix
GPG Key ID: E3435E19257D6FCB

@ -59,26 +59,30 @@ local CFG_PORT = 1234
local bc = {} local bc = {}
function bc:init(local_nouns, local_verbs) function bc:init(local_nouns, local_verbs)
local local_nouns = local_nouns or {} local o = {
local local_verbs = local_verbs or {} local_nouns = local_nouns or {},
local o = {} local_verbs = local_verbs or {},
remote_verbs = {},
remote_nouns = {},
local_listeners = {},
remote_listeners = {},
listening_remotes = {},
}
setmetatable(o, self) setmetatable(o, self)
self.__index = self self.__index = self
o.remote_verbs = {}
o.remote_nouns = {}
o.local_listeners = {}
o.remote_listeners = {}
o.listening_remotes = {}
-- Modem listener -- Modem listener
function modem_listener(moden_msg, localAddress, remoteAddress, port, dist, message) function modem_listener(moden_msg, localAddress, remoteAddress, port, dist, message)
local message = serializer.unserialize(message) local message = serializer.unserialize(message)
if port == CFG_PORT then if port == CFG_PORT then
if message.ty == message_type.request_noun then if message.ty == message_type.request_noun then
local msg = {ty=message_type.noun_response, modem.send(remoteAddress, port, serializer.serialize({
ty=message_type.noun_response,
noun=message.noun, noun=message.noun,
value=o.local_nouns[message.noun] value=o.local_nouns[message.noun],
} }))
modem.send(remoteAddress, port, serializer.serialize(msg))
elseif message.ty == message_type.noun_response then elseif message.ty == message_type.noun_response then
-- Ignore, this is handled via pull -- Ignore, this is handled via pull
elseif message.ty == message_type.call_verb then elseif message.ty == message_type.call_verb then
@ -87,6 +91,7 @@ function bc:init(local_nouns, local_verbs)
for i,verb in ipairs(message.verbs) do for i,verb in ipairs(message.verbs) do
o.remote_verbs[verb] = remoteAddress o.remote_verbs[verb] = remoteAddress
end end
for i,noun in ipairs(message.nouns) do for i,noun in ipairs(message.nouns) do
o.remote_nouns[noun] = remoteAddress o.remote_nouns[noun] = remoteAddress
-- Check for potential dormant listeners -- Check for potential dormant listeners
@ -111,7 +116,12 @@ function bc:init(local_nouns, local_verbs)
for verb in pairs(o.local_verbs) do for verb in pairs(o.local_verbs) do
table.insert(myverbs, verb) table.insert(myverbs, verb)
end end
modem.send(remoteAddress, port, serializer.serialize({ty=message_type.hello_response, verbs=myverbs, nouns=mynouns}))
modem.send(remoteAddress, port, serializer.serialize({
ty=message_type.hello_response,
verbs=myverbs,
nouns=mynouns,
}))
elseif message.ty == message_type.hello_response then elseif message.ty == message_type.hello_response then
for i,verb in ipairs(message.verbs) do for i,verb in ipairs(message.verbs) do
o.remote_verbs[verb] = remoteAddress o.remote_verbs[verb] = remoteAddress
@ -130,24 +140,29 @@ function bc:init(local_nouns, local_verbs)
end end
end end
end end
-- Setup connections -- Setup connections
modem.open(CFG_PORT) modem.open(CFG_PORT)
event.listen("modem_message", modem_listener) event.listen("modem_message", modem_listener)
-- Save listener function for deinit -- Save listener function for deinit
o.modem_cb = modem_listener o.modem_cb = modem_listener
-- Init local stuff
o.local_verbs = local_verbs
o.local_nouns = local_nouns
-- Send own nouns and verbs and request all remotes to send theirs -- Send own nouns and verbs and request all remotes to send theirs
local mynouns = {} local mynouns = {}
for noun in pairs(local_nouns) do for noun in pairs(o.local_nouns) do
table.insert(mynouns, noun) table.insert(mynouns, noun)
end end
local myverbs = {} local myverbs = {}
for verb in pairs(local_verbs) do for verb in pairs(o.local_verbs) do
table.insert(myverbs, verb) table.insert(myverbs, verb)
end end
modem.broadcast(CFG_PORT, serializer.serialize({ty=message_type.hello, verbs=myverbs, nouns=mynouns})) modem.broadcast(CFG_PORT, serializer.serialize({
ty=message_type.hello,
verbs=myverbs,
nouns=mynouns,
}))
return o return o
end end
@ -155,7 +170,10 @@ function bc:get_noun(n)
if self.local_nouns[n] ~= nil then -- This noun is local, makes it easy if self.local_nouns[n] ~= nil then -- This noun is local, makes it easy
return self.local_nouns[n] return self.local_nouns[n]
elseif self.remote_nouns[n] ~= nil then -- This noun is remote elseif self.remote_nouns[n] ~= nil then -- This noun is remote
modem.send(self.remote_nouns[n], CFG_PORT, serializer.serialize({ty=message_type.request_noun, noun=n})) modem.send(self.remote_nouns[n], CFG_PORT, serializer.serialize({
ty=message_type.request_noun,
noun=n,
}))
local i = 0 local i = 0
while i < 5 do while i < 5 do
local _, _, remoteAddr, port, _, msg = event.pull("modem_message") local _, _, remoteAddr, port, _, msg = event.pull("modem_message")
@ -226,7 +244,11 @@ function bc:call_verb(v, param)
self.local_verbs[v](self, param) self.local_verbs[v](self, param)
return true return true
elseif self.remote_verbs[v] ~= nil then elseif self.remote_verbs[v] ~= nil then
modem.send(self.remote_verbs[v], CFG_PORT, serializer.serialize({ty=message_type.call_verb, verb=v, param=param})) modem.send(self.remote_verbs[v], CFG_PORT, serializer.serialize({
ty=message_type.call_verb,
verb=v,
param=param,
}))
return true return true
else else
return false return false
@ -240,18 +262,36 @@ end
function bc:listen_noun(n, query, qparam, callback) function bc:listen_noun(n, query, qparam, callback)
if self.local_nouns[n] ~= nil then -- Local listening if self.local_nouns[n] ~= nil then -- Local listening
self.local_listeners[n] = self.local_listeners[n] or List:new() self.local_listeners[n] = self.local_listeners[n] or List:new()
local id = self.local_listeners[n]:insert({query=query, qparam=qparam, callback=callback}) local id = self.local_listeners[n]:insert({
query=query,
qparam=qparam,
callback=callback,
})
return id return id
elseif self.remote_nouns[n] ~= nil then -- Remote listening elseif self.remote_nouns[n] ~= nil then -- Remote listening
self.remote_listeners[n] = self.remote_listeners[n] or List:new() self.remote_listeners[n] = self.remote_listeners[n] or List:new()
local id = self.remote_listeners[n]:insert({query=query, qparam=qparam, callback=callback}) local id = self.remote_listeners[n]:insert({
query=query,
qparam=qparam,
callback=callback,
})
-- Request remote listening -- Request remote listening
modem.send(self.remote_nouns[n], CFG_PORT, serializer.serialize({ty=message_type.request_listening, noun=n, query=query, qparam=qparam, id=id})) modem.send(self.remote_nouns[n], CFG_PORT, serializer.serialize({
ty=message_type.request_listening,
noun=n,
query=query,
qparam=qparam,
id=id,
}))
return id return id
else else
-- Install it, with hope, that the node will come online later -- Install it, with hope, that the node will come online later
self.remote_listeners[n] = self.remote_listeners[n] or List:new() self.remote_listeners[n] = self.remote_listeners[n] or List:new()
local id = self.remote_listeners[n]:insert({query=query, qparam=qparam, callback=callback}) local id = self.remote_listeners[n]:insert({
query=query,
qparam=qparam,
callback=callback,
})
return id return id
end end
end end
@ -264,7 +304,11 @@ function bc:listen_cancel(n, id)
elseif self.remote_nouns[n] ~= nil then -- Remote listening elseif self.remote_nouns[n] ~= nil then -- Remote listening
if self.remote_listeners[n] ~= nil then if self.remote_listeners[n] ~= nil then
self.remote_listeners[n]:remove(id) self.remote_listeners[n]:remove(id)
modem.send(self.remote_nouns[n], CFG_PORT, serializer.serialize({ty=message_type.request_stop_listening, noun=n, id=id})) modem.send(self.remote_nouns[n], CFG_PORT, serializer.serialize({
ty=message_type.request_stop_listening,
noun=n,
id=id,
}))
end end
else else
error("Trying to cancel non existing listener") error("Trying to cancel non existing listener")

Loading…
Cancel
Save