singe/thirdparty/librs232/bindings/lua/test/testsrv_rs232.lua
2023-10-23 19:38:18 -05:00

61 lines
1.5 KiB
Lua

package.path = "../?.lua;" .. package.path
local rs232 = require "rs232"
do local _print = print print = function(...) return _print('[server]', ...) end end
do local _exit = os.exit os.exit = function(...) io.flush() return _exit(...) end end
control_port = arg[1] or CONTROL_PORT or 'CNCA1'
data_port = arg[2] or DATA_PORT or 'CNCA0'
local function split_first(str, sep, plain)
local e, e2 = string.find(str, sep, nil, plain)
if e then
return string.sub(str, 1, e - 1), string.sub(str, e2 + 1)
end
return str
end
local function open_port(name)
local p, e = rs232.port(name)
local ok, e = p:open()
if not ok then
print(string.format("can't open serial port '%s', error: '%s'",
name, tostring(e)))
os.exit(-1)
end
print(string.format("OK, port open with values '%s'", e))
return p
end
local function run_test_server(control_port, data_port)
ztimer = require "lzmq.timer"
control = open_port(control_port)
data = open_port(data_port)
local sep, buffer = '\n'
print("Server started")
io.flush()
while true do
local d, e = assert(control:read(100, 100))
buffer = (buffer or '') .. (d or '')
local code, tail = split_first(buffer, sep, true)
if tail then -- we have full code
print(code)
control:write(sep)
buffer = tail
local fn = (loadstring or load)(code)
fn()
end
end
-- never got here
control:close()
data:close()
end
run_test_server(control_port, data_port)