aboutsummaryrefslogtreecommitdiff
path: root/mavlink-library
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2015-03-23 22:38:17 +0100
committerJakob Odersky <jodersky@gmail.com>2015-03-23 22:38:17 +0100
commit19175b88e9a61d3c197a4627aee270de49df5269 (patch)
tree9543d6a9577d12abbd2cbade8620f57346faece3 /mavlink-library
parent37842d340dd87391b1288a3e5f91d47dbda59fa5 (diff)
downloadsbt-mavlink-19175b88e9a61d3c197a4627aee270de49df5269.tar.gz
sbt-mavlink-19175b88e9a61d3c197a4627aee270de49df5269.tar.bz2
sbt-mavlink-19175b88e9a61d3c197a4627aee270de49df5269.zip
implement enum supportv0.4
Diffstat (limited to 'mavlink-library')
-rw-r--r--mavlink-library/src/main/scala/com/github/jodersky/mavlink/Generator.scala25
-rw-r--r--mavlink-library/src/main/scala/com/github/jodersky/mavlink/Parser.scala3
-rw-r--r--mavlink-library/src/main/scala/com/github/jodersky/mavlink/StringUtils.scala42
-rw-r--r--mavlink-library/src/main/scala/com/github/jodersky/mavlink/trees/package.scala2
-rw-r--r--mavlink-library/src/main/twirl/org/mavlink/enums/enums.scala.txt14
5 files changed, 77 insertions, 9 deletions
diff --git a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Generator.scala b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Generator.scala
index 4f8b207..2aeb9de 100644
--- a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Generator.scala
+++ b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Generator.scala
@@ -12,6 +12,7 @@ import trees._
* @param dialect a specific MAVLink dialect for which to generate code
*/
class Generator(dialect: Dialect) {
+ import Generator._
lazy val maxPayloadLength = dialect.messages.map(_.length).max
@@ -30,12 +31,26 @@ class Generator(dialect: Dialect) {
def targets: List[Target] = {
val context = Context(dialect.version)
List(
- Target("org/mavlink/Assembler.scala", () => org.mavlink.txt.Assembler(context).body),
- Target("org/mavlink/Crc.scala", () => org.mavlink.txt.Crc(context).body),
- Target("org/mavlink/Packet.scala", () => org.mavlink.txt.Packet(context, maxPayloadLength, extraCrcs).body),
- Target("org/mavlink/Parser.scala", () => org.mavlink.txt.Parser(context).body),
- Target("org/mavlink/messages/messages.scala", () => org.mavlink.messages.txt.messages(context, dialect.messages).body)
+ Target(targetFiles(0), () => org.mavlink.txt.Assembler(context).body),
+ Target(targetFiles(1), () => org.mavlink.txt.Crc(context).body),
+ Target(targetFiles(2), () => org.mavlink.txt.Packet(context, maxPayloadLength, extraCrcs).body),
+ Target(targetFiles(3), () => org.mavlink.txt.Parser(context).body),
+ Target(targetFiles(4), () => org.mavlink.messages.txt.messages(context, dialect.messages).body),
+ Target(targetFiles(5), () => org.mavlink.enums.txt.enums(context, dialect.enums).body)
)
}
+}
+
+object Generator {
+
+ val targetFiles: Seq[String] = Array(
+ "org/mavlink/Assembler.scala",
+ "org/mavlink/Crc.scala",
+ "org/mavlink/Packet.scala",
+ "org/mavlink/Parser.scala",
+ "org/mavlink/messages/messages.scala",
+ "org/mavlink/enums/enums.scala"
+ )
+
} \ No newline at end of file
diff --git a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Parser.scala b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Parser.scala
index ca1b772..3010121 100644
--- a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Parser.scala
+++ b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Parser.scala
@@ -44,6 +44,7 @@ class Parser(reporter: Reporter) {
case <enum>{_*}</enum> =>
val name = (node \ "@name").map(_.text).headOption getOrElse fatal("no name defined for enum", node)
+ val description = (node \ "description").map(_.text).headOption getOrElse ""
val entries = (node \ "entry").zipWithIndex map { case (n, i) =>
//FIXME: some official MAVLink dialects don't define values in enums
@@ -59,7 +60,7 @@ class Parser(reporter: Reporter) {
case _ => fatal("illegal definition in enum, only entries are allowed", n)
}
}
- Enum(name, entries)
+ Enum(name, entries, description)
case <message>{_*}</message> =>
val id = (node \ "@id").map(_.text).headOption map { str =>
diff --git a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/StringUtils.scala b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/StringUtils.scala
index 38b87e7..29f262f 100644
--- a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/StringUtils.scala
+++ b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/StringUtils.scala
@@ -2,15 +2,53 @@ package com.github.jodersky.mavlink
object StringUtils {
+ private final val Keywords = Set(
+ "class",
+ "object",
+ "trait",
+ "extends",
+ "type",
+ "import",
+ "package",
+ "val",
+ "var",
+ "def",
+ "implicit",
+ "private",
+ "protected",
+ "abstract",
+ "override",
+ "class",
+ "case",
+ "match",
+ "final",
+ "this",
+ "super",
+ "throw",
+ "catch",
+ "finally",
+ "if",
+ "else",
+ "for",
+ "while",
+ "do"
+ )
+
+ private def escape(str: String) = if (Keywords.contains(str)) {
+ "`" + str + "`"
+ } else {
+ str
+ }
+
def camelify(str: String) = {
val lower = str.toLowerCase
- "_([a-z\\d])".r.replaceAllIn(lower, {m => m.group(1).toUpperCase()})
+ escape("_([a-z\\d])".r.replaceAllIn(lower, {m => m.group(1).toUpperCase()}))
}
def Camelify(str: String) = {
val camel = camelify(str)
val (head, tail) = camel.splitAt(1)
- head.toUpperCase + tail
+ escape(head.toUpperCase + tail)
}
} \ No newline at end of file
diff --git a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/trees/package.scala b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/trees/package.scala
index 75c1753..c1e2993 100644
--- a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/trees/package.scala
+++ b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/trees/package.scala
@@ -5,7 +5,7 @@ package trees {
sealed trait Tree
case class Dialect(version: String, enums: Set[Enum], messages: Set[Message]) extends Tree
- case class Enum(name: String, entries: Seq[EnumEntry]) extends Tree
+ case class Enum(name: String, entries: Seq[EnumEntry], description: String) extends Tree
case class EnumEntry(value: Int, name: String, description: String) extends Tree
case class Field(tpe: Type, nativeType: String, name: String, enum: Option[String], description: String) extends Tree
case class Message(id: Byte, name: String, description: String, fields: Seq[Field]) extends Tree {
diff --git a/mavlink-library/src/main/twirl/org/mavlink/enums/enums.scala.txt b/mavlink-library/src/main/twirl/org/mavlink/enums/enums.scala.txt
new file mode 100644
index 0000000..453ba2f
--- /dev/null
+++ b/mavlink-library/src/main/twirl/org/mavlink/enums/enums.scala.txt
@@ -0,0 +1,14 @@
+@(__context: Context, __enums: Set[Enum])@org.mavlink.txt._header(__context)
+package org.mavlink.enums
+
+@__commentParagraphs(paragraphs: Seq[String]) = {@paragraphs.mkString("/**\n * ", "\n * ", "\n */")}
+
+@for(__enum <- __enums) {
+@__commentParagraphs(__enum.description.grouped(100).toList)
+object @{StringUtils.Camelify(__enum.name)} {
+ @for(__entry <- __enum.entries) {
+ @__commentParagraphs(__entry.description.grouped(100).toList)
+ final val @{StringUtils.Camelify(__entry.name)}: Int = @__entry.value.toString
+ }
+}
+}