aboutsummaryrefslogtreecommitdiff
path: root/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Generator.scala
diff options
context:
space:
mode:
Diffstat (limited to 'mavlink-library/src/main/scala/com/github/jodersky/mavlink/Generator.scala')
-rw-r--r--mavlink-library/src/main/scala/com/github/jodersky/mavlink/Generator.scala45
1 files changed, 45 insertions, 0 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
new file mode 100644
index 0000000..06a4909
--- /dev/null
+++ b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Generator.scala
@@ -0,0 +1,45 @@
+package com.github.jodersky.mavlink
+
+import scala.xml.XML
+import java.io.FileWriter
+import java.io.BufferedWriter
+import scalax.file.Path
+import java.io.File
+
+import trees._
+
+/**
+ * Generates Scala code implementing the MAVLink protocol.
+ * @param dialect a specific MAVLink dialect for which to generate code
+ */
+class Generator(dialect: Dialect) {
+
+ lazy val maxPayloadLength = {
+ val widths = dialect.messages map { msg =>
+ msg.fields.map(_.tpe.sizeof).sum
+ }
+ widths.max
+ }
+
+ lazy val extraCrcs = Array.tabulate[Byte](255){i =>
+ val message = dialect.messages.find(_.id == i)
+ message.map(_.checksum).getOrElse(0)
+ }
+
+ /**
+ * Generates Scala code implementing MAVLink.
+ * @return a list containing proposed Scala file names pointing to their contents
+ */
+ def generate(): List[(String, String)] = {
+ val context = Context(dialect.version)
+
+ List(
+ "org/mavlink/Assembler.scala" -> org.mavlink.txt.Assembler(context).body,
+ "org/mavlink/Crc.scala" -> org.mavlink.txt.Crc(context).body,
+ "org/mavlink/MavlinkBuffer.scala" -> org.mavlink.txt.MavlinkBuffer(context).body,
+ "org/mavlink/Packet.scala" -> org.mavlink.txt.Packet(context, maxPayloadLength, extraCrcs).body,
+ "org/mavlink/Parser.scala" -> org.mavlink.txt.Parser(context).body,
+ "org/mavlink/messages/messages.scala" -> org.mavlink.messages.txt.messages(context, dialect.messages).body
+ )
+ }
+} \ No newline at end of file