commit
b17d044bb5
@ -0,0 +1,75 @@
|
|||||||
|
_bc_backend = { local_addr = "address_light", power = 12, iscb = false, cbid = 0, cbn = "" }
|
||||||
|
|
||||||
|
function _bc_backend:init(cb_handler)
|
||||||
|
local o = {}
|
||||||
|
setmetatable(o, self)
|
||||||
|
self.__index = self
|
||||||
|
o.cb_handler = cb_handler
|
||||||
|
return o
|
||||||
|
end
|
||||||
|
|
||||||
|
function _bc_backend:fetch_list(master_id)
|
||||||
|
return {
|
||||||
|
nouns = {
|
||||||
|
["power"] = "address_power",
|
||||||
|
["light"] = "address_light",
|
||||||
|
},
|
||||||
|
verbs = {
|
||||||
|
["inc_pwr"] = "address_power",
|
||||||
|
["toggle_light"] = "address_light",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
function _bc_backend:request_noun(addr, n)
|
||||||
|
if addr == "address_power" and n == "power" then
|
||||||
|
return self.power
|
||||||
|
end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
function _bc_backend:call_verb(addr, v, param)
|
||||||
|
if addr == "address_power" and v == "inc_pwr" then
|
||||||
|
self.power = param
|
||||||
|
if self.iscb then
|
||||||
|
self.cb_handler("listen", 101010)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function _bc_backend:register_callback(addr, n, query, qparam)
|
||||||
|
self.iscb = true
|
||||||
|
return 101010
|
||||||
|
end
|
||||||
|
|
||||||
|
function _bc_backend:cancel_callback(addr, n, id)
|
||||||
|
self.iscb = false
|
||||||
|
end
|
||||||
|
|
||||||
|
function _bc_backend:call_listener(addr, n, id, value)
|
||||||
|
if id == self.cbid and addr == "foobar" and n == self.cbn then
|
||||||
|
self.cb(value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Debug handlers
|
||||||
|
function _bc_backend:debug_request_noun(n)
|
||||||
|
-- Ask cb for noun value
|
||||||
|
return self.cb_handler("noun", n)
|
||||||
|
end
|
||||||
|
|
||||||
|
function _bc_backend:debug_call_verb(v, arg)
|
||||||
|
self.cb_handler("verb", v, arg)
|
||||||
|
end
|
||||||
|
|
||||||
|
function _bc_backend:debug_register_cb(n, query, qparam, cb)
|
||||||
|
self.cbid = self.cb_handler("reg_nl", n, {query = query, qparam = qparam, addr = "foobar"})
|
||||||
|
self.cbn = n
|
||||||
|
self.cb = cb
|
||||||
|
end
|
||||||
|
|
||||||
|
function _bc_backend:debug_cancel_cb()
|
||||||
|
self.cb_handler("unreg_nl", self.cbn, self.cbid)
|
||||||
|
end
|
||||||
|
|
||||||
|
return _bc_backend
|
||||||
@ -0,0 +1,101 @@
|
|||||||
|
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
|
||||||
Loading…
Reference in new issue