diff options
14 files changed, 70 insertions, 114 deletions
diff --git a/flow-main/src/main/scala/com/github/jodersky/flow/Parity.scala b/flow-main/src/main/scala/com/github/jodersky/flow/Parity.scala index 9bf52a6..04d64a9 100644 --- a/flow-main/src/main/scala/com/github/jodersky/flow/Parity.scala +++ b/flow-main/src/main/scala/com/github/jodersky/flow/Parity.scala @@ -6,4 +6,4 @@ object Parity extends Enumeration { val None = Value(0) val Odd = Value(1) val Even = Value(2) -}
\ No newline at end of file +} diff --git a/flow-main/src/main/scala/com/github/jodersky/flow/SerialExt.scala b/flow-main/src/main/scala/com/github/jodersky/flow/SerialExt.scala index 38e140a..5c1ddf6 100644 --- a/flow-main/src/main/scala/com/github/jodersky/flow/SerialExt.scala +++ b/flow-main/src/main/scala/com/github/jodersky/flow/SerialExt.scala @@ -1,10 +1,9 @@ package com.github.jodersky.flow -import akka.actor.ExtendedActorSystem -import akka.actor.Props +import akka.actor.{ ExtendedActorSystem, Props } import akka.io.IO /** Provides the serial IO manager. */ class SerialExt(system: ExtendedActorSystem) extends IO.Extension { lazy val manager = system.systemActorOf(Props(classOf[SerialManager]), name = "IO-SERIAL") -}
\ No newline at end of file +} diff --git a/flow-main/src/main/scala/com/github/jodersky/flow/SerialManager.scala b/flow-main/src/main/scala/com/github/jodersky/flow/SerialManager.scala index 40739ca..686cdb3 100644 --- a/flow-main/src/main/scala/com/github/jodersky/flow/SerialManager.scala +++ b/flow-main/src/main/scala/com/github/jodersky/flow/SerialManager.scala @@ -1,17 +1,9 @@ package com.github.jodersky.flow -import scala.util.Failure -import scala.util.Success -import scala.util.Try - -import com.github.jodersky.flow.internal.SerialConnection -import com.github.jodersky.flow.internal.Watcher - -import akka.actor.Actor -import akka.actor.ActorLogging -import akka.actor.OneForOneStrategy +import akka.actor.{ Actor, ActorLogging, OneForOneStrategy } import akka.actor.SupervisorStrategy.Stop -import akka.actor.actorRef2Scala +import internal.{ SerialConnection, Watcher } +import scala.util.{ Failure, Success, Try } /** * Entry point to the serial API. Actor that manages serial port creation. Once opened, a serial port is handed over to diff --git a/flow-main/src/main/scala/com/github/jodersky/flow/SerialOperator.scala b/flow-main/src/main/scala/com/github/jodersky/flow/SerialOperator.scala index f40f4de..ec0ee27 100644 --- a/flow-main/src/main/scala/com/github/jodersky/flow/SerialOperator.scala +++ b/flow-main/src/main/scala/com/github/jodersky/flow/SerialOperator.scala @@ -1,23 +1,9 @@ package com.github.jodersky.flow +import akka.actor.{ Actor, ActorLogging, ActorRef, Props, Terminated, actorRef2Scala } +import internal.{ Reader, SerialConnection, ThreadDied } import java.nio.ByteBuffer -import com.github.jodersky.flow.internal.Reader -import com.github.jodersky.flow.internal.ThreadDied -import com.github.jodersky.flow.internal.SerialConnection - -import Serial.Close -import Serial.Closed -import Serial.NoAck -import Serial.Opened -import Serial.Write -import akka.actor.Actor -import akka.actor.ActorLogging -import akka.actor.ActorRef -import akka.actor.Props -import akka.actor.Terminated -import akka.actor.actorRef2Scala - /** * Operator associated to an open serial port. All communication with a port is done via an operator. Operators are created though the serial manager. * @see SerialManager @@ -31,7 +17,7 @@ class SerialOperator(connection: SerialConnection, bufferSize: Int, client: Acto val writeBuffer = ByteBuffer.allocateDirect(bufferSize) context.watch(client) - client ! Opened(connection.port) + client ! Serial.Opened(connection.port) reader.start() override def postStop = { @@ -40,18 +26,18 @@ class SerialOperator(connection: SerialConnection, bufferSize: Int, client: Acto def receive: Receive = { - case Write(data, ack) => { + case Serial.Write(data, ack) => { writeBuffer.clear() data.copyToBuffer(writeBuffer) val sent = connection.write(writeBuffer) - if (ack != NoAck) sender ! ack(sent) + if (ack != Serial.NoAck) sender ! ack(sent) } - case Close => { - client ! Closed + case Serial.Close => { + client ! Serial.Closed context stop self } - + case Terminated(`client`) => { context stop self } diff --git a/flow-main/src/main/scala/com/github/jodersky/flow/SerialSettings.scala b/flow-main/src/main/scala/com/github/jodersky/flow/SerialSettings.scala index 08a5556..087fa6e 100644 --- a/flow-main/src/main/scala/com/github/jodersky/flow/SerialSettings.scala +++ b/flow-main/src/main/scala/com/github/jodersky/flow/SerialSettings.scala @@ -7,4 +7,4 @@ package com.github.jodersky.flow * @param twoStopBits set to use two stop bits instead of one * @param parity type of parity to use with serial port */ -case class SerialSettings(baud: Int, characterSize: Int = 8, twoStopBits: Boolean = false, parity: Parity.Parity = Parity.None)
\ No newline at end of file +case class SerialSettings(baud: Int, characterSize: Int = 8, twoStopBits: Boolean = false, parity: Parity.Parity = Parity.None) diff --git a/flow-main/src/main/scala/com/github/jodersky/flow/exceptions.scala b/flow-main/src/main/scala/com/github/jodersky/flow/exceptions.scala index adefcea..ebc0e65 100644 --- a/flow-main/src/main/scala/com/github/jodersky/flow/exceptions.scala +++ b/flow-main/src/main/scala/com/github/jodersky/flow/exceptions.scala @@ -16,4 +16,4 @@ class InvalidSettingsException(message: String) extends Exception(message) class PortInterruptedException(message: String) extends Exception(message) /** The specified port has been closed. */ -class PortClosedException(message: String) extends Exception(message)
\ No newline at end of file +class PortClosedException(message: String) extends Exception(message) diff --git a/flow-main/src/main/scala/com/github/jodersky/flow/internal/NativeLoader.scala b/flow-main/src/main/scala/com/github/jodersky/flow/internal/NativeLoader.scala index dc539ea..a5fdc40 100644 --- a/flow-main/src/main/scala/com/github/jodersky/flow/internal/NativeLoader.scala +++ b/flow-main/src/main/scala/com/github/jodersky/flow/internal/NativeLoader.scala @@ -1,9 +1,7 @@ -package com.github.jodersky.flow.internal +package com.github.jodersky.flow +package internal -import java.io.File -import java.io.FileOutputStream -import java.io.InputStream -import java.io.OutputStream +import java.io.{ File, FileOutputStream, InputStream, OutputStream } /** Handles loading of the current platform's native library for flow. */ object NativeLoader { @@ -46,8 +44,8 @@ object NativeLoader { extract(path, fqlib) match { case Some(file) => System.load(file.getAbsolutePath) case None => throw new UnsatisfiedLinkError("Cannot extract flow's native library, " + - "the native library does not exist for your specific architecture/OS combination." + - "Could not find " + path + ".") + "the native library does not exist for your specific architecture/OS combination." + + "Could not find " + path + ".") } } diff --git a/flow-main/src/main/scala/com/github/jodersky/flow/internal/Reader.scala b/flow-main/src/main/scala/com/github/jodersky/flow/internal/Reader.scala index 42400c8..59ad575 100644 --- a/flow-main/src/main/scala/com/github/jodersky/flow/internal/Reader.scala +++ b/flow-main/src/main/scala/com/github/jodersky/flow/internal/Reader.scala @@ -1,13 +1,9 @@ -package com.github.jodersky.flow.internal +package com.github.jodersky.flow +package internal -import java.nio.ByteBuffer - -import com.github.jodersky.flow.PortInterruptedException -import com.github.jodersky.flow.Serial.Received - -import akka.actor.Actor -import akka.actor.ActorRef +import akka.actor.{ Actor, ActorRef } import akka.util.ByteString +import java.nio.ByteBuffer class Reader(serial: SerialConnection, buffer: ByteBuffer, operator: ActorRef, client: ActorRef) extends Thread { def readLoop() = { @@ -18,7 +14,7 @@ class Reader(serial: SerialConnection, buffer: ByteBuffer, operator: ActorRef, c val length = serial.read(buffer) buffer.limit(length) val data = ByteString.fromByteBuffer(buffer) - client.tell(Received(data), operator) + client.tell(Serial.Received(data), operator) } catch { //don't do anything if port is interrupted diff --git a/flow-main/src/main/scala/com/github/jodersky/flow/internal/SerialConnection.scala b/flow-main/src/main/scala/com/github/jodersky/flow/internal/SerialConnection.scala index b4242fe..73416e3 100644 --- a/flow-main/src/main/scala/com/github/jodersky/flow/internal/SerialConnection.scala +++ b/flow-main/src/main/scala/com/github/jodersky/flow/internal/SerialConnection.scala @@ -1,11 +1,9 @@ -package com.github.jodersky.flow.internal +package com.github.jodersky.flow +package internal import java.nio.ByteBuffer import java.util.concurrent.atomic.AtomicBoolean -import com.github.jodersky.flow.PortClosedException -import com.github.jodersky.flow.SerialSettings - /** * Represents a serial connection in a more secure and object-oriented style than `NativeSerial`. In contrast * to the latter, this class encapsulates and secures any pointers used to communicate with the native @@ -16,7 +14,8 @@ import com.github.jodersky.flow.SerialSettings class SerialConnection private ( val port: String, val settings: SerialSettings, - private val pointer: Long) { + private val pointer: Long +) { import SerialConnection._ @@ -74,7 +73,8 @@ class SerialConnection private ( try { transfer( b => NativeSerial.readDirect(pointer, b), - b => NativeSerial.read(pointer, b.array()))(buffer) + b => NativeSerial.read(pointer, b.array()) + )(buffer) } finally { reading = false if (closed.get) readLock.notify() @@ -105,7 +105,8 @@ class SerialConnection private ( try { transfer( b => NativeSerial.writeDirect(pointer, b, b.position()), - b => NativeSerial.write(pointer, b.array(), b.position()))(buffer) + b => NativeSerial.write(pointer, b.array(), b.position()) + )(buffer) } finally { writing = false if (closed.get) writeLock.notify() @@ -154,4 +155,4 @@ object SerialConnection { */ def debug(value: Boolean) = NativeSerial.debug(value) -}
\ No newline at end of file +} diff --git a/flow-main/src/main/scala/com/github/jodersky/flow/internal/ThreadDied.scala b/flow-main/src/main/scala/com/github/jodersky/flow/internal/ThreadDied.scala index 0674354..1470aa5 100644 --- a/flow-main/src/main/scala/com/github/jodersky/flow/internal/ThreadDied.scala +++ b/flow-main/src/main/scala/com/github/jodersky/flow/internal/ThreadDied.scala @@ -1,3 +1,4 @@ -package com.github.jodersky.flow.internal +package com.github.jodersky.flow +package internal case class ThreadDied(thread: Thread, reason: Exception) diff --git a/flow-main/src/main/scala/com/github/jodersky/flow/internal/Watcher.scala b/flow-main/src/main/scala/com/github/jodersky/flow/internal/Watcher.scala index 4548aa0..3c30ccb 100644 --- a/flow-main/src/main/scala/com/github/jodersky/flow/internal/Watcher.scala +++ b/flow-main/src/main/scala/com/github/jodersky/flow/internal/Watcher.scala @@ -1,7 +1,7 @@ -package com.github.jodersky.flow.internal +package com.github.jodersky.flow +package internal import akka.actor.{ Actor, ActorRef, Props } -import com.github.jodersky.flow.Serial import java.nio.file.{ ClosedWatchServiceException, FileSystems, Path, Paths, WatchEvent, WatchKey } import java.nio.file.StandardWatchEventKinds._ import scala.collection.JavaConversions._ 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 index 8eb1f15..68a79db 100644 --- 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 @@ -1,7 +1,8 @@ -package com.github.jodersky.flow.samples.terminal +package com.github.jodersky.flow +package samples.terminal import akka.actor.Actor -import akka.actor.actorRef2Scala +import scala.io.StdIn class ConsoleReader extends Actor { import context._ @@ -9,7 +10,7 @@ class ConsoleReader extends Actor { def receive = { case Read => - Console.readLine() match { + StdIn.readLine() match { case ":q" | null => parent ! EOT case s => { parent ! ConsoleInput(s) @@ -25,4 +26,4 @@ object ConsoleReader { case object EOT case class ConsoleInput(in: String) -}
\ 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 5b17265..1447b78 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 @@ -1,17 +1,15 @@ package com.github.jodersky.flow package samples.terminal -import com.github.jodersky.flow.Parity -import com.github.jodersky.flow.SerialSettings -import com.github.jodersky.flow.internal.SerialConnection - import akka.actor.ActorSystem +import internal.SerialConnection +import scala.io.StdIn object Main { - + def ask(label: String, default: String) = { print(label + " [" + default.toString + "]: ") - val in = Console.readLine() + val in = StdIn.readLine() println("") if (in.isEmpty) default else in } @@ -30,4 +28,4 @@ object Main { val terminal = system.actorOf(Terminal(port, settings), name = "terminal") system.registerOnTermination(println("Stopped terminal system.")) } -}
\ 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 index cf75d98..82f6b4f 100644 --- 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 @@ -1,21 +1,7 @@ -package com.github.jodersky.flow.samples.terminal - -import com.github.jodersky.flow.Serial -import com.github.jodersky.flow.Serial.Close -import com.github.jodersky.flow.Serial.Closed -import com.github.jodersky.flow.Serial.CommandFailed -import com.github.jodersky.flow.Serial.Event -import com.github.jodersky.flow.Serial.Opened -import com.github.jodersky.flow.Serial.Received -import com.github.jodersky.flow.Serial.Write -import com.github.jodersky.flow.SerialSettings - -import akka.actor.Actor -import akka.actor.ActorLogging -import akka.actor.ActorRef -import akka.actor.Props -import akka.actor.Terminated -import akka.actor.actorRef2Scala +package com.github.jodersky.flow +package samples.terminal + +import akka.actor.{ Actor, ActorLogging, ActorRef, Props, Terminated, actorRef2Scala } import akka.io.IO import akka.util.ByteString @@ -24,20 +10,20 @@ class Terminal(port: String, settings: SerialSettings) extends Actor with ActorL import context._ val reader = actorOf(Props[ConsoleReader]) - + log.info(s"Requesting manager to open port: ${port}, baud: ${settings.baud}") IO(Serial) ! Serial.Open(port, settings) - + override def postStop() = { system.shutdown() } def receive = { - case CommandFailed(cmd, reason) => { + case Serial.CommandFailed(cmd, reason) => { log.error(s"Connection failed, stopping terminal. Reason: ${reason}") context stop self } - case Opened(port) => { + case Serial.Opened(port) => { log.info(s"Port ${port} is now open.") val operator = sender context become opened(operator) @@ -47,19 +33,19 @@ class Terminal(port: String, settings: SerialSettings) extends Actor with ActorL } def opened(operator: ActorRef): Receive = { - - case Received(data) => { + + case Serial.Received(data) => { log.info(s"Received data: ${formatData(data)}") } - - case Wrote(data) => log.info(s"Wrote data: ${formatData(data)}") - case Closed => { + case Terminal.Wrote(data) => log.info(s"Wrote data: ${formatData(data)}") + + case Serial.Closed => { log.info("Operator closed normally, exiting terminal.") context unwatch operator context stop self } - + case Terminated(`operator`) => { log.error("Operator crashed, exiting terminal.") context stop self @@ -67,25 +53,23 @@ class Terminal(port: String, settings: SerialSettings) extends Actor with ActorL case ConsoleReader.EOT => { log.info("Initiating close.") - operator ! Close + operator ! Serial.Close } case ConsoleReader.ConsoleInput(input) => { val data = ByteString(input.getBytes) - operator ! Write(data, length => Wrote(data.take(length))) + operator ! Serial.Write(data, length => Wrote(data.take(length))) reader ! ConsoleReader.Read } } - - } object Terminal { - case class Wrote(data: ByteString) extends Event - + case class Wrote(data: ByteString) extends Serial.Event + def apply(port: String, settings: SerialSettings) = Props(classOf[Terminal], port, settings) - + private def formatData(data: ByteString) = data.mkString("[", ",", "]") + " " + (new String(data.toArray, "UTF-8")) - -}
\ No newline at end of file + +} |