aboutsummaryrefslogtreecommitdiff
path: root/vfd-main/app/plugins/UavPlugin.scala
blob: 00efb8d35f9a8e97aebbb4551f6cce0cfe97fc58 (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
package plugins

import akka.actor.ActorRef
import akka.actor.Props
import play.api.Application
import play.api.Plugin
import play.api.libs.concurrent.Akka
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).toByte

  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 compId = conn.flatMap(_.getInt("component_id")).getOrElse(1).toByte

    val props = tpe match {
      case "mock" =>
        val remote = config.flatMap(_.getInt("mock.remote_system_id")).getOrElse(0).toByte
        val prescaler = config.flatMap(_.getInt("mock.prescaler")).getOrElse(1)
        MockConnection(systemId, compId, remote, prescaler)

      case "serial" =>
        val serial = config.flatMap(_.getConfig("serial"))
        SerialConnection(
          systemId,
          compId,
          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 IllegalArgumentException("Unsupported connection type '" + unknown + "'")
    }

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

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

}