aboutsummaryrefslogtreecommitdiff
path: root/scala/jssc/src/main/scala/com/github/jodersky/ace/jssc/Serial.scala
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2013-03-02 12:06:03 +0100
committerJakob Odersky <jodersky@gmail.com>2013-03-02 12:06:03 +0100
commit494b80da610fe2b4cb1790ae237437a17ac6ef62 (patch)
treed36b5ed810851198a21de640128631c9846a4835 /scala/jssc/src/main/scala/com/github/jodersky/ace/jssc/Serial.scala
parent5b00baec28e8e7976636df86f30bc3a6412f8203 (diff)
downloadace-494b80da610fe2b4cb1790ae237437a17ac6ef62.tar.gz
ace-494b80da610fe2b4cb1790ae237437a17ac6ef62.tar.bz2
ace-494b80da610fe2b4cb1790ae237437a17ac6ef62.zip
simplify scala implementation
Diffstat (limited to 'scala/jssc/src/main/scala/com/github/jodersky/ace/jssc/Serial.scala')
-rw-r--r--scala/jssc/src/main/scala/com/github/jodersky/ace/jssc/Serial.scala47
1 files changed, 47 insertions, 0 deletions
diff --git a/scala/jssc/src/main/scala/com/github/jodersky/ace/jssc/Serial.scala b/scala/jssc/src/main/scala/com/github/jodersky/ace/jssc/Serial.scala
new file mode 100644
index 0000000..508a79e
--- /dev/null
+++ b/scala/jssc/src/main/scala/com/github/jodersky/ace/jssc/Serial.scala
@@ -0,0 +1,47 @@
+package com.github.jodersky.ace.jssc
+
+import com.github.jodersky.ace.PhysicalLayer
+import jssc.SerialPortEvent
+import jssc.SerialPort
+import jssc.SerialPortEventListener
+import scala.concurrent._
+import scala.concurrent.ExecutionContext.Implicits.global
+import java.io.IOException
+
+class Serial(
+ portName: String,
+ baudRate: Int = 9600,
+ dataBits: Int = SerialPort.DATABITS_8,
+ stopBits: Int = SerialPort.STOPBITS_1,
+ parity: Int = SerialPort.PARITY_NONE) extends PhysicalLayer {
+
+ private val port = new SerialPort(portName)
+
+ private val listener = new SerialPortEventListener {
+ override def serialEvent(event: SerialPortEvent) = {
+ if (event.isRXCHAR()) {
+ val bytes = port.readBytes
+ if (bytes != null) notifyHigher(bytes.map(_ & 0xff))
+ }
+ }
+ }
+
+ def send(data: Seq[Int]) = future {
+ port.writeBytes(data.toArray.map(_.toByte))
+ } map { success =>
+ if (success) data
+ else throw new IOException("Could not write to serial port.")
+ }
+
+ def begin() {
+ val mask = SerialPort.MASK_RXCHAR + SerialPort.MASK_CTS + SerialPort.MASK_DSR
+
+ port.openPort()
+ port.setParams(baudRate, dataBits, stopBits, parity)
+ port.setEventsMask(mask)
+ port.addEventListener(listener)
+ }
+
+ def close() = port.closePort()
+
+} \ No newline at end of file