example 'meshtastic': add protobuf log (file)

This commit is contained in:
pls.153 2024-06-06 18:24:06 +02:00
parent b6d13d4a4c
commit e6eb418cab

View file

@ -10,8 +10,13 @@
(defvar *receiver* nil) (defvar *receiver* nil)
(defvar *config-lora* nil) (defvar *config-lora* nil)
(defvar *ble-names* nil) (defvar *ble-names* nil)
(defvar *print-json* #+mobile nil
#-mobile t) (defvar *print-json* #+mobile nil
#-mobile t
"Print all sent/received protobuf packets as json to terminal.")
(defvar *log-packets* t
"Write all raw protobuf data sent/received to a file.")
(defun ini () (defun ini ()
(setf *channel-name* (or (app:setting :channel-name) (setf *channel-name* (or (app:setting :channel-name)
@ -162,6 +167,8 @@
(pr:print-json to-radio)) (pr:print-json to-radio))
(let* ((bytes (pr:serialize-to-bytes to-radio)) (let* ((bytes (pr:serialize-to-bytes to-radio))
(header (header (length bytes)))) (header (header (length bytes))))
(when *log-packets*
(log-packet :out bytes))
(case radios:*connection* (case radios:*connection*
(:ble (:ble
(qrun* (qrun*
@ -196,6 +203,8 @@
(progn (progn
(when *print-json* (when *print-json*
(pr:print-json from-radio)) (pr:print-json from-radio))
(when *log-packets*
(log-packet :in bytes))
(push from-radio *received*)) (push from-radio *received*))
(progn (progn
(qlog "received faulty bytes: ~A" error) (qlog "received faulty bytes: ~A" error)
@ -333,7 +342,9 @@
(radios:add-radio (radios:add-radio
(list :name name (list :name name
:hw-model (symbol-name (me:hw-model x:it)) :hw-model (symbol-name (me:hw-model x:it))
:battery-level (float (if metrics (me:battery-level metrics) 0)) :battery-level (float (if metrics
(max 0 (min 100 (me:battery-level metrics)))
0))
:current current)) :current current))
(when current (when current
(app:update-current-device name))))))) (app:update-current-device name)))))))
@ -512,3 +523,19 @@
(:region-code (:region-code
'me:config.lo-ra-config.region-code)))) 'me:config.lo-ra-config.region-code))))
;;; log serialized protobuf packets (for ev. future analysis)
(defun timestamp-bytes ()
(let ((ti (get-universal-time)))
(to-bytes (loop :for i :from 3 :downto 0
:collect (ldb (byte 8 (* i 8)) ti)))))
(defun log-packet (direction packet)
(with-open-file (s (app:in-data-path "packets.bin") :direction :output
:if-exists :append :if-does-not-exist :create
:element-type '(unsigned-byte 8))
(write-sequence (header (length packet)) s) ; header for length
(write-byte (char-code (if (eql :in direction) #\> #\<)) s) ; direction (1 byte)
(write-sequence (timestamp-bytes) s) ; timestamp (4 bytes)
(write-sequence packet s))) ; protobuf