aboutsummaryrefslogtreecommitdiff
path: root/flow/src/main/scala/com/github/jodersky/flow/SerialOperator.scala
diff options
context:
space:
mode:
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.scala36
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