aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2013-06-18 12:59:05 +0200
committerJakob Odersky <jodersky@gmail.com>2013-06-18 12:59:05 +0200
commitdf6a79639dfb5241c57d9af4c6e2274de68166e0 (patch)
treea6a1107caf85f60bfc9135cf0696789e151befa0
parent6b86c91b3901c5d8ad28f68b248152d443954034 (diff)
downloadakka-serial-df6a79639dfb5241c57d9af4c6e2274de68166e0.tar.gz
akka-serial-df6a79639dfb5241c57d9af4c6e2274de68166e0.tar.bz2
akka-serial-df6a79639dfb5241c57d9af4c6e2274de68166e0.zip
modifications
-rw-r--r--main/src/main/scala/com/github/jodersky/flow/Serial.scala18
-rw-r--r--main/src/main/scala/com/github/jodersky/flow/SerialManager.scala5
-rw-r--r--main/src/main/scala/com/github/jodersky/flow/SerialOperator.scala30
-rw-r--r--main/src/main/scala/com/github/jodersky/flow/low/Serial.scala12
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