diff options
Diffstat (limited to 'flow-main/src/main/scala/com/github/jodersky/flow/SerialManager.scala')
-rw-r--r-- | flow-main/src/main/scala/com/github/jodersky/flow/SerialManager.scala | 48 |
1 files changed, 48 insertions, 0 deletions
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 new file mode 100644 index 0000000..eb8c44e --- /dev/null +++ b/flow-main/src/main/scala/com/github/jodersky/flow/SerialManager.scala @@ -0,0 +1,48 @@ +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 Serial.CommandFailed +import Serial.Open +import akka.actor.Actor +import akka.actor.ActorLogging +import akka.actor.OneForOneStrategy +import akka.actor.SupervisorStrategy.Stop +import akka.actor.actorRef2Scala + +/** + * Entry point to the serial API. Actor that manages serial port creation. Once opened, a serial port is handed over to + * a dedicated operator actor that acts as an intermediate between client code and the native system serial port. + * @see SerialOperator + */ +class SerialManager extends Actor with ActorLogging { + import SerialManager._ + import context._ + + override val supervisorStrategy = OneForOneStrategy() { + case _: Exception => Stop + } + + def receive = { + case open @ Open(port, settings, bufferSize) => Try { + SerialConnection.open(port, settings) + } match { + case Success(connection) => context.actorOf(SerialOperator(connection, bufferSize, sender), name = escapePortString(connection.port)) + case Failure(err) => sender ! CommandFailed(open, err) + } + } + +} + +object SerialManager { + + private def escapePortString(port: String) = port collect { + case '/' => '-' + case c => c + } + +}
\ No newline at end of file |