57 lines
1.5 KiB
Fennel
57 lines
1.5 KiB
Fennel
; using https://github.com/srdgame/librs232
|
|
(local (_ rs232) (pcall #(require :luars232)))
|
|
(local command (require "core.command"))
|
|
|
|
(fn check [err ...]
|
|
(when (not= err rs232.RS232_ERR_NOERROR) (error (rs232.error_tostring err)))
|
|
...)
|
|
|
|
(fn open []
|
|
(local port (check (rs232.open "/dev/ttyUSB0")))
|
|
(port:set_baud_rate rs232.RS232_BAUD_9600)
|
|
(port:set_data_bits rs232.RS232_DATA_8)
|
|
(port:set_parity rs232.RS232_PARITY_NONE)
|
|
(port:set_stop_bits rs232.RS232_STOP_1)
|
|
(port:set_flow_control rs232.RS232_FLOW_HW)
|
|
port)
|
|
|
|
(local machine
|
|
{:connect
|
|
(fn [self]
|
|
(when (not self.port)
|
|
(set self.port (open))))
|
|
:disconnect
|
|
(fn [self]
|
|
(when self.port
|
|
(check (self.port:close))
|
|
(set self.port nil)))
|
|
:connected? (fn [self] self.port)
|
|
:cmd
|
|
(fn [self cmd]
|
|
(check (self.port:write (.. cmd "\r"))
|
|
(love.timer.sleep 0.08)))
|
|
:write
|
|
(fn [self addr bytes]
|
|
(var bytes-to-write bytes)
|
|
(var addrout addr)
|
|
(while (> (length bytes-to-write) 0)
|
|
(local bytesout (bytes-to-write:sub 1 10))
|
|
(local hexbytes (bytesout:gsub "." (fn [c] (string.format "%02X " (string.byte c)))))
|
|
(self:cmd (.. (string.format "%04X:" addrout) hexbytes))
|
|
(set bytes-to-write (bytes-to-write:sub 11))
|
|
(set addrout (+ addrout 10))))
|
|
:monitor (fn [self] (self:cmd "CALL-151"))
|
|
; :stub (fn [self org post-debug-stub]) ; todo
|
|
})
|
|
|
|
(command.add #(not (machine:connected?)) {
|
|
"serial:connect" #(machine:connect)
|
|
})
|
|
|
|
(command.add #(machine:connected?) {
|
|
"serial:disconnect" #(machine:disconnect)
|
|
"serial:start-monitor" #(machine:monitor)
|
|
})
|
|
|
|
machine
|