From 458971f834a3af0dbf2fffe527352fa11e7d8168 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Tue, 16 Dec 2014 00:09:12 +0100 Subject: generate mavlink files in build --- .../twirl/org/mavlink/messages/Message.scala.txt | 70 ++++++++++++++++++++++ .../org/mavlink/messages/_message_class.scala.txt | 14 +++++ 2 files changed, 84 insertions(+) create mode 100644 project/mavlink-library/src/main/twirl/org/mavlink/messages/Message.scala.txt create mode 100644 project/mavlink-library/src/main/twirl/org/mavlink/messages/_message_class.scala.txt (limited to 'project/mavlink-library/src/main/twirl/org/mavlink/messages') 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 -- cgit v1.2.3