diff options
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.scala | 47 |
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 |