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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
package com.github.jodersky.mavlink
import scala.xml.XML
import java.io.FileWriter
import java.io.BufferedWriter
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) {
import Generator._
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)
}
/**
* Represents a generator's target file
* @param path the path of the generated file
* @param generate contents of the generated file
*/
case class Target(path: String, generate: () => String)
def targets: List[Target] = {
val context = Context(dialect.version)
List(
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"
)
}
|