dev
Rahix 9 years ago
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

101
bc.lua

@ -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…
Cancel
Save