Created
March 14, 2011 16:42
-
-
Save samaaron/869423 to your computer and use it in GitHub Desktop.
rxtx handler
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(defn listen | |
"Register a function to be called for every byte received on the specified port." | |
([port handler] (listen port handler true)) | |
([port handler skip-buffered] | |
(let [raw-port (:raw-port port) | |
in-stream (:in-stream port) | |
listener (reify SerialPortEventListener | |
(serialEvent [_ event] (when (= SerialPortEvent/DATA_AVAILABLE (.getEventType event)) | |
(handler in-stream))))] | |
(if skip-buffered | |
(let [to-drop (.available in-stream)] | |
(.skip in-stream to-drop))) | |
(.addEventListener raw-port listener) | |
(.notifyOnDataAvailable raw-port true)))) | |
(defn stop-listening | |
"De-register the listening fn for the specified port" | |
[port] | |
(.removeEventListener (:raw-port port))) | |
(defn on-n-bytes | |
[port handler n] | |
(listen port (fn [^InputStream in-stream] | |
(if (>= (.available in-stream) n) | |
(handler (doall (repeatedly n #(.read in-stream)))))))) | |
(defn on-each-byte | |
[port handler] | |
(listen port (fn [^InputStream in-stream] | |
(handler (.read in-stream))))) | |
(defn on-bytes-with-sep | |
[port handler sep] | |
(let [sep (if (number? sep) [sep] sep) | |
sep-count (count sep) | |
buffered-bytes (ref []) | |
handle-byte (fn [b] | |
(let [vals-to-send (dosync | |
(alter buffered-bytes conj b) | |
(let [num-non-sep-bytes (- (count @buffered-bytes) sep-count) | |
[pre-sep maybe-sep] (split-at num-non-sep-bytes @buffered-bytes)] | |
(when (= sep maybe-sep) | |
(ref-set buffered-bytes []) | |
pre-sep)))] | |
(if vals-to-send | |
(handler vals-to-send))))] | |
(on-each-byte port handle-byte))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment