[fluksod] encode/decode all sensor board commands
This commit is contained in:
parent
6084528217
commit
3d41fba408
|
@ -24,12 +24,14 @@ local nixio = require 'nixio'
|
||||||
local os, table, string =
|
local os, table, string =
|
||||||
os, table, string
|
os, table, string
|
||||||
|
|
||||||
local getfenv, setmetatable =
|
local getfenv, setmetatable, tonumber =
|
||||||
getfenv, setmetatable
|
getfenv, setmetatable, tonumber
|
||||||
|
|
||||||
module (...)
|
module (...)
|
||||||
local modenv = getfenv()
|
local modenv = getfenv()
|
||||||
|
|
||||||
|
local MAX_SENSORS = 6
|
||||||
|
|
||||||
local SPI_END_OF_MESSAGE = '.'
|
local SPI_END_OF_MESSAGE = '.'
|
||||||
local SPI_FORWARD_TO_UART_PORT = 'u'
|
local SPI_FORWARD_TO_UART_PORT = 'u'
|
||||||
local SPI_FORWARD_TO_CTRL_PORT = 'l' -- 'l'ocal port
|
local SPI_FORWARD_TO_CTRL_PORT = 'l' -- 'l'ocal port
|
||||||
|
@ -60,45 +62,65 @@ function parse(msg)
|
||||||
|
|
||||||
msg.parsed.cmd = msg.body:match('^%l%l')
|
msg.parsed.cmd = msg.body:match('^%l%l')
|
||||||
for arg in msg.body:gmatch('%d+') do
|
for arg in msg.body:gmatch('%d+') do
|
||||||
msg.parsed[#msg.parsed + 1] = arg
|
msg.parsed[#msg.parsed + 1] = tonumber(arg) -- returns nil when string does not contain a number
|
||||||
end
|
end
|
||||||
|
|
||||||
--> TODO: more detailed command syntax checking
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function encode(msg)
|
function encode(msg)
|
||||||
|
local numtohex = nixio.bin.numtohex
|
||||||
|
|
||||||
|
local noarg_cmd = { gd = true, gh = true, gs = true, gp = true, gw = true, gb = true, ct = true }
|
||||||
|
|
||||||
|
local function argcheck(argc)
|
||||||
|
if argc ~= #msg.parsed then
|
||||||
|
return false
|
||||||
|
else
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
if msg.to == 'uart' then
|
if msg.to == 'uart' then
|
||||||
msg.encoded = nixio.bin.hexlify(msg.body or '')
|
msg.encoded = nixio.bin.hexlify(msg.body or '')
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if msg.parsed.cmd == 'gd' then
|
if noarg_cmd[msg.parsed.cmd] then
|
||||||
msg.encoded = msg.parsed.cmd
|
msg.encoded = msg.parsed.cmd
|
||||||
elseif msg.parsed.cmd == 'gv' then
|
|
||||||
|
|
||||||
elseif msg.parsed.cmd == 'gp' then
|
elseif msg.parsed.cmd == 'gc' and argcheck(1) then
|
||||||
|
msg.encoded = msg.parsed.cmd .. numtohex(msg.parsed[1], 1)
|
||||||
|
|
||||||
elseif msg.parsed.cmd == 'gc' then
|
elseif msg.parsed.cmd == 'gm' and argcheck(1) then
|
||||||
|
msg.encoded = msg.parsed.cmd .. numtohex(msg.parsed[1], 1)
|
||||||
|
|
||||||
elseif msg.parsed.cmd == 'gm' then
|
elseif msg.parsed.cmd == 'sh' and argcheck(2) then
|
||||||
|
msg.encoded = msg.parsed.cmd .. numtohex(msg.parsed[1], 2)
|
||||||
|
.. numtohex(msg.parsed[2], 1)
|
||||||
|
|
||||||
elseif msg.parsed.cmd == 'gw' then
|
elseif msg.parsed.cmd == 'ss' and argcheck(2) then
|
||||||
|
msg.encoded = msg.parsed.cmd .. numtohex(msg.parsed[1], 1)
|
||||||
|
.. numtohex(msg.parsed[2], 1)
|
||||||
|
|
||||||
elseif msg.parsed.cmd == 'gb' then
|
elseif msg.parsed.cmd == 'sp' and argcheck(6) then
|
||||||
|
msg.encoded = msg.parsed.cmd
|
||||||
|
|
||||||
elseif msg.parsed.cmd == 'sv' then
|
for i = 1, MAX_SENSORS do
|
||||||
|
msg.encoded = msg.encoded .. numtohex(msg.parsed[i], 1)
|
||||||
|
end
|
||||||
|
|
||||||
elseif msg.parsed.cmd == 'sp' then
|
elseif msg.parsed.cmd == 'sc' and argcheck(2) then
|
||||||
|
msg.encoded = msg.parsed.cmd .. numtohex(msg.parsed[1], 1)
|
||||||
|
.. numtohex(msg.parsed[2], 4)
|
||||||
|
|
||||||
elseif msg.parsed.cmd == 'sc' then
|
elseif msg.parsed.cmd == 'sm' and argcheck(2) then
|
||||||
|
msg.encoded = msg.parsed.cmd .. numtohex(msg.parsed[1], 1)
|
||||||
|
.. numtohex(msg.parsed[2], 2)
|
||||||
|
|
||||||
elseif msg.parsed.cmd == 'sm' then
|
elseif msg.parsed.cmd == 'sw' and argcheck(1) then
|
||||||
|
msg.encoded = msg.parsed.cmd .. numtohex(msg.parsed[1], 2)
|
||||||
|
|
||||||
elseif msg.parsed.cmd == 'sw' then
|
elseif msg.parsed.cmd == 'sb' and argcheck(1) then
|
||||||
|
msg.encoded = msg.parsed.cmd .. numtohex(msg.parsed[1], 2)
|
||||||
elseif msg.parsed.cmd == 'sb' then
|
|
||||||
|
|
||||||
elseif msg.parsed.cmd == 'ct' then
|
|
||||||
|
|
||||||
else
|
else
|
||||||
return
|
return
|
||||||
|
@ -118,6 +140,8 @@ function tx(msg, cdev)
|
||||||
end
|
end
|
||||||
|
|
||||||
function rx(msg, cdev)
|
function rx(msg, cdev)
|
||||||
|
local hextonum = nixio.bin.hextonum
|
||||||
|
|
||||||
msg.received = {}
|
msg.received = {}
|
||||||
msg.received.raw = cdev:read(SPI_MAX_READ_BYTES)
|
msg.received.raw = cdev:read(SPI_MAX_READ_BYTES)
|
||||||
|
|
||||||
|
@ -133,7 +157,7 @@ function rx(msg, cdev)
|
||||||
msg.received.crc = msg.received.l:sub(-2, -1)
|
msg.received.crc = msg.received.l:sub(-2, -1)
|
||||||
msg.received.l = msg.received.l:sub( 1, -3)
|
msg.received.l = msg.received.l:sub( 1, -3)
|
||||||
|
|
||||||
if nixio.bin.dow_crc(msg.received.l) ~= nixio.bin.hextonum(msg.received.crc) then
|
if nixio.bin.dow_crc(msg.received.l) ~= hextonum(msg.received.crc) then
|
||||||
--> TODO implement near-end crc error counter
|
--> TODO implement near-end crc error counter
|
||||||
msg.received.l = nil
|
msg.received.l = nil
|
||||||
end
|
end
|
||||||
|
@ -141,6 +165,8 @@ function rx(msg, cdev)
|
||||||
end
|
end
|
||||||
|
|
||||||
function decode(msg)
|
function decode(msg)
|
||||||
|
local hextonum = nixio.bin.hextonum
|
||||||
|
|
||||||
msg.decoded = {}
|
msg.decoded = {}
|
||||||
|
|
||||||
if msg.received.u then
|
if msg.received.u then
|
||||||
|
@ -154,39 +180,58 @@ function decode(msg)
|
||||||
if msg.decoded.cmd == 'gd' then
|
if msg.decoded.cmd == 'gd' then
|
||||||
for i = 1, msg.decoded.args:len() / 18 do
|
for i = 1, msg.decoded.args:len() / 18 do
|
||||||
msg.decoded[(i-1)*3 + 1] =
|
msg.decoded[(i-1)*3 + 1] =
|
||||||
nixio.bin.hextonum(msg.decoded.args:sub((i-1)*18 + 1, (i-1)*18 + 2))
|
hextonum(msg.decoded.args:sub((i-1)*18 + 1, (i-1)*18 + 2))
|
||||||
msg.decoded[(i-1)*3 + 2] =
|
msg.decoded[(i-1)*3 + 2] =
|
||||||
nixio.bin.hextonum(msg.decoded.args:sub((i-1)*18 + 3, (i-1)*18 + 10))
|
hextonum(msg.decoded.args:sub((i-1)*18 + 3, (i-1)*18 + 10))
|
||||||
msg.decoded[(i-1)*3 + 3] =
|
msg.decoded[(i-1)*3 + 3] =
|
||||||
nixio.bin.hextonum(msg.decoded.args:sub((i-1)*18 + 11, (i-1)*18 + 18))
|
hextonum(msg.decoded.args:sub((i-1)*18 + 11, (i-1)*18 + 18))
|
||||||
end
|
end
|
||||||
|
|
||||||
msg.decoded.delta = os.time() .. ' ' .. table.concat(msg.decoded, ' ')
|
msg.decoded.delta = os.time() .. ' ' .. table.concat(msg.decoded, ' ')
|
||||||
elseif msg.decoded.cmd == 'gv' then
|
|
||||||
|
|
||||||
elseif msg.decoded.cmd == 'gp' then
|
elseif msg.decoded.cmd == 'gh' or msg.decoded.cmd == 'sh' then
|
||||||
|
msg.decoded[1] = hextonum(msg.decoded.args:sub(1, 4))
|
||||||
|
msg.decoded[2] = hextonum(msg.decoded.args:sub(5, 6))
|
||||||
|
|
||||||
elseif msg.decoded.cmd == 'gc' then
|
msg.decoded.ctrl = msg.decoded.cmd .. ' ' .. table.concat(msg.decoded, ' ')
|
||||||
|
|
||||||
elseif msg.decoded.cmd == 'gm' then
|
elseif msg.decoded.cmd == 'gs' or msg.decoded.cmd == 'ss' then
|
||||||
|
msg.decoded[1] = hextonum(msg.decoded.args:sub(1, 2))
|
||||||
|
msg.decoded[2] = hextonum(msg.decoded.args:sub(3, 4))
|
||||||
|
|
||||||
elseif msg.decoded.cmd == 'gw' then
|
msg.decoded.ctrl = msg.decoded.cmd .. ' ' .. table.concat(msg.decoded, ' ')
|
||||||
|
|
||||||
elseif msg.decoded.cmd == 'gb' then
|
elseif msg.decoded.cmd == 'gp' or msg.decoded.cmd == 'sp' then
|
||||||
|
for i = 1, MAX_SENSORS do
|
||||||
|
msg.decoded[i] = hextonum(msg.decoded.args:sub(i*2 - 1, i*2))
|
||||||
|
end
|
||||||
|
|
||||||
elseif msg.decoded.cmd == 'sv' then
|
msg.decoded.ctrl = msg.decoded.cmd .. ' ' .. table.concat(msg.decoded, ' ')
|
||||||
|
|
||||||
elseif msg.decoded.cmd == 'sp' then
|
elseif msg.decoded.cmd == 'gc' or msg.decoded.cmd == 'sc' then
|
||||||
|
msg.decoded[1] = hextonum(msg.decoded.args:sub(1, 2))
|
||||||
|
msg.decoded[2] = hextonum(msg.decoded.args:sub(3, 10))
|
||||||
|
|
||||||
elseif msg.decoded.cmd == 'sc' then
|
msg.decoded.ctrl = msg.decoded.cmd .. ' ' .. table.concat(msg.decoded, ' ')
|
||||||
|
|
||||||
elseif msg.decoded.cmd == 'sm' then
|
elseif msg.decoded.cmd == 'gm' or msg.decoded.cmd == 'sm' then
|
||||||
|
msg.decoded[1] = hextonum(msg.decoded.args:sub(1, 2))
|
||||||
|
msg.decoded[2] = hextonum(msg.decoded.args:sub(3, 6))
|
||||||
|
|
||||||
elseif msg.decoded.cmd == 'sw' then
|
msg.decoded.ctrl = msg.decoded.cmd .. ' ' .. table.concat(msg.decoded, ' ')
|
||||||
|
|
||||||
elseif msg.decoded.cmd == 'sb' then
|
elseif msg.decoded.cmd == 'gw' or msg.decoded.cmd == 'sw' then
|
||||||
|
msg.decoded[1] = hextonum(msg.decoded.args:sub(1, 4))
|
||||||
|
|
||||||
|
msg.decoded.ctrl = msg.decoded.cmd .. ' ' .. table.concat(msg.decoded, ' ')
|
||||||
|
|
||||||
|
elseif msg.decoded.cmd == 'gb' or msg.decoded.cmd == 'sb' then
|
||||||
|
msg.decoded[1] = hextonum(msg.decoded.args:sub(1, 4))
|
||||||
|
|
||||||
|
msg.decoded.ctrl = msg.decoded.cmd .. ' ' .. table.concat(msg.decoded, ' ')
|
||||||
|
|
||||||
elseif msg.decoded.cmd == 'ct' then
|
elseif msg.decoded.cmd == 'ct' then
|
||||||
|
msg.decoded.ctrl = msg.decoded.cmd
|
||||||
|
|
||||||
elseif msg.decoded.cmd == 'zz' then
|
elseif msg.decoded.cmd == 'zz' then
|
||||||
--> TODO implement far-end crc error counter
|
--> TODO implement far-end crc error counter
|
||||||
|
|
Loading…
Reference in New Issue