diff options
Diffstat (limited to 'main/src')
4 files changed, 28 insertions, 37 deletions
diff --git a/main/src/main/scala/com/github/jodersky/flow/Serial.scala b/main/src/main/scala/com/github/jodersky/flow/Serial.scala index 3f28ad8..7182425 100644 --- a/main/src/main/scala/com/github/jodersky/flow/Serial.scala +++ b/main/src/main/scala/com/github/jodersky/flow/Serial.scala @@ -12,19 +12,21 @@ object Serial extends ExtensionKey[SerialExt] { trait Command trait Event - - case class CommandFailed(command: Command, reason: Throwable) extends Event - + case class Open(handler: ActorRef, port: String, baud: Int) extends Command - case class Opened(operator: ActorRef) extends Command - - case object Close extends Command - case class Closed(reason: Throwable) extends Event + case class Opened(operator: ActorRef) extends Event + + case class Received(data: ByteString) extends Event case class Write(data: ByteString) extends Command case class Wrote(data: ByteString) extends Event - case class Received(data: ByteString) extends Event + case object Close extends Command + + + case class CommandFailed(command: Command, reason: Throwable) extends Event + + } class SerialExt(system: ExtendedActorSystem) extends IO.Extension { diff --git a/main/src/main/scala/com/github/jodersky/flow/SerialManager.scala b/main/src/main/scala/com/github/jodersky/flow/SerialManager.scala index b288a71..ca3fc6b 100644 --- a/main/src/main/scala/com/github/jodersky/flow/SerialManager.scala +++ b/main/src/main/scala/com/github/jodersky/flow/SerialManager.scala @@ -6,6 +6,7 @@ import low.{ Serial => LowSerial } import scala.util.Success import scala.util.Failure import akka.actor.Props +import scala.concurrent._ class SerialManager extends Actor { import SerialManager._ @@ -13,12 +14,12 @@ class SerialManager extends Actor { def receive = { case command @ Open(handler, port, baud) => - LowSerial.open(port, baud).onComplete(_ match { + future{LowSerial.open(port, baud)}.onComplete(_ match { case Success(serial) => { val operator = context.actorOf(Props(classOf[SerialOperator], serial, handler), name = escapePortString(port)) handler ! Opened(operator) } - case Failure(t) => handler ! CommandFailed(command, t) + case Failure(t) => sender ! CommandFailed(command, t) }) } diff --git a/main/src/main/scala/com/github/jodersky/flow/SerialOperator.scala b/main/src/main/scala/com/github/jodersky/flow/SerialOperator.scala index dcfb22b..21d2067 100644 --- a/main/src/main/scala/com/github/jodersky/flow/SerialOperator.scala +++ b/main/src/main/scala/com/github/jodersky/flow/SerialOperator.scala @@ -2,47 +2,41 @@ package com.github.jodersky.flow import scala.util.Failure import scala.util.Success - import Serial._ import akka.actor.Actor import akka.actor.ActorLogging import akka.actor.ActorRef import akka.util.ByteString import low.{ Serial => LowSerial } +import scala.util.Try +import scala.concurrent._ class SerialOperator(serial: LowSerial, handler: ActorRef) extends Actor { import context._ context.watch(handler) - startRead() + + class Reader extends Actor { + while (true) { + val data = ByteString(serial.read()) + handler ! Received(data) + } + } def receive = { - case c @ Write(data) => { + case Write(data) => { val writer = sender - serial.write(data.toArray).onComplete { + future{serial.write(data.toArray)}.onComplete { case Success(data) => writer ! Wrote(ByteString(data)) case Failure(t) => writer ! CommandFailed(c, t) } } + case Close => { context.stop(self) } } - private def startRead(): Unit = { - val futureData = serial.read() - futureData.onComplete { - case Failure(t) => { - handler ! Closed(t) - context.stop(self) - } - case Success(data) => { - handler ! Received(ByteString(data)) - startRead() - } - } - } - override def postStop = { serial.close() } diff --git a/main/src/main/scala/com/github/jodersky/flow/low/Serial.scala b/main/src/main/scala/com/github/jodersky/flow/low/Serial.scala index ac58187..e482bf8 100644 --- a/main/src/main/scala/com/github/jodersky/flow/low/Serial.scala +++ b/main/src/main/scala/com/github/jodersky/flow/low/Serial.scala @@ -12,7 +12,7 @@ import scala.util.Try class Serial private (val port: String, private val pointer: Long) { import NativeSerial._ - private def doRead(): Array[Byte] = synchronized { + def read(): Array[Byte] = synchronized { val buffer = new Array[Byte](100) NativeSerial.read(pointer, buffer) match { case E_POINTER => throw new NullPointerException("pointer to native serial") @@ -24,7 +24,7 @@ class Serial private (val port: String, private val pointer: Long) { } } - private def doWrite(data: Array[Byte]): Array[Byte] = { + def write(data: Array[Byte]): Array[Byte] = { import NativeSerial._ NativeSerial.write(pointer, data) match { case E_POINTER => throw new NullPointerException("pointer to native serial") @@ -34,10 +34,6 @@ class Serial private (val port: String, private val pointer: Long) { } } - def read() = future { doRead() } - - def write(data: Array[Byte]) = future { doWrite(data) } - def close() = { NativeSerial.close(pointer) } @@ -46,7 +42,7 @@ class Serial private (val port: String, private val pointer: Long) { object Serial { - def doOpen(port: String, baud: Int) = synchronized { + def open(port: String, baud: Int) = synchronized { val pointer = new Array[Long](1) val result = NativeSerial.open(port, baud, pointer) @@ -64,8 +60,6 @@ object Serial { } } - def open(port: String, baud: Int) = future { doOpen(port, baud) } - def debug(value: Boolean) = NativeSerial.debug(value) }
\ No newline at end of file |