diff options
Diffstat (limited to 'flow/src/main/scala/com/github/jodersky/flow/SerialOperator.scala')
-rw-r--r-- | flow/src/main/scala/com/github/jodersky/flow/SerialOperator.scala | 36 |
1 files changed, 10 insertions, 26 deletions
diff --git a/flow/src/main/scala/com/github/jodersky/flow/SerialOperator.scala b/flow/src/main/scala/com/github/jodersky/flow/SerialOperator.scala index 3ac50c0..69db4df 100644 --- a/flow/src/main/scala/com/github/jodersky/flow/SerialOperator.scala +++ b/flow/src/main/scala/com/github/jodersky/flow/SerialOperator.scala @@ -16,25 +16,17 @@ import akka.actor.Props * Operator associated to an open serial port. All communication with a port is done via an operator. Operators are created though the serial manager. * @see SerialManager */ -class SerialOperator(serial: InternalSerial) extends Actor with ActorLogging { +class SerialOperator(serial: InternalSerial, client: ActorRef) extends Actor with ActorLogging { import SerialOperator._ import context._ - private val receivers = new HashSet[ActorRef] - private val receiversLock = new Object - private def tellAllReceivers(msg: Any) = receiversLock.synchronized { - receivers.foreach { receiver => - receiver ! msg - } - } - private object Reader extends Thread { def readLoop() = { var continueReading = true while (continueReading) { try { val data = ByteString(serial.read()) - tellAllReceivers(Received(data)) + client ! Received(data) } catch { //port is closing, stop thread gracefully @@ -51,17 +43,17 @@ class SerialOperator(serial: InternalSerial) extends Actor with ActorLogging { } } - def name = this.getName() - override def run() { this.setName("flow-reader " + serial.port) readLoop() } } - - override def preStart() = { - Reader.start() - } + + + client ! Opened(serial.port) + context.watch(client) + Reader.start() + override def postStop = { serial.close() @@ -69,21 +61,13 @@ class SerialOperator(serial: InternalSerial) extends Actor with ActorLogging { def receive: Receive = { - case Register(actor) => receiversLock.synchronized { - receivers += actor - } - - case Unregister(actor) => receiversLock.synchronized { - receivers -= actor - } - case Write(data, ack) => { val sent = serial.write(data.toArray) if (ack != NoAck) sender ! ack } case Close => { - tellAllReceivers(Closed) + client ! Closed context stop self } @@ -97,5 +81,5 @@ class SerialOperator(serial: InternalSerial) extends Actor with ActorLogging { object SerialOperator { private case class ReadException(ex: Exception) - def apply(serial: InternalSerial) = Props(classOf[SerialOperator], serial) + def apply(serial: InternalSerial, client: ActorRef) = Props(classOf[SerialOperator], serial, client) }
\ No newline at end of file |