You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
2.8 KiB

bc = {}
_bc_backend = require("_bc_backend")
function bc:init(master_id)
local o = {}
setmetatable(o, self)
self.__index = self
-- Init backend and cb handler
o._listen_callbacks = {}
o._verb_handlers = {}
o._listeners = {}
local function cb_handler(cb_type, param, arg)
if cb_type == "listen" then
if type(o._listen_callbacks[param]) == "function" then
o._listen_callbacks[param]()
end
elseif cb_type == "verb" then
o._verb_handlers[param](arg)
elseif cb_type == "noun" then
return o._mynouns[param]
elseif cb_type == "reg_nl" then
-- Create array if there is not one already
o._listeners[param] = o._listeners[param] or {}
-- Insert parameters
table.insert(o._listeners[param], arg)
return #o._listeners[param]
elseif cb_type == "unreg_nl" then
o._listeners[param][arg] = true;
else
error("Wrong cb type")
end
end
o._backend = _bc_backend:init(cb_handler)
-- Fetch list of nouns and verbs from master
local list = o._backend:fetch_list(master_id)
o._nouns = list.nouns
o._verbs = list.verbs
-- Initialize own nouns
o._mynouns = {}
for noun, addr in pairs(o._nouns) do
if addr == o._backend.local_addr then
o._mynouns[noun] = 0
end
end
list = nil
return o
end
function bc:get_noun(n)
if self._nouns[n] == self._backend.local_addr then
return self._mynouns[n]
else
return self._backend:request_noun(self._nouns[n], n)
end
end
function bc:set_noun(n, val)
if self._nouns[n] == self._backend.local_addr then
-- Call listeners
if type(self._listeners[n]) == "table" then
for i, listener in ipairs(self._listeners[n]) do
-- Check condition
if type(listener) == "table" and
( (listener.query == "onchange" and self._mynouns[n] ~= val)
or (listener.query == "onrising" and self._mynouns[n] < val)
or (listener.query == "onfalling" and self._mynouns[n] > val)
or (listener.query == "onabove" and val > listener.qparam)
or (listener.query == "onbelow" and val < listener.qparam)
or (listener.query == "onvalue" and val == listener.qparam)
) then
self._backend:call_listener(listener.addr, n, i, val)
end
end
end
-- Set value
self._mynouns[n] = val
return true
end
return false
end
function bc:on_verb(v, handler)
self._verb_handlers[v] = handler
end
function bc:call_verb(v, param)
self._backend:call_verb(self._verbs[v], v, param)
end
function bc:listen_noun(n, query, qparam, cb)
local id = self._backend:register_callback(self._nouns[n], n, query, qparam)
self._listen_callbacks[id] = cb
return id
end
function bc:listen_cancel(n, id)
self._backend:cancel_callback(n, id)
end
return bc