Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 122 additions & 16 deletions res/Lisp/Examples/m365_dash.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,18 @@

;****User parameters****
;Calibrate throttle min max
(define cal-thr-lo 32.0)
(define cal-thr-lo 41.0)
(define cal-thr-hi 178.0)

;Calibrate brake min max
(define cal-brk-lo 32.0)
(define cal-brk-lo 40.0)
(define cal-brk-hi 178.0)

(define light-default 0)
(define show-faults 1)
(define show-batt-in-idle 1)

(define min-speed 1)

;****Code section****
(uart-start 115200 'half-duplex)
Expand All @@ -26,18 +29,54 @@
(define throttle 0)
(define brake 0)
(define buttonold 0)
(define light 0)
(define light 1)
(setvar 'light light-default)
(define c-out 0)
(define battery 100)
(define code 0)

(define presstime (systime))
(define presses 0)

(define off 0)
(define locked 0)
(define speedmode 1)

(defun inp (buffer) ;Frame 0x65
(progn
(setvar 'throttle (/(-(bufget-u8 uart-buf 4) cal-thr-lo) cal-thr-hi))
(setvar 'brake (/(-(bufget-u8 uart-buf 5) cal-brk-lo) cal-brk-hi))
(if (> brake 0.01)
(set-brake-rel brake)
(set-current-rel throttle)

; todo: figure out how to calculate and set max rpm
(if (= speedmode 1) ; is drive?
(print "drive")
(if (= speedmode 2) ; is eco?
(print "eco")
(if (= speedmode 4) ; is sport?
(print "sport"))))

(if (= (+ off locked) 0)
(progn
(if (> (* (get-speed) 3.6) min-speed)
(set-current-rel throttle)
(set-current-rel 0))

(if (> brake 0.02)
(set-brake-rel brake))
)
(progn
(set-current-rel 0)
(if (= locked 1)
(if (> (* (get-speed) 3.6) min-speed)
(set-brake-rel 1)
(set-brake-rel 0)
)
(set-brake-rel 0)
)
)
)


))

(defun outp (buffer) ;Frame 0x64
Expand Down Expand Up @@ -66,26 +105,93 @@
(setvar 'crc (+ crc (bufget-u8 uart-buf i))))
(if (=(+(shl(bufget-u8 uart-buf (+ len 2))8) (bufget-u8 uart-buf (+ len 1))) (bitwise-xor crc 0xFFFF))
(progn
(if(= (bufget-u8 uart-buf 1) 0x65)
(inp uart-buf))
(if(= (bufget-u8 uart-buf 1) 0x64)
(outp uart-buf))
(setvar 'code (bufget-u8 uart-buf 1))

(if(= code 0x65)
(inp uart-buf)
)
))))))))
;(if(= code 0x64)
(outp uart-buf)
;)
)
)
)
)
)))))

(spawn 150 read-thd) ; Run UART in its own thread

(loopwhile t
(progn
(if (> buttonold (gpio-read 'pin-rx))
(setvar 'light (bitwise-xor light 1))
(progn
(setvar 'presses (+ presses 1))
(setvar 'presstime (systime))
)
(if (> (- (systime) presstime) 4000) ;; double press
(progn
(print presses)
(if (= presses 1)
(setvar 'light (bitwise-xor light 1))
)

(if (>= presses 2) ; double press
(progn
;; seems not to be working hmm
;; (case speedmode
;; (1 (setvar 'speedmode 4))
;; (2 (setvar 'speedmode 1))
;; (4 (setvar 'speedmode 2)))

(if (> brake 0.02)
(setvar 'locked (bitwise-xor locked 1))
(if (= speedmode 1) ; is drive?
(setvar 'speedmode 4) ; to sport
(if (= speedmode 2) ; is eco?
(setvar 'speedmode 1) ; to drive
(if (= speedmode 4) ; is sport?
(setvar 'speedmode 2)))) ; to eco
)
)
)

(setvar 'presses 0)
)
)
)
(setvar 'buttonold (gpio-read 'pin-rx))

(if (= (gpio-read 'pin-rx) 0)
(if (> (- (systime) presstime) 10000) ; long press
(progn
(setvar 'off (bitwise-xor off 1))
(setvar 'presstime (systime))
)
)
)

(if (= off 1)
(bufset-u8 tx-frame 6 16) ; turn off display
(if (= locked 1)
(bufset-u8 tx-frame 6 32)
(bufset-u8 tx-frame 6 speedmode)
)
)

(bufset-u8 tx-frame 7 (*(get-batt) 100))
(bufset-u8 tx-frame 8 light)
(bufset-u8 tx-frame 10 (* (get-speed) 3.6))
(if (= off 0)
(bufset-u8 tx-frame 8 light)
(bufset-u8 tx-frame 8 0)
)
(if (= show-batt-in-idle 1)
(if (> (* (get-speed) 3.6) 1)
(bufset-u8 tx-frame 10 (* (get-speed) 3.6))
(bufset-u8 tx-frame 10 (*(get-batt) 100)))
(bufset-u8 tx-frame 10 (* (get-speed) 3.6))
)

(if (= show-faults 1)
(bufset-u8 tx-frame 11 (get-fault))
(bufset-u8 tx-frame 11 (get-fault))
)
(sleep 0.1)
))
))-