diff options
Diffstat (limited to 'ebus-racket/parser.rkt')
-rw-r--r-- | ebus-racket/parser.rkt | 39 |
1 files changed, 18 insertions, 21 deletions
diff --git a/ebus-racket/parser.rkt b/ebus-racket/parser.rkt index 51b9b55..773e86e 100644 --- a/ebus-racket/parser.rkt +++ b/ebus-racket/parser.rkt @@ -7,10 +7,6 @@ (define ebus-const-ackok (string->bytes/latin-1 "\x00")) (define ebus-const-broadcastaddr 254) -(struct ebus-header - (source destination primaryCommand secondaryCommand payloadLength) - #:transparent) - (struct ebus-body-broadcast (crc) #:transparent) (struct ebus-body-mastermaster (crc) #:transparent) @@ -19,18 +15,10 @@ (crc payloadSlaveLength payloadSlave crcSlave) #:transparent) -(struct ebus-paket (header payload body) #:transparent) - -(define parse-ebus-header (token (seq source <- any-byte - destination <- any-byte - primaryCommand <- any-byte - secondaryCommand <- any-byte - payloadLength <- any-byte - (return (ebus-header source - destination - primaryCommand - secondaryCommand - payloadLength)) ))) +(struct ebus-paket + (source destination primaryCommand secondaryCommand payloadLength payload body) + #:transparent) + ;; single, maybe escaped, payload data byte (define ebus-payload (choice (seq escape-seq <- (bytes= ebus-const-escape) escape-code <- (byte-in (list 0 1)) @@ -60,11 +48,21 @@ (define parse-ebus-master-or-slave (token (choice parse-ebus-mastermaster parse-ebus-masterslave))) -(define parse-ebus-paket (token (seq header <- parse-ebus-header - payload <- (repeat ebus-payload (ebus-header-payloadLength header) (ebus-header-payloadLength header)) - body <- (cond ((= (ebus-header-destination header) ebus-const-broadcastaddr) parse-ebus-broadcast) +(define parse-ebus-paket (token (seq source <- any-byte + destination <- any-byte + primaryCommand <- any-byte + secondaryCommand <- any-byte + payloadLength <- any-byte + payload <- (repeat ebus-payload payloadLength payloadLength) + body <- (cond ((= destination ebus-const-broadcastaddr) parse-ebus-broadcast) (else parse-ebus-master-or-slave)) - (return (ebus-paket header payload body))))) + (return (ebus-paket source + destination + primaryCommand + secondaryCommand + payloadLength + payload + body))))) (define ebus-sync (tokens syncs <- (seq (repeat (string->bytes/latin-1 "\xaa"))) (return (length syncs)))) @@ -97,7 +95,6 @@ (provide read-ebus read-ebus-loop (struct-out ebus-paket) - (struct-out ebus-header) (struct-out ebus-body-broadcast) (struct-out ebus-body-mastermaster) (struct-out ebus-body-masterslave))
\ No newline at end of file |