aboutsummaryrefslogtreecommitdiff
path: root/scala/ace/src/main/scala/com/github/jodersky/ace/Framer.scala
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2013-02-27 15:53:33 +0100
committerJakob Odersky <jodersky@gmail.com>2013-02-27 15:53:33 +0100
commit793983ca31eb05fce655ed5877b6f3faa4577acd (patch)
tree94929b35094209df2964cd69068a0b9a270095dd /scala/ace/src/main/scala/com/github/jodersky/ace/Framer.scala
parent20a2350f9b33a797763413509781d0686fc38fe5 (diff)
downloadace-793983ca31eb05fce655ed5877b6f3faa4577acd.tar.gz
ace-793983ca31eb05fce655ed5877b6f3faa4577acd.tar.bz2
ace-793983ca31eb05fce655ed5877b6f3faa4577acd.zip
restructure scala implementation
Diffstat (limited to 'scala/ace/src/main/scala/com/github/jodersky/ace/Framer.scala')
-rw-r--r--scala/ace/src/main/scala/com/github/jodersky/ace/Framer.scala83
1 files changed, 0 insertions, 83 deletions
diff --git a/scala/ace/src/main/scala/com/github/jodersky/ace/Framer.scala b/scala/ace/src/main/scala/com/github/jodersky/ace/Framer.scala
deleted file mode 100644
index 52496e4..0000000
--- a/scala/ace/src/main/scala/com/github/jodersky/ace/Framer.scala
+++ /dev/null
@@ -1,83 +0,0 @@
-package com.github.jodersky.ace
-
-import scala.collection.mutable.ArrayBuffer
-import scala.concurrent.Future
-import scala.concurrent.ExecutionContext.Implicits.global
-
-/** A framer takes bytes (as unsigned integers) and creates frames.
- * Note that the input type of this reactive layer is also a sequence of
- * integers for performance reasons (i.e. a future will not be created for every byte sent).
- */
-class Framer extends ReactiveLayer[Seq[Int], Seq[Int]] {
- import Framer._
-
- private var state: State = Waiting
- private val buffer = new ArrayBuffer[Int]
-
- def receive(bytes: Seq[Int]) = bytes foreach receive
-
- def receive(byte: Int): Unit = {
-
- state match {
- case Escaping => {
- buffer += byte
- state = Receiving
- }
- case Waiting => if (byte == Start) {
- buffer.clear()
- state = Receiving
- }
- case Receiving => byte match {
- case Escape => state = Escaping
- case Start => buffer.clear()
- case Stop => {
- state = Waiting
- if (checksum(buffer.init) == buffer.last)
- notifyHigher(buffer.init)
- }
- case datum => buffer += datum
- }
- }
- }
-
- def write(data: Seq[Int]): Future[Seq[Int]] = {
- val buffer = new ArrayBuffer[Int]
-
- buffer += Start
- data foreach { byte =>
- byte match {
- case Start | Stop | Escape => {
- buffer += Escape
- buffer += byte
- }
- case _ => buffer += byte
- }
- }
- val c = checksum(data)
- c match {
- case Start | Stop | Escape => {
- buffer += Escape
- buffer += c
- }
- case _ => buffer += c
- }
- buffer += Stop
- writeToLower(buffer) map (_ => data)
- }
-}
-
-object Framer {
- sealed trait State
- case object Waiting extends State
- case object Receiving extends State
- case object Escaping extends State
-
- final val Escape = 0x02
- final val Start = 0x03
- final val Stop = 0x10
-
- def checksum(unsignedData: Seq[Int]) = {
- unsignedData.fold(0)(_ ^ _)
- }
-
-} \ No newline at end of file