summaryrefslogtreecommitdiffstats
path: root/src/utils.rkt
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils.rkt')
-rw-r--r--src/utils.rkt47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/utils.rkt b/src/utils.rkt
new file mode 100644
index 0000000..eaac52a
--- /dev/null
+++ b/src/utils.rkt
@@ -0,0 +1,47 @@
1#lang racket/base
2
3(require racket/place)
4
5(provide make-toggle-relay)
6(provide make-toggle-blinker-relay)
7
8(define (make-send-to-dev data)
9 (lambda (dev)
10 (with-output-to-file dev
11 #:exists 'truncate
12 #:mode 'binary
13 (lambda ()
14 (write-bytes data)))))
15
16(define send-message-on
17 (make-send-to-dev (bytes #xA0 #x01 #x01 #xA2)))
18
19(define send-message-off
20 (make-send-to-dev (bytes #xA0 #x01 #x00 #xA1)))
21
22(define (make-toggle-relay dev)
23 (let ((turn-on? #t))
24 (lambda ()
25 (displayln (format "Relay on ~a toggled" dev))
26 (if turn-on?
27 (send-message-on dev)
28 (send-message-off dev))
29 (set! turn-on? (not turn-on?)))))
30
31(define (make-toggle-blinker-relay toggle-relay
32 #:delay [delay 3])
33 (let ((blinker-thread #f))
34 (lambda ()
35 (if (and (thread? blinker-thread)
36 (not (thread-dead? blinker-thread)))
37 (if (thread-running? blinker-thread)
38 (thread-suspend blinker-thread)
39 (thread-resume blinker-thread))
40 (set! blinker-thread
41 (thread
42 (lambda ()
43 (let loop ()
44 (toggle-relay)
45 (sleep delay)
46 (loop))))))
47 blinker-thread)))