aboutsummaryrefslogblamecommitdiff
path: root/mavlink-library/src/main/scala/com/github/jodersky/mavlink/Generator.scala
blob: ff7970d0a3f3b39b2bc2392bce3ad8a9a1c48e80 (plain) (tree)
1
2
3
4
5




                                   








                                                                       
                    
  
                                                                






                                                     


                                                   
     
                                                         
 

                                          
         

                                                                            




                                                                                                      

     
 






                                       
                                





                                          
 
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.Mavlink(context).body),
      Target(targetFiles(3), () => org.mavlink.txt.Packet(context, maxPayloadLength, extraCrcs).body),
      Target(targetFiles(4), () => org.mavlink.txt.Parser(context).body),
      Target(targetFiles(5), () => org.mavlink.messages.txt.messages(context, dialect.messages).body),
      Target(targetFiles(6), () => 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/Mavlink.scala",
    "org/mavlink/Packet.scala",
    "org/mavlink/Parser.scala",
    "org/mavlink/messages/messages.scala",
    "org/mavlink/enums/enums.scala"
  )

}