aboutsummaryrefslogtreecommitdiff
path: root/flow-core/src/main/scala/com/github/jodersky/flow/internal/Reader.scala
blob: 59ad575f7412ed3adc29d1486b42cc45c9f9f5e1 (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
package com.github.jodersky.flow
package internal

import akka.actor.{ Actor, ActorRef }
import akka.util.ByteString
import java.nio.ByteBuffer

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(Serial.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(ThreadDied(this, ex), Actor.noSender)
        }
      }
    }
  }

  override def run() {
    this.setName("flow-reader " + serial.port)
    readLoop()
  }
}