From c9c4864d3b63459ea8d989d13d9e83a058e3145e Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Thu, 11 Jul 2013 22:12:16 +0200 Subject: update example --- .../flow/samples/terminal/ConsoleReader.scala | 19 ++++++ .../jodersky/flow/samples/terminal/Main.scala | 18 +----- .../flow/samples/terminal/SerialHandler.scala | 54 ----------------- .../jodersky/flow/samples/terminal/Terminal.scala | 67 ++++++++++++++++++++++ 4 files changed, 89 insertions(+), 69 deletions(-) create mode 100644 flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/ConsoleReader.scala delete mode 100644 flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/SerialHandler.scala create mode 100644 flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/Terminal.scala diff --git a/flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/ConsoleReader.scala b/flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/ConsoleReader.scala new file mode 100644 index 0000000..6b06206 --- /dev/null +++ b/flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/ConsoleReader.scala @@ -0,0 +1,19 @@ +package com.github.jodersky.flow.samples.terminal + +import akka.actor._ + +case object Read +case class ConsoleInput(in: String) +class ConsoleReader extends Actor { + import context._ + + def receive = { + case Read => read() + } + + def read() = { + val in = Console.readLine() + parent ! ConsoleInput(in) + } + +} \ No newline at end of file diff --git a/flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/Main.scala b/flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/Main.scala index b8d332c..b6f45f3 100644 --- a/flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/Main.scala +++ b/flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/Main.scala @@ -24,23 +24,11 @@ object Main { val cs = ask("Char size", "8").toInt val tsb = ask("Use two stop bits", "false").toBoolean val parity = Parity(ask("Parity [0=None, 1=Odd, 2=Even]", "0").toInt) - println("Starting terminal, enter :q to exit.") + println("Starting terminal system, enter :q to exit.") internal.InternalSerial.debug(true) val system = ActorSystem("flow") - val serial = system.actorOf(Props(classOf[SerialHandler], port, baud, cs, tsb, parity), name = "serial-handler") - - var continue = true - while (continue) { - val in = Console.readLine() - if (in == ":q") { - continue = false - serial ! "close" - } else { - serial ! ByteString(in.getBytes()) - } - } - system.shutdown() - println("Stopped terminal.") + system.registerOnTermination(println("Stopped terminal system.")) + val terminal = system.actorOf(Props(classOf[Terminal], port, baud, cs, tsb, parity), name = "terminal") } } \ No newline at end of file diff --git a/flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/SerialHandler.scala b/flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/SerialHandler.scala deleted file mode 100644 index 33f276a..0000000 --- a/flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/SerialHandler.scala +++ /dev/null @@ -1,54 +0,0 @@ -package com.github.jodersky.flow.samples.terminal - -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 -import com.github.jodersky.flow.Parity - - -class SerialHandler(port: String, baud: Int, cs: Int, tsb: Boolean, parity: Parity.Parity) 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(s"Received data: ${formatData(data)} (${new String(data.toArray, "UTF-8")})") - } - case Wrote(data) => log.info(s"Wrote data: ${formatData(data)} (${new String(data.toArray, "UTF-8")})") - case Closed(None) => { - log.info("Operator closed normally, exiting handler.") - context stop self - } - case Closed(Some(ex)) => { - log.error("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 diff --git a/flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/Terminal.scala b/flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/Terminal.scala new file mode 100644 index 0000000..5ec8cde --- /dev/null +++ b/flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/Terminal.scala @@ -0,0 +1,67 @@ +package com.github.jodersky.flow.samples.terminal + +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 +import com.github.jodersky.flow.Parity +import akka.actor.Props + +class Terminal(port: String, baud: Int, cs: Int, tsb: Boolean, parity: Parity.Parity) extends Actor with ActorLogging { + import context._ + + val reader = actorOf(Props[ConsoleReader]) + + override def preStart() = { + log.info(s"Requesting manager to open port: ${port}, baud: ${baud}") + IO(Serial) ! Serial.Open(self, port, baud) + } + + override def postStop() = { + system.shutdown() + } + + def receive = { + case OpenFailed(reason, _, _, _, _, _) => { + log.error(s"Connection failed, stopping terminal. Reason: ${reason}") + context stop self + } + case Opened(port, _, _, _, _) => { + log.info(s"Port ${port} is now open.") + context become opened(sender) + reader ! Read + } + } + + def opened(operator: ActorRef): Receive = { + case Received(data) => { + log.info(s"Received data: ${formatData(data)} (${new String(data.toArray, "UTF-8")})") + } + case Wrote(data) => log.info(s"Wrote data: ${formatData(data)} (${new String(data.toArray, "UTF-8")})") + + case Closed(x) => { + x match { + case None => log.info("Operator closed normally, exiting terminal.") + case Some(ex) => log.error("Operator crashed, exiting terminal.") + } + context stop self + } + + case ConsoleInput(":q") => { + log.info("Initiating close.") + operator ! Close + } + + case ConsoleInput(input) => { + operator ! Write(ByteString(input.getBytes), true) + reader ! Read + } + } + + private def formatData(data: ByteString) = data.mkString("[", ",", "]") + +} \ No newline at end of file -- cgit v1.2.3