summaryrefslogtreecommitdiff
path: root/ebus-racket/parse.rkt
diff options
context:
space:
mode:
authorYves Fischer <yvesf-git@xapek.org>2012-02-26 00:02:21 +0100
committerYves Fischer <yvesf-git@xapek.org>2012-02-26 00:35:11 +0100
commitcb7f015ae3e4e386fe7d1a6da5c0e6f403bc7f7c (patch)
tree308380790df14ba1ead492ca01946ff0433dda5a /ebus-racket/parse.rkt
parent7969ec13dd87e3370555d96e7eb960860850e654 (diff)
downloadebus-alt-cb7f015ae3e4e386fe7d1a6da5c0e6f403bc7f7c.tar.gz
ebus-alt-cb7f015ae3e4e386fe7d1a6da5c0e6f403bc7f7c.zip
ebus-racket: parser
Diffstat (limited to 'ebus-racket/parse.rkt')
-rw-r--r--ebus-racket/parse.rkt100
1 files changed, 100 insertions, 0 deletions
diff --git a/ebus-racket/parse.rkt b/ebus-racket/parse.rkt
new file mode 100644
index 0000000..46d91fd
--- /dev/null
+++ b/ebus-racket/parse.rkt
@@ -0,0 +1,100 @@
+#lang racket
+(require (planet bzlib/parseq:1:3))
+
+; Ebus SYN Byte-String
+(define ebus-const-syn (string->bytes/latin-1 "\xaa"))
+(define ebus-const-escape (string->bytes/latin-1 "\xa9"))
+(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)
+
+(struct ebus-body-masterslave
+ (crc payloadSlaveLength payloadSlave crcSlave)
+ #:transparent)
+
+(struct ebus-paket (header 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)) )))
+;; 1 payload data byte
+(define ebus-payload (choice (seq ebus-const-escape
+ escape-code <- (byte-in (list #"\0" #"\1"))
+ (return (cond
+ ((= escape-code #"\0") ebus-const-escape)
+ ((= escape-code #"\0") ebus-const-syn))))
+ any-byte
+ ))
+
+(define parse-ebus-broadcast (token (seq crc <- any-byte
+ syn <- (bytes= ebus-const-syn)
+ (return (ebus-body-broadcast crc)))))
+
+(define parse-ebus-mastermaster (token (seq crc <- any-byte
+ ack <- (bytes= ebus-const-ackok) ; ACK des Empfängers
+ syn <- (bytes= ebus-const-syn) ; SYN des Senders
+ (return (ebus-body-mastermaster crc)))))
+
+(define parse-ebus-masterslave (token (seq crc <- any-byte
+ ack <- (bytes= ebus-const-ackok) ;ACK des Empfängers
+ payloadSlaveLength <- any-byte
+ payloadSlave <- (repeat ebus-payload payloadSlaveLength payloadSlaveLength)
+ crcSlave <- any-byte
+ ackSlave <- (bytes= ebus-const-ackok) ;ACK des Senders
+ synSlave <- (bytes= ebus-const-syn) ;SYN des Senders
+ (return (ebus-body-masterslave crc payloadSlaveLength payloadSlave crcSlave)))))
+
+(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)
+ (else parse-ebus-master-or-slave))
+ (return (ebus-paket header body)))))
+
+(define ebus-sync (tokens syncs <- (seq (repeat (string->bytes/latin-1 "\xaa")))
+ (return (length syncs))))
+
+(define input-port (open-input-file "../doc/dumps/dump_2011-12-17_23-04-00.bin"))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(define (read-ebus)
+ (let ([syn ((make-reader ebus-sync #:sof? #f #:eof? #f) input-port)]
+ [paket ((make-reader parse-ebus-paket #:sof? #f #:eof? #f) input-port)])
+ (cond ((not (false? paket))
+ (cond ((not (false? syn))
+ (display (format "drop ~s x SYN (~s) ~n" syn ebus-const-syn))))
+ (display (format "Paket ~s~n" paket)))
+ (else
+ (display (format "drop ~s ~n" (peek-byte input-port)))
+ (file-position input-port (+ 1 (file-position input-port)))
+ ))
+ (cond ((not (eof-object? (peek-byte input-port)))
+ (read-ebus)))))
+
+(read-ebus)
+
+
+;(define-values (cin cout)
+; (tcp-connect "localhost" 2222))
+
+
+;
+;(define (work-on port)
+; (pretty-print token)