aboutsummaryrefslogtreecommitdiff
path: root/mavlink-library/src/main/scala/com/github/jodersky/mavlink/trees/package.scala
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2015-03-19 16:08:46 +0100
committerJakob Odersky <jodersky@gmail.com>2015-03-19 16:08:46 +0100
commit1cf6e37dc356144f3da2a2dcde75d1ced8bc5ad6 (patch)
tree287a8e4ce18d3a8c299d7b2a91599a7a48c7b59d /mavlink-library/src/main/scala/com/github/jodersky/mavlink/trees/package.scala
downloadsbt-mavlink-1cf6e37dc356144f3da2a2dcde75d1ced8bc5ad6.tar.gz
sbt-mavlink-1cf6e37dc356144f3da2a2dcde75d1ced8bc5ad6.tar.bz2
sbt-mavlink-1cf6e37dc356144f3da2a2dcde75d1ced8bc5ad6.zip
initial commit
Diffstat (limited to 'mavlink-library/src/main/scala/com/github/jodersky/mavlink/trees/package.scala')
-rw-r--r--mavlink-library/src/main/scala/com/github/jodersky/mavlink/trees/package.scala44
1 files changed, 44 insertions, 0 deletions
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
new file mode 100644
index 0000000..49b697b
--- /dev/null
+++ b/mavlink-library/src/main/scala/com/github/jodersky/mavlink/trees/package.scala
@@ -0,0 +1,44 @@
+package com.github.jodersky.mavlink
+
+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 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 {
+ def orderedFields = fields.toSeq.sortBy(_.tpe.width)(Ordering[Int].reverse)
+
+ lazy val checksum = {
+ var c = new Crc()
+ c = c.accumulate((name + " ").getBytes)
+ for (field <- orderedFields) {
+ c = c.accumulate((field.nativeType + " ").getBytes)
+ c = c.accumulate((field.name + " ").getBytes)
+ }
+ (c.lsb ^ c.msb).toByte
+ }
+ }
+
+ trait Type extends Tree {
+ def width: Int // width in bytes of the type
+ def sizeof: Int = width // size of bytes of the type
+ }
+
+ case class IntType(width: Int, signed: Boolean) extends Type
+ case class FloatType(width: Int) extends Type
+ case class ArrayType(underlying: Type, length: Int) extends Type {
+ def width = underlying.width
+ override def sizeof = width * length
+ }
+ case object CharType extends Type {
+ def width = 1
+ }
+ case class StringType(maxLength: Int) extends Type {
+ val width = 1
+ override def sizeof = width * maxLength
+ }
+
+} \ No newline at end of file