diff options
Diffstat (limited to 'vfd-uav/src')
-rw-r--r-- | vfd-uav/src/main/scala/vfd/uav/Connection.scala | 6 | ||||
-rw-r--r-- | vfd-uav/src/main/scala/vfd/uav/MavlinkUtil.scala | 13 | ||||
-rw-r--r-- | vfd-uav/src/main/scala/vfd/uav/MockConnection.scala | 46 | ||||
-rw-r--r-- | vfd-uav/src/main/scala/vfd/uav/SerialConnection.scala | 28 |
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 + ) + ) + ) } } |