aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2013-06-18 23:55:38 +0200
committerJakob Odersky <jodersky@gmail.com>2013-06-18 23:55:38 +0200
commit892bd6053aff21cda2fbabddb824c9710d7baafa (patch)
tree2cff8af70946110fbb7c6e3a1d695c800b434733
parent98241aa830bedb006ae041dce661afd57c3d90a8 (diff)
downloadakka-serial-892bd6053aff21cda2fbabddb824c9710d7baafa.tar.gz
akka-serial-892bd6053aff21cda2fbabddb824c9710d7baafa.tar.bz2
akka-serial-892bd6053aff21cda2fbabddb824c9710d7baafa.zip
repair broken example
-rw-r--r--build.sbt0
-rw-r--r--project/Build.scala8
-rw-r--r--project/plugins.sbt4
-rw-r--r--samples/src/main/scala/com/github/jodersky/flow/example/Main.scala10
-rw-r--r--samples/src/main/scala/com/github/jodersky/flow/example/SerialHandler.scala46
-rw-r--r--src/main/native/flow.c1
-rw-r--r--src/main/scala/com/github/jodersky/flow/Framing.scala (renamed from src/main/scala/com/github/jodersky/flow/Framing.scalac)0
-rw-r--r--src/main/scala/com/github/jodersky/flow/Serial.scala (renamed from src/main/scala/com/github/jodersky/flow/Serial.scalac)2
-rw-r--r--src/main/scala/com/github/jodersky/flow/SerialManager.scala (renamed from src/main/scala/com/github/jodersky/flow/SerialManager.scalac)2
-rw-r--r--src/main/scala/com/github/jodersky/flow/SerialOperator.scala (renamed from src/main/scala/com/github/jodersky/flow/SerialOperator.scalac)24
10 files changed, 57 insertions, 40 deletions
diff --git a/build.sbt b/build.sbt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/build.sbt
diff --git a/project/Build.scala b/project/Build.scala
index 73f0894..a0f0baa 100644
--- a/project/Build.scala
+++ b/project/Build.scala
@@ -30,10 +30,10 @@ object FlowBuild extends Build {
}
) ++ Jni.defaultSettings)
- lazy val example = Project(
- id = "flow-example",
- base = file("example"),
- settings = buildSettings ++ runSettings ++ Seq(libraryDependencies ++= Dependencies.all))
+ lazy val samples = Project(
+ id = "flow-samples",
+ base = file("samples"),
+ settings = buildSettings ++ runSettings ++ Seq(libraryDependencies ++= Dependencies.all)).dependsOn(main)
lazy val buildSettings = Defaults.defaultSettings ++ Seq(
organization := Organization,
diff --git a/project/plugins.sbt b/project/plugins.sbt
index 6eb2159..f0483bb 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -1 +1,5 @@
+resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/snapshots/"
+
+addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.2.0")
+
addSbtPlugin("com.github.jodersky" % "sbt-native" % "1.0-SNAPSHOT")
diff --git a/samples/src/main/scala/com/github/jodersky/flow/example/Main.scala b/samples/src/main/scala/com/github/jodersky/flow/example/Main.scala
index 20fffe2..c25270b 100644
--- a/samples/src/main/scala/com/github/jodersky/flow/example/Main.scala
+++ b/samples/src/main/scala/com/github/jodersky/flow/example/Main.scala
@@ -26,15 +26,13 @@ object Main {
val port = "/dev/ttyACM0"
val baud = 115200
- //low.Serial.debug(true)
+ low.Serial.debug(true)
implicit val system = ActorSystem("flow")
- val serial = system.actorOf(Props[SerialHandler], name = "serial-handler")
-
- IO(Serial) ! Serial.Open(serial, port, baud)
-
+ val serial = system.actorOf(Props(classOf[SerialHandler], port, baud), name = "serial-handler")
+
readLine()
- serial ! Write(ByteString(42))
+ serial ! ByteString(42)
readLine()
//serial ! Close
diff --git a/samples/src/main/scala/com/github/jodersky/flow/example/SerialHandler.scala b/samples/src/main/scala/com/github/jodersky/flow/example/SerialHandler.scala
index d228cb9..2f7dfc3 100644
--- a/samples/src/main/scala/com/github/jodersky/flow/example/SerialHandler.scala
+++ b/samples/src/main/scala/com/github/jodersky/flow/example/SerialHandler.scala
@@ -1,36 +1,40 @@
package com.github.jodersky.flow.example
import com.github.jodersky.flow.Serial._
-import com.github.jodersky.flow.low.{Serial => LowSerial}
+import com.github.jodersky.flow.low.{ Serial => LowSerial }
import akka.actor.Actor
import akka.actor.ActorLogging
import akka.actor.ActorRef
import akka.util.ByteString
+import akka.io.IO
+import com.github.jodersky.flow.Serial
-class SerialHandler extends Actor with ActorLogging {
- var operator: Option[ActorRef] = None
+
+class SerialHandler(port: String, baud: Int) extends Actor with ActorLogging {
+ import context._
+
+ println(s"Requesting port open: ${port}, baud: ${baud}")
+ IO(Serial) ! Serial.Open(self, port, baud)
+
def receive = {
- case Opened(operator) => this.operator = Some(operator)
-
- case CommandFailed(cmd, reason) =>
- println(s"command ${cmd} failed, reason: ${reason}")
-
- case Received(data) => println("received data: " + formatData(data))
-
- case Close =>
- operator.map(_ ! Close)
-
- case Closed(_) => println("port closed")
-
- case Write(data) => {
- operator.map(_ ! Write(data))
+ case CommandFailed(_: Open, reason) => {
+ println(s"connection failed, reason: ${reason}")
+ context stop self
}
-
- case Wrote(data) => println("wrote data: " + formatData(data))
-
+
+ case Opened(operator) =>
+ println("Port opened.")
+ context become {
+ case Received(data) => println("received data: " + formatData(data))
+ case Wrote(data) => println("wrote ACK: " + formatData(data))
+ case CommandFailed(_, _) => println("write failed")
+ case Closed => context stop self
+ case "close" => operator ! Close
+ case data: ByteString => operator ! Write(data)
+ }
}
- private def formatData(data: ByteString) = data.mkString("[",",","]")
+ private def formatData(data: ByteString) = data.mkString("[", ",", "]")
} \ No newline at end of file
diff --git a/src/main/native/flow.c b/src/main/native/flow.c
index 09ffca6..ca91468 100644
--- a/src/main/native/flow.c
+++ b/src/main/native/flow.c
@@ -205,6 +205,7 @@ int serial_read(struct serial_config* serial, unsigned char * buffer, size_t siz
}
return r;
} else {
+ DEBUG(printf("poll pipe result %d\n", pp.revents));
return E_CLOSE;
}
}
diff --git a/src/main/scala/com/github/jodersky/flow/Framing.scalac b/src/main/scala/com/github/jodersky/flow/Framing.scala
index f8173a7..f8173a7 100644
--- a/src/main/scala/com/github/jodersky/flow/Framing.scalac
+++ b/src/main/scala/com/github/jodersky/flow/Framing.scala
diff --git a/src/main/scala/com/github/jodersky/flow/Serial.scalac b/src/main/scala/com/github/jodersky/flow/Serial.scala
index 7182425..1eacd6e 100644
--- a/src/main/scala/com/github/jodersky/flow/Serial.scalac
+++ b/src/main/scala/com/github/jodersky/flow/Serial.scala
@@ -22,7 +22,7 @@ object Serial extends ExtensionKey[SerialExt] {
case class Wrote(data: ByteString) extends Event
case object Close extends Command
-
+ case object Closed extends Event
case class CommandFailed(command: Command, reason: Throwable) extends Event
diff --git a/src/main/scala/com/github/jodersky/flow/SerialManager.scalac b/src/main/scala/com/github/jodersky/flow/SerialManager.scala
index ca3fc6b..4af2f9a 100644
--- a/src/main/scala/com/github/jodersky/flow/SerialManager.scalac
+++ b/src/main/scala/com/github/jodersky/flow/SerialManager.scala
@@ -19,7 +19,7 @@ class SerialManager extends Actor {
val operator = context.actorOf(Props(classOf[SerialOperator], serial, handler), name = escapePortString(port))
handler ! Opened(operator)
}
- case Failure(t) => sender ! CommandFailed(command, t)
+ case Failure(t) => handler ! CommandFailed(command, t)
})
}
diff --git a/src/main/scala/com/github/jodersky/flow/SerialOperator.scalac b/src/main/scala/com/github/jodersky/flow/SerialOperator.scala
index 21d2067..6177188 100644
--- a/src/main/scala/com/github/jodersky/flow/SerialOperator.scalac
+++ b/src/main/scala/com/github/jodersky/flow/SerialOperator.scala
@@ -13,18 +13,26 @@ import scala.concurrent._
class SerialOperator(serial: LowSerial, handler: ActorRef) extends Actor {
import context._
-
- context.watch(handler)
- class Reader extends Actor {
- while (true) {
- val data = ByteString(serial.read())
- handler ! Received(data)
+ object Reader extends Thread {
+ private var continueReading = true
+
+ override def run() {
+ while (continueReading) {
+ println("beginning read")
+ val data = ByteString(serial.read())
+ println("return from read")
+ handler ! Received(data)
+ }
}
}
+
+ Reader.start()
+
+ context.watch(handler)
def receive = {
- case Write(data) => {
+ case c @ Write(data) => {
val writer = sender
future{serial.write(data.toArray)}.onComplete {
case Success(data) => writer ! Wrote(ByteString(data))
@@ -33,6 +41,8 @@ class SerialOperator(serial: LowSerial, handler: ActorRef) extends Actor {
}
case Close => {
+ serial.close()
+ sender ! Closed
context.stop(self)
}
}