diff options
Diffstat (limited to 'scala/rxtx/src')
-rw-r--r-- | scala/rxtx/src/main/scala/com/github/jodersky/ace/rxtx/Serial.scala | 56 | ||||
-rw-r--r-- | scala/rxtx/src/test/scala/com/github/jodersky/ace/rxtx/test/Main.scala | 27 |
2 files changed, 83 insertions, 0 deletions
diff --git a/scala/rxtx/src/main/scala/com/github/jodersky/ace/rxtx/Serial.scala b/scala/rxtx/src/main/scala/com/github/jodersky/ace/rxtx/Serial.scala new file mode 100644 index 0000000..1af3898 --- /dev/null +++ b/scala/rxtx/src/main/scala/com/github/jodersky/ace/rxtx/Serial.scala @@ -0,0 +1,56 @@ +package com.github.jodersky.ace.rxtx + +import scala.concurrent._ +import scala.concurrent.ExecutionContext.Implicits.global +import java.io.IOException +import gnu.io.CommPort +import gnu.io.CommPortIdentifier +import gnu.io.SerialPort +import gnu.io.SerialPortEvent +import gnu.io.SerialPortEventListener +import scala.collection.mutable.ArrayBuffer +import com.github.jodersky.ace.PhysicalLayer + +class Serial( + portName: String, + baudRate: Int = 9600, + dataBits: Int = SerialPort.DATABITS_8, + stopBits: Int = SerialPort.STOPBITS_1, + parity: Int = SerialPort.PARITY_NONE) extends PhysicalLayer { + + lazy val portIdentifier = { + System.setProperty("gnu.io.rxtx.SerialPorts", portName); + CommPortIdentifier.getPortIdentifier(portName) + } + + private lazy val port: SerialPort = { + if (portIdentifier.isCurrentlyOwned()) throw new IOException("Port " + portName + " is currently in use") + val commPort = portIdentifier.open(this.getClass().getName(), 2000); + val serialPort = commPort.asInstanceOf[SerialPort] + serialPort.setSerialPortParams(baudRate, dataBits, stopBits, parity) + serialPort + } + + private lazy val listener = new SerialPortEventListener { + override def serialEvent(event: SerialPortEvent) = { + val in = port.getInputStream() + while (in.available() > 0) { + notifyHigher(Seq(in.read() & 0xff)) + } + } + } + + def send(data: Seq[Int]) = future { + port.getOutputStream().write(data.map(_.toByte).toArray) + } map { _ => data } + + def begin() = { + port.addEventListener(listener) + port.notifyOnDataAvailable(true) + } + + def close() = { + port.close() + } + +}
\ No newline at end of file diff --git a/scala/rxtx/src/test/scala/com/github/jodersky/ace/rxtx/test/Main.scala b/scala/rxtx/src/test/scala/com/github/jodersky/ace/rxtx/test/Main.scala new file mode 100644 index 0000000..1b42fa3 --- /dev/null +++ b/scala/rxtx/src/test/scala/com/github/jodersky/ace/rxtx/test/Main.scala @@ -0,0 +1,27 @@ +package com.github.jodersky.ace.rxtx.test + +import com.github.jodersky.ace.Arq; +import com.github.jodersky.ace.Framer; +import com.github.jodersky.ace._ +import com.github.jodersky.ace.rxtx._ +import scala.concurrent.ExecutionContext.Implicits.global + + +object Main { + + def main(args: Array[String]): Unit = { + val serial = new Serial("/dev/ttyACM0") + val framer = new Framer + val arq = new Arq(200) + val app = new SimpleActionLayer((s: Seq[Int]) => println(s)) + + serial connect framer connect arq connect app + serial.begin() + + while (true) { + app.send(Console.readLine.getBytes().map(_.toInt)).map(sent => Console.println("> " + sent)) + } + + } + +}
\ No newline at end of file |