aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2013-06-25 18:04:06 +0200
committerJakob Odersky <jodersky@gmail.com>2013-06-25 18:04:06 +0200
commit8ed6731a397f2639938747e03fc60c7f4106df2a (patch)
tree4606a36d8655a6bae0e7e8f1fafc4762daf2c8f6
parent5d4e198b4a60dfb7f012cf259b172478ba8cbf08 (diff)
downloadakka-serial-8ed6731a397f2639938747e03fc60c7f4106df2a.tar.gz
akka-serial-8ed6731a397f2639938747e03fc60c7f4106df2a.tar.bz2
akka-serial-8ed6731a397f2639938747e03fc60c7f4106df2a.zip
add logging
-rw-r--r--src/main/scala/com/github/jodersky/flow/Serial.scala8
-rw-r--r--src/main/scala/com/github/jodersky/flow/SerialExt.scala9
-rw-r--r--src/main/scala/com/github/jodersky/flow/SerialManager.scala9
-rw-r--r--src/main/scala/com/github/jodersky/flow/SerialOperator.scala29
-rw-r--r--src/main/scala/com/github/jodersky/flow/low/Serial.scala14
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))
}