11.02.2019, 12:45
Here's a complete example with two sequences - one for "on" event, another for "off". 32/1/1 is the object that triggers execution. Delay between each command is fixed at 0.5 seconds. This can be made adjustable via sequence table, but it must not be 0, otherwise sequence thread won't be able to pass control to localbus monitor thread.
Code:
if not client then
require('copas')
seqon = {
{ address = '1/1/1', value = true },
{ address = '32/1/2', value = 42 },
{ address = '32/1/3', value = 43 },
{ address = '32/1/4', value = 44 },
{ address = '32/1/5', value = 45 },
}
seqoff = {
{ address = '1/1/1', value = false },
{ address = '32/1/2', value = 53 },
{ address = '32/1/3', value = 54 },
{ address = '32/1/4', value = 55 },
{ address = '32/1/5', value = 56 },
}
function eventhandler(event)
if event.dst == '32/1/1' then
local val = busdatatype.decode(event.datahex, dt.bool)
sequence = val and seqon or seqoff
seqpos = 1
copas.wakeup(seqthread)
end
end
client = require('localbus').new()
client:sethandler('groupwrite', eventhandler)
copas.addserver(client.sock, function()
client.sock = copas.wrap(client.sock)
while true do
client:step()
end
end, 1)
seqthread = copas.addthread(function()
copas.sleep(-1) -- put thread to sleep until wakeup is called
while true do
local curr = sequence[ seqpos ]
grp.write(curr.address, curr.value)
seqpos = seqpos + 1
-- end of sequence
if seqpos > #sequence then
copas.sleep(-1)
else
copas.sleep(0.5)
end
end
end)
end
copas.step()