Skip to content

Instantly share code, notes, and snippets.

@samaaron
Created March 14, 2011 16:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save samaaron/869423 to your computer and use it in GitHub Desktop.
Save samaaron/869423 to your computer and use it in GitHub Desktop.
rxtx handler
(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