diff options
Diffstat (limited to 'mavigator-cockpit/src/main/scala/mavigator/cockpit/MavlinkWebSockets.scala')
-rw-r--r-- | mavigator-cockpit/src/main/scala/mavigator/cockpit/MavlinkWebSockets.scala | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/mavigator-cockpit/src/main/scala/mavigator/cockpit/MavlinkWebSockets.scala b/mavigator-cockpit/src/main/scala/mavigator/cockpit/MavlinkWebSockets.scala new file mode 100644 index 0000000..3797005 --- /dev/null +++ b/mavigator-cockpit/src/main/scala/mavigator/cockpit/MavlinkWebSockets.scala @@ -0,0 +1,60 @@ +package mavigator +package cockpit + +import org.mavlink._ +import org.mavlink.Parser.Errors._ +import org.mavlink.messages._ + +import org.scalajs.dom +import scalajs.js + +trait MavlinkWebSockets { self: Instruments => + + private class MavlinkWebSocket(url: String, remoteSystemId: Int) { + + private var _open = false + def open: Boolean = _open + + private val parser = new Parser( + { + case pckt@Packet(seq, `remoteSystemId`, compId, msgId, payload) => + val msg = Message.unpack(pckt.messageId, pckt.payload) + onMessage(msg) + //_packets() = _packets.now + 1 + case _ => + //_wrongIds() = _wrongIds.now + 1 + }, + { + case CrcError => //_crcErrors() = _crcErrors.now + 1 + case OverflowError => //_overflows() = _overflows.now + 1 + } + ) + + private val connection = new dom.WebSocket(url) + + connection.binaryType = "arraybuffer" + + connection.onopen = (e: dom.Event) => { + _open = true + } + connection.onmessage = (e: dom.MessageEvent) => { + val buffer = e.data.asInstanceOf[js.typedarray.ArrayBuffer] + val view = new js.typedarray.DataView(buffer) + + for (i <- 0 until view.byteLength) { + parser.push(view.getInt8(i)) + } + } + connection.onclose = (e: dom.CloseEvent) => { + _open = false + } + + } + + private def onMessage(msg: Message): Unit = msg match { + case a: Attitude => attitudeOverlay.update((a.pitch.toFloat, a.roll.toFloat)) + case _ => () + } + + def connect(url: String, remoteSystemId: Int): Unit = new MavlinkWebSocket(url, remoteSystemId) +} |