aboutsummaryrefslogtreecommitdiff
path: root/mavigator-cockpit/src/main/scala/mavigator/cockpit/MavlinkWebSockets.scala
diff options
context:
space:
mode:
Diffstat (limited to 'mavigator-cockpit/src/main/scala/mavigator/cockpit/MavlinkWebSockets.scala')
-rw-r--r--mavigator-cockpit/src/main/scala/mavigator/cockpit/MavlinkWebSockets.scala60
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)
+}