aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2015-03-21 20:07:22 +0100
committerJakob Odersky <jodersky@gmail.com>2015-03-21 20:12:15 +0100
commitdac8f076338ad121ce482993b226f945304969dc (patch)
tree4f6b071ff1e64603e7b1d27d6706de67b32cfbe9
parentf7a74ef1050cb390bf3929d6e7bc07631d015f06 (diff)
downloadsbt-mavlink-dac8f076338ad121ce482993b226f945304969dc.tar.gz
sbt-mavlink-dac8f076338ad121ce482993b226f945304969dc.tar.bz2
sbt-mavlink-dac8f076338ad121ce482993b226f945304969dc.zip
several changesv0.2
* warn on enum entries with no value * reporting integrated with sbt * add uint8_t_mavlink_version to types
-rw-r--r--README.md2
-rw-r--r--mavlink-library/src/main/scala/com/github/jodersky/mavlink/Parser.scala24
-rw-r--r--mavlink-library/src/main/scala/com/github/jodersky/mavlink/Reporter.scala16
-rw-r--r--mavlink-library/src/main/scala/com/github/jodersky/mavlink/trees/package.scala2
-rw-r--r--mavlink-plugin/src/main/scala/com/github/jodersky/mavlink/sbt/SbtMavlink.scala15
-rw-r--r--project/Build.scala2
6 files changed, 48 insertions, 13 deletions
diff --git a/README.md b/README.md
index 1186a1a..a13dd41 100644
--- a/README.md
+++ b/README.md
@@ -66,7 +66,7 @@ interpret the values of fields correctly.*
Add the following to your plugins:
```scala
- addSbtPlugin("com.github.jodersky" % "sbt-mavlink" % "0.1")`
+ addSbtPlugin("com.github.jodersky" % "sbt-mavlink" % "0.2")`
```
Set a MAVLink dialect
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 e2dda42..ca1b772 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
@@ -2,7 +2,11 @@ package com.github.jodersky.mavlink
import scala.language.postfixOps
+import scala.xml.Attribute
+import scala.xml.Elem
import scala.xml.Node
+import scala.xml.Null
+import scala.xml.Text
import scala.util.Try
import trees._
@@ -11,10 +15,8 @@ import trees._
* Provides means to parse a MAVLink dialect definition into a
* scala object representation.
*/
-object Parser {
-
- def fatal(error: String, node: Node) = throw new ParseError("Parse error at " + node + ": " + error)
- def warn(warning: String, node: Node) = Console.err.println("Warning " + node + ": " + warning)
+class Parser(reporter: Reporter) {
+ import reporter._
def parseDialect(node: Node): Dialect = parse(node) match {
case p: Dialect => p
@@ -42,8 +44,17 @@ object Parser {
case <enum>{_*}</enum> =>
val name = (node \ "@name").map(_.text).headOption getOrElse fatal("no name defined for enum", node)
- val entries = (node \ "entry").toSet map { n: Node =>
- parse(n) match {
+ val entries = (node \ "entry").zipWithIndex map { case (n, i) =>
+
+ //FIXME: some official MAVLink dialects don't define values in enums
+ val nodeWithValue = if ((n \ "@value").isEmpty) {
+ warn("no value defined for enum entry, using index instead", n)
+ n.asInstanceOf[Elem] % Attribute(None, "value", Text(i.toString), Null)
+ } else {
+ n
+ }
+
+ parse(nodeWithValue) match {
case e: EnumEntry => e
case _ => fatal("illegal definition in enum, only entries are allowed", n)
}
@@ -92,6 +103,7 @@ object Parser {
val ArrayPattern = """(.*)\[(\d+)\]""".r
def parseType(typeStr: String, node: Node): Type = typeStr match {
case "int8_t" => IntType(1, true)
+ case "uint8_t_mavlink_version" => IntType(1, false)
case "int16_t" => IntType(2, true)
case "int32_t" => IntType(4, true)
case "int64_t" => IntType(8, true)
diff --git a/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Reporter.scala b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Reporter.scala
new file mode 100644
index 0000000..629c3a8
--- /dev/null
+++ b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Reporter.scala
@@ -0,0 +1,16 @@
+package com.github.jodersky.mavlink
+
+import scala.xml.Node
+
+trait Reporter {
+
+ protected def printWarning(msg: String): Unit
+
+ def fatal(error: String, node: Node) = throw new ParseError("Parse error: " + error + " at " + node)
+ def warn(warning: String, node: Node) = printWarning("Warning: " + warning +" at " + node)
+
+}
+
+object StandardReporter extends Reporter {
+ protected def printWarning(msg: String): Unit = Console.err.println(msg)
+} \ 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 fc4b5f3..75c1753 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: Set[EnumEntry]) extends Tree
+ case class Enum(name: String, entries: Seq[EnumEntry]) 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-plugin/src/main/scala/com/github/jodersky/mavlink/sbt/SbtMavlink.scala b/mavlink-plugin/src/main/scala/com/github/jodersky/mavlink/sbt/SbtMavlink.scala
index d04ea43..613538c 100644
--- a/mavlink-plugin/src/main/scala/com/github/jodersky/mavlink/sbt/SbtMavlink.scala
+++ b/mavlink-plugin/src/main/scala/com/github/jodersky/mavlink/sbt/SbtMavlink.scala
@@ -1,14 +1,17 @@
package com.github.jodersky.mavlink.sbt
-import com.github.jodersky.mavlink.Parser
+import MavlinkKeys._
+
import com.github.jodersky.mavlink.Generator
-import scala.xml.XML
+import com.github.jodersky.mavlink.Parser
+import com.github.jodersky.mavlink.Reporter
-import MavlinkKeys._
import sbt._
import sbt.Keys._
import sbt.plugins._
+import scala.xml.XML
+
object SbtMavlink extends AutoPlugin {
override def trigger = allRequirements
@@ -29,8 +32,12 @@ object SbtMavlink extends AutoPlugin {
"Dialect definition " + dialectDefinitionFile.getAbsolutePath + " does not exist."
)
+ val reporter = new Reporter {
+ def printWarning(msg: String) = streams.value.log.warn(msg)
+ }
+
val dialectDefinition = XML.loadFile(dialectDefinitionFile)
- val dialect = Parser.parseDialect(dialectDefinition)
+ val dialect = (new Parser(reporter)).parseDialect(dialectDefinition)
val pathToSource = (new Generator(dialect)).generate()
val outDirectory = mavlinkTarget.value
diff --git a/project/Build.scala b/project/Build.scala
index 19c9543..4ab6a80 100644
--- a/project/Build.scala
+++ b/project/Build.scala
@@ -10,7 +10,7 @@ object ApplicationBuild extends Build {
scalaVersion := "2.10.4",
scalacOptions ++= Seq("-feature", "-deprecation"),
organization := "com.github.jodersky",
- version := "0.1-SNAPSHOT"
+ version := "0.2-SNAPSHOT"
) ++ publishSettings
lazy val root = (