diff options
-rw-r--r-- | build.sbt | 0 | ||||
-rw-r--r-- | project/Build.scala | 8 | ||||
-rw-r--r-- | project/plugins.sbt | 4 | ||||
-rw-r--r-- | samples/src/main/scala/com/github/jodersky/flow/example/Main.scala | 10 | ||||
-rw-r--r-- | samples/src/main/scala/com/github/jodersky/flow/example/SerialHandler.scala | 46 | ||||
-rw-r--r-- | src/main/native/flow.c | 1 | ||||
-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) } } |