diff options
Diffstat (limited to 'mavigator-cockpit/src/main/scala/mavigator/index/Main.scala')
-rw-r--r-- | mavigator-cockpit/src/main/scala/mavigator/index/Main.scala | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/mavigator-cockpit/src/main/scala/mavigator/index/Main.scala b/mavigator-cockpit/src/main/scala/mavigator/index/Main.scala new file mode 100644 index 0000000..7724f89 --- /dev/null +++ b/mavigator-cockpit/src/main/scala/mavigator/index/Main.scala @@ -0,0 +1,97 @@ +package mavigator.index + +import scala.scalajs.js +import scala.scalajs.js.annotation.JSExport + +import org.scalajs.dom.html + +import mavigator.dashboard.ui.Layout +import mavigator.util.Environment +import mavigator.util.Application + +import scalatags.JsDom.all._ + +import org.mavlink.Parser +import org.mavlink.messages.Message +import org.mavlink.messages.Heartbeat + +import org.scalajs.dom + +import rx._ + + +@JSExport("mavigator_index_Main") +object Main extends Application { + import Util._ + + val active = Var(Set.empty[ActiveVehicle]) + + val parser = new Parser( + packet => { + val m: Message = Message.unpack(packet.messageId, packet.payload) + println(m) + m match { + case hb: Heartbeat => + active() += ActiveVehicle.fromHeartbeat(packet.systemId, hb) + case _ => () + } + } + ) + + override def main(args: Map[String, String])(implicit env: Environment): Unit = { + val root = env.root + val connection = new dom.WebSocket(args("socketUrl")) + + connection.binaryType = "arraybuffer" + 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.Event) => { + while (root.firstChild != null) { + root.removeChild(root.firstChild); + } + root.appendChild( + div(`class`:="alert alert-danger")( + "Connection to server unexpectedly closed. Check server logs for errors." + ).render + ) + + } + + root.appendChild(div( + table(`class` := "table table-hover")( + thead( + tr( + th("System ID"), + th("Type"), + th("Autopilot"), + th("State"), + th("") + ) + ), + Rx { + tbody( + for (vehicle <- active().toSeq) yield { + tr( + td(vehicle.systemId), + td(vehicle.vehicleType), + td(vehicle.autopilot), + td(vehicle.state), + td(a(href := "/dashboard/" + vehicle.systemId, `class` := "btn btn-default")("Pilot")) + ) + } + ) + } + ), + i(`class`:="fa fa-spinner fa-spin")(), + " Listening for heartbeats..." + ).render) + + } +} |