I could be completely wrong about how this threading is working. Also, I'm on OSX so might not be the same as Linux
(sys:load "libs/core/audio_dsp.xtm")
(sys:load "libs/contrib/librs232.xtm")
(bind-func dsp
(let ((osc1 (osc_c 0.0))
(freq1:SAMPLE 200.0:float))
(lambda (in:SAMPLE time:i64 channel:i64 data:SAMPLE*)
(cond
((= channel 0)
(osc1 0.1 freq1))
(else 0.0)))))
(dsp:set! dsp)
(bind-func list-ports:[i64]*
(lambda ()
(let ((n:i64 (i32toi64 (comEnumerate)))
(loop:[i64,i64]*
(lambda (i:i64)
(cond
((< i n)
(printf "Port %d:\t%s\n" i (comGetPortName (i64toi32 i)))
(loop (+ i 1)))
(else n)))))
(loop 0))))
(bind-func serial_port_id:[i64,i8*]*
(lambda (port_name)
(let* ((n:i64 (i32toi64 (comEnumerate)))
(loop:[i64,i64]*
(lambda (i:i64)
(cond
((and (<= 0 i) (< i n))
(let* ((name:i8* (comGetPortName (i64toi32 i)))
(a (strlen name)) (b (strlen port_name)) (c (if (< a b) a b)))
(cond
((= 0:i32 (strncmp name port_name c)) i)
(else
(loop (+ i 1))))))
(else
(printf "No serial port found matching name %s\n" port_name)
-1)))))
(loop 0))))
(bind-func readSerialPort:[i64,i64]*
(let ((buffer:i8* (alloc 32)))
(lambda (port:i64)
(let ((loop:[i64]*
(let ((count:i64 0))
(lambda ()
(let ((nr:i32 (comRead (i64toi32 port) buffer 32)) (i:i32 0:i32))
(cond
((< 0:i32 nr)
(dotimes (i nr)
(set! count (+ count 1))
(dsp.freq1 (* 10.0:float (i8tof (pref buffer i)))))
(loop))
(else ;(println "Read" count "bytes")
count)))))))
(loop)))))
(bind-func serial_port_polling:[void,i64]*
(let ((isConnected:i1 #f))
(lambda (port:i64)
(if (not isConnected)
(begin
(comOpen (i64toi32 port) (i64toi32 115200))
(set! isConnected #t)))
(readSerialPort port)
;;(printf "\n--- serial data read complete ---\n")
(callback (+ (now) 10) serial_port_polling port)
void)))
;; Replace "tty.usbmodem1412" with the appropriate string for your COM port
(serial_port_polling (serial_port_id "tty.usbmodem1412"))