249
8.
comport
='ttyUSB2'
9.
-- open serial port
10.
modem
=
AT:init
('/dev/'
.. comport
)
11.
-- command parser
12.
parser
=function(
cmd, sender
)
13.
local
find, pos, name, mode, offset, value, jvalue, obj
14.
cmd
=
cmd:trim
()
15.
mode
=
cmd:sub
(
1, 1
)
:upper
()
16.
if
mode
=='W'or
mode
=='R'then
17.
cmd
=
cmd:sub
(3)
:trim
()
18.
-- parse object name/address
19.
find
=
cmd:sub
(1
,
1)=='"'and'"'or' '
20.
offset
=
find
=='"'and
1
or0
21.
-- pad with space when in read mode
22.
if
mode
=='R'and
find
==' 'then
23.
cmd
=
cmd ..
' '
24.
end
25.
-- find name
26.
pos
=
cmd:find
(
find, 1 + offset,
true)
27.
-- name end not found, stop
28.
ifnot
pos
then
29.
returnfalse
30.
end
31.
-- get name part
32.
name
=
cmd:sub
(
1 + offset, pos - offset
)
:trim
()
33.
if
mode
=='W'then
34.
value
=
cmd:sub
(
pos + offset
)
:trim
()
35.
ifnot
value
then
36.
returnfalse
37.
end
38.
-- try decoding value
39.
jvalue
=
json.pdecode
(
value
)
40.
value
=
jvalue ~
=niland
jvalue
or
value
41.
-- send to bus
42.
grp.
write(
name, value
)
43.
-- read request
44.
else
45.
obj
=
grp.find
(
name
)
46.
-- send read request and wait for update
47.
if
obj
then
48.
obj:
read()
49.
os
.sleep
(1)
50.
-- read new value
51.
value
=
grp.getvalue
(
name
)
52.
-- got value, send response
53.
if
value ~
=nilthen
54.
jvalue
=
json.pencode
(
value
)
55.
if
obj.name
then
56.
name
=string.format('%s (%s)'
, obj.name, obj.address
)
57.
end