From 78740ba7206ec0895be4aebedd308d409bc1dbb5 Mon Sep 17 00:00:00 2001 From: jdlugosz963 Date: Tue, 30 Jul 2024 11:57:23 +0200 Subject: Add new command: toggle-blinker. --- src/utils.rkt | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/utils.rkt (limited to 'src/utils.rkt') 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 @@ +#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))) -- cgit v1.2.3