diff options
author | Jakob Odersky <jodersky@gmail.com> | 2015-03-21 20:07:22 +0100 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2015-03-21 20:12:15 +0100 |
commit | dac8f076338ad121ce482993b226f945304969dc (patch) | |
tree | 4f6b071ff1e64603e7b1d27d6706de67b32cfbe9 | |
parent | f7a74ef1050cb390bf3929d6e7bc07631d015f06 (diff) | |
download | sbt-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
6 files changed, 48 insertions, 13 deletions
@@ -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 = ( |