diff options
author | Jakob Odersky <jodersky@gmail.com> | 2013-07-11 22:12:16 +0200 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2013-07-11 22:12:16 +0200 |
commit | c9c4864d3b63459ea8d989d13d9e83a058e3145e (patch) | |
tree | 8e2017dcf0ee4c912936c5eb74cf32d05cd58a89 | |
parent | 6a40acc11f6611a24c776134945edba369135d5a (diff) | |
download | akka-serial-c9c4864d3b63459ea8d989d13d9e83a058e3145e.tar.gz akka-serial-c9c4864d3b63459ea8d989d13d9e83a058e3145e.tar.bz2 akka-serial-c9c4864d3b63459ea8d989d13d9e83a058e3145e.zip |
update example
-rw-r--r-- | flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/ConsoleReader.scala | 19 | ||||
-rw-r--r-- | flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/Main.scala | 18 | ||||
-rw-r--r-- | flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/Terminal.scala (renamed from flow-samples/terminal/src/main/scala/com/github/jodersky/flow/samples/terminal/SerialHandler.scala) | 41 |
3 files changed, 49 insertions, 29 deletions
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/Terminal.scala index 33f276a..5ec8cde 100644 --- 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/Terminal.scala @@ -9,44 +9,57 @@ 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 SerialHandler(port: String, baud: Int, cs: Int, tsb: Boolean, parity: Parity.Parity) extends Actor with ActorLogging { +class Terminal(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) + 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 handler. Reason: ${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(None) => { - log.info("Operator closed normally, exiting handler.") - context stop self - } - case Closed(Some(ex)) => { - log.error("Operator crashed, exiting handler.") + + 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 "close" => { + + case ConsoleInput(":q") => { log.info("Initiating close.") operator ! Close } - case data: ByteString => operator ! Write(data, true) + + case ConsoleInput(input) => { + operator ! Write(ByteString(input.getBytes), true) + reader ! Read + } } private def formatData(data: ByteString) = data.mkString("[", ",", "]") |