aboutsummaryrefslogtreecommitdiff
path: root/flow/src/main/scala/com/github/jodersky/flow/internal/Reader.scala
diff options
context:
space:
mode:
Diffstat (limited to 'flow/src/main/scala/com/github/jodersky/flow/internal/Reader.scala')
-rw-r--r--flow/src/main/scala/com/github/jodersky/flow/internal/Reader.scala40
1 files changed, 40 insertions, 0 deletions
diff --git a/flow/src/main/scala/com/github/jodersky/flow/internal/Reader.scala b/flow/src/main/scala/com/github/jodersky/flow/internal/Reader.scala
new file mode 100644
index 0000000..7b3f2ef
--- /dev/null
+++ b/flow/src/main/scala/com/github/jodersky/flow/internal/Reader.scala
@@ -0,0 +1,40 @@
+package com.github.jodersky.flow.internal
+
+import java.nio.ByteBuffer
+
+import com.github.jodersky.flow.PortInterruptedException
+import com.github.jodersky.flow.Serial.Received
+
+import akka.actor.Actor
+import akka.actor.ActorRef
+import akka.util.ByteString
+
+class Reader(serial: SerialConnection, buffer: ByteBuffer, operator: ActorRef, client: ActorRef) extends Thread {
+ def readLoop() = {
+ var stop = false
+ while (!serial.isClosed && !stop) {
+ try {
+ buffer.clear()
+ val length = serial.read(buffer)
+ buffer.limit(length)
+ val data = ByteString.fromByteBuffer(buffer)
+ client.tell(Received(data), operator)
+ } catch {
+
+ //don't do anything if port is interrupted
+ case ex: PortInterruptedException => {}
+
+ //stop and tell operator on other exception
+ case ex: Exception => {
+ stop = true
+ operator.tell(ReaderDied(ex), Actor.noSender)
+ }
+ }
+ }
+ }
+
+ override def run() {
+ this.setName("flow-reader " + serial.port)
+ readLoop()
+ }
+} \ No newline at end of file