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