blob: 7b3f2efc1dc6a0f09b5fc22d68127be06afdb8c1 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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()
}
}
|