aboutsummaryrefslogtreecommitdiff
path: root/project/mavlink-library/src/main/twirl/org/mavlink/messages
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2014-12-16 00:09:12 +0100
committerJakob Odersky <jodersky@gmail.com>2014-12-16 00:09:12 +0100
commit458971f834a3af0dbf2fffe527352fa11e7d8168 (patch)
tree226675f8402f2c099cb15b21cab28eb8784f1c96 /project/mavlink-library/src/main/twirl/org/mavlink/messages
parent84c641d12187183466df936eaa7c1637d861cf62 (diff)
downloadmavigator-458971f834a3af0dbf2fffe527352fa11e7d8168.tar.gz
mavigator-458971f834a3af0dbf2fffe527352fa11e7d8168.tar.bz2
mavigator-458971f834a3af0dbf2fffe527352fa11e7d8168.zip
generate mavlink files in build
Diffstat (limited to 'project/mavlink-library/src/main/twirl/org/mavlink/messages')
-rw-r--r--project/mavlink-library/src/main/twirl/org/mavlink/messages/Message.scala.txt70
-rw-r--r--project/mavlink-library/src/main/twirl/org/mavlink/messages/_message_class.scala.txt14
2 files changed, 84 insertions, 0 deletions
diff --git a/project/mavlink-library/src/main/twirl/org/mavlink/messages/Message.scala.txt b/project/mavlink-library/src/main/twirl/org/mavlink/messages/Message.scala.txt
new file mode 100644
index 0000000..1507df4
--- /dev/null
+++ b/project/mavlink-library/src/main/twirl/org/mavlink/messages/Message.scala.txt
@@ -0,0 +1,70 @@
+@(messages: Seq[parsing.Message])
+
+@extract(field: parsing.Field, offset: Int) = {
+ @field.tpe.width match {
+ case 1 => {payload(@offset)}
+ case 2 => {((payload(@offset)) | ((payload(@{offset+1}) & 0xff) << 8)).toShort}
+ case 4 => {(payload(@offset)) | ((payload(@{offset+1}) & 0xff) << 8) | ((payload(@{offset+2}) & 0xff) << 16) | ((payload(@{offset+3}) & 0xff) << 24)}
+ case 8 => {payload(@offset) |
+ ((payload(@{offset+2}) & 0xffl) << 8) |
+ ((payload(@{offset+3}) & 0xffl) << 16) |
+ ((payload(@{offset+4}) & 0xffl) << 24) |
+ ((payload(@{offset+5}) & 0xffl) << 32) |
+ ((payload(@{offset+6}) & 0xffl) << 40) |
+ ((payload(@{offset+7}) & 0xffl) << 48) |
+ ((payload(@{offset+8}) & 0xffl) << 56)}
+ }
+}
+
+@insert(field: parsing.Field, offset: Int) = {
+ @defining("m." + field.scalaName) { attr =>
+ @if(field.tpe.width >= 1) { arr(@offset) = (@attr & 0xff).toByte }
+ @if(field.tpe.width >= 2) { arr(@{offset+1}) = ((@attr >> 8) & 0xff).toByte }
+ @if(field.tpe.width >= 3) { arr(@{offset+2}) = ((@attr >> 16) & 0xff).toByte }
+ @if(field.tpe.width >= 4) { arr(@{offset+3}) = ((@attr >> 24) & 0xff).toByte }
+ @if(field.tpe.width >= 5) { arr(@{offset+4}) = ((@attr >> 32) & 0xff).toByte }
+ @if(field.tpe.width >= 6) { arr(@{offset+5}) = ((@attr >> 40) & 0xff).toByte }
+ @if(field.tpe.width >= 7) { arr(@{offset+6}) = ((@attr >> 48) & 0xff).toByte }
+ @if(field.tpe.width >= 8) { arr(@{offset+7}) = ((@attr >> 56) & 0xff).toByte }
+ }
+}
+
+@org.mavlink.txt._header()
+
+package org.mavlink.messages
+
+sealed trait Message
+@for(message <- messages) {
+ @_message_class(message)
+}
+case class Unknown(id: Byte, payload: Seq[Byte]) extends Message
+
+object Message {
+ def unpack(id: Byte, payload: Seq[Byte]) = id match {
+ @for(message <- messages) {
+ case @message.id =>
+ @defining(message.orderedFields){ ordered =>
+ @defining(ordered.map(_.tpe.width).scanLeft(0)(_ + _)){ offsets =>
+ @for((field, offset) <- ordered zip offsets) {
+ val @field.scalaName: @field.tpe.scalaType = @extract(field, offset)
+ }}}
+ @{message.scalaName}@message.fields.map(_.scalaName).mkString("(", ", ", ")")
+ }
+
+ case id => Unknown(id, payload)
+ }
+
+ def pack(message: Message): (Byte, Seq[Byte]) = message match {
+ @for(message <- messages) {
+ case m: @message.scalaName =>
+ val arr = new Array[Byte](@message.fields.map(_.tpe.width).sum)
+ @defining(message.orderedFields) { ordered =>
+ @defining(ordered.map(_.tpe.width).scanLeft(0)(_ + _)){ offsets =>
+ @for((field, offset) <- ordered zip offsets) {
+ @insert(field, offset)
+ }
+ (@message.id, arr)
+ }}}
+ case u: Unknown => (u.id, u.payload)
+ }
+} \ No newline at end of file
diff --git a/project/mavlink-library/src/main/twirl/org/mavlink/messages/_message_class.scala.txt b/project/mavlink-library/src/main/twirl/org/mavlink/messages/_message_class.scala.txt
new file mode 100644
index 0000000..78c8326
--- /dev/null
+++ b/project/mavlink-library/src/main/twirl/org/mavlink/messages/_message_class.scala.txt
@@ -0,0 +1,14 @@
+@(message: parsing.Message)
+
+@arguments(fields: Seq[parsing.Field]) = @{
+ fields.map(f => f.scalaName + ": " + f.tpe.scalaType)
+}
+
+@comment(paragraphs: Seq[String]) = @{
+ paragraphs.mkString("/**\n * ", "\n * ", "\n */")
+}
+
+@defining(message.description.grouped(120).toSeq){intro =>
+@defining(message.fields.map(field => "@param " + field.name + " " + field.description)){ fields =>
+@comment(intro ++ fields)}}
+case class @{message.scalaName}@arguments(message.fields).mkString("(", ", ", ")") extends Message \ No newline at end of file