aboutsummaryrefslogtreecommitdiff
path: root/vfd-backend/app/plugins/UavPlugin.scala
blob: 2e5af65bca7465ee7cf4704079044b1cb1569dea (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package plugins

import akka.actor.Actor
import akka.actor.ActorLogging
import akka.actor.ActorRef
import akka.actor.Props
import akka.actor.actorRef2Scala
import play.api.Application
import play.api.Plugin
import play.api.libs.concurrent.Akka
import vfd.uav.Connection
import vfd.uav.MockConnection
import vfd.uav.SerialConnection

class UavPlugin(app: Application) extends Plugin {

  private lazy val config = app.configuration.getConfig("uav")

  lazy val systemId = config.flatMap(_.getInt("system_id")).getOrElse(1)

  private lazy val connection = {
    val conn = config.flatMap(_.getConfig("connection"))
    val tpe = conn.flatMap(_.getString("type")).getOrElse("mock")
    val heartbeat = conn.flatMap(_.getInt("heartbeat")).getOrElse(2000)
    val id = conn.flatMap(_.getInt("component_id")).getOrElse(99).toByte

    val props = tpe match {
      case "mock" =>
        MockConnection.apply

      case "serial" =>
        val serial = config.flatMap(_.getConfig("serial"))
        SerialConnection(
          id,
          heartbeat,
          serial.flatMap(_.getString("port")).getOrElse("/dev/ttyUSB0"),
          serial.flatMap(_.getInt("baud")).getOrElse(115200),
          serial.flatMap(_.getBoolean("two_stop_bits")).getOrElse(false),
          serial.flatMap(_.getInt("parity")).getOrElse(0))

      case unknown => throw new RuntimeException("Unsupported connection type '" + unknown + "'")
    }

    Akka.system(app).actorOf(props, name = "uav-connection")
  }

  def register(websocket: ActorRef): Props = Props(classOf[ClientConnection], websocket, connection)

}

class ClientConnection(websocket: ActorRef, uav: ActorRef) extends Actor with ActorLogging {

  override def preStart = {
    uav ! Connection.Register
  }

  def receive = {

    case Connection.Received(bstr) =>
      log.info(bstr.toArray.mkString(","))
      websocket ! bstr.toArray


    case Connection.Closed(msg) =>
      log.warning(msg)
      context stop self

  }

}