aboutsummaryrefslogtreecommitdiff
path: root/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Generator.scala
blob: 55a00e6024fd4072dab4fd16efa6a5354a86637e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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 = dialect.messages.map(_.length).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/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
    )
  }
}