blob: eaac52aa3cb43a125aea4754372a492d59cd5967 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#lang racket/base
(require racket/place)
(provide make-toggle-relay)
(provide make-toggle-blinker-relay)
(define (make-send-to-dev data)
(lambda (dev)
(with-output-to-file dev
#:exists 'truncate
#:mode 'binary
(lambda ()
(write-bytes data)))))
(define send-message-on
(make-send-to-dev (bytes #xA0 #x01 #x01 #xA2)))
(define send-message-off
(make-send-to-dev (bytes #xA0 #x01 #x00 #xA1)))
(define (make-toggle-relay dev)
(let ((turn-on? #t))
(lambda ()
(displayln (format "Relay on ~a toggled" dev))
(if turn-on?
(send-message-on dev)
(send-message-off dev))
(set! turn-on? (not turn-on?)))))
(define (make-toggle-blinker-relay toggle-relay
#:delay [delay 3])
(let ((blinker-thread #f))
(lambda ()
(if (and (thread? blinker-thread)
(not (thread-dead? blinker-thread)))
(if (thread-running? blinker-thread)
(thread-suspend blinker-thread)
(thread-resume blinker-thread))
(set! blinker-thread
(thread
(lambda ()
(let loop ()
(toggle-relay)
(sleep delay)
(loop))))))
blinker-thread)))
|