diff options
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.scala | 40 |
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 |