lqml/examples/cl-repl/lisp/usb-ulisp.lisp
2024-06-05 07:37:52 +02:00

37 lines
1.2 KiB
Common Lisp

;;; USB connected uLisp (e.g. Arduino)
(in-package :editor)
(defvar *ulisp-mode* nil)
(defparameter *newline* #.(map 'string 'identity (list #\Return #\Newline)))
(defun ini-usb ()
(when *ulisp-mode*
(qt:connect-usb qt:*cpp*)))
(defun send-to-ulisp (form)
(qt:send-to-ulisp qt:*cpp* (x:cc form *newline*)))
(let (prompt)
(defun received-from-ulisp (data)
(let* ((lines (delete-if 'x:empty-string (x:split data *newline*)))
(len (length lines)))
(cond ((= len 2)
(print-eval-output :expression (first lines))
(setf prompt (second lines)))
((> len 2)
(let ((exp (cons prompt (butlast lines 2)))
(value (nth (- len 2) lines)))
(print-eval-output :expression (x:join exp #\Newline))
(print-eval-output (cond ((x:starts-with "Error:" value)
:error)
((string= "Break!" value)
:trace)
(t
:values))
value))
(setf prompt (first (last lines))))))
(values)))
(qlater 'ini-usb)