diff options
author | Jakob Odersky <jodersky@gmail.com> | 2013-06-25 18:04:06 +0200 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2013-06-25 18:04:06 +0200 |
commit | 8ed6731a397f2639938747e03fc60c7f4106df2a (patch) | |
tree | 4606a36d8655a6bae0e7e8f1fafc4762daf2c8f6 | |
parent | 5d4e198b4a60dfb7f012cf259b172478ba8cbf08 (diff) | |
download | akka-serial-8ed6731a397f2639938747e03fc60c7f4106df2a.tar.gz akka-serial-8ed6731a397f2639938747e03fc60c7f4106df2a.tar.bz2 akka-serial-8ed6731a397f2639938747e03fc60c7f4106df2a.zip |
add logging
5 files changed, 44 insertions, 25 deletions
diff --git a/src/main/scala/com/github/jodersky/flow/Serial.scala b/src/main/scala/com/github/jodersky/flow/Serial.scala index 1eacd6e..7929ef2 100644 --- a/src/main/scala/com/github/jodersky/flow/Serial.scala +++ b/src/main/scala/com/github/jodersky/flow/Serial.scala @@ -2,7 +2,6 @@ package com.github.jodersky.flow import akka.io._ import akka.actor.ExtensionKey -import akka.actor.ExtendedActorSystem import akka.actor.Props import low.{ Serial => LowSerial } import akka.actor.ActorRef @@ -18,7 +17,7 @@ object Serial extends ExtensionKey[SerialExt] { case class Received(data: ByteString) extends Event - case class Write(data: ByteString) extends Command + case class Write(data: ByteString, ack: Boolean = false) extends Command case class Wrote(data: ByteString) extends Event case object Close extends Command @@ -26,9 +25,4 @@ object Serial extends ExtensionKey[SerialExt] { case class CommandFailed(command: Command, reason: Throwable) extends Event - } - -class SerialExt(system: ExtendedActorSystem) extends IO.Extension { - def manager = system.actorOf(Props[SerialManager], name = "IO-SERIAL") -}
\ No newline at end of file diff --git a/src/main/scala/com/github/jodersky/flow/SerialExt.scala b/src/main/scala/com/github/jodersky/flow/SerialExt.scala new file mode 100644 index 0000000..14da388 --- /dev/null +++ b/src/main/scala/com/github/jodersky/flow/SerialExt.scala @@ -0,0 +1,9 @@ +package com.github.jodersky.flow + +import akka.actor.ExtendedActorSystem +import akka.io.IO +import akka.actor.Props + +class SerialExt(system: ExtendedActorSystem) extends IO.Extension { + lazy val manager = system.actorOf(Props[SerialManager], name = "IO-SERIAL") +}
\ No newline at end of file diff --git a/src/main/scala/com/github/jodersky/flow/SerialManager.scala b/src/main/scala/com/github/jodersky/flow/SerialManager.scala index 4af2f9a..3e6e543 100644 --- a/src/main/scala/com/github/jodersky/flow/SerialManager.scala +++ b/src/main/scala/com/github/jodersky/flow/SerialManager.scala @@ -7,8 +7,9 @@ import scala.util.Success import scala.util.Failure import akka.actor.Props import scala.concurrent._ +import akka.actor.ActorLogging -class SerialManager extends Actor { +class SerialManager extends Actor with ActorLogging { import SerialManager._ import context._ @@ -16,10 +17,14 @@ class SerialManager extends Actor { case command @ Open(handler, port, baud) => future{LowSerial.open(port, baud)}.onComplete(_ match { case Success(serial) => { + log.debug(s"opened low serial port at ${port}, baud ${baud}") 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) => { + log.debug(s"failed to open low serial port at ${port}, baud ${baud}, reason: " + t.getMessage()) + handler ! CommandFailed(command, t) + } }) } diff --git a/src/main/scala/com/github/jodersky/flow/SerialOperator.scala b/src/main/scala/com/github/jodersky/flow/SerialOperator.scala index 951e9f9..b1e8a0d 100644 --- a/src/main/scala/com/github/jodersky/flow/SerialOperator.scala +++ b/src/main/scala/com/github/jodersky/flow/SerialOperator.scala @@ -1,17 +1,23 @@ package com.github.jodersky.flow +import scala.concurrent.future import scala.util.Failure import scala.util.Success -import Serial._ + +import Serial.Close +import Serial.Closed +import Serial.CommandFailed +import Serial.Received +import Serial.Write +import Serial.Wrote import akka.actor.Actor import akka.actor.ActorLogging import akka.actor.ActorRef +import akka.actor.actorRef2Scala import akka.util.ByteString -import low.{ Serial => LowSerial } -import scala.util.Try -import scala.concurrent._ +import low.{Serial => LowSerial} -class SerialOperator(serial: LowSerial, handler: ActorRef) extends Actor { +class SerialOperator(serial: LowSerial, handler: ActorRef) extends Actor with ActorLogging { import context._ object Reader extends Thread { @@ -19,16 +25,21 @@ class SerialOperator(serial: LowSerial, handler: ActorRef) extends Actor { override def run() { Thread.currentThread().setName("flow-reader " + serial.port) + log.debug("started read thread " + Thread.currentThread().getName()) while (continueReading) { try { - println("beginning read") + log.debug("enter blocking read") val data = ByteString(serial.read()) - println("return from read") + log.debug("return from blocking read") handler ! Received(data) } catch { - case ex: PortInterruptedException => continueReading = false + case ex: PortInterruptedException => { + continueReading = false + log.debug("interrupted from blocking read") + } } } + log.debug("exit read thread normally " + Thread.currentThread().getName()) } } @@ -37,7 +48,7 @@ class SerialOperator(serial: LowSerial, handler: ActorRef) extends Actor { context.watch(handler) def receive = { - case c @ Write(data) => { + case c @ Write(data, ack) => { val writer = sender future { serial.write(data.toArray) }.onComplete { case Success(data) => writer ! Wrote(ByteString(data)) diff --git a/src/main/scala/com/github/jodersky/flow/low/Serial.scala b/src/main/scala/com/github/jodersky/flow/low/Serial.scala index fcf4d37..32fb888 100644 --- a/src/main/scala/com/github/jodersky/flow/low/Serial.scala +++ b/src/main/scala/com/github/jodersky/flow/low/Serial.scala @@ -21,10 +21,10 @@ class Serial private (val port: String, private val pointer: Long) { def close(): Unit = if (!closed.get()) { closed.set(true) - requireSuccess(NativeSerial.interrupt(pointer), port) + except(NativeSerial.interrupt(pointer), port) if (writing.get()) synchronized{wait()} // if reading, wait for read to finish if (reading.get()) synchronized{wait()} - requireSuccess(NativeSerial.close(pointer), port) + except(NativeSerial.close(pointer), port) } def read(): Array[Byte] = if (!closed.get) { @@ -33,7 +33,7 @@ class Serial private (val port: String, private val pointer: Long) { val readResult = NativeSerial.read(pointer, buffer) if (closed.get) synchronized{notify()}; //read was interrupted by close reading.set(false) - val n = requireSuccess(readResult, port) + val n = except(readResult, port) buffer take n } else { throw new PortClosedException(s"port ${port} is already closed") @@ -44,7 +44,7 @@ class Serial private (val port: String, private val pointer: Long) { val writeResult = NativeSerial.write(pointer, data) if (closed.get) synchronized{notify()} writing.set(false) - val n = requireSuccess(writeResult, port) + val n = except(writeResult, port) data take n } else { throw new PortClosedException(s"port ${port} is already closed") @@ -55,11 +55,11 @@ class Serial private (val port: String, private val pointer: Long) { object Serial { import NativeSerial._ - private def requireSuccess(result: Int, port: String): Int = result match { + private def except(result: Int, port: String): Int = result match { case E_IO => throw new IOException(port) case E_ACCESS_DENIED => throw new AccessDeniedException(port) case E_BUSY => throw new PortInUseException(port) - case E_INVALID_BAUD => throw new IllegalBaudRateException("use standard baud rate (see termios.h)") + case E_INVALID_BAUD => throw new IllegalBaudRateException("use standard baud rate") case E_INTERRUPT => throw new PortInterruptedException(port) case E_NO_PORT => throw new NoSuchPortException(port) case error if error < 0 => throw new IOException(s"unknown error code: ${error}") @@ -68,7 +68,7 @@ object Serial { def open(port: String, baud: Int): Serial = synchronized { val pointer = new Array[Long](1) - requireSuccess(NativeSerial.open(port, baud, pointer), port) + except(NativeSerial.open(port, baud, pointer), port) new Serial(port, pointer(0)) } |