From 94a0ee545ab71c6779f15a5192745bedddfdb4d4 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Sun, 30 Jun 2013 11:56:29 +0200 Subject: solve cyclic dependency issue --- .../com/github/jodersky/flow/example/Main.scala | 37 +++++++++++++++ .../jodersky/flow/example/SerialHandler.scala | 55 ++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 flow-samples/rwc/src/main/scala/com/github/jodersky/flow/example/Main.scala create mode 100644 flow-samples/rwc/src/main/scala/com/github/jodersky/flow/example/SerialHandler.scala (limited to 'flow-samples/rwc/src') diff --git a/flow-samples/rwc/src/main/scala/com/github/jodersky/flow/example/Main.scala b/flow-samples/rwc/src/main/scala/com/github/jodersky/flow/example/Main.scala new file mode 100644 index 0000000..518efc2 --- /dev/null +++ b/flow-samples/rwc/src/main/scala/com/github/jodersky/flow/example/Main.scala @@ -0,0 +1,37 @@ +package com.github.jodersky.flow +package example + +import akka.actor.ActorSystem +import akka.actor.Props +import akka.actor.actorRef2Scala +import akka.util.ByteString + +object Main { + + def main(args: Array[String]): Unit = { + + /*val isInt = Try(args(1).toInt) match { case Success(_) => true; case _ => false } + if (!(args.length == 2 && isInt)) { + println("invalid parameters") + println("parameters: port baud") + println("example: /dev/ttyACM0 115200") + return + }*/ + val port = "/dev/ttyACM0" + val baud = 115200 + + // InternalSerial.debug(true) + + implicit val system = ActorSystem("flow") + val serial = system.actorOf(Props(classOf[SerialHandler], port, baud), name = "serial-handler") + + readLine() + serial ! ByteString("hello back".getBytes()) + + readLine() + serial ! "close" + readLine() + + system.shutdown() + } +} \ No newline at end of file diff --git a/flow-samples/rwc/src/main/scala/com/github/jodersky/flow/example/SerialHandler.scala b/flow-samples/rwc/src/main/scala/com/github/jodersky/flow/example/SerialHandler.scala new file mode 100644 index 0000000..e616763 --- /dev/null +++ b/flow-samples/rwc/src/main/scala/com/github/jodersky/flow/example/SerialHandler.scala @@ -0,0 +1,55 @@ +package com.github.jodersky.flow.example + +import com.github.jodersky.flow.Serial._ +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 +import akka.actor.Terminated + +class SerialHandler(port: String, baud: Int) extends Actor with ActorLogging { + import context._ + + log.info(s"Requesting manager to open port: ${port}, baud: ${baud}") + IO(Serial) ! Serial.Open(self, port, baud) + + def receive = { + + case OpenFailed(_, reason) => { + log.error(s"Connection failed, stopping handler. Reason: ${reason}") + context stop self + } + + case Opened(port) => { + log.info(s"Port ${port} is now open.") + context become opened(sender) + } + } + + def opened(operator: ActorRef): Receive = { + + case Received(data) => { + log.info("Received data: " + formatData(data)) + log.info("As string: " + new String(data.toArray, "UTF-8")) + } + case Wrote(data) => log.info("Got ACK for writing data: " + formatData(data)) + case Closed(None) => { + log.info("Operator closed normally, exiting handler.") + context stop self + } + case Closed(Some(ex)) => { + log.info("Operator crashed, exiting handler.") + context stop self + } + case "close" => { + log.info("Initiating close.") + operator ! Close + } + case data: ByteString => operator ! Write(data, true) + } + + private def formatData(data: ByteString) = data.mkString("[", ",", "]") + +} \ No newline at end of file -- cgit v1.2.3