Add generated protobuf implementations.
authorChristopher Peplin <chris.peplin@rhubarbtech.com>
Tue, 1 Oct 2013 20:56:35 +0000 (16:56 -0400)
committerChristopher Peplin <chris.peplin@rhubarbtech.com>
Tue, 7 Jan 2014 18:18:09 +0000 (13:18 -0500)
16 files changed:
.gitmodules [new file with mode: 0644]
Makefile [new file with mode: 0644]
benchmark/proto/generate.sh [deleted file]
gen/README.mkd [new file with mode: 0644]
gen/cpp/openxc.pb [new file with mode: 0644]
gen/cpp/openxc.pb.c [new file with mode: 0644]
gen/cpp/openxc.pb.h [new file with mode: 0644]
gen/java/openxc/Openxc.java [new file with mode: 0644]
gen/openxc.pb [new file with mode: 0644]
gen/openxc.pb.c [new file with mode: 0644]
gen/openxc.pb.h [new file with mode: 0644]
gen/openxc_pb2.py [new file with mode: 0644]
gen/python/openxc_pb2.py [new file with mode: 0644]
libs/nanopb [new submodule]
pip-requirements.txt [moved from benchmark/pip-requirements.txt with 100% similarity]
script/bootstrap.sh [new file with mode: 0755]

