diff options
author | Jakob Odersky <jodersky@gmail.com> | 2014-12-16 00:09:12 +0100 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2014-12-16 00:09:12 +0100 |
commit | 458971f834a3af0dbf2fffe527352fa11e7d8168 (patch) | |
tree | 226675f8402f2c099cb15b21cab28eb8784f1c96 /project/mavlink-library/src/main/twirl/org/mavlink/messages | |
parent | 84c641d12187183466df936eaa7c1637d861cf62 (diff) | |
download | mavigator-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.txt | 70 | ||||
-rw-r--r-- | project/mavlink-library/src/main/twirl/org/mavlink/messages/_message_class.scala.txt | 14 |
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 |