aboutsummaryrefslogtreecommitdiff
path: root/vfd-uav/src
diff options
context:
space:
mode:
Diffstat (limited to 'vfd-uav/src')
-rw-r--r--vfd-uav/src/main/scala/vfd/uav/Connection.scala6
-rw-r--r--vfd-uav/src/main/scala/vfd/uav/MavlinkUtil.scala13
-rw-r--r--vfd-uav/src/main/scala/vfd/uav/MockConnection.scala46
-rw-r--r--vfd-uav/src/main/scala/vfd/uav/SerialConnection.scala28
4 files changed, 51 insertions, 42 deletions
diff --git a/vfd-uav/src/main/scala/vfd/uav/Connection.scala b/vfd-uav/src/main/scala/vfd/uav/Connection.scala
index 38e1836..b99aadd 100644
--- a/vfd-uav/src/main/scala/vfd/uav/Connection.scala
+++ b/vfd-uav/src/main/scala/vfd/uav/Connection.scala
@@ -1,16 +1,12 @@
package vfd.uav
import scala.collection.mutable.ArrayBuffer
+
import akka.actor.Actor
import akka.actor.ActorRef
import akka.actor.Terminated
import akka.actor.actorRef2Scala
import akka.util.ByteString
-import org.mavlink.Assembler
-import org.mavlink.messages.Message
-import org.mavlink.Parser
-import org.mavlink.Packet
-import akka.actor.ActorLogging
/** Protocol definition. */
object Connection {
diff --git a/vfd-uav/src/main/scala/vfd/uav/MavlinkUtil.scala b/vfd-uav/src/main/scala/vfd/uav/MavlinkUtil.scala
index edc8484..8a8c364 100644
--- a/vfd-uav/src/main/scala/vfd/uav/MavlinkUtil.scala
+++ b/vfd-uav/src/main/scala/vfd/uav/MavlinkUtil.scala
@@ -1,14 +1,13 @@
package vfd.uav
import org.mavlink.Assembler
-import akka.util.ByteString
import org.mavlink.Packet
-import akka.actor.Actor
-import org.mavlink.messages.Ping
-import org.mavlink.messages.Ack
-import org.mavlink.messages.Message
import org.mavlink.Parser
+import org.mavlink.messages.Message
+
+import akka.actor.Actor
import akka.actor.ActorLogging
+import akka.util.ByteString
/** Provides utilities for actors representing a mavlink connection. */
trait MavlinkUtil { myself: Actor with ActorLogging =>
@@ -31,10 +30,12 @@ trait MavlinkUtil { myself: Actor with ActorLogging =>
/** Parser for messages being sent to the uav. */
protected val outgoing: Parser = new Parser(packet => Message.unpack(packet.messageId, packet.payload) match {
+ //TODO handle ping
+ /*
case Ping(`systemId`, `componentId`) =>
val message = Ack(packet.systemId, packet.componentId)
val data = assemble(message)
- self ! Connection.Received(data)
+ self ! Connection.Received(data)*/
case _ => ()
})
diff --git a/vfd-uav/src/main/scala/vfd/uav/MockConnection.scala b/vfd-uav/src/main/scala/vfd/uav/MockConnection.scala
index 801c4ac..6c2dbc8 100644
--- a/vfd-uav/src/main/scala/vfd/uav/MockConnection.scala
+++ b/vfd-uav/src/main/scala/vfd/uav/MockConnection.scala
@@ -1,30 +1,43 @@
package vfd.uav
import java.util.concurrent.TimeUnit.MILLISECONDS
+
import scala.concurrent.duration.FiniteDuration
import scala.util.Random
+
+import org.mavlink.Packet
+import org.mavlink.enums.MavAutopilot
+import org.mavlink.enums.MavModeFlag
+import org.mavlink.enums.MavState
+import org.mavlink.enums.MavType
+import org.mavlink.messages.Heartbeat
+
import Connection.Received
import akka.actor.Actor
import akka.actor.ActorLogging
import akka.actor.Props
import akka.util.ByteString
-import org.mavlink.messages._
-import org.mavlink.Packet
class MockConnection(localSystemId: Byte, localComponentId: Byte, remoteSystemId: Byte) extends Actor with ActorLogging with Connection with MavlinkUtil {
import Connection._
import context._
-
+
override val systemId = remoteSystemId
override val componentId = remoteSystemId
- val MessageInterval = FiniteDuration(100, MILLISECONDS)
-
- def randomData: ByteString = Random.nextInt(MockPackets.Messages + 1) match {
- case 0 => ByteString(MockPackets.invalid)
- case i => assemble(MockPackets.message(i - 1))
- }
-
+ val MessageInterval = FiniteDuration(1000, MILLISECONDS)
+
+ def randomData: ByteString =
+ assemble(
+ Heartbeat(
+ MavType.MavTypeGeneric.toByte,
+ MavAutopilot.MavAutopilotGeneric.toByte,
+ (MavModeFlag.MavModeFlagSafetyArmed | MavModeFlag.MavModeFlagManualInputEnabled).toByte,
+ 0, //no custom mode
+ MavState.MavStateActive.toByte,
+ 0 //TODO properly implement read-only fields
+ ))
+
override def preStart() = context.system.scheduler.schedule(MessageInterval, MessageInterval) {
sendAll(Received(randomData))
}
@@ -43,19 +56,6 @@ object MockPackets {
def nextByte(): Byte = r.nextInt().toByte
def nextByte(max: Int): Byte = r.nextInt(max).toByte
}
-
- def heartbeat = Heartbeat(0)
- def motor = Motor(r.nextByte(101), r.nextByte(101), r.nextByte(101), r.nextByte(101))
- def attitude = Attitude((r.nextInt(160) - 80).toShort, (r.nextInt(160) - 80).toShort, r.nextInt(360).toShort)
- def power = Power(Random.nextInt(12000).toShort)
-
- val Messages = 4
- def message(i: Int) = i match {
- case 0 => heartbeat
- case 1 => motor
- case 2 => attitude
- case 3 => power
- }
val invalidCrc = Array(254, 1, 123, 13, 13).map(_.toByte)
val invalidOverflow = {
diff --git a/vfd-uav/src/main/scala/vfd/uav/SerialConnection.scala b/vfd-uav/src/main/scala/vfd/uav/SerialConnection.scala
index 4b2e71a..1756cac 100644
--- a/vfd-uav/src/main/scala/vfd/uav/SerialConnection.scala
+++ b/vfd-uav/src/main/scala/vfd/uav/SerialConnection.scala
@@ -1,16 +1,19 @@
package vfd.uav
import java.util.concurrent.TimeUnit.MILLISECONDS
+
import scala.concurrent.duration.FiniteDuration
-import org.mavlink.Packet
-import org.mavlink.Parser
-import org.mavlink.Assembler
+
+import org.mavlink.enums.MavAutopilot
+import org.mavlink.enums.MavModeFlag
+import org.mavlink.enums.MavState
+import org.mavlink.enums.MavType
import org.mavlink.messages.Heartbeat
-import org.mavlink.messages.Ack
-import org.mavlink.messages.Message
+
import com.github.jodersky.flow.Parity
import com.github.jodersky.flow.Serial
import com.github.jodersky.flow.SerialSettings
+
import akka.actor.Actor
import akka.actor.ActorLogging
import akka.actor.ActorRef
@@ -18,8 +21,6 @@ import akka.actor.Props
import akka.actor.Terminated
import akka.actor.actorRef2Scala
import akka.io.IO
-import akka.util.ByteString
-import org.mavlink.messages.Ping
class SerialConnection(
val systemId: Byte,
@@ -32,7 +33,18 @@ class SerialConnection(
override def preStart() = heartbeatInterval foreach { interval =>
context.system.scheduler.schedule(interval, interval) {
- self ! Connection.Send(assemble(Heartbeat(0)))
+ self ! Connection.Send(
+ assemble(
+ Heartbeat(
+ MavType.MavTypeGeneric.toByte,
+ MavAutopilot.MavAutopilotGeneric.toByte,
+ 0, //no base mode
+ 0, //no custom mode
+ MavState.MavStateActive.toByte,
+ 0 //TODO properly implement read-only fields
+ )
+ )
+ )
}
}