diff --git a/.gitmodules b/.gitmodules
new file mode 100644 (file)
index 0000000..aaa1a95
--- /dev/null
@@ -0,0 +1,3 @@
+[submodule "libs/nanopb"]
+       path = libs/nanopb
+       url = https://code.google.com/p/nanopb/
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..4b1b687
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,10 @@
+nanopb: proto
+       python libs/nanopb/generator/nanopb_generator.py -s max_size:100 -f openxc.options gen/cpp/openxc.pb
+
+proto: openxc.proto
+       @mkdir -p gen/java
+       @mkdir -p gen/python
+       @mkdir -p gen/cpp
+       protoc -I . -I gen -ogen/cpp/openxc.pb --python_out=gen/python --java_out=gen/java $?
+
+all: nanopb proto
diff --git a/benchmark/proto/generate.sh b/benchmark/proto/generate.sh
deleted file mode 100755 (executable)
index 09400a3..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-
-protoc -I ../.. --python_out=. ../../openxc.proto
diff --git a/gen/README.mkd b/gen/README.mkd
new file mode 100644 (file)
index 0000000..e607772
--- /dev/null
@@ -0,0 +1,11 @@
+Generated Files
+================
+
+This directory holds generated implementation files for the Protocol Buffer
+objects defined in openxc.proto. The definitions don't change very often, and so
+it makes more sense to keep a compiled version in the repository for each
+major build environment rather than requiring each developer to get the protobuf
+dependencies.
+
+I've also not found a good way to incorporate protobuf generation with our
+Makefile build system in the openxc/vi-firmware project.
diff --git a/gen/cpp/openxc.pb b/gen/cpp/openxc.pb
new file mode 100644 (file)
index 0000000..e343eeb
--- /dev/null
@@ -0,0 +1,30 @@
+
\ 4
+\fopenxc.proto\12\ 6openxc"Å\ 2
+\ eVehicleMessage\12)
+\ 4type\18\ 1 \ 1(\ e2\e.openxc.VehicleMessage.Type\12'
+\vraw_message\18\ 2 \ 1(\v2\12.openxc.RawMessage\127
+\ estring_message\18\ 3 \ 1(\v2\1f.openxc.TranslatedStringMessage\12;
+\11numerical_message\18\ 4 \ 1(\v2 .openxc.TranslatedNumericMessage\129
+\ fboolean_message\18\ 5 \ 1(\v2 .openxc.TranslatedBooleanMessage".
+\ 4Type\12\a
+\ 3RAW\10\ 1\12
+
+\ 6STRING\10\ 2\12\a
+\ 3NUM\10\ 3\12\b
+\ 4BOOL\10\ 4";
+
+RawMessage\12\v
+\ 3bus\18\ 1 \ 1(\ 5\12\12
+
+message_id\18\ 2 \ 1(\r\12\f
+\ 4data\18\ 3 \ 1(\12"6
+\17TranslatedStringMessage\12\f
+\ 4name\18\ 1 \ 1(     \12\r
+\ 5value\18\ 2 \ 1(    "7
+\18TranslatedNumericMessage\12\f
+\ 4name\18\ 1 \ 1(     \12\r
+\ 5value\18\ 2 \ 1(\ 1"7
+\18TranslatedBooleanMessage\12\f
+\ 4name\18\ 1 \ 1(     \12\r
+\ 5value\18\ 2 \ 1(\b
\ No newline at end of file
diff --git a/gen/cpp/openxc.pb.c b/gen/cpp/openxc.pb.c
new file mode 100644 (file)
index 0000000..89e32a6
--- /dev/null
@@ -0,0 +1,57 @@
+/* Automatically generated nanopb constant definitions */
+/* Generated by nanopb-0.2.4-dev at Tue Oct  1 16:51:23 2013. */
+
+#include "openxc.pb.h"
+
+
+
+const pb_field_t openxc_VehicleMessage_fields[6] = {
+    PB_FIELD2(  1, ENUM    , OPTIONAL, STATIC, FIRST, openxc_VehicleMessage, type, type, 0),
+    PB_FIELD2(  2, MESSAGE , OPTIONAL, STATIC, OTHER, openxc_VehicleMessage, raw_message, type, &openxc_RawMessage_fields),
+    PB_FIELD2(  3, MESSAGE , OPTIONAL, STATIC, OTHER, openxc_VehicleMessage, string_message, raw_message, &openxc_TranslatedStringMessage_fields),
+    PB_FIELD2(  4, MESSAGE , OPTIONAL, STATIC, OTHER, openxc_VehicleMessage, numerical_message, string_message, &openxc_TranslatedNumericMessage_fields),
+    PB_FIELD2(  5, MESSAGE , OPTIONAL, STATIC, OTHER, openxc_VehicleMessage, boolean_message, numerical_message, &openxc_TranslatedBooleanMessage_fields),
+    PB_LAST_FIELD
+};
+
+const pb_field_t openxc_RawMessage_fields[4] = {
+    PB_FIELD2(  1, INT32   , OPTIONAL, STATIC, FIRST, openxc_RawMessage, bus, bus, 0),
+    PB_FIELD2(  2, UINT32  , OPTIONAL, STATIC, OTHER, openxc_RawMessage, message_id, bus, 0),
+    PB_FIELD2(  3, SINT64  , OPTIONAL, STATIC, OTHER, openxc_RawMessage, data, message_id, 0),
+    PB_LAST_FIELD
+};
+
+const pb_field_t openxc_TranslatedStringMessage_fields[3] = {
+    PB_FIELD2(  1, STRING  , OPTIONAL, STATIC, FIRST, openxc_TranslatedStringMessage, name, name, 0),
+    PB_FIELD2(  2, STRING  , OPTIONAL, STATIC, OTHER, openxc_TranslatedStringMessage, value, name, 0),
+    PB_LAST_FIELD
+};
+
+const pb_field_t openxc_TranslatedNumericMessage_fields[3] = {
+    PB_FIELD2(  1, STRING  , OPTIONAL, STATIC, FIRST, openxc_TranslatedNumericMessage, name, name, 0),
+    PB_FIELD2(  2, DOUBLE  , OPTIONAL, STATIC, OTHER, openxc_TranslatedNumericMessage, value, name, 0),
+    PB_LAST_FIELD
+};
+
+const pb_field_t openxc_TranslatedBooleanMessage_fields[3] = {
+    PB_FIELD2(  1, STRING  , OPTIONAL, STATIC, FIRST, openxc_TranslatedBooleanMessage, name, name, 0),
+    PB_FIELD2(  2, BOOL    , OPTIONAL, STATIC, OTHER, openxc_TranslatedBooleanMessage, value, name, 0),
+    PB_LAST_FIELD
+};
+
+
+/* Check that field information fits in pb_field_t */
+#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT)
+STATIC_ASSERT((pb_membersize(openxc_VehicleMessage, raw_message) < 256 && pb_membersize(openxc_VehicleMessage, string_message) < 256 && pb_membersize(openxc_VehicleMessage, numerical_message) < 256 && pb_membersize(openxc_VehicleMessage, boolean_message) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_openxc_VehicleMessage_openxc_RawMessage_openxc_TranslatedStringMessage_openxc_TranslatedNumericMessage_openxc_TranslatedBooleanMessage)
+#endif
+
+#if !defined(PB_FIELD_32BIT)
+STATIC_ASSERT((pb_membersize(openxc_VehicleMessage, raw_message) < 65536 && pb_membersize(openxc_VehicleMessage, string_message) < 65536 && pb_membersize(openxc_VehicleMessage, numerical_message) < 65536 && pb_membersize(openxc_VehicleMessage, boolean_message) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_openxc_VehicleMessage_openxc_RawMessage_openxc_TranslatedStringMessage_openxc_TranslatedNumericMessage_openxc_TranslatedBooleanMessage)
+#endif
+
+/* On some platforms (such as AVR), double is really float.
+ * These are not directly supported by nanopb, but see example_avr_double.
+ * To get rid of this error, remove any double fields from your .proto.
+ */
+STATIC_ASSERT(sizeof(double) == 8, DOUBLE_MUST_BE_8_BYTES)
+
diff --git a/gen/cpp/openxc.pb.h b/gen/cpp/openxc.pb.h
new file mode 100644 (file)
index 0000000..9c50569
--- /dev/null
@@ -0,0 +1,100 @@
+/* Automatically generated nanopb header */
+/* Generated by nanopb-0.2.4-dev at Tue Oct  1 16:51:23 2013. */
+
+#ifndef _PB_OPENXC_PB_H_
+#define _PB_OPENXC_PB_H_
+#include <pb.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Enum definitions */
+typedef enum _openxc_VehicleMessage_Type {
+    openxc_VehicleMessage_Type_RAW = 1,
+    openxc_VehicleMessage_Type_STRING = 2,
+    openxc_VehicleMessage_Type_NUM = 3,
+    openxc_VehicleMessage_Type_BOOL = 4
+} openxc_VehicleMessage_Type;
+
+/* Struct definitions */
+typedef struct _openxc_RawMessage {
+    bool has_bus;
+    int32_t bus;
+    bool has_message_id;
+    uint32_t message_id;
+    bool has_data;
+    int64_t data;
+} openxc_RawMessage;
+
+typedef struct _openxc_TranslatedBooleanMessage {
+    bool has_name;
+    char name[100];
+    bool has_value;
+    bool value;
+} openxc_TranslatedBooleanMessage;
+
+typedef struct _openxc_TranslatedNumericMessage {
+    bool has_name;
+    char name[100];
+    bool has_value;
+    double value;
+} openxc_TranslatedNumericMessage;
+
+typedef struct _openxc_TranslatedStringMessage {
+    bool has_name;
+    char name[100];
+    bool has_value;
+    char value[100];
+} openxc_TranslatedStringMessage;
+
+typedef struct _openxc_VehicleMessage {
+    bool has_type;
+    openxc_VehicleMessage_Type type;
+    bool has_raw_message;
+    openxc_RawMessage raw_message;
+    bool has_string_message;
+    openxc_TranslatedStringMessage string_message;
+    bool has_numerical_message;
+    openxc_TranslatedNumericMessage numerical_message;
+    bool has_boolean_message;
+    openxc_TranslatedBooleanMessage boolean_message;
+} openxc_VehicleMessage;
+
+/* Default values for struct fields */
+
+/* Field tags (for use in manual encoding/decoding) */
+#define openxc_RawMessage_bus_tag                1
+#define openxc_RawMessage_message_id_tag         2
+#define openxc_RawMessage_data_tag               3
+#define openxc_TranslatedBooleanMessage_name_tag 1
+#define openxc_TranslatedBooleanMessage_value_tag 2
+#define openxc_TranslatedNumericMessage_name_tag 1
+#define openxc_TranslatedNumericMessage_value_tag 2
+#define openxc_TranslatedStringMessage_name_tag  1
+#define openxc_TranslatedStringMessage_value_tag 2
+#define openxc_VehicleMessage_type_tag           1
+#define openxc_VehicleMessage_raw_message_tag    2
+#define openxc_VehicleMessage_string_message_tag 3
+#define openxc_VehicleMessage_numerical_message_tag 4
+#define openxc_VehicleMessage_boolean_message_tag 5
+
+/* Struct field encoding specification for nanopb */
+extern const pb_field_t openxc_VehicleMessage_fields[6];
+extern const pb_field_t openxc_RawMessage_fields[4];
+extern const pb_field_t openxc_TranslatedStringMessage_fields[3];
+extern const pb_field_t openxc_TranslatedNumericMessage_fields[3];
+extern const pb_field_t openxc_TranslatedBooleanMessage_fields[3];
+
+/* Maximum encoded size of messages (where known) */
+#define openxc_VehicleMessage_size               457
+#define openxc_RawMessage_size                   23
+#define openxc_TranslatedStringMessage_size      204
+#define openxc_TranslatedNumericMessage_size     111
+#define openxc_TranslatedBooleanMessage_size     104
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif
diff --git a/gen/java/openxc/Openxc.java b/gen/java/openxc/Openxc.java
new file mode 100644 (file)
index 0000000..f5c7f0b
--- /dev/null
@@ -0,0 +1,3668 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: openxc.proto
+
+package openxc;
+
+public final class Openxc {
+  private Openxc() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+  }
+  public interface VehicleMessageOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+
+    // optional .openxc.VehicleMessage.Type type = 1;
+    /**
+     * <code>optional .openxc.VehicleMessage.Type type = 1;</code>
+     */
+    boolean hasType();
+    /**
+     * <code>optional .openxc.VehicleMessage.Type type = 1;</code>
+     */
+    openxc.Openxc.VehicleMessage.Type getType();
+
+    // optional .openxc.RawMessage raw_message = 2;
+    /**
+     * <code>optional .openxc.RawMessage raw_message = 2;</code>
+     */
+    boolean hasRawMessage();
+    /**
+     * <code>optional .openxc.RawMessage raw_message = 2;</code>
+     */
+    openxc.Openxc.RawMessage getRawMessage();
+    /**
+     * <code>optional .openxc.RawMessage raw_message = 2;</code>
+     */
+    openxc.Openxc.RawMessageOrBuilder getRawMessageOrBuilder();
+
+    // optional .openxc.TranslatedStringMessage string_message = 3;
+    /**
+     * <code>optional .openxc.TranslatedStringMessage string_message = 3;</code>
+     */
+    boolean hasStringMessage();
+    /**
+     * <code>optional .openxc.TranslatedStringMessage string_message = 3;</code>
+     */
+    openxc.Openxc.TranslatedStringMessage getStringMessage();
+    /**
+     * <code>optional .openxc.TranslatedStringMessage string_message = 3;</code>
+     */
+    openxc.Openxc.TranslatedStringMessageOrBuilder getStringMessageOrBuilder();
+
+    // optional .openxc.TranslatedNumericMessage numerical_message = 4;
+    /**
+     * <code>optional .openxc.TranslatedNumericMessage numerical_message = 4;</code>
+     */
+    boolean hasNumericalMessage();
+    /**
+     * <code>optional .openxc.TranslatedNumericMessage numerical_message = 4;</code>
+     */
+    openxc.Openxc.TranslatedNumericMessage getNumericalMessage();
+    /**
+     * <code>optional .openxc.TranslatedNumericMessage numerical_message = 4;</code>
+     */
+    openxc.Openxc.TranslatedNumericMessageOrBuilder getNumericalMessageOrBuilder();
+
+    // optional .openxc.TranslatedBooleanMessage boolean_message = 5;
+    /**
+     * <code>optional .openxc.TranslatedBooleanMessage boolean_message = 5;</code>
+     */
+    boolean hasBooleanMessage();
+    /**
+     * <code>optional .openxc.TranslatedBooleanMessage boolean_message = 5;</code>
+     */
+    openxc.Openxc.TranslatedBooleanMessage getBooleanMessage();
+    /**
+     * <code>optional .openxc.TranslatedBooleanMessage boolean_message = 5;</code>
+     */
+    openxc.Openxc.TranslatedBooleanMessageOrBuilder getBooleanMessageOrBuilder();
+  }
+  /**
+   * Protobuf type {@code openxc.VehicleMessage}
+   */
+  public static final class VehicleMessage extends
+      com.google.protobuf.GeneratedMessage
+      implements VehicleMessageOrBuilder {
+    // Use VehicleMessage.newBuilder() to construct.
+    private VehicleMessage(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
+      super(builder);
+      this.unknownFields = builder.getUnknownFields();
+    }
+    private VehicleMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
+
+    private static final VehicleMessage defaultInstance;
+    public static VehicleMessage getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public VehicleMessage getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+    private final com.google.protobuf.UnknownFieldSet unknownFields;
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+        getUnknownFields() {
+      return this.unknownFields;
+    }
+    private VehicleMessage(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      initFields();
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+            case 8: {
+              int rawValue = input.readEnum();
+              openxc.Openxc.VehicleMessage.Type value = openxc.Openxc.VehicleMessage.Type.valueOf(rawValue);
+              if (value == null) {
+                unknownFields.mergeVarintField(1, rawValue);
+              } else {
+                bitField0_ |= 0x00000001;
+                type_ = value;
+              }
+              break;
+            }
+            case 18: {
+              openxc.Openxc.RawMessage.Builder subBuilder = null;
+              if (((bitField0_ & 0x00000002) == 0x00000002)) {
+                subBuilder = rawMessage_.toBuilder();
+              }
+              rawMessage_ = input.readMessage(openxc.Openxc.RawMessage.PARSER, extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(rawMessage_);
+                rawMessage_ = subBuilder.buildPartial();
+              }
+              bitField0_ |= 0x00000002;
+              break;
+            }
+            case 26: {
+              openxc.Openxc.TranslatedStringMessage.Builder subBuilder = null;
+              if (((bitField0_ & 0x00000004) == 0x00000004)) {
+                subBuilder = stringMessage_.toBuilder();
+              }
+              stringMessage_ = input.readMessage(openxc.Openxc.TranslatedStringMessage.PARSER, extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(stringMessage_);
+                stringMessage_ = subBuilder.buildPartial();
+              }
+              bitField0_ |= 0x00000004;
+              break;
+            }
+            case 34: {
+              openxc.Openxc.TranslatedNumericMessage.Builder subBuilder = null;
+              if (((bitField0_ & 0x00000008) == 0x00000008)) {
+                subBuilder = numericalMessage_.toBuilder();
+              }
+              numericalMessage_ = input.readMessage(openxc.Openxc.TranslatedNumericMessage.PARSER, extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(numericalMessage_);
+                numericalMessage_ = subBuilder.buildPartial();
+              }
+              bitField0_ |= 0x00000008;
+              break;
+            }
+            case 42: {
+              openxc.Openxc.TranslatedBooleanMessage.Builder subBuilder = null;
+              if (((bitField0_ & 0x00000010) == 0x00000010)) {
+                subBuilder = booleanMessage_.toBuilder();
+              }
+              booleanMessage_ = input.readMessage(openxc.Openxc.TranslatedBooleanMessage.PARSER, extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(booleanMessage_);
+                booleanMessage_ = subBuilder.buildPartial();
+              }
+              bitField0_ |= 0x00000010;
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return openxc.Openxc.internal_static_openxc_VehicleMessage_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return openxc.Openxc.internal_static_openxc_VehicleMessage_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              openxc.Openxc.VehicleMessage.class, openxc.Openxc.VehicleMessage.Builder.class);
+    }
+
+    public static com.google.protobuf.Parser<VehicleMessage> PARSER =
+        new com.google.protobuf.AbstractParser<VehicleMessage>() {
+      public VehicleMessage parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new VehicleMessage(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<VehicleMessage> getParserForType() {
+      return PARSER;
+    }
+
+    /**
+     * Protobuf enum {@code openxc.VehicleMessage.Type}
+     */
+    public enum Type
+        implements com.google.protobuf.ProtocolMessageEnum {
+      /**
+       * <code>RAW = 1;</code>
+       */
+      RAW(0, 1),
+      /**
+       * <code>STRING = 2;</code>
+       */
+      STRING(1, 2),
+      /**
+       * <code>NUM = 3;</code>
+       */
+      NUM(2, 3),
+      /**
+       * <code>BOOL = 4;</code>
+       */
+      BOOL(3, 4),
+      ;
+
+      /**
+       * <code>RAW = 1;</code>
+       */
+      public static final int RAW_VALUE = 1;
+      /**
+       * <code>STRING = 2;</code>
+       */
+      public static final int STRING_VALUE = 2;
+      /**
+       * <code>NUM = 3;</code>
+       */
+      public static final int NUM_VALUE = 3;
+      /**
+       * <code>BOOL = 4;</code>
+       */
+      public static final int BOOL_VALUE = 4;
+
+
+      public final int getNumber() { return value; }
+
+      public static Type valueOf(int value) {
+        switch (value) {
+          case 1: return RAW;
+          case 2: return STRING;
+          case 3: return NUM;
+          case 4: return BOOL;
+          default: return null;
+        }
+      }
+
+      public static com.google.protobuf.Internal.EnumLiteMap<Type>
+          internalGetValueMap() {
+        return internalValueMap;
+      }
+      private static com.google.protobuf.Internal.EnumLiteMap<Type>
+          internalValueMap =
+            new com.google.protobuf.Internal.EnumLiteMap<Type>() {
+              public Type findValueByNumber(int number) {
+                return Type.valueOf(number);
+              }
+            };
+
+      public final com.google.protobuf.Descriptors.EnumValueDescriptor
+          getValueDescriptor() {
+        return getDescriptor().getValues().get(index);
+      }
+      public final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptorForType() {
+        return getDescriptor();
+      }
+      public static final com.google.protobuf.Descriptors.EnumDescriptor
+          getDescriptor() {
+        return openxc.Openxc.VehicleMessage.getDescriptor().getEnumTypes().get(0);
+      }
+
+      private static final Type[] VALUES = values();
+
+      public static Type valueOf(
+          com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+        if (desc.getType() != getDescriptor()) {
+          throw new java.lang.IllegalArgumentException(
+            "EnumValueDescriptor is not for this type.");
+        }
+        return VALUES[desc.getIndex()];
+      }
+
+      private final int index;
+      private final int value;
+
+      private Type(int index, int value) {
+        this.index = index;
+        this.value = value;
+      }
+
+      // @@protoc_insertion_point(enum_scope:openxc.VehicleMessage.Type)
+    }
+
+    private int bitField0_;
+    // optional .openxc.VehicleMessage.Type type = 1;
+    public static final int TYPE_FIELD_NUMBER = 1;
+    private openxc.Openxc.VehicleMessage.Type type_;
+    /**
+     * <code>optional .openxc.VehicleMessage.Type type = 1;</code>
+     */
+    public boolean hasType() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    /**
+     * <code>optional .openxc.VehicleMessage.Type type = 1;</code>
+     */
+    public openxc.Openxc.VehicleMessage.Type getType() {
+      return type_;
+    }
+
+    // optional .openxc.RawMessage raw_message = 2;
+    public static final int RAW_MESSAGE_FIELD_NUMBER = 2;
+    private openxc.Openxc.RawMessage rawMessage_;
+    /**
+     * <code>optional .openxc.RawMessage raw_message = 2;</code>
+     */
+    public boolean hasRawMessage() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    /**
+     * <code>optional .openxc.RawMessage raw_message = 2;</code>
+     */
+    public openxc.Openxc.RawMessage getRawMessage() {
+      return rawMessage_;
+    }
+    /**
+     * <code>optional .openxc.RawMessage raw_message = 2;</code>
+     */
+    public openxc.Openxc.RawMessageOrBuilder getRawMessageOrBuilder() {
+      return rawMessage_;
+    }
+
+    // optional .openxc.TranslatedStringMessage string_message = 3;
+    public static final int STRING_MESSAGE_FIELD_NUMBER = 3;
+    private openxc.Openxc.TranslatedStringMessage stringMessage_;
+    /**
+     * <code>optional .openxc.TranslatedStringMessage string_message = 3;</code>
+     */
+    public boolean hasStringMessage() {
+      return ((bitField0_ & 0x00000004) == 0x00000004);
+    }
+    /**
+     * <code>optional .openxc.TranslatedStringMessage string_message = 3;</code>
+     */
+    public openxc.Openxc.TranslatedStringMessage getStringMessage() {
+      return stringMessage_;
+    }
+    /**
+     * <code>optional .openxc.TranslatedStringMessage string_message = 3;</code>
+     */
+    public openxc.Openxc.TranslatedStringMessageOrBuilder getStringMessageOrBuilder() {
+      return stringMessage_;
+    }
+
+    // optional .openxc.TranslatedNumericMessage numerical_message = 4;
+    public static final int NUMERICAL_MESSAGE_FIELD_NUMBER = 4;
+    private openxc.Openxc.TranslatedNumericMessage numericalMessage_;
+    /**
+     * <code>optional .openxc.TranslatedNumericMessage numerical_message = 4;</code>
+     */
+    public boolean hasNumericalMessage() {
+      return ((bitField0_ & 0x00000008) == 0x00000008);
+    }
+    /**
+     * <code>optional .openxc.TranslatedNumericMessage numerical_message = 4;</code>
+     */
+    public openxc.Openxc.TranslatedNumericMessage getNumericalMessage() {
+      return numericalMessage_;
+    }
+    /**
+     * <code>optional .openxc.TranslatedNumericMessage numerical_message = 4;</code>
+     */
+    public openxc.Openxc.TranslatedNumericMessageOrBuilder getNumericalMessageOrBuilder() {
+      return numericalMessage_;
+    }
+
+    // optional .openxc.TranslatedBooleanMessage boolean_message = 5;
+    public static final int BOOLEAN_MESSAGE_FIELD_NUMBER = 5;
+    private openxc.Openxc.TranslatedBooleanMessage booleanMessage_;
+    /**
+     * <code>optional .openxc.TranslatedBooleanMessage boolean_message = 5;</code>
+     */
+    public boolean hasBooleanMessage() {
+      return ((bitField0_ & 0x00000010) == 0x00000010);
+    }
+    /**
+     * <code>optional .openxc.TranslatedBooleanMessage boolean_message = 5;</code>
+     */
+    public openxc.Openxc.TranslatedBooleanMessage getBooleanMessage() {
+      return booleanMessage_;
+    }
+    /**
+     * <code>optional .openxc.TranslatedBooleanMessage boolean_message = 5;</code>
+     */
+    public openxc.Openxc.TranslatedBooleanMessageOrBuilder getBooleanMessageOrBuilder() {
+      return booleanMessage_;
+    }
+
+    private void initFields() {
+      type_ = openxc.Openxc.VehicleMessage.Type.RAW;
+      rawMessage_ = openxc.Openxc.RawMessage.getDefaultInstance();
+      stringMessage_ = openxc.Openxc.TranslatedStringMessage.getDefaultInstance();
+      numericalMessage_ = openxc.Openxc.TranslatedNumericMessage.getDefaultInstance();
+      booleanMessage_ = openxc.Openxc.TranslatedBooleanMessage.getDefaultInstance();
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeEnum(1, type_.getNumber());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeMessage(2, rawMessage_);
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        output.writeMessage(3, stringMessage_);
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        output.writeMessage(4, numericalMessage_);
+      }
+      if (((bitField0_ & 0x00000010) == 0x00000010)) {
+        output.writeMessage(5, booleanMessage_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(1, type_.getNumber());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, rawMessage_);
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, stringMessage_);
+      }
+      if (((bitField0_ & 0x00000008) == 0x00000008)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(4, numericalMessage_);
+      }
+      if (((bitField0_ & 0x00000010) == 0x00000010)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(5, booleanMessage_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+
+    public static openxc.Openxc.VehicleMessage parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static openxc.Openxc.VehicleMessage parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static openxc.Openxc.VehicleMessage parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static openxc.Openxc.VehicleMessage parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static openxc.Openxc.VehicleMessage parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static openxc.Openxc.VehicleMessage parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static openxc.Openxc.VehicleMessage parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static openxc.Openxc.VehicleMessage parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static openxc.Openxc.VehicleMessage parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static openxc.Openxc.VehicleMessage parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(openxc.Openxc.VehicleMessage prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code openxc.VehicleMessage}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements openxc.Openxc.VehicleMessageOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return openxc.Openxc.internal_static_openxc_VehicleMessage_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return openxc.Openxc.internal_static_openxc_VehicleMessage_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                openxc.Openxc.VehicleMessage.class, openxc.Openxc.VehicleMessage.Builder.class);
+      }
+
+      // Construct using openxc.Openxc.VehicleMessage.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+          getRawMessageFieldBuilder();
+          getStringMessageFieldBuilder();
+          getNumericalMessageFieldBuilder();
+          getBooleanMessageFieldBuilder();
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+
+      public Builder clear() {
+        super.clear();
+        type_ = openxc.Openxc.VehicleMessage.Type.RAW;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        if (rawMessageBuilder_ == null) {
+          rawMessage_ = openxc.Openxc.RawMessage.getDefaultInstance();
+        } else {
+          rawMessageBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000002);
+        if (stringMessageBuilder_ == null) {
+          stringMessage_ = openxc.Openxc.TranslatedStringMessage.getDefaultInstance();
+        } else {
+          stringMessageBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000004);
+        if (numericalMessageBuilder_ == null) {
+          numericalMessage_ = openxc.Openxc.TranslatedNumericMessage.getDefaultInstance();
+        } else {
+          numericalMessageBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000008);
+        if (booleanMessageBuilder_ == null) {
+          booleanMessage_ = openxc.Openxc.TranslatedBooleanMessage.getDefaultInstance();
+        } else {
+          booleanMessageBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000010);
+        return this;
+      }
+
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return openxc.Openxc.internal_static_openxc_VehicleMessage_descriptor;
+      }
+
+      public openxc.Openxc.VehicleMessage getDefaultInstanceForType() {
+        return openxc.Openxc.VehicleMessage.getDefaultInstance();
+      }
+
+      public openxc.Openxc.VehicleMessage build() {
+        openxc.Openxc.VehicleMessage result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public openxc.Openxc.VehicleMessage buildPartial() {
+        openxc.Openxc.VehicleMessage result = new openxc.Openxc.VehicleMessage(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.type_ = type_;
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        if (rawMessageBuilder_ == null) {
+          result.rawMessage_ = rawMessage_;
+        } else {
+          result.rawMessage_ = rawMessageBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+          to_bitField0_ |= 0x00000004;
+        }
+        if (stringMessageBuilder_ == null) {
+          result.stringMessage_ = stringMessage_;
+        } else {
+          result.stringMessage_ = stringMessageBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
+          to_bitField0_ |= 0x00000008;
+        }
+        if (numericalMessageBuilder_ == null) {
+          result.numericalMessage_ = numericalMessage_;
+        } else {
+          result.numericalMessage_ = numericalMessageBuilder_.build();
+        }
+        if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
+          to_bitField0_ |= 0x00000010;
+        }
+        if (booleanMessageBuilder_ == null) {
+          result.booleanMessage_ = booleanMessage_;
+        } else {
+          result.booleanMessage_ = booleanMessageBuilder_.build();
+        }
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof openxc.Openxc.VehicleMessage) {
+          return mergeFrom((openxc.Openxc.VehicleMessage)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(openxc.Openxc.VehicleMessage other) {
+        if (other == openxc.Openxc.VehicleMessage.getDefaultInstance()) return this;
+        if (other.hasType()) {
+          setType(other.getType());
+        }
+        if (other.hasRawMessage()) {
+          mergeRawMessage(other.getRawMessage());
+        }
+        if (other.hasStringMessage()) {
+          mergeStringMessage(other.getStringMessage());
+        }
+        if (other.hasNumericalMessage()) {
+          mergeNumericalMessage(other.getNumericalMessage());
+        }
+        if (other.hasBooleanMessage()) {
+          mergeBooleanMessage(other.getBooleanMessage());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        openxc.Openxc.VehicleMessage parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (openxc.Openxc.VehicleMessage) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      // optional .openxc.VehicleMessage.Type type = 1;
+      private openxc.Openxc.VehicleMessage.Type type_ = openxc.Openxc.VehicleMessage.Type.RAW;
+      /**
+       * <code>optional .openxc.VehicleMessage.Type type = 1;</code>
+       */
+      public boolean hasType() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      /**
+       * <code>optional .openxc.VehicleMessage.Type type = 1;</code>
+       */
+      public openxc.Openxc.VehicleMessage.Type getType() {
+        return type_;
+      }
+      /**
+       * <code>optional .openxc.VehicleMessage.Type type = 1;</code>
+       */
+      public Builder setType(openxc.Openxc.VehicleMessage.Type value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        bitField0_ |= 0x00000001;
+        type_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional .openxc.VehicleMessage.Type type = 1;</code>
+       */
+      public Builder clearType() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        type_ = openxc.Openxc.VehicleMessage.Type.RAW;
+        onChanged();
+        return this;
+      }
+
+      // optional .openxc.RawMessage raw_message = 2;
+      private openxc.Openxc.RawMessage rawMessage_ = openxc.Openxc.RawMessage.getDefaultInstance();
+      private com.google.protobuf.SingleFieldBuilder<
+          openxc.Openxc.RawMessage, openxc.Openxc.RawMessage.Builder, openxc.Openxc.RawMessageOrBuilder> rawMessageBuilder_;
+      /**
+       * <code>optional .openxc.RawMessage raw_message = 2;</code>
+       */
+      public boolean hasRawMessage() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      /**
+       * <code>optional .openxc.RawMessage raw_message = 2;</code>
+       */
+      public openxc.Openxc.RawMessage getRawMessage() {
+        if (rawMessageBuilder_ == null) {
+          return rawMessage_;
+        } else {
+          return rawMessageBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>optional .openxc.RawMessage raw_message = 2;</code>
+       */
+      public Builder setRawMessage(openxc.Openxc.RawMessage value) {
+        if (rawMessageBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          rawMessage_ = value;
+          onChanged();
+        } else {
+          rawMessageBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000002;
+        return this;
+      }
+      /**
+       * <code>optional .openxc.RawMessage raw_message = 2;</code>
+       */
+      public Builder setRawMessage(
+          openxc.Openxc.RawMessage.Builder builderForValue) {
+        if (rawMessageBuilder_ == null) {
+          rawMessage_ = builderForValue.build();
+          onChanged();
+        } else {
+          rawMessageBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000002;
+        return this;
+      }
+      /**
+       * <code>optional .openxc.RawMessage raw_message = 2;</code>
+       */
+      public Builder mergeRawMessage(openxc.Openxc.RawMessage value) {
+        if (rawMessageBuilder_ == null) {
+          if (((bitField0_ & 0x00000002) == 0x00000002) &&
+              rawMessage_ != openxc.Openxc.RawMessage.getDefaultInstance()) {
+            rawMessage_ =
+              openxc.Openxc.RawMessage.newBuilder(rawMessage_).mergeFrom(value).buildPartial();
+          } else {
+            rawMessage_ = value;
+          }
+          onChanged();
+        } else {
+          rawMessageBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000002;
+        return this;
+      }
+      /**
+       * <code>optional .openxc.RawMessage raw_message = 2;</code>
+       */
+      public Builder clearRawMessage() {
+        if (rawMessageBuilder_ == null) {
+          rawMessage_ = openxc.Openxc.RawMessage.getDefaultInstance();
+          onChanged();
+        } else {
+          rawMessageBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000002);
+        return this;
+      }
+      /**
+       * <code>optional .openxc.RawMessage raw_message = 2;</code>
+       */
+      public openxc.Openxc.RawMessage.Builder getRawMessageBuilder() {
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return getRawMessageFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>optional .openxc.RawMessage raw_message = 2;</code>
+       */
+      public openxc.Openxc.RawMessageOrBuilder getRawMessageOrBuilder() {
+        if (rawMessageBuilder_ != null) {
+          return rawMessageBuilder_.getMessageOrBuilder();
+        } else {
+          return rawMessage_;
+        }
+      }
+      /**
+       * <code>optional .openxc.RawMessage raw_message = 2;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilder<
+          openxc.Openxc.RawMessage, openxc.Openxc.RawMessage.Builder, openxc.Openxc.RawMessageOrBuilder> 
+          getRawMessageFieldBuilder() {
+        if (rawMessageBuilder_ == null) {
+          rawMessageBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+              openxc.Openxc.RawMessage, openxc.Openxc.RawMessage.Builder, openxc.Openxc.RawMessageOrBuilder>(
+                  rawMessage_,
+                  getParentForChildren(),
+                  isClean());
+          rawMessage_ = null;
+        }
+        return rawMessageBuilder_;
+      }
+
+      // optional .openxc.TranslatedStringMessage string_message = 3;
+      private openxc.Openxc.TranslatedStringMessage stringMessage_ = openxc.Openxc.TranslatedStringMessage.getDefaultInstance();
+      private com.google.protobuf.SingleFieldBuilder<
+          openxc.Openxc.TranslatedStringMessage, openxc.Openxc.TranslatedStringMessage.Builder, openxc.Openxc.TranslatedStringMessageOrBuilder> stringMessageBuilder_;
+      /**
+       * <code>optional .openxc.TranslatedStringMessage string_message = 3;</code>
+       */
+      public boolean hasStringMessage() {
+        return ((bitField0_ & 0x00000004) == 0x00000004);
+      }
+      /**
+       * <code>optional .openxc.TranslatedStringMessage string_message = 3;</code>
+       */
+      public openxc.Openxc.TranslatedStringMessage getStringMessage() {
+        if (stringMessageBuilder_ == null) {
+          return stringMessage_;
+        } else {
+          return stringMessageBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>optional .openxc.TranslatedStringMessage string_message = 3;</code>
+       */
+      public Builder setStringMessage(openxc.Openxc.TranslatedStringMessage value) {
+        if (stringMessageBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          stringMessage_ = value;
+          onChanged();
+        } else {
+          stringMessageBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000004;
+        return this;
+      }
+      /**
+       * <code>optional .openxc.TranslatedStringMessage string_message = 3;</code>
+       */
+      public Builder setStringMessage(
+          openxc.Openxc.TranslatedStringMessage.Builder builderForValue) {
+        if (stringMessageBuilder_ == null) {
+          stringMessage_ = builderForValue.build();
+          onChanged();
+        } else {
+          stringMessageBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000004;
+        return this;
+      }
+      /**
+       * <code>optional .openxc.TranslatedStringMessage string_message = 3;</code>
+       */
+      public Builder mergeStringMessage(openxc.Openxc.TranslatedStringMessage value) {
+        if (stringMessageBuilder_ == null) {
+          if (((bitField0_ & 0x00000004) == 0x00000004) &&
+              stringMessage_ != openxc.Openxc.TranslatedStringMessage.getDefaultInstance()) {
+            stringMessage_ =
+              openxc.Openxc.TranslatedStringMessage.newBuilder(stringMessage_).mergeFrom(value).buildPartial();
+          } else {
+            stringMessage_ = value;
+          }
+          onChanged();
+        } else {
+          stringMessageBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000004;
+        return this;
+      }
+      /**
+       * <code>optional .openxc.TranslatedStringMessage string_message = 3;</code>
+       */
+      public Builder clearStringMessage() {
+        if (stringMessageBuilder_ == null) {
+          stringMessage_ = openxc.Openxc.TranslatedStringMessage.getDefaultInstance();
+          onChanged();
+        } else {
+          stringMessageBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000004);
+        return this;
+      }
+      /**
+       * <code>optional .openxc.TranslatedStringMessage string_message = 3;</code>
+       */
+      public openxc.Openxc.TranslatedStringMessage.Builder getStringMessageBuilder() {
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return getStringMessageFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>optional .openxc.TranslatedStringMessage string_message = 3;</code>
+       */
+      public openxc.Openxc.TranslatedStringMessageOrBuilder getStringMessageOrBuilder() {
+        if (stringMessageBuilder_ != null) {
+          return stringMessageBuilder_.getMessageOrBuilder();
+        } else {
+          return stringMessage_;
+        }
+      }
+      /**
+       * <code>optional .openxc.TranslatedStringMessage string_message = 3;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilder<
+          openxc.Openxc.TranslatedStringMessage, openxc.Openxc.TranslatedStringMessage.Builder, openxc.Openxc.TranslatedStringMessageOrBuilder> 
+          getStringMessageFieldBuilder() {
+        if (stringMessageBuilder_ == null) {
+          stringMessageBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+              openxc.Openxc.TranslatedStringMessage, openxc.Openxc.TranslatedStringMessage.Builder, openxc.Openxc.TranslatedStringMessageOrBuilder>(
+                  stringMessage_,
+                  getParentForChildren(),
+                  isClean());
+          stringMessage_ = null;
+        }
+        return stringMessageBuilder_;
+      }
+
+      // optional .openxc.TranslatedNumericMessage numerical_message = 4;
+      private openxc.Openxc.TranslatedNumericMessage numericalMessage_ = openxc.Openxc.TranslatedNumericMessage.getDefaultInstance();
+      private com.google.protobuf.SingleFieldBuilder<
+          openxc.Openxc.TranslatedNumericMessage, openxc.Openxc.TranslatedNumericMessage.Builder, openxc.Openxc.TranslatedNumericMessageOrBuilder> numericalMessageBuilder_;
+      /**
+       * <code>optional .openxc.TranslatedNumericMessage numerical_message = 4;</code>
+       */
+      public boolean hasNumericalMessage() {
+        return ((bitField0_ & 0x00000008) == 0x00000008);
+      }
+      /**
+       * <code>optional .openxc.TranslatedNumericMessage numerical_message = 4;</code>
+       */
+      public openxc.Openxc.TranslatedNumericMessage getNumericalMessage() {
+        if (numericalMessageBuilder_ == null) {
+          return numericalMessage_;
+        } else {
+          return numericalMessageBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>optional .openxc.TranslatedNumericMessage numerical_message = 4;</code>
+       */
+      public Builder setNumericalMessage(openxc.Openxc.TranslatedNumericMessage value) {
+        if (numericalMessageBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          numericalMessage_ = value;
+          onChanged();
+        } else {
+          numericalMessageBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000008;
+        return this;
+      }
+      /**
+       * <code>optional .openxc.TranslatedNumericMessage numerical_message = 4;</code>
+       */
+      public Builder setNumericalMessage(
+          openxc.Openxc.TranslatedNumericMessage.Builder builderForValue) {
+        if (numericalMessageBuilder_ == null) {
+          numericalMessage_ = builderForValue.build();
+          onChanged();
+        } else {
+          numericalMessageBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000008;
+        return this;
+      }
+      /**
+       * <code>optional .openxc.TranslatedNumericMessage numerical_message = 4;</code>
+       */
+      public Builder mergeNumericalMessage(openxc.Openxc.TranslatedNumericMessage value) {
+        if (numericalMessageBuilder_ == null) {
+          if (((bitField0_ & 0x00000008) == 0x00000008) &&
+              numericalMessage_ != openxc.Openxc.TranslatedNumericMessage.getDefaultInstance()) {
+            numericalMessage_ =
+              openxc.Openxc.TranslatedNumericMessage.newBuilder(numericalMessage_).mergeFrom(value).buildPartial();
+          } else {
+            numericalMessage_ = value;
+          }
+          onChanged();
+        } else {
+          numericalMessageBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000008;
+        return this;
+      }
+      /**
+       * <code>optional .openxc.TranslatedNumericMessage numerical_message = 4;</code>
+       */
+      public Builder clearNumericalMessage() {
+        if (numericalMessageBuilder_ == null) {
+          numericalMessage_ = openxc.Openxc.TranslatedNumericMessage.getDefaultInstance();
+          onChanged();
+        } else {
+          numericalMessageBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000008);
+        return this;
+      }
+      /**
+       * <code>optional .openxc.TranslatedNumericMessage numerical_message = 4;</code>
+       */
+      public openxc.Openxc.TranslatedNumericMessage.Builder getNumericalMessageBuilder() {
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return getNumericalMessageFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>optional .openxc.TranslatedNumericMessage numerical_message = 4;</code>
+       */
+      public openxc.Openxc.TranslatedNumericMessageOrBuilder getNumericalMessageOrBuilder() {
+        if (numericalMessageBuilder_ != null) {
+          return numericalMessageBuilder_.getMessageOrBuilder();
+        } else {
+          return numericalMessage_;
+        }
+      }
+      /**
+       * <code>optional .openxc.TranslatedNumericMessage numerical_message = 4;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilder<
+          openxc.Openxc.TranslatedNumericMessage, openxc.Openxc.TranslatedNumericMessage.Builder, openxc.Openxc.TranslatedNumericMessageOrBuilder> 
+          getNumericalMessageFieldBuilder() {
+        if (numericalMessageBuilder_ == null) {
+          numericalMessageBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+              openxc.Openxc.TranslatedNumericMessage, openxc.Openxc.TranslatedNumericMessage.Builder, openxc.Openxc.TranslatedNumericMessageOrBuilder>(
+                  numericalMessage_,
+                  getParentForChildren(),
+                  isClean());
+          numericalMessage_ = null;
+        }
+        return numericalMessageBuilder_;
+      }
+
+      // optional .openxc.TranslatedBooleanMessage boolean_message = 5;
+      private openxc.Openxc.TranslatedBooleanMessage booleanMessage_ = openxc.Openxc.TranslatedBooleanMessage.getDefaultInstance();
+      private com.google.protobuf.SingleFieldBuilder<
+          openxc.Openxc.TranslatedBooleanMessage, openxc.Openxc.TranslatedBooleanMessage.Builder, openxc.Openxc.TranslatedBooleanMessageOrBuilder> booleanMessageBuilder_;
+      /**
+       * <code>optional .openxc.TranslatedBooleanMessage boolean_message = 5;</code>
+       */
+      public boolean hasBooleanMessage() {
+        return ((bitField0_ & 0x00000010) == 0x00000010);
+      }
+      /**
+       * <code>optional .openxc.TranslatedBooleanMessage boolean_message = 5;</code>
+       */
+      public openxc.Openxc.TranslatedBooleanMessage getBooleanMessage() {
+        if (booleanMessageBuilder_ == null) {
+          return booleanMessage_;
+        } else {
+          return booleanMessageBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>optional .openxc.TranslatedBooleanMessage boolean_message = 5;</code>
+       */
+      public Builder setBooleanMessage(openxc.Openxc.TranslatedBooleanMessage value) {
+        if (booleanMessageBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          booleanMessage_ = value;
+          onChanged();
+        } else {
+          booleanMessageBuilder_.setMessage(value);
+        }
+        bitField0_ |= 0x00000010;
+        return this;
+      }
+      /**
+       * <code>optional .openxc.TranslatedBooleanMessage boolean_message = 5;</code>
+       */
+      public Builder setBooleanMessage(
+          openxc.Openxc.TranslatedBooleanMessage.Builder builderForValue) {
+        if (booleanMessageBuilder_ == null) {
+          booleanMessage_ = builderForValue.build();
+          onChanged();
+        } else {
+          booleanMessageBuilder_.setMessage(builderForValue.build());
+        }
+        bitField0_ |= 0x00000010;
+        return this;
+      }
+      /**
+       * <code>optional .openxc.TranslatedBooleanMessage boolean_message = 5;</code>
+       */
+      public Builder mergeBooleanMessage(openxc.Openxc.TranslatedBooleanMessage value) {
+        if (booleanMessageBuilder_ == null) {
+          if (((bitField0_ & 0x00000010) == 0x00000010) &&
+              booleanMessage_ != openxc.Openxc.TranslatedBooleanMessage.getDefaultInstance()) {
+            booleanMessage_ =
+              openxc.Openxc.TranslatedBooleanMessage.newBuilder(booleanMessage_).mergeFrom(value).buildPartial();
+          } else {
+            booleanMessage_ = value;
+          }
+          onChanged();
+        } else {
+          booleanMessageBuilder_.mergeFrom(value);
+        }
+        bitField0_ |= 0x00000010;
+        return this;
+      }
+      /**
+       * <code>optional .openxc.TranslatedBooleanMessage boolean_message = 5;</code>
+       */
+      public Builder clearBooleanMessage() {
+        if (booleanMessageBuilder_ == null) {
+          booleanMessage_ = openxc.Openxc.TranslatedBooleanMessage.getDefaultInstance();
+          onChanged();
+        } else {
+          booleanMessageBuilder_.clear();
+        }
+        bitField0_ = (bitField0_ & ~0x00000010);
+        return this;
+      }
+      /**
+       * <code>optional .openxc.TranslatedBooleanMessage boolean_message = 5;</code>
+       */
+      public openxc.Openxc.TranslatedBooleanMessage.Builder getBooleanMessageBuilder() {
+        bitField0_ |= 0x00000010;
+        onChanged();
+        return getBooleanMessageFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>optional .openxc.TranslatedBooleanMessage boolean_message = 5;</code>
+       */
+      public openxc.Openxc.TranslatedBooleanMessageOrBuilder getBooleanMessageOrBuilder() {
+        if (booleanMessageBuilder_ != null) {
+          return booleanMessageBuilder_.getMessageOrBuilder();
+        } else {
+          return booleanMessage_;
+        }
+      }
+      /**
+       * <code>optional .openxc.TranslatedBooleanMessage boolean_message = 5;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilder<
+          openxc.Openxc.TranslatedBooleanMessage, openxc.Openxc.TranslatedBooleanMessage.Builder, openxc.Openxc.TranslatedBooleanMessageOrBuilder> 
+          getBooleanMessageFieldBuilder() {
+        if (booleanMessageBuilder_ == null) {
+          booleanMessageBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+              openxc.Openxc.TranslatedBooleanMessage, openxc.Openxc.TranslatedBooleanMessage.Builder, openxc.Openxc.TranslatedBooleanMessageOrBuilder>(
+                  booleanMessage_,
+                  getParentForChildren(),
+                  isClean());
+          booleanMessage_ = null;
+        }
+        return booleanMessageBuilder_;
+      }
+
+      // @@protoc_insertion_point(builder_scope:openxc.VehicleMessage)
+    }
+
+    static {
+      defaultInstance = new VehicleMessage(true);
+      defaultInstance.initFields();
+    }
+
+    // @@protoc_insertion_point(class_scope:openxc.VehicleMessage)
+  }
+
+  public interface RawMessageOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+
+    // optional int32 bus = 1;
+    /**
+     * <code>optional int32 bus = 1;</code>
+     */
+    boolean hasBus();
+    /**
+     * <code>optional int32 bus = 1;</code>
+     */
+    int getBus();
+
+    // optional uint32 message_id = 2;
+    /**
+     * <code>optional uint32 message_id = 2;</code>
+     */
+    boolean hasMessageId();
+    /**
+     * <code>optional uint32 message_id = 2;</code>
+     */
+    int getMessageId();
+
+    // optional sint64 data = 3;
+    /**
+     * <code>optional sint64 data = 3;</code>
+     */
+    boolean hasData();
+    /**
+     * <code>optional sint64 data = 3;</code>
+     */
+    long getData();
+  }
+  /**
+   * Protobuf type {@code openxc.RawMessage}
+   */
+  public static final class RawMessage extends
+      com.google.protobuf.GeneratedMessage
+      implements RawMessageOrBuilder {
+    // Use RawMessage.newBuilder() to construct.
+    private RawMessage(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
+      super(builder);
+      this.unknownFields = builder.getUnknownFields();
+    }
+    private RawMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
+
+    private static final RawMessage defaultInstance;
+    public static RawMessage getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public RawMessage getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+    private final com.google.protobuf.UnknownFieldSet unknownFields;
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+        getUnknownFields() {
+      return this.unknownFields;
+    }
+    private RawMessage(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      initFields();
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+            case 8: {
+              bitField0_ |= 0x00000001;
+              bus_ = input.readInt32();
+              break;
+            }
+            case 16: {
+              bitField0_ |= 0x00000002;
+              messageId_ = input.readUInt32();
+              break;
+            }
+            case 24: {
+              bitField0_ |= 0x00000004;
+              data_ = input.readSInt64();
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return openxc.Openxc.internal_static_openxc_RawMessage_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return openxc.Openxc.internal_static_openxc_RawMessage_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              openxc.Openxc.RawMessage.class, openxc.Openxc.RawMessage.Builder.class);
+    }
+
+    public static com.google.protobuf.Parser<RawMessage> PARSER =
+        new com.google.protobuf.AbstractParser<RawMessage>() {
+      public RawMessage parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new RawMessage(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<RawMessage> getParserForType() {
+      return PARSER;
+    }
+
+    private int bitField0_;
+    // optional int32 bus = 1;
+    public static final int BUS_FIELD_NUMBER = 1;
+    private int bus_;
+    /**
+     * <code>optional int32 bus = 1;</code>
+     */
+    public boolean hasBus() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    /**
+     * <code>optional int32 bus = 1;</code>
+     */
+    public int getBus() {
+      return bus_;
+    }
+
+    // optional uint32 message_id = 2;
+    public static final int MESSAGE_ID_FIELD_NUMBER = 2;
+    private int messageId_;
+    /**
+     * <code>optional uint32 message_id = 2;</code>
+     */
+    public boolean hasMessageId() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    /**
+     * <code>optional uint32 message_id = 2;</code>
+     */
+    public int getMessageId() {
+      return messageId_;
+    }
+
+    // optional sint64 data = 3;
+    public static final int DATA_FIELD_NUMBER = 3;
+    private long data_;
+    /**
+     * <code>optional sint64 data = 3;</code>
+     */
+    public boolean hasData() {
+      return ((bitField0_ & 0x00000004) == 0x00000004);
+    }
+    /**
+     * <code>optional sint64 data = 3;</code>
+     */
+    public long getData() {
+      return data_;
+    }
+
+    private void initFields() {
+      bus_ = 0;
+      messageId_ = 0;
+      data_ = 0L;
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeInt32(1, bus_);
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeUInt32(2, messageId_);
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        output.writeSInt64(3, data_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt32Size(1, bus_);
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt32Size(2, messageId_);
+      }
+      if (((bitField0_ & 0x00000004) == 0x00000004)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeSInt64Size(3, data_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+
+    public static openxc.Openxc.RawMessage parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static openxc.Openxc.RawMessage parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static openxc.Openxc.RawMessage parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static openxc.Openxc.RawMessage parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static openxc.Openxc.RawMessage parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static openxc.Openxc.RawMessage parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static openxc.Openxc.RawMessage parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static openxc.Openxc.RawMessage parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static openxc.Openxc.RawMessage parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static openxc.Openxc.RawMessage parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(openxc.Openxc.RawMessage prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code openxc.RawMessage}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements openxc.Openxc.RawMessageOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return openxc.Openxc.internal_static_openxc_RawMessage_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return openxc.Openxc.internal_static_openxc_RawMessage_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                openxc.Openxc.RawMessage.class, openxc.Openxc.RawMessage.Builder.class);
+      }
+
+      // Construct using openxc.Openxc.RawMessage.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+
+      public Builder clear() {
+        super.clear();
+        bus_ = 0;
+        bitField0_ = (bitField0_ & ~0x00000001);
+        messageId_ = 0;
+        bitField0_ = (bitField0_ & ~0x00000002);
+        data_ = 0L;
+        bitField0_ = (bitField0_ & ~0x00000004);
+        return this;
+      }
+
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return openxc.Openxc.internal_static_openxc_RawMessage_descriptor;
+      }
+
+      public openxc.Openxc.RawMessage getDefaultInstanceForType() {
+        return openxc.Openxc.RawMessage.getDefaultInstance();
+      }
+
+      public openxc.Openxc.RawMessage build() {
+        openxc.Openxc.RawMessage result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public openxc.Openxc.RawMessage buildPartial() {
+        openxc.Openxc.RawMessage result = new openxc.Openxc.RawMessage(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.bus_ = bus_;
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.messageId_ = messageId_;
+        if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+          to_bitField0_ |= 0x00000004;
+        }
+        result.data_ = data_;
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof openxc.Openxc.RawMessage) {
+          return mergeFrom((openxc.Openxc.RawMessage)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(openxc.Openxc.RawMessage other) {
+        if (other == openxc.Openxc.RawMessage.getDefaultInstance()) return this;
+        if (other.hasBus()) {
+          setBus(other.getBus());
+        }
+        if (other.hasMessageId()) {
+          setMessageId(other.getMessageId());
+        }
+        if (other.hasData()) {
+          setData(other.getData());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        openxc.Openxc.RawMessage parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (openxc.Openxc.RawMessage) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      // optional int32 bus = 1;
+      private int bus_ ;
+      /**
+       * <code>optional int32 bus = 1;</code>
+       */
+      public boolean hasBus() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      /**
+       * <code>optional int32 bus = 1;</code>
+       */
+      public int getBus() {
+        return bus_;
+      }
+      /**
+       * <code>optional int32 bus = 1;</code>
+       */
+      public Builder setBus(int value) {
+        bitField0_ |= 0x00000001;
+        bus_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional int32 bus = 1;</code>
+       */
+      public Builder clearBus() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        bus_ = 0;
+        onChanged();
+        return this;
+      }
+
+      // optional uint32 message_id = 2;
+      private int messageId_ ;
+      /**
+       * <code>optional uint32 message_id = 2;</code>
+       */
+      public boolean hasMessageId() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      /**
+       * <code>optional uint32 message_id = 2;</code>
+       */
+      public int getMessageId() {
+        return messageId_;
+      }
+      /**
+       * <code>optional uint32 message_id = 2;</code>
+       */
+      public Builder setMessageId(int value) {
+        bitField0_ |= 0x00000002;
+        messageId_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional uint32 message_id = 2;</code>
+       */
+      public Builder clearMessageId() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        messageId_ = 0;
+        onChanged();
+        return this;
+      }
+
+      // optional sint64 data = 3;
+      private long data_ ;
+      /**
+       * <code>optional sint64 data = 3;</code>
+       */
+      public boolean hasData() {
+        return ((bitField0_ & 0x00000004) == 0x00000004);
+      }
+      /**
+       * <code>optional sint64 data = 3;</code>
+       */
+      public long getData() {
+        return data_;
+      }
+      /**
+       * <code>optional sint64 data = 3;</code>
+       */
+      public Builder setData(long value) {
+        bitField0_ |= 0x00000004;
+        data_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional sint64 data = 3;</code>
+       */
+      public Builder clearData() {
+        bitField0_ = (bitField0_ & ~0x00000004);
+        data_ = 0L;
+        onChanged();
+        return this;
+      }
+
+      // @@protoc_insertion_point(builder_scope:openxc.RawMessage)
+    }
+
+    static {
+      defaultInstance = new RawMessage(true);
+      defaultInstance.initFields();
+    }
+
+    // @@protoc_insertion_point(class_scope:openxc.RawMessage)
+  }
+
+  public interface TranslatedStringMessageOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+
+    // optional string name = 1;
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    boolean hasName();
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    java.lang.String getName();
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    com.google.protobuf.ByteString
+        getNameBytes();
+
+    // optional string value = 2;
+    /**
+     * <code>optional string value = 2;</code>
+     */
+    boolean hasValue();
+    /**
+     * <code>optional string value = 2;</code>
+     */
+    java.lang.String getValue();
+    /**
+     * <code>optional string value = 2;</code>
+     */
+    com.google.protobuf.ByteString
+        getValueBytes();
+  }
+  /**
+   * Protobuf type {@code openxc.TranslatedStringMessage}
+   */
+  public static final class TranslatedStringMessage extends
+      com.google.protobuf.GeneratedMessage
+      implements TranslatedStringMessageOrBuilder {
+    // Use TranslatedStringMessage.newBuilder() to construct.
+    private TranslatedStringMessage(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
+      super(builder);
+      this.unknownFields = builder.getUnknownFields();
+    }
+    private TranslatedStringMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
+
+    private static final TranslatedStringMessage defaultInstance;
+    public static TranslatedStringMessage getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public TranslatedStringMessage getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+    private final com.google.protobuf.UnknownFieldSet unknownFields;
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+        getUnknownFields() {
+      return this.unknownFields;
+    }
+    private TranslatedStringMessage(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      initFields();
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+            case 10: {
+              bitField0_ |= 0x00000001;
+              name_ = input.readBytes();
+              break;
+            }
+            case 18: {
+              bitField0_ |= 0x00000002;
+              value_ = input.readBytes();
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return openxc.Openxc.internal_static_openxc_TranslatedStringMessage_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return openxc.Openxc.internal_static_openxc_TranslatedStringMessage_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              openxc.Openxc.TranslatedStringMessage.class, openxc.Openxc.TranslatedStringMessage.Builder.class);
+    }
+
+    public static com.google.protobuf.Parser<TranslatedStringMessage> PARSER =
+        new com.google.protobuf.AbstractParser<TranslatedStringMessage>() {
+      public TranslatedStringMessage parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new TranslatedStringMessage(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<TranslatedStringMessage> getParserForType() {
+      return PARSER;
+    }
+
+    private int bitField0_;
+    // optional string name = 1;
+    public static final int NAME_FIELD_NUMBER = 1;
+    private java.lang.Object name_;
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public boolean hasName() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public java.lang.String getName() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (bs.isValidUtf8()) {
+          name_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public com.google.protobuf.ByteString
+        getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    // optional string value = 2;
+    public static final int VALUE_FIELD_NUMBER = 2;
+    private java.lang.Object value_;
+    /**
+     * <code>optional string value = 2;</code>
+     */
+    public boolean hasValue() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    /**
+     * <code>optional string value = 2;</code>
+     */
+    public java.lang.String getValue() {
+      java.lang.Object ref = value_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (bs.isValidUtf8()) {
+          value_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>optional string value = 2;</code>
+     */
+    public com.google.protobuf.ByteString
+        getValueBytes() {
+      java.lang.Object ref = value_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        value_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    private void initFields() {
+      name_ = "";
+      value_ = "";
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeBytes(1, getNameBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeBytes(2, getValueBytes());
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getNameBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(2, getValueBytes());
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+
+    public static openxc.Openxc.TranslatedStringMessage parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static openxc.Openxc.TranslatedStringMessage parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static openxc.Openxc.TranslatedStringMessage parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static openxc.Openxc.TranslatedStringMessage parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static openxc.Openxc.TranslatedStringMessage parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static openxc.Openxc.TranslatedStringMessage parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static openxc.Openxc.TranslatedStringMessage parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static openxc.Openxc.TranslatedStringMessage parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static openxc.Openxc.TranslatedStringMessage parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static openxc.Openxc.TranslatedStringMessage parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(openxc.Openxc.TranslatedStringMessage prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code openxc.TranslatedStringMessage}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements openxc.Openxc.TranslatedStringMessageOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return openxc.Openxc.internal_static_openxc_TranslatedStringMessage_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return openxc.Openxc.internal_static_openxc_TranslatedStringMessage_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                openxc.Openxc.TranslatedStringMessage.class, openxc.Openxc.TranslatedStringMessage.Builder.class);
+      }
+
+      // Construct using openxc.Openxc.TranslatedStringMessage.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+
+      public Builder clear() {
+        super.clear();
+        name_ = "";
+        bitField0_ = (bitField0_ & ~0x00000001);
+        value_ = "";
+        bitField0_ = (bitField0_ & ~0x00000002);
+        return this;
+      }
+
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return openxc.Openxc.internal_static_openxc_TranslatedStringMessage_descriptor;
+      }
+
+      public openxc.Openxc.TranslatedStringMessage getDefaultInstanceForType() {
+        return openxc.Openxc.TranslatedStringMessage.getDefaultInstance();
+      }
+
+      public openxc.Openxc.TranslatedStringMessage build() {
+        openxc.Openxc.TranslatedStringMessage result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public openxc.Openxc.TranslatedStringMessage buildPartial() {
+        openxc.Openxc.TranslatedStringMessage result = new openxc.Openxc.TranslatedStringMessage(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.name_ = name_;
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.value_ = value_;
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof openxc.Openxc.TranslatedStringMessage) {
+          return mergeFrom((openxc.Openxc.TranslatedStringMessage)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(openxc.Openxc.TranslatedStringMessage other) {
+        if (other == openxc.Openxc.TranslatedStringMessage.getDefaultInstance()) return this;
+        if (other.hasName()) {
+          bitField0_ |= 0x00000001;
+          name_ = other.name_;
+          onChanged();
+        }
+        if (other.hasValue()) {
+          bitField0_ |= 0x00000002;
+          value_ = other.value_;
+          onChanged();
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        openxc.Openxc.TranslatedStringMessage parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (openxc.Openxc.TranslatedStringMessage) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      // optional string name = 1;
+      private java.lang.Object name_ = "";
+      /**
+       * <code>optional string name = 1;</code>
+       */
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      /**
+       * <code>optional string name = 1;</code>
+       */
+      public java.lang.String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof java.lang.String)) {
+          java.lang.String s = ((com.google.protobuf.ByteString) ref)
+              .toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>optional string name = 1;</code>
+       */
+      public com.google.protobuf.ByteString
+          getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>optional string name = 1;</code>
+       */
+      public Builder setName(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string name = 1;</code>
+       */
+      public Builder clearName() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        name_ = getDefaultInstance().getName();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string name = 1;</code>
+       */
+      public Builder setNameBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+        return this;
+      }
+
+      // optional string value = 2;
+      private java.lang.Object value_ = "";
+      /**
+       * <code>optional string value = 2;</code>
+       */
+      public boolean hasValue() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      /**
+       * <code>optional string value = 2;</code>
+       */
+      public java.lang.String getValue() {
+        java.lang.Object ref = value_;
+        if (!(ref instanceof java.lang.String)) {
+          java.lang.String s = ((com.google.protobuf.ByteString) ref)
+              .toStringUtf8();
+          value_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>optional string value = 2;</code>
+       */
+      public com.google.protobuf.ByteString
+          getValueBytes() {
+        java.lang.Object ref = value_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          value_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>optional string value = 2;</code>
+       */
+      public Builder setValue(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000002;
+        value_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string value = 2;</code>
+       */
+      public Builder clearValue() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        value_ = getDefaultInstance().getValue();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string value = 2;</code>
+       */
+      public Builder setValueBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000002;
+        value_ = value;
+        onChanged();
+        return this;
+      }
+
+      // @@protoc_insertion_point(builder_scope:openxc.TranslatedStringMessage)
+    }
+
+    static {
+      defaultInstance = new TranslatedStringMessage(true);
+      defaultInstance.initFields();
+    }
+
+    // @@protoc_insertion_point(class_scope:openxc.TranslatedStringMessage)
+  }
+
+  public interface TranslatedNumericMessageOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+
+    // optional string name = 1;
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    boolean hasName();
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    java.lang.String getName();
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    com.google.protobuf.ByteString
+        getNameBytes();
+
+    // optional double value = 2;
+    /**
+     * <code>optional double value = 2;</code>
+     */
+    boolean hasValue();
+    /**
+     * <code>optional double value = 2;</code>
+     */
+    double getValue();
+  }
+  /**
+   * Protobuf type {@code openxc.TranslatedNumericMessage}
+   */
+  public static final class TranslatedNumericMessage extends
+      com.google.protobuf.GeneratedMessage
+      implements TranslatedNumericMessageOrBuilder {
+    // Use TranslatedNumericMessage.newBuilder() to construct.
+    private TranslatedNumericMessage(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
+      super(builder);
+      this.unknownFields = builder.getUnknownFields();
+    }
+    private TranslatedNumericMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
+
+    private static final TranslatedNumericMessage defaultInstance;
+    public static TranslatedNumericMessage getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public TranslatedNumericMessage getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+    private final com.google.protobuf.UnknownFieldSet unknownFields;
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+        getUnknownFields() {
+      return this.unknownFields;
+    }
+    private TranslatedNumericMessage(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      initFields();
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+            case 10: {
+              bitField0_ |= 0x00000001;
+              name_ = input.readBytes();
+              break;
+            }
+            case 17: {
+              bitField0_ |= 0x00000002;
+              value_ = input.readDouble();
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return openxc.Openxc.internal_static_openxc_TranslatedNumericMessage_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return openxc.Openxc.internal_static_openxc_TranslatedNumericMessage_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              openxc.Openxc.TranslatedNumericMessage.class, openxc.Openxc.TranslatedNumericMessage.Builder.class);
+    }
+
+    public static com.google.protobuf.Parser<TranslatedNumericMessage> PARSER =
+        new com.google.protobuf.AbstractParser<TranslatedNumericMessage>() {
+      public TranslatedNumericMessage parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new TranslatedNumericMessage(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<TranslatedNumericMessage> getParserForType() {
+      return PARSER;
+    }
+
+    private int bitField0_;
+    // optional string name = 1;
+    public static final int NAME_FIELD_NUMBER = 1;
+    private java.lang.Object name_;
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public boolean hasName() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public java.lang.String getName() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (bs.isValidUtf8()) {
+          name_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public com.google.protobuf.ByteString
+        getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    // optional double value = 2;
+    public static final int VALUE_FIELD_NUMBER = 2;
+    private double value_;
+    /**
+     * <code>optional double value = 2;</code>
+     */
+    public boolean hasValue() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    /**
+     * <code>optional double value = 2;</code>
+     */
+    public double getValue() {
+      return value_;
+    }
+
+    private void initFields() {
+      name_ = "";
+      value_ = 0D;
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeBytes(1, getNameBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeDouble(2, value_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getNameBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeDoubleSize(2, value_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+
+    public static openxc.Openxc.TranslatedNumericMessage parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static openxc.Openxc.TranslatedNumericMessage parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static openxc.Openxc.TranslatedNumericMessage parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static openxc.Openxc.TranslatedNumericMessage parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static openxc.Openxc.TranslatedNumericMessage parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static openxc.Openxc.TranslatedNumericMessage parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static openxc.Openxc.TranslatedNumericMessage parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static openxc.Openxc.TranslatedNumericMessage parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static openxc.Openxc.TranslatedNumericMessage parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static openxc.Openxc.TranslatedNumericMessage parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(openxc.Openxc.TranslatedNumericMessage prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code openxc.TranslatedNumericMessage}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements openxc.Openxc.TranslatedNumericMessageOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return openxc.Openxc.internal_static_openxc_TranslatedNumericMessage_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return openxc.Openxc.internal_static_openxc_TranslatedNumericMessage_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                openxc.Openxc.TranslatedNumericMessage.class, openxc.Openxc.TranslatedNumericMessage.Builder.class);
+      }
+
+      // Construct using openxc.Openxc.TranslatedNumericMessage.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+
+      public Builder clear() {
+        super.clear();
+        name_ = "";
+        bitField0_ = (bitField0_ & ~0x00000001);
+        value_ = 0D;
+        bitField0_ = (bitField0_ & ~0x00000002);
+        return this;
+      }
+
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return openxc.Openxc.internal_static_openxc_TranslatedNumericMessage_descriptor;
+      }
+
+      public openxc.Openxc.TranslatedNumericMessage getDefaultInstanceForType() {
+        return openxc.Openxc.TranslatedNumericMessage.getDefaultInstance();
+      }
+
+      public openxc.Openxc.TranslatedNumericMessage build() {
+        openxc.Openxc.TranslatedNumericMessage result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public openxc.Openxc.TranslatedNumericMessage buildPartial() {
+        openxc.Openxc.TranslatedNumericMessage result = new openxc.Openxc.TranslatedNumericMessage(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.name_ = name_;
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.value_ = value_;
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof openxc.Openxc.TranslatedNumericMessage) {
+          return mergeFrom((openxc.Openxc.TranslatedNumericMessage)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(openxc.Openxc.TranslatedNumericMessage other) {
+        if (other == openxc.Openxc.TranslatedNumericMessage.getDefaultInstance()) return this;
+        if (other.hasName()) {
+          bitField0_ |= 0x00000001;
+          name_ = other.name_;
+          onChanged();
+        }
+        if (other.hasValue()) {
+          setValue(other.getValue());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        openxc.Openxc.TranslatedNumericMessage parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (openxc.Openxc.TranslatedNumericMessage) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      // optional string name = 1;
+      private java.lang.Object name_ = "";
+      /**
+       * <code>optional string name = 1;</code>
+       */
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      /**
+       * <code>optional string name = 1;</code>
+       */
+      public java.lang.String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof java.lang.String)) {
+          java.lang.String s = ((com.google.protobuf.ByteString) ref)
+              .toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>optional string name = 1;</code>
+       */
+      public com.google.protobuf.ByteString
+          getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>optional string name = 1;</code>
+       */
+      public Builder setName(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string name = 1;</code>
+       */
+      public Builder clearName() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        name_ = getDefaultInstance().getName();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string name = 1;</code>
+       */
+      public Builder setNameBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+        return this;
+      }
+
+      // optional double value = 2;
+      private double value_ ;
+      /**
+       * <code>optional double value = 2;</code>
+       */
+      public boolean hasValue() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      /**
+       * <code>optional double value = 2;</code>
+       */
+      public double getValue() {
+        return value_;
+      }
+      /**
+       * <code>optional double value = 2;</code>
+       */
+      public Builder setValue(double value) {
+        bitField0_ |= 0x00000002;
+        value_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional double value = 2;</code>
+       */
+      public Builder clearValue() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        value_ = 0D;
+        onChanged();
+        return this;
+      }
+
+      // @@protoc_insertion_point(builder_scope:openxc.TranslatedNumericMessage)
+    }
+
+    static {
+      defaultInstance = new TranslatedNumericMessage(true);
+      defaultInstance.initFields();
+    }
+
+    // @@protoc_insertion_point(class_scope:openxc.TranslatedNumericMessage)
+  }
+
+  public interface TranslatedBooleanMessageOrBuilder
+      extends com.google.protobuf.MessageOrBuilder {
+
+    // optional string name = 1;
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    boolean hasName();
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    java.lang.String getName();
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    com.google.protobuf.ByteString
+        getNameBytes();
+
+    // optional bool value = 2;
+    /**
+     * <code>optional bool value = 2;</code>
+     */
+    boolean hasValue();
+    /**
+     * <code>optional bool value = 2;</code>
+     */
+    boolean getValue();
+  }
+  /**
+   * Protobuf type {@code openxc.TranslatedBooleanMessage}
+   */
+  public static final class TranslatedBooleanMessage extends
+      com.google.protobuf.GeneratedMessage
+      implements TranslatedBooleanMessageOrBuilder {
+    // Use TranslatedBooleanMessage.newBuilder() to construct.
+    private TranslatedBooleanMessage(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
+      super(builder);
+      this.unknownFields = builder.getUnknownFields();
+    }
+    private TranslatedBooleanMessage(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
+
+    private static final TranslatedBooleanMessage defaultInstance;
+    public static TranslatedBooleanMessage getDefaultInstance() {
+      return defaultInstance;
+    }
+
+    public TranslatedBooleanMessage getDefaultInstanceForType() {
+      return defaultInstance;
+    }
+
+    private final com.google.protobuf.UnknownFieldSet unknownFields;
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+        getUnknownFields() {
+      return this.unknownFields;
+    }
+    private TranslatedBooleanMessage(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      initFields();
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            default: {
+              if (!parseUnknownField(input, unknownFields,
+                                     extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+            case 10: {
+              bitField0_ |= 0x00000001;
+              name_ = input.readBytes();
+              break;
+            }
+            case 16: {
+              bitField0_ |= 0x00000002;
+              value_ = input.readBool();
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e.getMessage()).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return openxc.Openxc.internal_static_openxc_TranslatedBooleanMessage_descriptor;
+    }
+
+    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return openxc.Openxc.internal_static_openxc_TranslatedBooleanMessage_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              openxc.Openxc.TranslatedBooleanMessage.class, openxc.Openxc.TranslatedBooleanMessage.Builder.class);
+    }
+
+    public static com.google.protobuf.Parser<TranslatedBooleanMessage> PARSER =
+        new com.google.protobuf.AbstractParser<TranslatedBooleanMessage>() {
+      public TranslatedBooleanMessage parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new TranslatedBooleanMessage(input, extensionRegistry);
+      }
+    };
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<TranslatedBooleanMessage> getParserForType() {
+      return PARSER;
+    }
+
+    private int bitField0_;
+    // optional string name = 1;
+    public static final int NAME_FIELD_NUMBER = 1;
+    private java.lang.Object name_;
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public boolean hasName() {
+      return ((bitField0_ & 0x00000001) == 0x00000001);
+    }
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public java.lang.String getName() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (bs.isValidUtf8()) {
+          name_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>optional string name = 1;</code>
+     */
+    public com.google.protobuf.ByteString
+        getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    // optional bool value = 2;
+    public static final int VALUE_FIELD_NUMBER = 2;
+    private boolean value_;
+    /**
+     * <code>optional bool value = 2;</code>
+     */
+    public boolean hasValue() {
+      return ((bitField0_ & 0x00000002) == 0x00000002);
+    }
+    /**
+     * <code>optional bool value = 2;</code>
+     */
+    public boolean getValue() {
+      return value_;
+    }
+
+    private void initFields() {
+      name_ = "";
+      value_ = false;
+    }
+    private byte memoizedIsInitialized = -1;
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized != -1) return isInitialized == 1;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        output.writeBytes(1, getNameBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        output.writeBool(2, value_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    private int memoizedSerializedSize = -1;
+    public int getSerializedSize() {
+      int size = memoizedSerializedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (((bitField0_ & 0x00000001) == 0x00000001)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(1, getNameBytes());
+      }
+      if (((bitField0_ & 0x00000002) == 0x00000002)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(2, value_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSerializedSize = size;
+      return size;
+    }
+
+    private static final long serialVersionUID = 0L;
+    @java.lang.Override
+    protected java.lang.Object writeReplace()
+        throws java.io.ObjectStreamException {
+      return super.writeReplace();
+    }
+
+    public static openxc.Openxc.TranslatedBooleanMessage parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static openxc.Openxc.TranslatedBooleanMessage parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static openxc.Openxc.TranslatedBooleanMessage parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static openxc.Openxc.TranslatedBooleanMessage parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static openxc.Openxc.TranslatedBooleanMessage parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static openxc.Openxc.TranslatedBooleanMessage parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+    public static openxc.Openxc.TranslatedBooleanMessage parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input);
+    }
+    public static openxc.Openxc.TranslatedBooleanMessage parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseDelimitedFrom(input, extensionRegistry);
+    }
+    public static openxc.Openxc.TranslatedBooleanMessage parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input);
+    }
+    public static openxc.Openxc.TranslatedBooleanMessage parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return PARSER.parseFrom(input, extensionRegistry);
+    }
+
+    public static Builder newBuilder() { return Builder.create(); }
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder(openxc.Openxc.TranslatedBooleanMessage prototype) {
+      return newBuilder().mergeFrom(prototype);
+    }
+    public Builder toBuilder() { return newBuilder(this); }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code openxc.TranslatedBooleanMessage}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessage.Builder<Builder>
+       implements openxc.Openxc.TranslatedBooleanMessageOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return openxc.Openxc.internal_static_openxc_TranslatedBooleanMessage_descriptor;
+      }
+
+      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return openxc.Openxc.internal_static_openxc_TranslatedBooleanMessage_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                openxc.Openxc.TranslatedBooleanMessage.class, openxc.Openxc.TranslatedBooleanMessage.Builder.class);
+      }
+
+      // Construct using openxc.Openxc.TranslatedBooleanMessage.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+        }
+      }
+      private static Builder create() {
+        return new Builder();
+      }
+
+      public Builder clear() {
+        super.clear();
+        name_ = "";
+        bitField0_ = (bitField0_ & ~0x00000001);
+        value_ = false;
+        bitField0_ = (bitField0_ & ~0x00000002);
+        return this;
+      }
+
+      public Builder clone() {
+        return create().mergeFrom(buildPartial());
+      }
+
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return openxc.Openxc.internal_static_openxc_TranslatedBooleanMessage_descriptor;
+      }
+
+      public openxc.Openxc.TranslatedBooleanMessage getDefaultInstanceForType() {
+        return openxc.Openxc.TranslatedBooleanMessage.getDefaultInstance();
+      }
+
+      public openxc.Openxc.TranslatedBooleanMessage build() {
+        openxc.Openxc.TranslatedBooleanMessage result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      public openxc.Openxc.TranslatedBooleanMessage buildPartial() {
+        openxc.Openxc.TranslatedBooleanMessage result = new openxc.Openxc.TranslatedBooleanMessage(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+          to_bitField0_ |= 0x00000001;
+        }
+        result.name_ = name_;
+        if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+          to_bitField0_ |= 0x00000002;
+        }
+        result.value_ = value_;
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof openxc.Openxc.TranslatedBooleanMessage) {
+          return mergeFrom((openxc.Openxc.TranslatedBooleanMessage)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(openxc.Openxc.TranslatedBooleanMessage other) {
+        if (other == openxc.Openxc.TranslatedBooleanMessage.getDefaultInstance()) return this;
+        if (other.hasName()) {
+          bitField0_ |= 0x00000001;
+          name_ = other.name_;
+          onChanged();
+        }
+        if (other.hasValue()) {
+          setValue(other.getValue());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        return this;
+      }
+
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        openxc.Openxc.TranslatedBooleanMessage parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (openxc.Openxc.TranslatedBooleanMessage) e.getUnfinishedMessage();
+          throw e;
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      // optional string name = 1;
+      private java.lang.Object name_ = "";
+      /**
+       * <code>optional string name = 1;</code>
+       */
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000001) == 0x00000001);
+      }
+      /**
+       * <code>optional string name = 1;</code>
+       */
+      public java.lang.String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof java.lang.String)) {
+          java.lang.String s = ((com.google.protobuf.ByteString) ref)
+              .toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>optional string name = 1;</code>
+       */
+      public com.google.protobuf.ByteString
+          getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>optional string name = 1;</code>
+       */
+      public Builder setName(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string name = 1;</code>
+       */
+      public Builder clearName() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        name_ = getDefaultInstance().getName();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional string name = 1;</code>
+       */
+      public Builder setNameBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000001;
+        name_ = value;
+        onChanged();
+        return this;
+      }
+
+      // optional bool value = 2;
+      private boolean value_ ;
+      /**
+       * <code>optional bool value = 2;</code>
+       */
+      public boolean hasValue() {
+        return ((bitField0_ & 0x00000002) == 0x00000002);
+      }
+      /**
+       * <code>optional bool value = 2;</code>
+       */
+      public boolean getValue() {
+        return value_;
+      }
+      /**
+       * <code>optional bool value = 2;</code>
+       */
+      public Builder setValue(boolean value) {
+        bitField0_ |= 0x00000002;
+        value_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>optional bool value = 2;</code>
+       */
+      public Builder clearValue() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        value_ = false;
+        onChanged();
+        return this;
+      }
+
+      // @@protoc_insertion_point(builder_scope:openxc.TranslatedBooleanMessage)
+    }
+
+    static {
+      defaultInstance = new TranslatedBooleanMessage(true);
+      defaultInstance.initFields();
+    }
+
+    // @@protoc_insertion_point(class_scope:openxc.TranslatedBooleanMessage)
+  }
+
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_openxc_VehicleMessage_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_openxc_VehicleMessage_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_openxc_RawMessage_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_openxc_RawMessage_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_openxc_TranslatedStringMessage_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_openxc_TranslatedStringMessage_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_openxc_TranslatedNumericMessage_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_openxc_TranslatedNumericMessage_fieldAccessorTable;
+  private static com.google.protobuf.Descriptors.Descriptor
+    internal_static_openxc_TranslatedBooleanMessage_descriptor;
+  private static
+    com.google.protobuf.GeneratedMessage.FieldAccessorTable
+      internal_static_openxc_TranslatedBooleanMessage_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\014openxc.proto\022\006openxc\"\305\002\n\016VehicleMessag" +
+      "e\022)\n\004type\030\001 \001(\0162\033.openxc.VehicleMessage." +
+      "Type\022\'\n\013raw_message\030\002 \001(\0132\022.openxc.RawMe" +
+      "ssage\0227\n\016string_message\030\003 \001(\0132\037.openxc.T" +
+      "ranslatedStringMessage\022;\n\021numerical_mess" +
+      "age\030\004 \001(\0132 .openxc.TranslatedNumericMess" +
+      "age\0229\n\017boolean_message\030\005 \001(\0132 .openxc.Tr" +
+      "anslatedBooleanMessage\".\n\004Type\022\007\n\003RAW\020\001\022" +
+      "\n\n\006STRING\020\002\022\007\n\003NUM\020\003\022\010\n\004BOOL\020\004\";\n\nRawMes" +
+      "sage\022\013\n\003bus\030\001 \001(\005\022\022\n\nmessage_id\030\002 \001(\r\022\014\n",
+      "\004data\030\003 \001(\022\"6\n\027TranslatedStringMessage\022\014" +
+      "\n\004name\030\001 \001(\t\022\r\n\005value\030\002 \001(\t\"7\n\030Translate" +
+      "dNumericMessage\022\014\n\004name\030\001 \001(\t\022\r\n\005value\030\002" +
+      " \001(\001\"7\n\030TranslatedBooleanMessage\022\014\n\004name" +
+      "\030\001 \001(\t\022\r\n\005value\030\002 \001(\010"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
+        public com.google.protobuf.ExtensionRegistry assignDescriptors(
+            com.google.protobuf.Descriptors.FileDescriptor root) {
+          descriptor = root;
+          internal_static_openxc_VehicleMessage_descriptor =
+            getDescriptor().getMessageTypes().get(0);
+          internal_static_openxc_VehicleMessage_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_openxc_VehicleMessage_descriptor,
+              new java.lang.String[] { "Type", "RawMessage", "StringMessage", "NumericalMessage", "BooleanMessage", });
+          internal_static_openxc_RawMessage_descriptor =
+            getDescriptor().getMessageTypes().get(1);
+          internal_static_openxc_RawMessage_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_openxc_RawMessage_descriptor,
+              new java.lang.String[] { "Bus", "MessageId", "Data", });
+          internal_static_openxc_TranslatedStringMessage_descriptor =
+            getDescriptor().getMessageTypes().get(2);
+          internal_static_openxc_TranslatedStringMessage_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_openxc_TranslatedStringMessage_descriptor,
+              new java.lang.String[] { "Name", "Value", });
+          internal_static_openxc_TranslatedNumericMessage_descriptor =
+            getDescriptor().getMessageTypes().get(3);
+          internal_static_openxc_TranslatedNumericMessage_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_openxc_TranslatedNumericMessage_descriptor,
+              new java.lang.String[] { "Name", "Value", });
+          internal_static_openxc_TranslatedBooleanMessage_descriptor =
+            getDescriptor().getMessageTypes().get(4);
+          internal_static_openxc_TranslatedBooleanMessage_fieldAccessorTable = new
+            com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+              internal_static_openxc_TranslatedBooleanMessage_descriptor,
+              new java.lang.String[] { "Name", "Value", });
+          return null;
+        }
+      };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        }, assigner);
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/gen/openxc.pb b/gen/openxc.pb
new file mode 100644 (file)
index 0000000..e343eeb
--- /dev/null
@@ -0,0 +1,30 @@
+
\ 4
+\fopenxc.proto\12\ 6openxc"Å\ 2
+\ eVehicleMessage\12)
+\ 4type\18\ 1 \ 1(\ e2\e.openxc.VehicleMessage.Type\12'
+\vraw_message\18\ 2 \ 1(\v2\12.openxc.RawMessage\127
+\ estring_message\18\ 3 \ 1(\v2\1f.openxc.TranslatedStringMessage\12;
+\11numerical_message\18\ 4 \ 1(\v2 .openxc.TranslatedNumericMessage\129
+\ fboolean_message\18\ 5 \ 1(\v2 .openxc.TranslatedBooleanMessage".
+\ 4Type\12\a
+\ 3RAW\10\ 1\12
+
+\ 6STRING\10\ 2\12\a
+\ 3NUM\10\ 3\12\b
+\ 4BOOL\10\ 4";
+
+RawMessage\12\v
+\ 3bus\18\ 1 \ 1(\ 5\12\12
+
+message_id\18\ 2 \ 1(\r\12\f
+\ 4data\18\ 3 \ 1(\12"6
+\17TranslatedStringMessage\12\f
+\ 4name\18\ 1 \ 1(     \12\r
+\ 5value\18\ 2 \ 1(    "7
+\18TranslatedNumericMessage\12\f
+\ 4name\18\ 1 \ 1(     \12\r
+\ 5value\18\ 2 \ 1(\ 1"7
+\18TranslatedBooleanMessage\12\f
+\ 4name\18\ 1 \ 1(     \12\r
+\ 5value\18\ 2 \ 1(\b
\ No newline at end of file
diff --git a/gen/openxc.pb.c b/gen/openxc.pb.c
new file mode 100644 (file)
index 0000000..19473b4
--- /dev/null
@@ -0,0 +1,57 @@
+/* Automatically generated nanopb constant definitions */
+/* Generated by nanopb-0.2.4-dev at Tue Oct  1 16:50:34 2013. */
+
+#include "openxc.pb.h"
+
+
+
+const pb_field_t openxc_VehicleMessage_fields[6] = {
+    PB_FIELD2(  1, ENUM    , OPTIONAL, STATIC, FIRST, openxc_VehicleMessage, type, type, 0),
+    PB_FIELD2(  2, MESSAGE , OPTIONAL, STATIC, OTHER, openxc_VehicleMessage, raw_message, type, &openxc_RawMessage_fields),
+    PB_FIELD2(  3, MESSAGE , OPTIONAL, STATIC, OTHER, openxc_VehicleMessage, string_message, raw_message, &openxc_TranslatedStringMessage_fields),
+    PB_FIELD2(  4, MESSAGE , OPTIONAL, STATIC, OTHER, openxc_VehicleMessage, numerical_message, string_message, &openxc_TranslatedNumericMessage_fields),
+    PB_FIELD2(  5, MESSAGE , OPTIONAL, STATIC, OTHER, openxc_VehicleMessage, boolean_message, numerical_message, &openxc_TranslatedBooleanMessage_fields),
+    PB_LAST_FIELD
+};
+
+const pb_field_t openxc_RawMessage_fields[4] = {
+    PB_FIELD2(  1, INT32   , OPTIONAL, STATIC, FIRST, openxc_RawMessage, bus, bus, 0),
+    PB_FIELD2(  2, UINT32  , OPTIONAL, STATIC, OTHER, openxc_RawMessage, message_id, bus, 0),
+    PB_FIELD2(  3, SINT64  , OPTIONAL, STATIC, OTHER, openxc_RawMessage, data, message_id, 0),
+    PB_LAST_FIELD
+};
+
+const pb_field_t openxc_TranslatedStringMessage_fields[3] = {
+    PB_FIELD2(  1, STRING  , OPTIONAL, STATIC, FIRST, openxc_TranslatedStringMessage, name, name, 0),
+    PB_FIELD2(  2, STRING  , OPTIONAL, STATIC, OTHER, openxc_TranslatedStringMessage, value, name, 0),
+    PB_LAST_FIELD
+};
+
+const pb_field_t openxc_TranslatedNumericMessage_fields[3] = {
+    PB_FIELD2(  1, STRING  , OPTIONAL, STATIC, FIRST, openxc_TranslatedNumericMessage, name, name, 0),
+    PB_FIELD2(  2, DOUBLE  , OPTIONAL, STATIC, OTHER, openxc_TranslatedNumericMessage, value, name, 0),
+    PB_LAST_FIELD
+};
+
+const pb_field_t openxc_TranslatedBooleanMessage_fields[3] = {
+    PB_FIELD2(  1, STRING  , OPTIONAL, STATIC, FIRST, openxc_TranslatedBooleanMessage, name, name, 0),
+    PB_FIELD2(  2, BOOL    , OPTIONAL, STATIC, OTHER, openxc_TranslatedBooleanMessage, value, name, 0),
+    PB_LAST_FIELD
+};
+
+
+/* Check that field information fits in pb_field_t */
+#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT)
+STATIC_ASSERT((pb_membersize(openxc_VehicleMessage, raw_message) < 256 && pb_membersize(openxc_VehicleMessage, string_message) < 256 && pb_membersize(openxc_VehicleMessage, numerical_message) < 256 && pb_membersize(openxc_VehicleMessage, boolean_message) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_openxc_VehicleMessage_openxc_RawMessage_openxc_TranslatedStringMessage_openxc_TranslatedNumericMessage_openxc_TranslatedBooleanMessage)
+#endif
+
+#if !defined(PB_FIELD_32BIT)
+STATIC_ASSERT((pb_membersize(openxc_VehicleMessage, raw_message) < 65536 && pb_membersize(openxc_VehicleMessage, string_message) < 65536 && pb_membersize(openxc_VehicleMessage, numerical_message) < 65536 && pb_membersize(openxc_VehicleMessage, boolean_message) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_openxc_VehicleMessage_openxc_RawMessage_openxc_TranslatedStringMessage_openxc_TranslatedNumericMessage_openxc_TranslatedBooleanMessage)
+#endif
+
+/* On some platforms (such as AVR), double is really float.
+ * These are not directly supported by nanopb, but see example_avr_double.
+ * To get rid of this error, remove any double fields from your .proto.
+ */
+STATIC_ASSERT(sizeof(double) == 8, DOUBLE_MUST_BE_8_BYTES)
+
diff --git a/gen/openxc.pb.h b/gen/openxc.pb.h
new file mode 100644 (file)
index 0000000..4923dcc
--- /dev/null
@@ -0,0 +1,100 @@
+/* Automatically generated nanopb header */
+/* Generated by nanopb-0.2.4-dev at Tue Oct  1 16:50:34 2013. */
+
+#ifndef _PB_OPENXC_PB_H_
+#define _PB_OPENXC_PB_H_
+#include <pb.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Enum definitions */
+typedef enum _openxc_VehicleMessage_Type {
+    openxc_VehicleMessage_Type_RAW = 1,
+    openxc_VehicleMessage_Type_STRING = 2,
+    openxc_VehicleMessage_Type_NUM = 3,
+    openxc_VehicleMessage_Type_BOOL = 4
+} openxc_VehicleMessage_Type;
+
+/* Struct definitions */
+typedef struct _openxc_RawMessage {
+    bool has_bus;
+    int32_t bus;
+    bool has_message_id;
+    uint32_t message_id;
+    bool has_data;
+    int64_t data;
+} openxc_RawMessage;
+
+typedef struct _openxc_TranslatedBooleanMessage {
+    bool has_name;
+    char name[100];
+    bool has_value;
+    bool value;
+} openxc_TranslatedBooleanMessage;
+
+typedef struct _openxc_TranslatedNumericMessage {
+    bool has_name;
+    char name[100];
+    bool has_value;
+    double value;
+} openxc_TranslatedNumericMessage;
+
+typedef struct _openxc_TranslatedStringMessage {
+    bool has_name;
+    char name[100];
+    bool has_value;
+    char value[100];
+} openxc_TranslatedStringMessage;
+
+typedef struct _openxc_VehicleMessage {
+    bool has_type;
+    openxc_VehicleMessage_Type type;
+    bool has_raw_message;
+    openxc_RawMessage raw_message;
+    bool has_string_message;
+    openxc_TranslatedStringMessage string_message;
+    bool has_numerical_message;
+    openxc_TranslatedNumericMessage numerical_message;
+    bool has_boolean_message;
+    openxc_TranslatedBooleanMessage boolean_message;
+} openxc_VehicleMessage;
+
+/* Default values for struct fields */
+
+/* Field tags (for use in manual encoding/decoding) */
+#define openxc_RawMessage_bus_tag                1
+#define openxc_RawMessage_message_id_tag         2
+#define openxc_RawMessage_data_tag               3
+#define openxc_TranslatedBooleanMessage_name_tag 1
+#define openxc_TranslatedBooleanMessage_value_tag 2
+#define openxc_TranslatedNumericMessage_name_tag 1
+#define openxc_TranslatedNumericMessage_value_tag 2
+#define openxc_TranslatedStringMessage_name_tag  1
+#define openxc_TranslatedStringMessage_value_tag 2
+#define openxc_VehicleMessage_type_tag           1
+#define openxc_VehicleMessage_raw_message_tag    2
+#define openxc_VehicleMessage_string_message_tag 3
+#define openxc_VehicleMessage_numerical_message_tag 4
+#define openxc_VehicleMessage_boolean_message_tag 5
+
+/* Struct field encoding specification for nanopb */
+extern const pb_field_t openxc_VehicleMessage_fields[6];
+extern const pb_field_t openxc_RawMessage_fields[4];
+extern const pb_field_t openxc_TranslatedStringMessage_fields[3];
+extern const pb_field_t openxc_TranslatedNumericMessage_fields[3];
+extern const pb_field_t openxc_TranslatedBooleanMessage_fields[3];
+
+/* Maximum encoded size of messages (where known) */
+#define openxc_VehicleMessage_size               457
+#define openxc_RawMessage_size                   23
+#define openxc_TranslatedStringMessage_size      204
+#define openxc_TranslatedNumericMessage_size     111
+#define openxc_TranslatedBooleanMessage_size     104
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif
diff --git a/gen/openxc_pb2.py b/gen/openxc_pb2.py
new file mode 100644 (file)
index 0000000..ad379eb
--- /dev/null
@@ -0,0 +1,296 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: openxc.proto
+
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import descriptor_pb2
+# @@protoc_insertion_point(imports)
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='openxc.proto',
+  package='openxc',
+  serialized_pb='\n\x0copenxc.proto\x12\x06openxc\"\xc5\x02\n\x0eVehicleMessage\x12)\n\x04type\x18\x01 \x01(\x0e\x32\x1b.openxc.VehicleMessage.Type\x12\'\n\x0braw_message\x18\x02 \x01(\x0b\x32\x12.openxc.RawMessage\x12\x37\n\x0estring_message\x18\x03 \x01(\x0b\x32\x1f.openxc.TranslatedStringMessage\x12;\n\x11numerical_message\x18\x04 \x01(\x0b\x32 .openxc.TranslatedNumericMessage\x12\x39\n\x0f\x62oolean_message\x18\x05 \x01(\x0b\x32 .openxc.TranslatedBooleanMessage\".\n\x04Type\x12\x07\n\x03RAW\x10\x01\x12\n\n\x06STRING\x10\x02\x12\x07\n\x03NUM\x10\x03\x12\x08\n\x04\x42OOL\x10\x04\";\n\nRawMessage\x12\x0b\n\x03\x62us\x18\x01 \x01(\x05\x12\x12\n\nmessage_id\x18\x02 \x01(\r\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x12\"6\n\x17TranslatedStringMessage\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"7\n\x18TranslatedNumericMessage\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x01\"7\n\x18TranslatedBooleanMessage\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x08')
+
+
+
+_VEHICLEMESSAGE_TYPE = _descriptor.EnumDescriptor(
+  name='Type',
+  full_name='openxc.VehicleMessage.Type',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='RAW', index=0, number=1,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='STRING', index=1, number=2,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='NUM', index=2, number=3,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='BOOL', index=3, number=4,
+      options=None,
+      type=None),
+  ],
+  containing_type=None,
+  options=None,
+  serialized_start=304,
+  serialized_end=350,
+)
+
+
+_VEHICLEMESSAGE = _descriptor.Descriptor(
+  name='VehicleMessage',
+  full_name='openxc.VehicleMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='type', full_name='openxc.VehicleMessage.type', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=1,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='raw_message', full_name='openxc.VehicleMessage.raw_message', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='string_message', full_name='openxc.VehicleMessage.string_message', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='numerical_message', full_name='openxc.VehicleMessage.numerical_message', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='boolean_message', full_name='openxc.VehicleMessage.boolean_message', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _VEHICLEMESSAGE_TYPE,
+  ],
+  options=None,
+  is_extendable=False,
+  extension_ranges=[],
+  serialized_start=25,
+  serialized_end=350,
+)
+
+
+_RAWMESSAGE = _descriptor.Descriptor(
+  name='RawMessage',
+  full_name='openxc.RawMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='bus', full_name='openxc.RawMessage.bus', index=0,
+      number=1, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='message_id', full_name='openxc.RawMessage.message_id', index=1,
+      number=2, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='data', full_name='openxc.RawMessage.data', index=2,
+      number=3, type=18, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  extension_ranges=[],
+  serialized_start=352,
+  serialized_end=411,
+)
+
+
+_TRANSLATEDSTRINGMESSAGE = _descriptor.Descriptor(
+  name='TranslatedStringMessage',
+  full_name='openxc.TranslatedStringMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='openxc.TranslatedStringMessage.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=unicode("", "utf-8"),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='openxc.TranslatedStringMessage.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=unicode("", "utf-8"),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  extension_ranges=[],
+  serialized_start=413,
+  serialized_end=467,
+)
+
+
+_TRANSLATEDNUMERICMESSAGE = _descriptor.Descriptor(
+  name='TranslatedNumericMessage',
+  full_name='openxc.TranslatedNumericMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='openxc.TranslatedNumericMessage.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=unicode("", "utf-8"),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='openxc.TranslatedNumericMessage.value', index=1,
+      number=2, type=1, cpp_type=5, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  extension_ranges=[],
+  serialized_start=469,
+  serialized_end=524,
+)
+
+
+_TRANSLATEDBOOLEANMESSAGE = _descriptor.Descriptor(
+  name='TranslatedBooleanMessage',
+  full_name='openxc.TranslatedBooleanMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='openxc.TranslatedBooleanMessage.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=unicode("", "utf-8"),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='openxc.TranslatedBooleanMessage.value', index=1,
+      number=2, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  extension_ranges=[],
+  serialized_start=526,
+  serialized_end=581,
+)
+
+_VEHICLEMESSAGE.fields_by_name['type'].enum_type = _VEHICLEMESSAGE_TYPE
+_VEHICLEMESSAGE.fields_by_name['raw_message'].message_type = _RAWMESSAGE
+_VEHICLEMESSAGE.fields_by_name['string_message'].message_type = _TRANSLATEDSTRINGMESSAGE
+_VEHICLEMESSAGE.fields_by_name['numerical_message'].message_type = _TRANSLATEDNUMERICMESSAGE
+_VEHICLEMESSAGE.fields_by_name['boolean_message'].message_type = _TRANSLATEDBOOLEANMESSAGE
+_VEHICLEMESSAGE_TYPE.containing_type = _VEHICLEMESSAGE;
+DESCRIPTOR.message_types_by_name['VehicleMessage'] = _VEHICLEMESSAGE
+DESCRIPTOR.message_types_by_name['RawMessage'] = _RAWMESSAGE
+DESCRIPTOR.message_types_by_name['TranslatedStringMessage'] = _TRANSLATEDSTRINGMESSAGE
+DESCRIPTOR.message_types_by_name['TranslatedNumericMessage'] = _TRANSLATEDNUMERICMESSAGE
+DESCRIPTOR.message_types_by_name['TranslatedBooleanMessage'] = _TRANSLATEDBOOLEANMESSAGE
+
+class VehicleMessage(_message.Message):
+  __metaclass__ = _reflection.GeneratedProtocolMessageType
+  DESCRIPTOR = _VEHICLEMESSAGE
+
+  # @@protoc_insertion_point(class_scope:openxc.VehicleMessage)
+
+class RawMessage(_message.Message):
+  __metaclass__ = _reflection.GeneratedProtocolMessageType
+  DESCRIPTOR = _RAWMESSAGE
+
+  # @@protoc_insertion_point(class_scope:openxc.RawMessage)
+
+class TranslatedStringMessage(_message.Message):
+  __metaclass__ = _reflection.GeneratedProtocolMessageType
+  DESCRIPTOR = _TRANSLATEDSTRINGMESSAGE
+
+  # @@protoc_insertion_point(class_scope:openxc.TranslatedStringMessage)
+
+class TranslatedNumericMessage(_message.Message):
+  __metaclass__ = _reflection.GeneratedProtocolMessageType
+  DESCRIPTOR = _TRANSLATEDNUMERICMESSAGE
+
+  # @@protoc_insertion_point(class_scope:openxc.TranslatedNumericMessage)
+
+class TranslatedBooleanMessage(_message.Message):
+  __metaclass__ = _reflection.GeneratedProtocolMessageType
+  DESCRIPTOR = _TRANSLATEDBOOLEANMESSAGE
+
+  # @@protoc_insertion_point(class_scope:openxc.TranslatedBooleanMessage)
+
+
+# @@protoc_insertion_point(module_scope)
diff --git a/gen/python/openxc_pb2.py b/gen/python/openxc_pb2.py
new file mode 100644 (file)
index 0000000..ad379eb
--- /dev/null
@@ -0,0 +1,296 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: openxc.proto
+
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import descriptor_pb2
+# @@protoc_insertion_point(imports)
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='openxc.proto',
+  package='openxc',
+  serialized_pb='\n\x0copenxc.proto\x12\x06openxc\"\xc5\x02\n\x0eVehicleMessage\x12)\n\x04type\x18\x01 \x01(\x0e\x32\x1b.openxc.VehicleMessage.Type\x12\'\n\x0braw_message\x18\x02 \x01(\x0b\x32\x12.openxc.RawMessage\x12\x37\n\x0estring_message\x18\x03 \x01(\x0b\x32\x1f.openxc.TranslatedStringMessage\x12;\n\x11numerical_message\x18\x04 \x01(\x0b\x32 .openxc.TranslatedNumericMessage\x12\x39\n\x0f\x62oolean_message\x18\x05 \x01(\x0b\x32 .openxc.TranslatedBooleanMessage\".\n\x04Type\x12\x07\n\x03RAW\x10\x01\x12\n\n\x06STRING\x10\x02\x12\x07\n\x03NUM\x10\x03\x12\x08\n\x04\x42OOL\x10\x04\";\n\nRawMessage\x12\x0b\n\x03\x62us\x18\x01 \x01(\x05\x12\x12\n\nmessage_id\x18\x02 \x01(\r\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x12\"6\n\x17TranslatedStringMessage\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"7\n\x18TranslatedNumericMessage\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x01\"7\n\x18TranslatedBooleanMessage\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x08')
+
+
+
+_VEHICLEMESSAGE_TYPE = _descriptor.EnumDescriptor(
+  name='Type',
+  full_name='openxc.VehicleMessage.Type',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='RAW', index=0, number=1,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='STRING', index=1, number=2,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='NUM', index=2, number=3,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='BOOL', index=3, number=4,
+      options=None,
+      type=None),
+  ],
+  containing_type=None,
+  options=None,
+  serialized_start=304,
+  serialized_end=350,
+)
+
+
+_VEHICLEMESSAGE = _descriptor.Descriptor(
+  name='VehicleMessage',
+  full_name='openxc.VehicleMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='type', full_name='openxc.VehicleMessage.type', index=0,
+      number=1, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=1,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='raw_message', full_name='openxc.VehicleMessage.raw_message', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='string_message', full_name='openxc.VehicleMessage.string_message', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='numerical_message', full_name='openxc.VehicleMessage.numerical_message', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='boolean_message', full_name='openxc.VehicleMessage.boolean_message', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _VEHICLEMESSAGE_TYPE,
+  ],
+  options=None,
+  is_extendable=False,
+  extension_ranges=[],
+  serialized_start=25,
+  serialized_end=350,
+)
+
+
+_RAWMESSAGE = _descriptor.Descriptor(
+  name='RawMessage',
+  full_name='openxc.RawMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='bus', full_name='openxc.RawMessage.bus', index=0,
+      number=1, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='message_id', full_name='openxc.RawMessage.message_id', index=1,
+      number=2, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='data', full_name='openxc.RawMessage.data', index=2,
+      number=3, type=18, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  extension_ranges=[],
+  serialized_start=352,
+  serialized_end=411,
+)
+
+
+_TRANSLATEDSTRINGMESSAGE = _descriptor.Descriptor(
+  name='TranslatedStringMessage',
+  full_name='openxc.TranslatedStringMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='openxc.TranslatedStringMessage.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=unicode("", "utf-8"),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='openxc.TranslatedStringMessage.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=unicode("", "utf-8"),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  extension_ranges=[],
+  serialized_start=413,
+  serialized_end=467,
+)
+
+
+_TRANSLATEDNUMERICMESSAGE = _descriptor.Descriptor(
+  name='TranslatedNumericMessage',
+  full_name='openxc.TranslatedNumericMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='openxc.TranslatedNumericMessage.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=unicode("", "utf-8"),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='openxc.TranslatedNumericMessage.value', index=1,
+      number=2, type=1, cpp_type=5, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  extension_ranges=[],
+  serialized_start=469,
+  serialized_end=524,
+)
+
+
+_TRANSLATEDBOOLEANMESSAGE = _descriptor.Descriptor(
+  name='TranslatedBooleanMessage',
+  full_name='openxc.TranslatedBooleanMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='openxc.TranslatedBooleanMessage.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=unicode("", "utf-8"),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='openxc.TranslatedBooleanMessage.value', index=1,
+      number=2, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  extension_ranges=[],
+  serialized_start=526,
+  serialized_end=581,
+)
+
+_VEHICLEMESSAGE.fields_by_name['type'].enum_type = _VEHICLEMESSAGE_TYPE
+_VEHICLEMESSAGE.fields_by_name['raw_message'].message_type = _RAWMESSAGE
+_VEHICLEMESSAGE.fields_by_name['string_message'].message_type = _TRANSLATEDSTRINGMESSAGE
+_VEHICLEMESSAGE.fields_by_name['numerical_message'].message_type = _TRANSLATEDNUMERICMESSAGE
+_VEHICLEMESSAGE.fields_by_name['boolean_message'].message_type = _TRANSLATEDBOOLEANMESSAGE
+_VEHICLEMESSAGE_TYPE.containing_type = _VEHICLEMESSAGE;
+DESCRIPTOR.message_types_by_name['VehicleMessage'] = _VEHICLEMESSAGE
+DESCRIPTOR.message_types_by_name['RawMessage'] = _RAWMESSAGE
+DESCRIPTOR.message_types_by_name['TranslatedStringMessage'] = _TRANSLATEDSTRINGMESSAGE
+DESCRIPTOR.message_types_by_name['TranslatedNumericMessage'] = _TRANSLATEDNUMERICMESSAGE
+DESCRIPTOR.message_types_by_name['TranslatedBooleanMessage'] = _TRANSLATEDBOOLEANMESSAGE
+
+class VehicleMessage(_message.Message):
+  __metaclass__ = _reflection.GeneratedProtocolMessageType
+  DESCRIPTOR = _VEHICLEMESSAGE
+
+  # @@protoc_insertion_point(class_scope:openxc.VehicleMessage)
+
+class RawMessage(_message.Message):
+  __metaclass__ = _reflection.GeneratedProtocolMessageType
+  DESCRIPTOR = _RAWMESSAGE
+
+  # @@protoc_insertion_point(class_scope:openxc.RawMessage)
+
+class TranslatedStringMessage(_message.Message):
+  __metaclass__ = _reflection.GeneratedProtocolMessageType
+  DESCRIPTOR = _TRANSLATEDSTRINGMESSAGE
+
+  # @@protoc_insertion_point(class_scope:openxc.TranslatedStringMessage)
+
+class TranslatedNumericMessage(_message.Message):
+  __metaclass__ = _reflection.GeneratedProtocolMessageType
+  DESCRIPTOR = _TRANSLATEDNUMERICMESSAGE
+
+  # @@protoc_insertion_point(class_scope:openxc.TranslatedNumericMessage)
+
+class TranslatedBooleanMessage(_message.Message):
+  __metaclass__ = _reflection.GeneratedProtocolMessageType
+  DESCRIPTOR = _TRANSLATEDBOOLEANMESSAGE
+
+  # @@protoc_insertion_point(class_scope:openxc.TranslatedBooleanMessage)
+
+
+# @@protoc_insertion_point(module_scope)
diff --git a/libs/nanopb b/libs/nanopb
new file mode 160000 (submodule)
index 0000000..388d4de
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit 388d4de833cf4e2127b2ab0489cb6b14ecc0cbb5
diff --git a/script/bootstrap.sh b/script/bootstrap.sh
new file mode 100755 (executable)
index 0000000..c042242
--- /dev/null
@@ -0,0 +1,179 @@
+#!/usr/bin/env bash
+
+set -e
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+pushd $DIR/..
+
+# TODO this is kind of a hacky way of determining if root is required -
+# ideally we wouuld set up a little virtualenv in the dependencies folder
+SUDO_CMD=
+if command -v sudo >/dev/null 2>&1; then
+    SUDO_CMD="sudo -E"
+
+    echo "The bootstrap script needs to install a few packages to your system as an admin, and we will use the 'sudo' command - enter your password to continue"
+    $SUDO_CMD ls > /dev/null
+fi
+
+KERNEL=`uname`
+if [ ${KERNEL:0:7} == "MINGW32" ]; then
+    OS="windows"
+elif [ ${KERNEL:0:6} == "CYGWIN" ]; then
+    OS="cygwin"
+elif [ $KERNEL == "Darwin" ]; then
+    OS="mac"
+else
+    OS="linux"
+    if ! command -v lsb_release >/dev/null 2>&1; then
+        # Arch Linux
+        if command -v pacman>/dev/null 2>&1; then
+            $SUDO_CMD pacman -S lsb-release
+        fi
+    fi
+
+    DISTRO=`lsb_release -si`
+fi
+
+die() {
+    echo >&2 "${bldred}$@${txtrst}"
+    exit 1
+}
+
+_cygwin_error() {
+    echo
+    echo "${bldred}Missing \"$1\"${txtrst} - run the Cygwin installer again and select the base package set:"
+    echo "    $CYGWIN_PACKAGES"
+    echo "After installing the packages, re-run this bootstrap script."
+    die
+}
+
+if ! command -v tput >/dev/null 2>&1; then
+    if [ $OS == "cygwin" ]; then
+        echo "OPTIONAL: Install the \"ncurses\" package in Cygwin to get colored shell output"
+    fi
+else
+    txtrst=$(tput sgr0) # reset
+    bldred=${txtbld}$(tput setaf 1)
+    bldgreen=${txtbld}$(tput setaf 2)
+fi
+
+_pushd() {
+    pushd $1 > /dev/null
+}
+
+_popd() {
+    popd > /dev/null
+}
+
+_wait() {
+    if [ -z $CI ]; then
+        echo "Press Enter when done"
+        read
+    fi
+}
+
+_install() {
+    if [ $OS == "cygwin" ]; then
+        _cygwin_error $1
+    elif [ $OS == "mac" ]; then
+        # brew exists with 1 if it's already installed
+        set +e
+        brew install $1
+        set -e
+    else
+        if [ -z $DISTRO ]; then
+            echo
+            echo "Missing $1 - install it using your distro's package manager or build from source"
+            _wait
+        else
+            if [ $DISTRO == "arch" ]; then
+                $SUDO_CMD pacman -S $1
+            elif [ $DISTRO == "Ubuntu" ]; then
+                $SUDO_CMD apt-get update -qq
+                $SUDO_CMD apt-get install $1 -y
+            else
+                echo
+                echo "Missing $1 - install it using your distro's package manager or build from source"
+                _wait
+            fi
+        fi
+    fi
+}
+
+CYGWIN_PACKAGES="make curl, libsasl2, ca-certificates, ncurses, python-setuptools"
+
+download() {
+    url=$1
+    filename=$2
+    curl $url -L --O $filename
+}
+
+if [ `id -u` == 0 ]; then
+    die "Error: running as root - don't use 'sudo' with this script"
+fi
+
+if ! command -v curl >/dev/null 2>&1; then
+    if [ $OS == "cygwin" ]; then
+        _cygwin_error "curl"
+    else
+        _install curl
+    fi
+fi
+
+if [ $OS == "windows" ]; then
+    die "Sorry, the bootstrap script for compiling from source doesn't support the Windows console - try Cygwin."
+fi
+
+if [ $OS == "mac" ] && ! command -v brew >/dev/null 2>&1; then
+    echo "Installing Homebrew..."
+    ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)"
+fi
+
+if ! command -v make >/dev/null 2>&1; then
+    if [ $OS == "cygwin" ]; then
+        _cygwin_error "make"
+    elif [ $OS == "mac" ]; then
+            die "Missing 'make' - install the Xcode CLI tools"
+    else
+        if [ $DISTRO == "arch" ]; then
+            $SUDO_CMD pacman -S base-devel
+        elif [ $DISTRO == "Ubuntu" ]; then
+            $SUDO_CMD apt-get update -qq
+            $SUDO_CMD apt-get install build-essential -y
+        fi
+    fi
+fi
+
+if ! command -v python >/dev/null 2>&1; then
+    echo "Installing Python..."
+    _install "python"
+fi
+
+if ! command -v pip >/dev/null 2>&1; then
+    echo "Installing Pip..."
+    if ! command -v easy_install >/dev/null 2>&1; then
+        die "easy_install not available, can't install pip"
+    fi
+
+    $SUDO_CMD easy_install pip
+fi
+
+$SUDO_CMD pip install -U pip
+$SUDO_CMD pip install --pre -Ur pip-requirements.txt
+
+if ! command -v protoc >/dev/null 2>&1; then
+    if [ $OS == "cygwin" ]; then
+        _cygwin_error "protobuf"
+    elif [ $OS == "mac" ] || [ $OS == "linux" ]; then
+        if [ $DISTRO == "Ubuntu" ]; then
+            _install protobuf-compiler
+        else
+            _install protobuf
+        fi
+    fi
+fi
+
+popd
+
+echo
+echo "${bldgreen}All developer dependencies installed, ready to compile.$txtrst"