diff options
-rw-r--r-- | project/Build.scala | 7 | ||||
-rw-r--r-- | project/Dependencies.scala | 3 | ||||
-rw-r--r-- | vfd-backend/app/controllers/Application.scala | 18 | ||||
-rw-r--r-- | vfd-frontend/src/main/scala/Frontend.scala | 37 |
4 files changed, 41 insertions, 24 deletions
diff --git a/project/Build.scala b/project/Build.scala index 9c6789b..f4a7834 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -40,10 +40,12 @@ object ApplicationBuild extends Build { enablePlugins(PlayScala) settings(common: _*) settings( + resolvers += Resolver.url("scala-js-releases", url("http://dl.bintray.com/content/scala-js/scala-js-releases"))(Resolver.ivyStylePatterns), libraryDependencies ++= Seq( bootstrap, fontawesome, - jquery + jquery, + picklingPlay ) ) dependsOn(uav) @@ -57,7 +59,8 @@ object ApplicationBuild extends Build { settings( libraryDependencies ++= Seq( rx, - dom + dom, + pickling ) ) ) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 73b07ac..ae56455 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -14,5 +14,8 @@ object Dependencies { val dom = "org.scala-lang.modules.scalajs" %%%! "scalajs-dom" % "0.6" val rx = "com.scalarx" %%%! "scalarx" % "0.2.5" + val pickling = "org.scalajs" %%%! "scalajs-pickling" % "0.3.1" + val picklingPlay = "org.scalajs" %% "scalajs-pickling-play-json" % "0.3.1" + }
\ No newline at end of file diff --git a/vfd-backend/app/controllers/Application.scala b/vfd-backend/app/controllers/Application.scala index 5a473b4..f048a07 100644 --- a/vfd-backend/app/controllers/Application.scala +++ b/vfd-backend/app/controllers/Application.scala @@ -5,7 +5,6 @@ import play.api.mvc._ import play.api.Play.current import play.api.mvc.WebSocket.FrameFormatter -import play.api.libs.functional.syntax._ import play.api.libs.json._ import vfd.uav.DataFrame @@ -22,7 +21,22 @@ object Application extends Controller { Ok(views.html.index()) } - implicit val dataFrameFormat = Json.format[DataFrame] + implicit object DataFrameFormat extends Format[DataFrame] { + import org.scalajs.spickling._ + import org.scalajs.spickling.playjson._ + import play.api.data.validation.ValidationError + + PicklerRegistry.register[DataFrame] + + def writes(o: DataFrame): JsValue = PicklerRegistry.pickle(o) + + def reads(j: JsValue): JsResult[DataFrame] = PicklerRegistry.unpickle(j) match { + case df: DataFrame => JsSuccess(df) + case _ => JsError("unpickling yielded wrong type") + } + } + + //implicit val dataFrameFormat = Json.format[DataFrame] implicit val dataFrameFormatter = FrameFormatter.jsonFrame[DataFrame] def socket = WebSocket.acceptWithActor[String, DataFrame] { request => diff --git a/vfd-frontend/src/main/scala/Frontend.scala b/vfd-frontend/src/main/scala/Frontend.scala index 9a628f6..dcb6a8d 100644 --- a/vfd-frontend/src/main/scala/Frontend.scala +++ b/vfd-frontend/src/main/scala/Frontend.scala @@ -3,36 +3,33 @@ import scala.scalajs.js import js.annotation.JSExport import org.scalajs.dom +import org.scalajs.spickling._ +import org.scalajs.spickling.jsany._ -class Data extends js.Object { - def roll: Double = ??? - def pitch: Double = ??? - def heading: Double = ??? - def altitude: Double = ??? - def temperature: Double = ??? -} @JSExport -class Frontend(attitudeSelector: String, azimuthSelector: String, altitudeSelector: String) { +class Frontend { + PicklerRegistry.register[vfd.uav.DataFrame] - val svg = dom.document.querySelector(attitudeSelector).asInstanceOf[dom.HTMLObjectElement] - val svg2 = dom.document.querySelector(azimuthSelector).asInstanceOf[dom.HTMLObjectElement] - var svgDoc = svg.contentDocument; - var svgDoc2 = svg2.contentDocument; - val svg3 = dom.document.querySelector(altitudeSelector).asInstanceOf[dom.HTMLObjectElement] - var svgDoc3 = svg3.contentDocument; + lazy val attitude = dom.document.getElementById("attitude").asInstanceOf[dom.HTMLObjectElement].contentDocument + lazy val heading = dom.document.getElementById("heading").asInstanceOf[dom.HTMLObjectElement].contentDocument + lazy val altitude = dom.document.getElementById("altitude").asInstanceOf[dom.HTMLObjectElement].contentDocument @JSExport def main() = { - var roll = svgDoc.getElementById("roll"); - var pitch = svgDoc.getElementById("pitch"); - var heading = svgDoc2.getElementById("heading"); - var altitude = svgDoc3.getElementById("hand") + var roll = attitude.getElementById("roll"); + var pitch = attitude.getElementById("pitch"); + var heading = this.heading.getElementById("heading"); + var altitude = this.altitude.getElementById("hand") val connection = new dom.WebSocket("ws://localhost:9000/socket"); connection.onmessage = (e: dom.MessageEvent) => { - Console.println(e.data); - val data = js.JSON.parse(e.data.asInstanceOf[String]).asInstanceOf[Data] + + val data = PicklerRegistry.unpickle(js.JSON.parse(e.data.asInstanceOf[String]).asInstanceOf[js.Any] ).asInstanceOf[vfd.uav.DataFrame] + //Console.println(d.roll) + + + roll.setAttribute("transform", "rotate(" + data.roll.toDouble + ")"); pitch.setAttribute("transform", "translate(0, " + data.pitch.toDouble + ")"); |