diff options
Diffstat (limited to 'mavigator-server/src/main/scala/mavigator')
-rw-r--r-- | mavigator-server/src/main/scala/mavigator/Main.scala | 40 | ||||
-rw-r--r-- | mavigator-server/src/main/scala/mavigator/Router.scala | 120 |
2 files changed, 88 insertions, 72 deletions
diff --git a/mavigator-server/src/main/scala/mavigator/Main.scala b/mavigator-server/src/main/scala/mavigator/Main.scala index 6ea894e..3ad1460 100644 --- a/mavigator-server/src/main/scala/mavigator/Main.scala +++ b/mavigator-server/src/main/scala/mavigator/Main.scala @@ -1,11 +1,12 @@ package mavigator +import scala.concurrent.{Await, TimeoutException} +import scala.concurrent.duration._ + import akka.actor._ import akka.http.scaladsl._ -import akka.http.scaladsl.server._ import akka.stream._ -import scala.concurrent.Await -import scala.concurrent.duration.Duration +import mavigator.uav.Uav object Main { @@ -15,30 +16,33 @@ object Main { def main(args: Array[String]): Unit = { import system.dispatcher - system.log.info("System started.") + val route = Router.route - val router = Router.route + system.log.info(s"Initializing UAV connection backend...") + Uav().init() - system.log.info(s"Starting server") - val binding = Http(system).bindAndHandle(router, "0.0.0.0", 8080) + system.log.info(s"Starting server...") + val binding = Http(system).bindAndHandle(route, "::", 8080) for (b <- binding) { val addr = b.localAddress.getHostString() val port = b.localAddress.getPort() system.log.info(s"Server is listening on $addr:$port") } - - scala.io.StdIn.readLine() - - binding.flatMap{b => - system.log.info("Shutting down server...") - b.unbind() - }.onComplete{ _ => - system.log.info("Server shut down") - system.terminate() - } - Await.result(system.whenTerminated, Duration.Inf) + sys.addShutdownHook { stop() } + } + def stop() = { + system.log.info("Stopping server...") + system.terminate() + + try { + Await.result(system.whenTerminated, 2.seconds) + System.err.println("Bye.") + } catch { + case ex: TimeoutException => + System.err.println("Shutdown is taking too long, exiting now") + } } } diff --git a/mavigator-server/src/main/scala/mavigator/Router.scala b/mavigator-server/src/main/scala/mavigator/Router.scala index 389cb4d..226d6c1 100644 --- a/mavigator-server/src/main/scala/mavigator/Router.scala +++ b/mavigator-server/src/main/scala/mavigator/Router.scala @@ -1,80 +1,92 @@ package mavigator import akka.actor._ -import akka.stream._ -import akka.stream.scaladsl._ -import akka.http.scaladsl._ +import akka.http.scaladsl.marshalling.{Marshaller, ToEntityMarshaller} +import akka.http.scaladsl.model.MediaTypes._ import akka.http.scaladsl.model._ +import akka.http.scaladsl.model.Uri.Path import akka.http.scaladsl.model.ws._ import akka.http.scaladsl.server._ -import uav.Uav import akka.util._ - -import akka.http.scaladsl.marshalling.{Marshaller, ToEntityMarshaller} -import akka.http.scaladsl.model.MediaTypes._ -import akka.http.scaladsl.model.MediaType -import play.twirl.api.{ Xml, Txt, Html } +import akka.stream.scaladsl._ +import play.twirl.api.Html +import uav.Uav object Router { import Directives._ - val socketUrl = "ws://localhost:8080/mavlink" + final val SocketEndpoint = "mavlink" + + def withSocketUri: Directive1[Uri] = extractUri.map { uri => + uri.withScheme("ws").withPath(Path.Empty / SocketEndpoint) + } def route(implicit system: ActorSystem): Route = ( - path("cockpit" / IntNumber) { id => + path("whoami") { get { - val html = mavigator.views.html.app( - "Mavigator", - "mavigator_cockpit_Main", - Map( - "socketUrl" -> socketUrl, - "remoteSystemId" -> "0", - "systemId" -> "0", - "componentId" -> "0" - ) - ) - complete(html) + withSocketUri { sock => + complete(sock.toString) + } } } ~ - path("mavlink") { - get { - val fromWebSocket = Flow[Message].collect{ - case BinaryMessage.Strict(data) => data + path("cockpit" / IntNumber) { id => + get { + withSocketUri { socket => + val html = mavigator.views.html.app( + "Mavigator", + "mavigator_cockpit_Main", + Map( + "socketUrl" -> socket.toString, + "remoteSystemId" -> id.toString + ) + ) + complete(html) + } } + } ~ + path(SocketEndpoint) { + get { + val fromWebSocket = Flow[Message].collect{ + case BinaryMessage.Strict(data) => data + } - val toWebSocket = Flow[ByteString].map{bytes => - BinaryMessage(bytes) - } + val toWebSocket = Flow[ByteString].map{bytes => + BinaryMessage(bytes) + } - val backend = Uav().connect() + val backend = Uav().connect() - handleWebSocketMessages(fromWebSocket via backend via toWebSocket) - } - } ~ - pathPrefix("assets") { - get { - encodeResponse { - getFromResourceDirectory("assets") + handleWebSocketMessages(fromWebSocket via backend via toWebSocket) + } + } ~ + pathEndOrSingleSlash { + get { + withSocketUri { socket => + val html = mavigator.views.html.app( + "Index", + "mavigator_index_Main", + Map( + "socketUrl" -> socket.toString + ) + ) + complete(html) + } + } + } ~ + pathPrefix("assets") { + get { + encodeResponse { + getFromResourceDirectory("assets") + } } } - } ~ - pathEndOrSingleSlash { - get { - val html = mavigator.views.html.app( - "Index", - "mavigator_index_Main", - Map( - "socketUrl" -> socketUrl - ) - ) - complete(html) - } - } ) - implicit val twirlHtml : ToEntityMarshaller[Html] = Marshaller.StringMarshaller.wrap(`text/html`){(h: Html) => - h.toString - } - + /** Enables completing requests with html. */ + implicit val twirlHtml : ToEntityMarshaller[Html] = + Marshaller.StringMarshaller.wrap(`text/html`){ h: Html => + h.toString + } + } |