Add 'CAN-binder/libs/openxc-message-format/' from commit 'd9f54f97578429773421abce98d...
authorRomain Forlot <romain.forlot@iot.bzh>
Tue, 2 May 2017 15:51:38 +0000 (17:51 +0200)
committerRomain Forlot <romain.forlot@iot.bzh>
Tue, 2 May 2017 15:51:38 +0000 (17:51 +0200)
git-subtree-dir: CAN-binder/libs/openxc-message-format
git-subtree-mainline: f44a5b1549bc4c8a84d0dedf4a8b1e4220a34f42
git-subtree-split: d9f54f97578429773421abce98d5f6579717afcc

20 files changed:
1  2 
CAN-binder/libs/openxc-message-format/.gitignore
CAN-binder/libs/openxc-message-format/.gitmodules
CAN-binder/libs/openxc-message-format/CHANGELOG.md
CAN-binder/libs/openxc-message-format/JSON.mkd
CAN-binder/libs/openxc-message-format/LICENSE
CAN-binder/libs/openxc-message-format/Makefile
CAN-binder/libs/openxc-message-format/README.md
CAN-binder/libs/openxc-message-format/benchmark/proto/.gitignore
CAN-binder/libs/openxc-message-format/benchmark/proto/compare_sizes.py
CAN-binder/libs/openxc-message-format/gen/README.mkd
CAN-binder/libs/openxc-message-format/gen/cpp/openxc.pb
CAN-binder/libs/openxc-message-format/gen/cpp/openxc.pb.c
CAN-binder/libs/openxc-message-format/gen/cpp/openxc.pb.h
CAN-binder/libs/openxc-message-format/gen/java/com/openxc/BinaryMessages.java
CAN-binder/libs/openxc-message-format/gen/python/openxc_pb2.py
CAN-binder/libs/openxc-message-format/libs/nanopb
CAN-binder/libs/openxc-message-format/openxc.options
CAN-binder/libs/openxc-message-format/openxc.proto
CAN-binder/libs/openxc-message-format/pip-requirements.txt
CAN-binder/libs/openxc-message-format/script/bootstrap.sh

index 0000000,0000000..b25c15b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++*~
index 0000000,0000000..5c59124
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,3 @@@
++[submodule "libs/nanopb"]
++      path = libs/nanopb
++      url = https://github.com/nanopb/nanopb
index 0000000,294826c..294826c
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,57 +1,57 @@@
+ # OpenXC Message Format Changelog
+ ## v0.7.0
+ * Improvement: Increase diagnostic response payload size to accommodate
+   multi-frame diagnostic responses.
+ * Feature: Added command to get device's platform
+ ## v0.6.0
+ * Feature: Added MessagePack support for BTLE connections.
+ * Feature: Support for vehicle message timestamps (changed previous uptime).
+ * Feature: Support for C5 SD Card.
+ * Feature: Support for C5 RTC.
+ * Fix: Update submodule from code.google to github.
+ ## v0.5.0
+ * Feature: Support for C5 Cellular device. New uptime message.
+ ## v0.4
+ * BREAKING: Removed factor and offset from diagnostic requests to minimize the number of
+   fields, and since this is such an uncommon use case and one that can be
+   handled by the client receiving the data. We may add them back in the future.
+ * BREAKING: Require an 'action' to diagnostic request commands, e.g. cancel or add.
+ * BREAKING: Rename "raw" messages to the more precise "CAN messages".
+ * BREAKING: Rename "translated" messages to "simple messages".
+ * BREAKING: Remove redundant `type` field from simple messages (formerly
+   translated messages). The type can be inferred implicitly through the types of
+   the value and event fields.
+ * Feature: Add a command for controlling CAN message passthrough.
+ * Feature: Add a command for controlling CAN controller acceptance filter bypass.
+ * Feature: Add a command to change the payload format.
+ * Feature: Add a command to control whether pre-defined, recurring OBD-II
+   requests are enabled.
+ * Improvement: Add `extras` field to JSON messages.
+ * Improvement: Add an optional 'status' field to all command responses.
+ * Improvement: Build protobuf generated files with nanopb v0.3.1.
+ * Improvement: Allow explicitly setting CAN message frame format (i.e. standard
+   or extended frame).
+ * Fix: Expand range of mode field to a full byte (#10)
+ ## v0.3
+ * Add diagnostic message request/response format.
+ * Officially add Protcol Buffer encoding.
+ * Change JSON delimiter to ```\0``` for both input and output.
+ * Officially document version and device ID commands.
+ ## v0.2
+ * Add a RAW can message format.
+ ## v0.1
+ * Initial release.
index 0000000,d320aad..d320aad
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,435 +1,435 @@@
+ # OpenXC JSON Message Format
+ Each JSON message published by a VI is delimited with a `\0 ` character.
+ ## Table of Contents
+ 1. [Vehicle Messages](#vehicle-messages)
+ 2. [CAN Message](#can-message)
+ 3. [Diagnostic Message](#diagnostic-message)
+ 4. [Commands](#commands)
+ 5. [Extra Values](#extra-values)
+ ## Vehicle Messages
+ ### Simple Vehicle Message
+ There may not be a 1:1 relationship between input and output signals - i.e.
+ engine timing CAN signals may be summarized in an "engine performance" metric on
+ the abstract side of the interface.
+ The expected format of a single valued message is:
+     {"name": "steering_wheel_angle", "value": 45}
+ ### Evented Simple Vehicle Message
+ The expected format of an event message is:
+     {"name": "button_event", "value": "up", "event": "pressed"}
+ This format is good for something like a button event, where there are two
+ discrete pieces of information in the measurement.
+ ## CAN Message
+ The format for a plain CAN message:
+     {"bus": 1, "id": 1234, "data": "0x12345678"}
+ **bus** - the numerical identifier of the CAN bus where this message originated,
+   most likely 1 or 2 (for a vehicle interface with 2 CAN controllers).
+ **id** - the CAN message ID
+ **data** - up to 8 bytes of data from the CAN message's payload, represented as
+   a hexidecimal number in a string. Many JSON parser cannot handle 64-bit
+   integers, which is why we are not using a numerical data type. Each byte in
+   the string *must* be represented with 2 characters, e.g. `0x1` is `0x01` - the
+   complete string must have an even number of characters. The `0x` prefix is
+   optional.
+ **format** - (optional) explicitly set the frame format for the CAN message, one
+   of `standard` or `extended`. If the `id` is greater than `0x7ff`, the extended
+   frame format will be selected automatically.
+ ## Diagnostic Message
+ ### Requests
+ A diagnostic request is added or cancelled with a JSON object like this example:
+     { "command": "diagnostic_request",
+       "action": "add",
+       "diagnostic_request": {
+           "bus": 1,
+           "message_id": 1234,
+           "mode": 1,
+           "pid": 5,
+           "payload": "0x1234",
+           "multiple_responses": false,
+           "frequency": 1,
+           "name": "my_pid"
+         }
+       }
+     }
+ * The `command` must be `diagnostic_request.`
+ * The `action` must be included, and must be one of:
+     * `add` - create a new one-off or recurring diagnostic request.
+     * `cancel` - cancel an existing request.
+ * The details of the request must be included in the `request` field, using
+   the sub-fields defined below.
+ A diagnostic request's `bus`, `id`, `mode` and `pid` (or lack of a `pid`)
+ combine to create a unique key to identify a request. These four fields will be
+ referred to as the key of the diagnostic request. For example, to create a
+ simple one-time diagnostic request:
+     { "command": "diagnostic_request",
+       "action": "add",
+       "diagnostic_request": {
+           "bus": 1,
+           "message_id": 1234,
+           "mode": 1,
+           "pid": 5
+         }
+       }
+     }
+ Requests are completed after any responses are received (unless
+ `multiple_responses` is set), or the request has timed out after a certain
+ number of seconds. After a request is completed, you can re-`create` the same
+ key to make another request.
+ Requests with a `frequency` are added as *recurring* requests, e.g. to add the
+ previous example as a recurring request at 1Hz:
+     { "command": "diagnostic_request",
+       "action": "add",
+       "diagnostic_request": {
+           "bus": 1,
+           "message_id": 1234,
+           "mode": 1,
+           "pid": 5,
+           "frequency": 1
+         }
+       }
+     }
+ To cancel a recurring request, send a `cancel` action with the same key, e.g.:
+     { "command": "diagnostic_request",
+       "action": "cancel",
+       "diagnostic_request": {
+           "bus": 1,
+           "message_id": 1234,
+           "mode": 1,
+           "pid": 5
+         }
+       }
+     }
+ Simultaneous recurring requests for the same key at different rates (e.g. 1Hz
+ *and* 2Hz) is not supported. However, non-recurring ("one-off") requests may
+ exist in parallel with a recurring request for the same key.
+ **bus** - the numerical identifier of the CAN bus where this request should be
+     sent, most likely 1 or 2 (for a vehicle interface with 2 CAN controllers).
+ **message_id** - the CAN message ID for the request.
+ **mode** - the OBD-II mode of the request - 0x1 through 0xff (1 through 9 are the
+     standardized modes and 0x22 is a common proprietary mode).
+ **pid** - (optional) the PID for the request, if applicable.
+ **payload** - (optional) up to 7 bytes of data for the request's payload
+     represented as a hexadecimal number in a string. Many JSON parser cannot
+     handle 64-bit integers, which is why we are not using a numerical data type.
+     Each byte in the string *must* be represented with 2 characters, e.g. `0x1`
+     is `0x01` - the complete string must have an even number of characters. The
+     `0x` prefix is optional.
+ **name** - (optional, defaults to nothing) A human readable, string name for
+   this request. If provided, the response will have a `name` field (much like a
+   simple vehicle message) with this value in place of `bus`, `id`, `mode` and
+   `pid`.
+ **multiple_responses** - (optional, false by default) if true, request will stay
+   active for a full 100ms, even after receiving a diagnostic response message.
+   This is useful for requests to the functional broadcast message ID
+   (`0x7df`) when you need to get responses from multiple modules. It's possible
+   to set this to `true` for non-broadcast requests, but in practice you won't
+   see any additional responses after the first and it will just take up memory
+   in the VI for longer.
+ **frequency** - (optional) Make this request a recurring request, at a this
+   frequency in Hz. To send a single non-recurring request, leave this field out.
+ **decoded_type** - (optional, defaults to "obd2" if the request is a recognized
+ OBD-II mode 1 request, otherwise "none") If specified, the valid values are
+ `"none"` and `"obd2"`. If `obd2`, the payload will be decoded according to the
+ OBD-II specification and returned in the `value` field. Set this to `none` to
+ manually override the OBD-II decoding feature for a known PID.
+ ### Responses
+ Requests to add or cancel a diagnostic request are first acknowledged by the VI,
+ before any responses to the request are returned. The response uses the standard
+ command response format:
+     { "command_response": "diagnostic_request", "status": true}
+ **status** - true if the request was successfully created or cancelled.
+ When a node on the network response to the request and the result is published
+ by the VI, the result looks like:
+     {"bus": 1,
+       "message_id": 1234,
+       "mode": 1,
+       "pid": 5,
+       "success": true,
+       "payload": "0x1234",
+       "value": 4660}
+ and to an unsuccessful request, with the `negative_response_code` and no `pid`
+ echo:
+     {"bus": 1,
+       "message_id": 1234,
+       "mode": 1,
+       "success": false,
+       "negative_response_code": 17}
+ **bus** - the numerical identifier of the CAN bus where this response was
+     received.
+ **message_id** - the CAN message ID for this response.
+ **mode** - the OBD-II mode of the original diagnostic request.
+ **pid** - (optional) the PID for the request, if applicable.
+ **success** -  true if the response received was a positive response. If this
+   field is false, the remote node returned an error and the
+   `negative_response_code` field should be populated.
+ **negative_response_code** - (optional)  If requested node returned an error,
+     `success` will be `false` and this field will contain the negative response
+     code (NRC).
+ Finally, the `payload` and `value` fields are mutually exclusive:
+ **payload** - (optional) up to 7 bytes of data returned in the response,
+     represented as a hexadecimal number in a string. Many JSON parser cannot
+     handle 64-bit integers, which is why we are not using a numerical data type.
+ **value** - (optional) if the response had a payload, this may be the
+     payload interpreted as an integer.
+ The response to a simple PID request would look like this:
+     {"success": true, "bus": 1, "message_id": 1234, "mode": 1, "pid": 5, "payload": "0x2"}
+ ## Commands
+ In addition to the `diagnostic_request` command described earlier, there are
+ other possible values for the `command` field.
+ All commands immediately return a `command_response`, e.g.:
+     { "command_response": "version", "message": "v6.0-dev (default)", "status": true}
+ **command_response** - an echo of the command this is a ACKing.
+ **status** - true if the command was understood and performed succesfully.
+ **message** - (optional) a string message from the VI, e.g. to return a version
+     descriptor or error message.
+ ### Version Query
+ The `version` command triggers the VI to inject a firmware version identifier
+ response into the outgoing data stream.
+ **Request**
+     { "command": "version"}
+ **Response**
+     { "command_response": "version", "message": "v6.0-dev (default)", "status": true}
+ ### Device ID Query
+ The `device_id` command triggers the VI to inject a unique device ID (e.g. the
+ MAC address of an included Bluetooth module) into into the outgoing data stream.
+ If no device ID is available, the response message will be "Unknown".
+ **Request**
+     { "command": "device_id"}
+ **Response**
+     { "command_response": "device_id", "message": "0012345678", "status": true}
+ ### Passthrough CAN Mode
+ The `passthrough` command controls whether low-level CAN messages are passed
+ through from the CAN bus through the VI to the output stream. If the CAN
+ acceptance filter is in bypass mode and passthrough is enabled, the output
+ stream will include all received CAN messages. If the bypass filter is enabled,
+ only those CAN messages that have been pre-defined in the firmware are
+ forwarded.
+ **Request**
+     { "command": "passthrough",
+       "bus": 1,
+       "enabled": true
+     }
+ **Response**
+ If the bus in the request was valid and the passthrough mode was changed, the
+ `status` field in the response will be `true`. If `false`, the passthrough mode
+ was not changed.
+     { "command_response": "passthrough", "status": true}
+ ### Acceptance Filter Bypass
+ The `af_bypass` command controls whether the CAN message acceptance filter is
+ bypassed for each CAN controller. By default, hardware acceptance filter (AF) is
+ enabled in the VI - only previously defined CAN message IDs will be received.
+ Send this command with `bypass: true` to force the filters to bypassed.
+ If `passthrough` mode is also enabled, when the AF is bypassed, the output will
+ include all CAN messages received.
+ **Request**
+     { "command": "af_bypass",
+       "bus": 1,
+       "bypass": true
+     }
+ **Response**
+ If the bus in the request was valid and the AF mode was changed, the `status`
+ field in the response will be `true`. If `false`, the passthrough mode was not
+ changed.
+     { "command_response": "af_bypass", "status": true}
+ ### Payload Format Control
+ The `payload_format` command determines the format for output data from the VI
+ and the expected format of commands sent to the VI.
+ Valid formats are `json` and `protobuf`.
+ **Request**
+     { "command": "payload_format",
+       "format": "json"
+     }
+ **Response**
+ If the format was changed successfully, the `status` in the response will be
+ `true`. The response will be in the original message format, and all subsequent
+ messages will be in the new format.
+     { "command_response": "payload_format", "status": true}
+ ### Automatic Pre-Defined OBD-II PID Requests
+ The `predefined_obd2` command enables and disables the querying for and
+ translating of a set of pre-defined OBD-II PIDs from the attached vehicle. When
+ enabled, the VI will query the vehicle to see if these PIDs are claimed to be
+ supported and for those that are, it will set up recurring requests. The
+ responses will be output as simple vehicle messages, with the names defined in
+ the "Signals Defined from Diagnostic Messages" section below.
+ **Request**
+     { "command": "predefined_obd2",
+       "enabled": true
+     }
+ **Response**
+ If the predefined requests were enabled or disabled successfully, the `status` in
+ the response will be `true`.
+     { "command_response": "predefined_obd2", "status": true}
+ ### C5 Cellular Configuration
+ The ModemConfigurationCommand message allows users to change certain aspects of modem operation on-the-fly (at runtime). The modem configuration settings are stored in flash memory and are untouched by the bootloader during a software update (assuming the correct cellular_c5 linker file is used during compilation of vi-firmware). Thus, new modem settings persistent across power cycles.
+ The ModemConfigurationCommand message provides three sub-messages for particular groups of modem settings. These are NetworkOperatorSettings, NetworkDataSettings, and ServerConnectSettings. These configuration messages are described in great detail within the [c5_cellular_config](https://github.com/openxc/vi-firmware/docs/advanced/c5_cell_config.html) documentation. 
+ Currently, only the ServerConnectSettings sub-message is supported in the vi-firmware's command interpreter. All other settings are currently compile-time only.
+ The ServerConnectSettings part of ModemConfigurationCommand allows the user to set the host server name and port that the device will use when opening a TCP socket to upload data. This destination must be running an HTTP server similar to [OpenXCWebServer](https://github.com/openxc/openxc-azure-webserver), which defines a set of supported HTTP transactions where the body is comprised of data in the familiar OpenXC Message Format.
+ **Request**
+     { "command": "modem_configuration",
+       "server": {
+               "host": "www.myhost.com",
+               "port": 10000
+         }
+     }
+ **Response**
+       { "command_response": "modem_configuration", "status": true}
+ ## C5 SD Card Status
+ In order to check the status of the SD card, the following command is available:
+     { "command": "sd_mount_status"}
+     
+ Command response if the SD card is mounted correctly:
+     { "command_response": "sd_mount_status", "status": true}
+     
+ If the SD card is full, not enabled, or connected as a MSD, the device will respond with:
+     { "command_response": "sd_mount_status", "status": false}
+     
+ For more info see [c5_msd](https://github.com/openxc/vi-firmware/docs/advanced/msd.html).
+ ## C5 RTC Configuration
+ To set the current time of the RTC, the following
+     { "command": "rtc_configuration", "unix_time": "1448551563"}
+     
+ The response is
+     { "command_response": "rtc_configuration", "status": true}
+ For more info see [c5_rtc](https://github.com/openxc/vi-firmware/docs/advanced/rtc.html).
+ ## Extra Values
+ Any of the following JSON objects may optionally include an `extras`
+ field. The value may be any valid JSON object or array. The client libraries
+ will do their best to parse this information into a generic format and pass it
+ to your application. For example:
+     {"name": "steering_wheel_angle",
+         "value": 45,
+         "extras": {
+             "calibrated": false
+         }
+     }
index 0000000,0000000..9a30ce4
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,24 @@@
++Copyright (c) 2012 Ford Motor Company
++All rights reserved.
++
++Redistribution and use in source and binary forms, with or without
++modification, are permitted provided that the following conditions are met:
++    * Redistributions of source code must retain the above copyright
++      notice, this list of conditions and the following disclaimer.
++    * Redistributions in binary form must reproduce the above copyright
++      notice, this list of conditions and the following disclaimer in the
++      documentation and/or other materials provided with the distribution.
++    * Neither the name of the <organization> nor the
++      names of its contributors may be used to endorse or promote products
++      derived from this software without specific prior written permission.
++
++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
++ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
++WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
++DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
++(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
++ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
index 0000000,7b968e6..7b968e6
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,11 +1,11 @@@
+ nanopb: proto
+       make -C libs/nanopb/generator/proto
+       python libs/nanopb/generator/nanopb_generator.py gen/cpp/openxc.pb -f openxc.options
+ 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
index 0000000,0000000..77758b8
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,177 @@@
++# OpenXC Message Format Specification
++
++Version: v0.6.0
++
++This specification is a part of the [OpenXC platform][OpenXC].
++
++An OpenXC vehicle interface sends generic vehicle data over one or more output
++interfaces (e.g. USB or Bluetooth) as JSON or Protocol Buffers (protobuf).
++
++## JSON
++
++The JSON format is the most flexible and easiest to use. The format is fully
++specified in the [JSON.mkd](JSON.mkd) file in this repository.
++a more flexible option than binary, but is less compact and
++therefore takes more bandwidth and processing power.
++
++The JSON format is best for most developers, as it is fairly efficient and very
++flexible.
++
++## Binary (Protocol Buffers)
++
++The binary format is encoded using [Google Protocol
++Buffers](https://code.google.com/p/protobuf/). The format is specified in the
++file [openxc.proto](openxc.proto). The descriptions of the messages can be foud
++in the JSON specs - the binary format mirrors this.
++
++The binary messages are published by the VI using the standard length-delimited
++method (any protobuf library should support this).
++
++The binary format is best if you need to maximize the amount of data that can be
++sent from the VI, trading off flexibility for efficiency.
++
++## Message Pack
++MessagePack is an efficient binary serialization format. It lets you exchange data
++among multiple languages like JSON, but it's faster and smaller. Small integers are 
++encoded into a single byte, and typical short strings require only one extra byte
++in addition to the strings themselves
++
++For protocol specification visit:
++https://github.com/msgpack/msgpack/blob/master/spec.md
++
++We are using the following lib:
++https://github.com/camgunz/cmp
++
++MessagePack provides a binary alternative to ProtoBuf. There are pros & cons to each 
++so you can decide what works best for your project.
++
++## Trace File Format
++
++An OpenXC vehicle trace file is a plaintext file that contains JSON objects,
++separated by newlines (which may be either `\r\n` or `\n`, depending on the
++platform the trace file was recorded).
++
++The first line may be a metadata object, although this is optional:
++
++```
++{"metadata": {
++    "version": "v3.0",
++    "vehicle_interface_id": "7ABF",
++    "vehicle": {
++        "make": "Ford",
++        "model": "Mustang",
++        "trim": "V6 Premium",
++        "year": 2013
++    },
++    "description": "highway drive to work",
++    "driver_name": "TJ Giuli",
++    "vehicle_id": "17N1039247929"
++}
++```
++
++The following lines are OpenXC messages with a `timestamp` field added, e.g.:
++
++    {"timestamp": 1385133351.285525, "name": "steering_wheel_angle", "value": 45}
++
++The timestamp is in [UNIX time](http://en.wikipedia.org/wiki/Unix_time)
++(i.e. seconds since the UNIX epoch, 00:00:00 UTC, 1/1/1970).
++
++## Official Signals
++
++These signal names are a part of the OpenXC specification, although some
++manufacturers may support custom message names.
++
++* steering_wheel_angle
++    * numerical, -600 to +600 degrees
++    * 10Hz
++* torque_at_transmission
++    * numerical, -500 to 1500 Nm
++    * 10Hz
++* engine_speed
++    * numerical, 0 to 16382 RPM
++    * 10Hz
++* vehicle_speed
++    * numerical, 0 to 655 km/h (this will be positive even if going in reverse
++      as it's not a velocity, although you can use the gear status to figure out
++      direction)
++    * 10Hz
++* accelerator_pedal_position
++    * percentage
++    * 10Hz
++* parking_brake_status
++    * boolean, (true == brake engaged)
++    * 1Hz, but sent immediately on change
++* brake_pedal_status
++    * boolean (True == pedal pressed)
++    * 1Hz, but sent immediately on change
++* transmission_gear_position
++    * states: first, second, third, fourth, fifth, sixth, seventh, eighth,
++      ninth, tenth, reverse, neutral
++    * 1Hz, but sent immediately on change
++* gear_lever_position
++    * states: neutral, park, reverse, drive, sport, low, first, second, third,
++      fourth, fifth, sixth, seventh, eighth, ninth, tenth
++    * 1Hz, but sent immediately on change
++* odometer
++    * Numerical, km
++        0 to 16777214.000 km, with about .2m resolution
++    * 10Hz
++* ignition_status
++    * states: off, accessory, run, start
++    * 1Hz, but sent immediately on change
++* fuel_level
++    * percentage
++    * 2Hz
++* fuel_consumed_since_restart
++    * numerical, 0 - 4294967295.0 L (this goes to 0 every time the vehicle
++      restarts, like a trip meter)
++    * 10Hz
++* door_status
++    * Value is State: driver, passenger, rear_left, rear_right.
++    * Event is boolean: true == ajar
++    * 1Hz, but sent immediately on change
++* headlamp_status
++    * boolean, true is on
++    * 1Hz, but sent immediately on change
++* high_beam_status
++    * boolean, true is on
++    * 1Hz, but sent immediately on change
++* windshield_wiper_status
++    * boolean, true is on
++    * 1Hz, but sent immediately on change
++* latitude
++    * numerical, -89.0 to 89.0 degrees with standard GPS accuracy
++    * 1Hz
++* longitude
++    * numerical, -179.0 to 179.0 degrees with standard GPS accuracy
++    * 1Hz
++
++## Signals from Diagnostic Messages
++
++This set of signals is often retreived from OBD-II requests. The units can be
++found in the [OBD-II standard](http://en.wikipedia.org/wiki/OBD-II_PIDs#Mode_01).
++
++* engine_load
++* engine_coolant_temperature
++* barometric_pressure
++* commanded_throttle_position
++* throttle_position
++* fuel_level
++* intake_air_temperature
++* intake_manifold_pressure
++* running_time
++* fuel_pressure
++* mass_airflow
++* accelerator_pedal_position
++* ethanol_fuel_percentage
++* engine_oil_temperature
++* engine_torque
++
++License
++=======
++
++Copyright (c) 2012-2014 Ford Motor Company
++
++Licensed under the BSD license.
++
++[OpenXC]: http://openxcplatform.com
index 0000000,0ed445f..0ed445f
mode 000000,100755..100755
--- /dev/null
@@@ -1,0 -1,96 +1,96 @@@
+ #!/usr/bin/env python
+ from __future__ import division
+ import sys
+ import numbers
+ import openxc_pb2
+ import json
+ def sizeof_fmt(num):
+     for unit in ['bytes', 'KB', 'MB', 'GB', 'TB']:
+         if num < 1024.0:
+             return "%3.1f%s" % (num, unit)
+         num /= 1024.0
+ total_raw_can_size = 0
+ total_raw_json_size = 0
+ total_raw_binary_size = 0
+ total_translated_json_size = 0
+ total_translated_binary_size = 0
+ for trace_file in sys.argv[1:]:
+     for line in open(trace_file):
+         try:
+             json_message = json.loads(line)
+         except ValueError:
+             continue
+         del json_message['timestamp']
+         message = openxc_pb2.VehicleMessage()
+         if 'id' and 'data' in json_message:
+             # rough approx. that CAN messages are 10 bytes - they could be less
+             # but most of ours are full 64+11 bits
+             total_raw_can_size += 10
+             total_raw_json_size += len(json.dumps(json_message))
+             message.type = openxc_pb2.VehicleMessage.RAW
+             message.raw_message.message_id = json_message['id']
+             message.raw_message.data = int(json_message['data'], 0)
+             total_raw_binary_size += len(message.SerializeToString())
+         else:
+             message.type = openxc_pb2.VehicleMessage.TRANSLATED
+             message.translated_message.name = json_message['name']
+             if 'event' in json_message:
+                 message.translated_message.string_value = json_message['value']
+                 if isinstance(json_message['event'], bool):
+                     message.translated_message.type = openxc_pb2.TranslatedMessage.EVENTED_BOOL
+                     message.translated_message.boolean_event = json_message['event']
+                 elif isinstance(json_message['event'], numbers.Number):
+                     message.translated_message.type = openxc_pb2.TranslatedMessage.EVENTED_NUM
+                     message.translated_message.numeric_value = json_message['event']
+                 else:
+                     message.translated_message.type = openxc_pb2.TranslatedMessage.EVENTED_STRING
+                     message.translated_message.string_value = json_message['event']
+             else:
+                 if isinstance(json_message['value'], bool):
+                     message.translated_message.type = openxc_pb2.TranslatedMessage.BOOL
+                     message.translated_message.boolean_value = json_message['value']
+                 elif isinstance(json_message['value'], numbers.Number):
+                     message.translated_message.type = openxc_pb2.TranslatedMessage.NUM
+                     message.translated_message.numeric_value = json_message['value']
+                 else:
+                     message.translated_message.type = openxc_pb2.TranslatedMessage.STRING
+                     message.translated_message.string_value = json_message['value']
+             total_translated_json_size += len(json.dumps(json_message))
+             total_translated_binary_size += len(message.SerializeToString())
+ print("For the %d trace files given..." % len(sys.argv[1:]))
+ print("Total transferred raw CAN size is %s" % sizeof_fmt(total_raw_can_size))
+ print("Total transferred raw JSON size is %s" % sizeof_fmt(total_raw_json_size))
+ print("Total transferred raw binary size is %s" % sizeof_fmt(total_raw_binary_size))
+ print("Total transferred translated JSON size is %s" %
+         sizeof_fmt(total_translated_json_size))
+ print("Total transferred translated binary size is %s" %
+         sizeof_fmt(total_translated_binary_size))
+ total_json_size = total_raw_json_size + total_translated_json_size
+ print("Total transferred JSON size is %s" % sizeof_fmt(total_json_size))
+ total_binary_size = total_raw_binary_size + total_translated_binary_size
+ print("Total transferred binary size is %s" % sizeof_fmt(total_binary_size))
+ if total_raw_can_size > 0:
+     print("Binary encoding adds %f%% overhead to raw CAN messages" % (
+             total_raw_binary_size / total_raw_can_size * 100 - 100))
+     print("JSON encoding adds %f%% overhead to raw CAN messages" % (
+             total_raw_json_size / total_raw_can_size * 100 - 100))
+ if total_raw_json_size > 0:
+     print("Binary encoding is %f%% smaller than JSON for raw messages" % (
+             100 - (total_raw_binary_size / total_raw_json_size * 100)))
+ if total_translated_json_size > 0:
+     print("Binary encoding is %f%% smaller than JSON for translated messages" % (
+             100 - (total_translated_binary_size / total_translated_json_size * 100)))
+ print("Binary encoding is %f%% smaller than JSON overall" % (
+         100 - (total_binary_size / total_json_size * 100)))
index 0000000,e607772..e607772
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,11 +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.
index 0000000,104c206..104c206
mode 000000,100644..100644
Binary files differ
index 0000000,9b90c36..9b90c36
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,184 +1,184 @@@
+ /* Automatically generated nanopb constant definitions */
+ /* Generated by nanopb-0.3.1 at Wed Sep 14 16:47:53 2016. */
+ #include "openxc.pb.h"
+ #if PB_PROTO_HEADER_VERSION != 30
+ #error Regenerate this file with the current version of nanopb generator.
+ #endif
+ const pb_field_t openxc_VehicleMessage_fields[8] = {
+     PB_FIELD(  1, ENUM    , OPTIONAL, STATIC  , FIRST, openxc_VehicleMessage, type, type, 0),
+     PB_FIELD(  2, MESSAGE , OPTIONAL, STATIC  , OTHER, openxc_VehicleMessage, can_message, type, &openxc_CanMessage_fields),
+     PB_FIELD(  3, MESSAGE , OPTIONAL, STATIC  , OTHER, openxc_VehicleMessage, simple_message, can_message, &openxc_SimpleMessage_fields),
+     PB_FIELD(  4, MESSAGE , OPTIONAL, STATIC  , OTHER, openxc_VehicleMessage, diagnostic_response, simple_message, &openxc_DiagnosticResponse_fields),
+     PB_FIELD(  5, MESSAGE , OPTIONAL, STATIC  , OTHER, openxc_VehicleMessage, control_command, diagnostic_response, &openxc_ControlCommand_fields),
+     PB_FIELD(  6, MESSAGE , OPTIONAL, STATIC  , OTHER, openxc_VehicleMessage, command_response, control_command, &openxc_CommandResponse_fields),
+     PB_FIELD(  7, UINT64  , OPTIONAL, STATIC  , OTHER, openxc_VehicleMessage, timestamp, command_response, 0),
+     PB_LAST_FIELD
+ };
+ const pb_field_t openxc_CanMessage_fields[5] = {
+     PB_FIELD(  1, INT32   , OPTIONAL, STATIC  , FIRST, openxc_CanMessage, bus, bus, 0),
+     PB_FIELD(  2, UINT32  , OPTIONAL, STATIC  , OTHER, openxc_CanMessage, id, bus, 0),
+     PB_FIELD(  3, BYTES   , OPTIONAL, STATIC  , OTHER, openxc_CanMessage, data, id, 0),
+     PB_FIELD(  4, ENUM    , OPTIONAL, STATIC  , OTHER, openxc_CanMessage, frame_format, data, 0),
+     PB_LAST_FIELD
+ };
+ const pb_field_t openxc_ControlCommand_fields[9] = {
+     PB_FIELD(  1, ENUM    , OPTIONAL, STATIC  , FIRST, openxc_ControlCommand, type, type, 0),
+     PB_FIELD(  2, MESSAGE , OPTIONAL, STATIC  , OTHER, openxc_ControlCommand, diagnostic_request, type, &openxc_DiagnosticControlCommand_fields),
+     PB_FIELD(  3, MESSAGE , OPTIONAL, STATIC  , OTHER, openxc_ControlCommand, passthrough_mode_request, diagnostic_request, &openxc_PassthroughModeControlCommand_fields),
+     PB_FIELD(  4, MESSAGE , OPTIONAL, STATIC  , OTHER, openxc_ControlCommand, acceptance_filter_bypass_command, passthrough_mode_request, &openxc_AcceptanceFilterBypassCommand_fields),
+     PB_FIELD(  5, MESSAGE , OPTIONAL, STATIC  , OTHER, openxc_ControlCommand, payload_format_command, acceptance_filter_bypass_command, &openxc_PayloadFormatCommand_fields),
+     PB_FIELD(  6, MESSAGE , OPTIONAL, STATIC  , OTHER, openxc_ControlCommand, predefined_obd2_requests_command, payload_format_command, &openxc_PredefinedObd2RequestsCommand_fields),
+     PB_FIELD(  7, MESSAGE , OPTIONAL, STATIC  , OTHER, openxc_ControlCommand, modem_configuration_command, predefined_obd2_requests_command, &openxc_ModemConfigurationCommand_fields),
+     PB_FIELD(  8, MESSAGE , OPTIONAL, STATIC  , OTHER, openxc_ControlCommand, rtc_configuration_command, modem_configuration_command, &openxc_RTCConfigurationCommand_fields),
+     PB_LAST_FIELD
+ };
+ const pb_field_t openxc_DiagnosticControlCommand_fields[3] = {
+     PB_FIELD(  1, MESSAGE , OPTIONAL, STATIC  , FIRST, openxc_DiagnosticControlCommand, request, request, &openxc_DiagnosticRequest_fields),
+     PB_FIELD(  2, ENUM    , OPTIONAL, STATIC  , OTHER, openxc_DiagnosticControlCommand, action, request, 0),
+     PB_LAST_FIELD
+ };
+ const pb_field_t openxc_PassthroughModeControlCommand_fields[3] = {
+     PB_FIELD(  1, INT32   , OPTIONAL, STATIC  , FIRST, openxc_PassthroughModeControlCommand, bus, bus, 0),
+     PB_FIELD(  2, BOOL    , OPTIONAL, STATIC  , OTHER, openxc_PassthroughModeControlCommand, enabled, bus, 0),
+     PB_LAST_FIELD
+ };
+ const pb_field_t openxc_AcceptanceFilterBypassCommand_fields[3] = {
+     PB_FIELD(  1, INT32   , OPTIONAL, STATIC  , FIRST, openxc_AcceptanceFilterBypassCommand, bus, bus, 0),
+     PB_FIELD(  2, BOOL    , OPTIONAL, STATIC  , OTHER, openxc_AcceptanceFilterBypassCommand, bypass, bus, 0),
+     PB_LAST_FIELD
+ };
+ const pb_field_t openxc_PayloadFormatCommand_fields[2] = {
+     PB_FIELD(  1, ENUM    , OPTIONAL, STATIC  , FIRST, openxc_PayloadFormatCommand, format, format, 0),
+     PB_LAST_FIELD
+ };
+ const pb_field_t openxc_PredefinedObd2RequestsCommand_fields[2] = {
+     PB_FIELD(  1, BOOL    , OPTIONAL, STATIC  , FIRST, openxc_PredefinedObd2RequestsCommand, enabled, enabled, 0),
+     PB_LAST_FIELD
+ };
+ const pb_field_t openxc_NetworkOperatorSettings_fields[4] = {
+     PB_FIELD(  1, BOOL    , OPTIONAL, STATIC  , FIRST, openxc_NetworkOperatorSettings, allowDataRoaming, allowDataRoaming, 0),
+     PB_FIELD(  2, ENUM    , OPTIONAL, STATIC  , OTHER, openxc_NetworkOperatorSettings, operatorSelectMode, allowDataRoaming, 0),
+     PB_FIELD(  3, MESSAGE , OPTIONAL, STATIC  , OTHER, openxc_NetworkOperatorSettings, networkDescriptor, operatorSelectMode, &openxc_NetworkOperatorSettings_NetworkDescriptor_fields),
+     PB_LAST_FIELD
+ };
+ const pb_field_t openxc_NetworkOperatorSettings_NetworkDescriptor_fields[3] = {
+     PB_FIELD(  1, UINT32  , OPTIONAL, STATIC  , FIRST, openxc_NetworkOperatorSettings_NetworkDescriptor, PLMN, PLMN, 0),
+     PB_FIELD(  2, ENUM    , OPTIONAL, STATIC  , OTHER, openxc_NetworkOperatorSettings_NetworkDescriptor, networkType, PLMN, 0),
+     PB_LAST_FIELD
+ };
+ const pb_field_t openxc_NetworkDataSettings_fields[2] = {
+     PB_FIELD(  1, STRING  , OPTIONAL, CALLBACK, FIRST, openxc_NetworkDataSettings, APN, APN, 0),
+     PB_LAST_FIELD
+ };
+ const pb_field_t openxc_ServerConnectSettings_fields[3] = {
+     PB_FIELD(  1, STRING  , OPTIONAL, STATIC  , FIRST, openxc_ServerConnectSettings, host, host, 0),
+     PB_FIELD(  2, UINT32  , OPTIONAL, STATIC  , OTHER, openxc_ServerConnectSettings, port, host, 0),
+     PB_LAST_FIELD
+ };
+ const pb_field_t openxc_ModemConfigurationCommand_fields[4] = {
+     PB_FIELD(  1, MESSAGE , OPTIONAL, STATIC  , FIRST, openxc_ModemConfigurationCommand, networkOperatorSettings, networkOperatorSettings, &openxc_NetworkOperatorSettings_fields),
+     PB_FIELD(  2, MESSAGE , OPTIONAL, STATIC  , OTHER, openxc_ModemConfigurationCommand, networkDataSettings, networkOperatorSettings, &openxc_NetworkDataSettings_fields),
+     PB_FIELD(  3, MESSAGE , OPTIONAL, STATIC  , OTHER, openxc_ModemConfigurationCommand, serverConnectSettings, networkDataSettings, &openxc_ServerConnectSettings_fields),
+     PB_LAST_FIELD
+ };
+ const pb_field_t openxc_RTCConfigurationCommand_fields[2] = {
+     PB_FIELD(  1, UINT32  , OPTIONAL, STATIC  , FIRST, openxc_RTCConfigurationCommand, unix_time, unix_time, 0),
+     PB_LAST_FIELD
+ };
+ const pb_field_t openxc_CommandResponse_fields[4] = {
+     PB_FIELD(  1, ENUM    , OPTIONAL, STATIC  , FIRST, openxc_CommandResponse, type, type, 0),
+     PB_FIELD(  2, STRING  , OPTIONAL, STATIC  , OTHER, openxc_CommandResponse, message, type, 0),
+     PB_FIELD(  3, BOOL    , OPTIONAL, STATIC  , OTHER, openxc_CommandResponse, status, message, 0),
+     PB_LAST_FIELD
+ };
+ const pb_field_t openxc_DiagnosticRequest_fields[10] = {
+     PB_FIELD(  1, INT32   , OPTIONAL, STATIC  , FIRST, openxc_DiagnosticRequest, bus, bus, 0),
+     PB_FIELD(  2, UINT32  , OPTIONAL, STATIC  , OTHER, openxc_DiagnosticRequest, message_id, bus, 0),
+     PB_FIELD(  3, UINT32  , OPTIONAL, STATIC  , OTHER, openxc_DiagnosticRequest, mode, message_id, 0),
+     PB_FIELD(  4, UINT32  , OPTIONAL, STATIC  , OTHER, openxc_DiagnosticRequest, pid, mode, 0),
+     PB_FIELD(  5, BYTES   , OPTIONAL, STATIC  , OTHER, openxc_DiagnosticRequest, payload, pid, 0),
+     PB_FIELD(  6, BOOL    , OPTIONAL, STATIC  , OTHER, openxc_DiagnosticRequest, multiple_responses, payload, 0),
+     PB_FIELD(  7, DOUBLE  , OPTIONAL, STATIC  , OTHER, openxc_DiagnosticRequest, frequency, multiple_responses, 0),
+     PB_FIELD(  8, STRING  , OPTIONAL, STATIC  , OTHER, openxc_DiagnosticRequest, name, frequency, 0),
+     PB_FIELD(  9, ENUM    , OPTIONAL, STATIC  , OTHER, openxc_DiagnosticRequest, decoded_type, name, 0),
+     PB_LAST_FIELD
+ };
+ const pb_field_t openxc_DiagnosticResponse_fields[9] = {
+     PB_FIELD(  1, INT32   , OPTIONAL, STATIC  , FIRST, openxc_DiagnosticResponse, bus, bus, 0),
+     PB_FIELD(  2, UINT32  , OPTIONAL, STATIC  , OTHER, openxc_DiagnosticResponse, message_id, bus, 0),
+     PB_FIELD(  3, UINT32  , OPTIONAL, STATIC  , OTHER, openxc_DiagnosticResponse, mode, message_id, 0),
+     PB_FIELD(  4, UINT32  , OPTIONAL, STATIC  , OTHER, openxc_DiagnosticResponse, pid, mode, 0),
+     PB_FIELD(  5, BOOL    , OPTIONAL, STATIC  , OTHER, openxc_DiagnosticResponse, success, pid, 0),
+     PB_FIELD(  6, UINT32  , OPTIONAL, STATIC  , OTHER, openxc_DiagnosticResponse, negative_response_code, success, 0),
+     PB_FIELD(  7, BYTES   , OPTIONAL, STATIC  , OTHER, openxc_DiagnosticResponse, payload, negative_response_code, 0),
+     PB_FIELD(  8, DOUBLE  , OPTIONAL, STATIC  , OTHER, openxc_DiagnosticResponse, value, payload, 0),
+     PB_LAST_FIELD
+ };
+ const pb_field_t openxc_DynamicField_fields[5] = {
+     PB_FIELD(  1, ENUM    , OPTIONAL, STATIC  , FIRST, openxc_DynamicField, type, type, 0),
+     PB_FIELD(  2, STRING  , OPTIONAL, STATIC  , OTHER, openxc_DynamicField, string_value, type, 0),
+     PB_FIELD(  3, DOUBLE  , OPTIONAL, STATIC  , OTHER, openxc_DynamicField, numeric_value, string_value, 0),
+     PB_FIELD(  4, BOOL    , OPTIONAL, STATIC  , OTHER, openxc_DynamicField, boolean_value, numeric_value, 0),
+     PB_LAST_FIELD
+ };
+ const pb_field_t openxc_SimpleMessage_fields[4] = {
+     PB_FIELD(  1, STRING  , OPTIONAL, STATIC  , FIRST, openxc_SimpleMessage, name, name, 0),
+     PB_FIELD(  2, MESSAGE , OPTIONAL, STATIC  , OTHER, openxc_SimpleMessage, value, name, &openxc_DynamicField_fields),
+     PB_FIELD(  3, MESSAGE , OPTIONAL, STATIC  , OTHER, openxc_SimpleMessage, event, value, &openxc_DynamicField_fields),
+     PB_LAST_FIELD
+ };
+ /* Check that field information fits in pb_field_t */
+ #if !defined(PB_FIELD_32BIT)
+ /* If you get an error here, it means that you need to define PB_FIELD_32BIT
+  * compile-time option. You can do that in pb.h or on compiler command line.
+  * 
+  * The reason you need to do this is that some of your messages contain tag
+  * numbers or field sizes that are larger than what can fit in 8 or 16 bit
+  * field descriptors.
+  */
+ PB_STATIC_ASSERT((pb_membersize(openxc_VehicleMessage, can_message) < 65536 && pb_membersize(openxc_VehicleMessage, simple_message) < 65536 && pb_membersize(openxc_VehicleMessage, diagnostic_response) < 65536 && pb_membersize(openxc_VehicleMessage, control_command) < 65536 && pb_membersize(openxc_VehicleMessage, command_response) < 65536 && pb_membersize(openxc_ControlCommand, diagnostic_request) < 65536 && pb_membersize(openxc_ControlCommand, passthrough_mode_request) < 65536 && pb_membersize(openxc_ControlCommand, acceptance_filter_bypass_command) < 65536 && pb_membersize(openxc_ControlCommand, payload_format_command) < 65536 && pb_membersize(openxc_ControlCommand, predefined_obd2_requests_command) < 65536 && pb_membersize(openxc_ControlCommand, modem_configuration_command) < 65536 && pb_membersize(openxc_ControlCommand, rtc_configuration_command) < 65536 && pb_membersize(openxc_DiagnosticControlCommand, request) < 65536 && pb_membersize(openxc_NetworkOperatorSettings, networkDescriptor) < 65536 && pb_membersize(openxc_ModemConfigurationCommand, networkOperatorSettings) < 65536 && pb_membersize(openxc_ModemConfigurationCommand, networkDataSettings) < 65536 && pb_membersize(openxc_ModemConfigurationCommand, serverConnectSettings) < 65536 && pb_membersize(openxc_SimpleMessage, value) < 65536 && pb_membersize(openxc_SimpleMessage, event) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_openxc_VehicleMessage_openxc_CanMessage_openxc_ControlCommand_openxc_DiagnosticControlCommand_openxc_PassthroughModeControlCommand_openxc_AcceptanceFilterBypassCommand_openxc_PayloadFormatCommand_openxc_PredefinedObd2RequestsCommand_openxc_NetworkOperatorSettings_openxc_NetworkOperatorSettings_NetworkDescriptor_openxc_NetworkDataSettings_openxc_ServerConnectSettings_openxc_ModemConfigurationCommand_openxc_RTCConfigurationCommand_openxc_CommandResponse_openxc_DiagnosticRequest_openxc_DiagnosticResponse_openxc_DynamicField_openxc_SimpleMessage)
+ #endif
+ #if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT)
+ /* If you get an error here, it means that you need to define PB_FIELD_16BIT
+  * compile-time option. You can do that in pb.h or on compiler command line.
+  * 
+  * The reason you need to do this is that some of your messages contain tag
+  * numbers or field sizes that are larger than what can fit in the default
+  * 8 bit descriptors.
+  */
+ PB_STATIC_ASSERT((pb_membersize(openxc_VehicleMessage, can_message) < 256 && pb_membersize(openxc_VehicleMessage, simple_message) < 256 && pb_membersize(openxc_VehicleMessage, diagnostic_response) < 256 && pb_membersize(openxc_VehicleMessage, control_command) < 256 && pb_membersize(openxc_VehicleMessage, command_response) < 256 && pb_membersize(openxc_ControlCommand, diagnostic_request) < 256 && pb_membersize(openxc_ControlCommand, passthrough_mode_request) < 256 && pb_membersize(openxc_ControlCommand, acceptance_filter_bypass_command) < 256 && pb_membersize(openxc_ControlCommand, payload_format_command) < 256 && pb_membersize(openxc_ControlCommand, predefined_obd2_requests_command) < 256 && pb_membersize(openxc_ControlCommand, modem_configuration_command) < 256 && pb_membersize(openxc_ControlCommand, rtc_configuration_command) < 256 && pb_membersize(openxc_DiagnosticControlCommand, request) < 256 && pb_membersize(openxc_NetworkOperatorSettings, networkDescriptor) < 256 && pb_membersize(openxc_ModemConfigurationCommand, networkOperatorSettings) < 256 && pb_membersize(openxc_ModemConfigurationCommand, networkDataSettings) < 256 && pb_membersize(openxc_ModemConfigurationCommand, serverConnectSettings) < 256 && pb_membersize(openxc_SimpleMessage, value) < 256 && pb_membersize(openxc_SimpleMessage, event) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_openxc_VehicleMessage_openxc_CanMessage_openxc_ControlCommand_openxc_DiagnosticControlCommand_openxc_PassthroughModeControlCommand_openxc_AcceptanceFilterBypassCommand_openxc_PayloadFormatCommand_openxc_PredefinedObd2RequestsCommand_openxc_NetworkOperatorSettings_openxc_NetworkOperatorSettings_NetworkDescriptor_openxc_NetworkDataSettings_openxc_ServerConnectSettings_openxc_ModemConfigurationCommand_openxc_RTCConfigurationCommand_openxc_CommandResponse_openxc_DiagnosticRequest_openxc_DiagnosticResponse_openxc_DynamicField_openxc_SimpleMessage)
+ #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.
+  */
+ PB_STATIC_ASSERT(sizeof(double) == 8, DOUBLE_MUST_BE_8_BYTES)
index 0000000,09735ee..09735ee
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,426 +1,426 @@@
+ /* Automatically generated nanopb header */
+ /* Generated by nanopb-0.3.1 at Wed Sep 14 16:47:53 2016. */
+ #ifndef PB_OPENXC_PB_H_INCLUDED
+ #define PB_OPENXC_PB_H_INCLUDED
+ #include <pb.h>
+ #if PB_PROTO_HEADER_VERSION != 30
+ #error Regenerate this file with the current version of nanopb generator.
+ #endif
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+ /* Enum definitions */
+ typedef enum _openxc_VehicleMessage_Type {
+     openxc_VehicleMessage_Type_CAN = 1,
+     openxc_VehicleMessage_Type_SIMPLE = 2,
+     openxc_VehicleMessage_Type_DIAGNOSTIC = 3,
+     openxc_VehicleMessage_Type_CONTROL_COMMAND = 4,
+     openxc_VehicleMessage_Type_COMMAND_RESPONSE = 5
+ } openxc_VehicleMessage_Type;
+ typedef enum _openxc_CanMessage_FrameFormat {
+     openxc_CanMessage_FrameFormat_STANDARD = 1,
+     openxc_CanMessage_FrameFormat_EXTENDED = 2
+ } openxc_CanMessage_FrameFormat;
+ typedef enum _openxc_ControlCommand_Type {
+     openxc_ControlCommand_Type_VERSION = 1,
+     openxc_ControlCommand_Type_DEVICE_ID = 2,
+     openxc_ControlCommand_Type_DIAGNOSTIC = 3,
+     openxc_ControlCommand_Type_PASSTHROUGH = 4,
+     openxc_ControlCommand_Type_ACCEPTANCE_FILTER_BYPASS = 5,
+     openxc_ControlCommand_Type_PAYLOAD_FORMAT = 6,
+     openxc_ControlCommand_Type_PREDEFINED_OBD2_REQUESTS = 7,
+     openxc_ControlCommand_Type_MODEM_CONFIGURATION = 8,
+     openxc_ControlCommand_Type_RTC_CONFIGURATION = 9,
+     openxc_ControlCommand_Type_SD_MOUNT_STATUS = 10,
+     openxc_ControlCommand_Type_PLATFORM = 11
+ } openxc_ControlCommand_Type;
+ typedef enum _openxc_DiagnosticControlCommand_Action {
+     openxc_DiagnosticControlCommand_Action_ADD = 1,
+     openxc_DiagnosticControlCommand_Action_CANCEL = 2
+ } openxc_DiagnosticControlCommand_Action;
+ typedef enum _openxc_PayloadFormatCommand_PayloadFormat {
+     openxc_PayloadFormatCommand_PayloadFormat_JSON = 1,
+     openxc_PayloadFormatCommand_PayloadFormat_PROTOBUF = 2,
+     openxc_PayloadFormatCommand_PayloadFormat_MESSAGEPACK = 3
+ } openxc_PayloadFormatCommand_PayloadFormat;
+ typedef enum _openxc_NetworkOperatorSettings_OperatorSelectMode {
+     openxc_NetworkOperatorSettings_OperatorSelectMode_AUTOMATIC = 0,
+     openxc_NetworkOperatorSettings_OperatorSelectMode_MANUAL = 1,
+     openxc_NetworkOperatorSettings_OperatorSelectMode_DEREGISTER = 2,
+     openxc_NetworkOperatorSettings_OperatorSelectMode_SET_ONLY = 3,
+     openxc_NetworkOperatorSettings_OperatorSelectMode_MANUAL_AUTOMATIC = 4
+ } openxc_NetworkOperatorSettings_OperatorSelectMode;
+ typedef enum _openxc_NetworkOperatorSettings_NetworkDescriptor_NetworkType {
+     openxc_NetworkOperatorSettings_NetworkDescriptor_NetworkType_GSM = 0,
+     openxc_NetworkOperatorSettings_NetworkDescriptor_NetworkType_UTRAN = 2
+ } openxc_NetworkOperatorSettings_NetworkDescriptor_NetworkType;
+ typedef enum _openxc_DiagnosticRequest_DecodedType {
+     openxc_DiagnosticRequest_DecodedType_NONE = 1,
+     openxc_DiagnosticRequest_DecodedType_OBD2 = 2
+ } openxc_DiagnosticRequest_DecodedType;
+ typedef enum _openxc_DynamicField_Type {
+     openxc_DynamicField_Type_STRING = 1,
+     openxc_DynamicField_Type_NUM = 2,
+     openxc_DynamicField_Type_BOOL = 3
+ } openxc_DynamicField_Type;
+ /* Struct definitions */
+ typedef struct _openxc_NetworkDataSettings {
+     pb_callback_t APN;
+ } openxc_NetworkDataSettings;
+ typedef struct _openxc_AcceptanceFilterBypassCommand {
+     bool has_bus;
+     int32_t bus;
+     bool has_bypass;
+     bool bypass;
+ } openxc_AcceptanceFilterBypassCommand;
+ typedef PB_BYTES_ARRAY_T(8) openxc_CanMessage_data_t;
+ typedef struct _openxc_CanMessage {
+     bool has_bus;
+     int32_t bus;
+     bool has_id;
+     uint32_t id;
+     bool has_data;
+     openxc_CanMessage_data_t data;
+     bool has_frame_format;
+     openxc_CanMessage_FrameFormat frame_format;
+ } openxc_CanMessage;
+ typedef struct _openxc_CommandResponse {
+     bool has_type;
+     openxc_ControlCommand_Type type;
+     bool has_message;
+     char message[128];
+     bool has_status;
+     bool status;
+ } openxc_CommandResponse;
+ typedef PB_BYTES_ARRAY_T(8) openxc_DiagnosticRequest_payload_t;
+ typedef struct _openxc_DiagnosticRequest {
+     bool has_bus;
+     int32_t bus;
+     bool has_message_id;
+     uint32_t message_id;
+     bool has_mode;
+     uint32_t mode;
+     bool has_pid;
+     uint32_t pid;
+     bool has_payload;
+     openxc_DiagnosticRequest_payload_t payload;
+     bool has_multiple_responses;
+     bool multiple_responses;
+     bool has_frequency;
+     double frequency;
+     bool has_name;
+     char name[10];
+     bool has_decoded_type;
+     openxc_DiagnosticRequest_DecodedType decoded_type;
+ } openxc_DiagnosticRequest;
+ typedef PB_BYTES_ARRAY_T(255) openxc_DiagnosticResponse_payload_t;
+ typedef struct _openxc_DiagnosticResponse {
+     bool has_bus;
+     int32_t bus;
+     bool has_message_id;
+     uint32_t message_id;
+     bool has_mode;
+     uint32_t mode;
+     bool has_pid;
+     uint32_t pid;
+     bool has_success;
+     bool success;
+     bool has_negative_response_code;
+     uint32_t negative_response_code;
+     bool has_payload;
+     openxc_DiagnosticResponse_payload_t payload;
+     bool has_value;
+     double value;
+ } openxc_DiagnosticResponse;
+ typedef struct _openxc_DynamicField {
+     bool has_type;
+     openxc_DynamicField_Type type;
+     bool has_string_value;
+     char string_value[100];
+     bool has_numeric_value;
+     double numeric_value;
+     bool has_boolean_value;
+     bool boolean_value;
+ } openxc_DynamicField;
+ typedef struct _openxc_NetworkOperatorSettings_NetworkDescriptor {
+     bool has_PLMN;
+     uint32_t PLMN;
+     bool has_networkType;
+     openxc_NetworkOperatorSettings_NetworkDescriptor_NetworkType networkType;
+ } openxc_NetworkOperatorSettings_NetworkDescriptor;
+ typedef struct _openxc_PassthroughModeControlCommand {
+     bool has_bus;
+     int32_t bus;
+     bool has_enabled;
+     bool enabled;
+ } openxc_PassthroughModeControlCommand;
+ typedef struct _openxc_PayloadFormatCommand {
+     bool has_format;
+     openxc_PayloadFormatCommand_PayloadFormat format;
+ } openxc_PayloadFormatCommand;
+ typedef struct _openxc_PredefinedObd2RequestsCommand {
+     bool has_enabled;
+     bool enabled;
+ } openxc_PredefinedObd2RequestsCommand;
+ typedef struct _openxc_RTCConfigurationCommand {
+     bool has_unix_time;
+     uint32_t unix_time;
+ } openxc_RTCConfigurationCommand;
+ typedef struct _openxc_ServerConnectSettings {
+     bool has_host;
+     char host[128];
+     bool has_port;
+     uint32_t port;
+ } openxc_ServerConnectSettings;
+ typedef struct _openxc_DiagnosticControlCommand {
+     bool has_request;
+     openxc_DiagnosticRequest request;
+     bool has_action;
+     openxc_DiagnosticControlCommand_Action action;
+ } openxc_DiagnosticControlCommand;
+ typedef struct _openxc_NetworkOperatorSettings {
+     bool has_allowDataRoaming;
+     bool allowDataRoaming;
+     bool has_operatorSelectMode;
+     openxc_NetworkOperatorSettings_OperatorSelectMode operatorSelectMode;
+     bool has_networkDescriptor;
+     openxc_NetworkOperatorSettings_NetworkDescriptor networkDescriptor;
+ } openxc_NetworkOperatorSettings;
+ typedef struct _openxc_SimpleMessage {
+     bool has_name;
+     char name[100];
+     bool has_value;
+     openxc_DynamicField value;
+     bool has_event;
+     openxc_DynamicField event;
+ } openxc_SimpleMessage;
+ typedef struct _openxc_ModemConfigurationCommand {
+     bool has_networkOperatorSettings;
+     openxc_NetworkOperatorSettings networkOperatorSettings;
+     bool has_networkDataSettings;
+     openxc_NetworkDataSettings networkDataSettings;
+     bool has_serverConnectSettings;
+     openxc_ServerConnectSettings serverConnectSettings;
+ } openxc_ModemConfigurationCommand;
+ typedef struct _openxc_ControlCommand {
+     bool has_type;
+     openxc_ControlCommand_Type type;
+     bool has_diagnostic_request;
+     openxc_DiagnosticControlCommand diagnostic_request;
+     bool has_passthrough_mode_request;
+     openxc_PassthroughModeControlCommand passthrough_mode_request;
+     bool has_acceptance_filter_bypass_command;
+     openxc_AcceptanceFilterBypassCommand acceptance_filter_bypass_command;
+     bool has_payload_format_command;
+     openxc_PayloadFormatCommand payload_format_command;
+     bool has_predefined_obd2_requests_command;
+     openxc_PredefinedObd2RequestsCommand predefined_obd2_requests_command;
+     bool has_modem_configuration_command;
+     openxc_ModemConfigurationCommand modem_configuration_command;
+     bool has_rtc_configuration_command;
+     openxc_RTCConfigurationCommand rtc_configuration_command;
+ } openxc_ControlCommand;
+ typedef struct _openxc_VehicleMessage {
+     bool has_type;
+     openxc_VehicleMessage_Type type;
+     bool has_can_message;
+     openxc_CanMessage can_message;
+     bool has_simple_message;
+     openxc_SimpleMessage simple_message;
+     bool has_diagnostic_response;
+     openxc_DiagnosticResponse diagnostic_response;
+     bool has_control_command;
+     openxc_ControlCommand control_command;
+     bool has_command_response;
+     openxc_CommandResponse command_response;
+     bool has_timestamp;
+     uint64_t timestamp;
+ } openxc_VehicleMessage;
+ /* Default values for struct fields */
+ /* Initializer values for message structs */
+ #define openxc_VehicleMessage_init_default       {false, (openxc_VehicleMessage_Type)0, false, openxc_CanMessage_init_default, false, openxc_SimpleMessage_init_default, false, openxc_DiagnosticResponse_init_default, false, openxc_ControlCommand_init_default, false, openxc_CommandResponse_init_default, false, 0}
+ #define openxc_CanMessage_init_default           {false, 0, false, 0, false, {0, {0}}, false, (openxc_CanMessage_FrameFormat)0}
+ #define openxc_ControlCommand_init_default       {false, (openxc_ControlCommand_Type)0, false, openxc_DiagnosticControlCommand_init_default, false, openxc_PassthroughModeControlCommand_init_default, false, openxc_AcceptanceFilterBypassCommand_init_default, false, openxc_PayloadFormatCommand_init_default, false, openxc_PredefinedObd2RequestsCommand_init_default, false, openxc_ModemConfigurationCommand_init_default, false, openxc_RTCConfigurationCommand_init_default}
+ #define openxc_DiagnosticControlCommand_init_default {false, openxc_DiagnosticRequest_init_default, false, (openxc_DiagnosticControlCommand_Action)0}
+ #define openxc_PassthroughModeControlCommand_init_default {false, 0, false, 0}
+ #define openxc_AcceptanceFilterBypassCommand_init_default {false, 0, false, 0}
+ #define openxc_PayloadFormatCommand_init_default {false, (openxc_PayloadFormatCommand_PayloadFormat)0}
+ #define openxc_PredefinedObd2RequestsCommand_init_default {false, 0}
+ #define openxc_NetworkOperatorSettings_init_default {false, 0, false, (openxc_NetworkOperatorSettings_OperatorSelectMode)0, false, openxc_NetworkOperatorSettings_NetworkDescriptor_init_default}
+ #define openxc_NetworkOperatorSettings_NetworkDescriptor_init_default {false, 0, false, (openxc_NetworkOperatorSettings_NetworkDescriptor_NetworkType)0}
+ #define openxc_NetworkDataSettings_init_default  {{{NULL}, NULL}}
+ #define openxc_ServerConnectSettings_init_default {false, "", false, 0}
+ #define openxc_ModemConfigurationCommand_init_default {false, openxc_NetworkOperatorSettings_init_default, false, openxc_NetworkDataSettings_init_default, false, openxc_ServerConnectSettings_init_default}
+ #define openxc_RTCConfigurationCommand_init_default {false, 0}
+ #define openxc_CommandResponse_init_default      {false, (openxc_ControlCommand_Type)0, false, "", false, 0}
+ #define openxc_DiagnosticRequest_init_default    {false, 0, false, 0, false, 0, false, 0, false, {0, {0}}, false, 0, false, 0, false, "", false, (openxc_DiagnosticRequest_DecodedType)0}
+ #define openxc_DiagnosticResponse_init_default   {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, {0, {0}}, false, 0}
+ #define openxc_DynamicField_init_default         {false, (openxc_DynamicField_Type)0, false, "", false, 0, false, 0}
+ #define openxc_SimpleMessage_init_default        {false, "", false, openxc_DynamicField_init_default, false, openxc_DynamicField_init_default}
+ #define openxc_VehicleMessage_init_zero          {false, (openxc_VehicleMessage_Type)0, false, openxc_CanMessage_init_zero, false, openxc_SimpleMessage_init_zero, false, openxc_DiagnosticResponse_init_zero, false, openxc_ControlCommand_init_zero, false, openxc_CommandResponse_init_zero, false, 0}
+ #define openxc_CanMessage_init_zero              {false, 0, false, 0, false, {0, {0}}, false, (openxc_CanMessage_FrameFormat)0}
+ #define openxc_ControlCommand_init_zero          {false, (openxc_ControlCommand_Type)0, false, openxc_DiagnosticControlCommand_init_zero, false, openxc_PassthroughModeControlCommand_init_zero, false, openxc_AcceptanceFilterBypassCommand_init_zero, false, openxc_PayloadFormatCommand_init_zero, false, openxc_PredefinedObd2RequestsCommand_init_zero, false, openxc_ModemConfigurationCommand_init_zero, false, openxc_RTCConfigurationCommand_init_zero}
+ #define openxc_DiagnosticControlCommand_init_zero {false, openxc_DiagnosticRequest_init_zero, false, (openxc_DiagnosticControlCommand_Action)0}
+ #define openxc_PassthroughModeControlCommand_init_zero {false, 0, false, 0}
+ #define openxc_AcceptanceFilterBypassCommand_init_zero {false, 0, false, 0}
+ #define openxc_PayloadFormatCommand_init_zero    {false, (openxc_PayloadFormatCommand_PayloadFormat)0}
+ #define openxc_PredefinedObd2RequestsCommand_init_zero {false, 0}
+ #define openxc_NetworkOperatorSettings_init_zero {false, 0, false, (openxc_NetworkOperatorSettings_OperatorSelectMode)0, false, openxc_NetworkOperatorSettings_NetworkDescriptor_init_zero}
+ #define openxc_NetworkOperatorSettings_NetworkDescriptor_init_zero {false, 0, false, (openxc_NetworkOperatorSettings_NetworkDescriptor_NetworkType)0}
+ #define openxc_NetworkDataSettings_init_zero     {{{NULL}, NULL}}
+ #define openxc_ServerConnectSettings_init_zero   {false, "", false, 0}
+ #define openxc_ModemConfigurationCommand_init_zero {false, openxc_NetworkOperatorSettings_init_zero, false, openxc_NetworkDataSettings_init_zero, false, openxc_ServerConnectSettings_init_zero}
+ #define openxc_RTCConfigurationCommand_init_zero {false, 0}
+ #define openxc_CommandResponse_init_zero         {false, (openxc_ControlCommand_Type)0, false, "", false, 0}
+ #define openxc_DiagnosticRequest_init_zero       {false, 0, false, 0, false, 0, false, 0, false, {0, {0}}, false, 0, false, 0, false, "", false, (openxc_DiagnosticRequest_DecodedType)0}
+ #define openxc_DiagnosticResponse_init_zero      {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, {0, {0}}, false, 0}
+ #define openxc_DynamicField_init_zero            {false, (openxc_DynamicField_Type)0, false, "", false, 0, false, 0}
+ #define openxc_SimpleMessage_init_zero           {false, "", false, openxc_DynamicField_init_zero, false, openxc_DynamicField_init_zero}
+ /* Field tags (for use in manual encoding/decoding) */
+ #define openxc_NetworkDataSettings_APN_tag       1
+ #define openxc_AcceptanceFilterBypassCommand_bus_tag 1
+ #define openxc_AcceptanceFilterBypassCommand_bypass_tag 2
+ #define openxc_CanMessage_bus_tag                1
+ #define openxc_CanMessage_id_tag                 2
+ #define openxc_CanMessage_data_tag               3
+ #define openxc_CanMessage_frame_format_tag       4
+ #define openxc_CommandResponse_type_tag          1
+ #define openxc_CommandResponse_message_tag       2
+ #define openxc_CommandResponse_status_tag        3
+ #define openxc_DiagnosticRequest_bus_tag         1
+ #define openxc_DiagnosticRequest_message_id_tag  2
+ #define openxc_DiagnosticRequest_mode_tag        3
+ #define openxc_DiagnosticRequest_pid_tag         4
+ #define openxc_DiagnosticRequest_payload_tag     5
+ #define openxc_DiagnosticRequest_multiple_responses_tag 6
+ #define openxc_DiagnosticRequest_frequency_tag   7
+ #define openxc_DiagnosticRequest_name_tag        8
+ #define openxc_DiagnosticRequest_decoded_type_tag 9
+ #define openxc_DiagnosticResponse_bus_tag        1
+ #define openxc_DiagnosticResponse_message_id_tag 2
+ #define openxc_DiagnosticResponse_mode_tag       3
+ #define openxc_DiagnosticResponse_pid_tag        4
+ #define openxc_DiagnosticResponse_success_tag    5
+ #define openxc_DiagnosticResponse_negative_response_code_tag 6
+ #define openxc_DiagnosticResponse_payload_tag    7
+ #define openxc_DiagnosticResponse_value_tag      8
+ #define openxc_DynamicField_type_tag             1
+ #define openxc_DynamicField_string_value_tag     2
+ #define openxc_DynamicField_numeric_value_tag    3
+ #define openxc_DynamicField_boolean_value_tag    4
+ #define openxc_NetworkOperatorSettings_NetworkDescriptor_PLMN_tag 1
+ #define openxc_NetworkOperatorSettings_NetworkDescriptor_networkType_tag 2
+ #define openxc_PassthroughModeControlCommand_bus_tag 1
+ #define openxc_PassthroughModeControlCommand_enabled_tag 2
+ #define openxc_PayloadFormatCommand_format_tag   1
+ #define openxc_PredefinedObd2RequestsCommand_enabled_tag 1
+ #define openxc_RTCConfigurationCommand_unix_time_tag 1
+ #define openxc_ServerConnectSettings_host_tag    1
+ #define openxc_ServerConnectSettings_port_tag    2
+ #define openxc_DiagnosticControlCommand_request_tag 1
+ #define openxc_DiagnosticControlCommand_action_tag 2
+ #define openxc_NetworkOperatorSettings_allowDataRoaming_tag 1
+ #define openxc_NetworkOperatorSettings_operatorSelectMode_tag 2
+ #define openxc_NetworkOperatorSettings_networkDescriptor_tag 3
+ #define openxc_SimpleMessage_name_tag            1
+ #define openxc_SimpleMessage_value_tag           2
+ #define openxc_SimpleMessage_event_tag           3
+ #define openxc_ModemConfigurationCommand_networkOperatorSettings_tag 1
+ #define openxc_ModemConfigurationCommand_networkDataSettings_tag 2
+ #define openxc_ModemConfigurationCommand_serverConnectSettings_tag 3
+ #define openxc_ControlCommand_type_tag           1
+ #define openxc_ControlCommand_diagnostic_request_tag 2
+ #define openxc_ControlCommand_passthrough_mode_request_tag 3
+ #define openxc_ControlCommand_acceptance_filter_bypass_command_tag 4
+ #define openxc_ControlCommand_payload_format_command_tag 5
+ #define openxc_ControlCommand_predefined_obd2_requests_command_tag 6
+ #define openxc_ControlCommand_modem_configuration_command_tag 7
+ #define openxc_ControlCommand_rtc_configuration_command_tag 8
+ #define openxc_VehicleMessage_type_tag           1
+ #define openxc_VehicleMessage_can_message_tag    2
+ #define openxc_VehicleMessage_simple_message_tag 3
+ #define openxc_VehicleMessage_diagnostic_response_tag 4
+ #define openxc_VehicleMessage_control_command_tag 5
+ #define openxc_VehicleMessage_command_response_tag 6
+ #define openxc_VehicleMessage_timestamp_tag      7
+ /* Struct field encoding specification for nanopb */
+ extern const pb_field_t openxc_VehicleMessage_fields[8];
+ extern const pb_field_t openxc_CanMessage_fields[5];
+ extern const pb_field_t openxc_ControlCommand_fields[9];
+ extern const pb_field_t openxc_DiagnosticControlCommand_fields[3];
+ extern const pb_field_t openxc_PassthroughModeControlCommand_fields[3];
+ extern const pb_field_t openxc_AcceptanceFilterBypassCommand_fields[3];
+ extern const pb_field_t openxc_PayloadFormatCommand_fields[2];
+ extern const pb_field_t openxc_PredefinedObd2RequestsCommand_fields[2];
+ extern const pb_field_t openxc_NetworkOperatorSettings_fields[4];
+ extern const pb_field_t openxc_NetworkOperatorSettings_NetworkDescriptor_fields[3];
+ extern const pb_field_t openxc_NetworkDataSettings_fields[2];
+ extern const pb_field_t openxc_ServerConnectSettings_fields[3];
+ extern const pb_field_t openxc_ModemConfigurationCommand_fields[4];
+ extern const pb_field_t openxc_RTCConfigurationCommand_fields[2];
+ extern const pb_field_t openxc_CommandResponse_fields[4];
+ extern const pb_field_t openxc_DiagnosticRequest_fields[10];
+ extern const pb_field_t openxc_DiagnosticResponse_fields[9];
+ extern const pb_field_t openxc_DynamicField_fields[5];
+ extern const pb_field_t openxc_SimpleMessage_fields[4];
+ /* Maximum encoded size of messages (where known) */
+ #define openxc_CanMessage_size                   33
+ #define openxc_DiagnosticControlCommand_size     76
+ #define openxc_PassthroughModeControlCommand_size 13
+ #define openxc_AcceptanceFilterBypassCommand_size 13
+ #define openxc_PayloadFormatCommand_size         6
+ #define openxc_PredefinedObd2RequestsCommand_size 2
+ #define openxc_NetworkOperatorSettings_size      22
+ #define openxc_NetworkOperatorSettings_NetworkDescriptor_size 12
+ #define openxc_ServerConnectSettings_size        137
+ #define openxc_RTCConfigurationCommand_size      6
+ #define openxc_CommandResponse_size              139
+ #define openxc_DiagnosticRequest_size            68
+ #define openxc_DiagnosticResponse_size           304
+ #define openxc_DynamicField_size                 119
+ #define openxc_SimpleMessage_size                344
+ #ifdef __cplusplus
+ } /* extern "C" */
+ #endif
+ #endif
index 0000000,4fad1d6..4fad1d6
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,12099 +1,12099 @@@
+ // Generated by the protocol buffer compiler.  DO NOT EDIT!
+ // source: openxc.proto
+ package com.openxc;
+ public final class BinaryMessages {
+   private BinaryMessages() {}
+   public static void registerAllExtensions(
+       com.google.protobuf.ExtensionRegistry registry) {
+   }
+   public interface VehicleMessageOrBuilder
+       extends com.google.protobuf.MessageOrBuilder {
+     
+     // optional .openxc.VehicleMessage.Type type = 1;
+     boolean hasType();
+     com.openxc.BinaryMessages.VehicleMessage.Type getType();
+     
+     // optional .openxc.CanMessage can_message = 2;
+     boolean hasCanMessage();
+     com.openxc.BinaryMessages.CanMessage getCanMessage();
+     com.openxc.BinaryMessages.CanMessageOrBuilder getCanMessageOrBuilder();
+     
+     // optional .openxc.SimpleMessage simple_message = 3;
+     boolean hasSimpleMessage();
+     com.openxc.BinaryMessages.SimpleMessage getSimpleMessage();
+     com.openxc.BinaryMessages.SimpleMessageOrBuilder getSimpleMessageOrBuilder();
+     
+     // optional .openxc.DiagnosticResponse diagnostic_response = 4;
+     boolean hasDiagnosticResponse();
+     com.openxc.BinaryMessages.DiagnosticResponse getDiagnosticResponse();
+     com.openxc.BinaryMessages.DiagnosticResponseOrBuilder getDiagnosticResponseOrBuilder();
+     
+     // optional .openxc.ControlCommand control_command = 5;
+     boolean hasControlCommand();
+     com.openxc.BinaryMessages.ControlCommand getControlCommand();
+     com.openxc.BinaryMessages.ControlCommandOrBuilder getControlCommandOrBuilder();
+     
+     // optional .openxc.CommandResponse command_response = 6;
+     boolean hasCommandResponse();
+     com.openxc.BinaryMessages.CommandResponse getCommandResponse();
+     com.openxc.BinaryMessages.CommandResponseOrBuilder getCommandResponseOrBuilder();
+     
+     // optional uint64 timestamp = 7;
+     boolean hasTimestamp();
+     long getTimestamp();
+   }
+   public static final class VehicleMessage extends
+       com.google.protobuf.GeneratedMessage
+       implements VehicleMessageOrBuilder {
+     // Use VehicleMessage.newBuilder() to construct.
+     private VehicleMessage(Builder builder) {
+       super(builder);
+     }
+     private VehicleMessage(boolean noInit) {}
+     
+     private static final VehicleMessage defaultInstance;
+     public static VehicleMessage getDefaultInstance() {
+       return defaultInstance;
+     }
+     
+     public VehicleMessage getDefaultInstanceForType() {
+       return defaultInstance;
+     }
+     
+     public static final com.google.protobuf.Descriptors.Descriptor
+         getDescriptor() {
+       return com.openxc.BinaryMessages.internal_static_openxc_VehicleMessage_descriptor;
+     }
+     
+     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+         internalGetFieldAccessorTable() {
+       return com.openxc.BinaryMessages.internal_static_openxc_VehicleMessage_fieldAccessorTable;
+     }
+     
+     public enum Type
+         implements com.google.protobuf.ProtocolMessageEnum {
+       CAN(0, 1),
+       SIMPLE(1, 2),
+       DIAGNOSTIC(2, 3),
+       CONTROL_COMMAND(3, 4),
+       COMMAND_RESPONSE(4, 5),
+       ;
+       
+       public static final int CAN_VALUE = 1;
+       public static final int SIMPLE_VALUE = 2;
+       public static final int DIAGNOSTIC_VALUE = 3;
+       public static final int CONTROL_COMMAND_VALUE = 4;
+       public static final int COMMAND_RESPONSE_VALUE = 5;
+       
+       
+       public final int getNumber() { return value; }
+       
+       public static Type valueOf(int value) {
+         switch (value) {
+           case 1: return CAN;
+           case 2: return SIMPLE;
+           case 3: return DIAGNOSTIC;
+           case 4: return CONTROL_COMMAND;
+           case 5: return COMMAND_RESPONSE;
+           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 com.openxc.BinaryMessages.VehicleMessage.getDescriptor().getEnumTypes().get(0);
+       }
+       
+       private static final Type[] VALUES = {
+         CAN, SIMPLE, DIAGNOSTIC, CONTROL_COMMAND, COMMAND_RESPONSE, 
+       };
+       
+       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 com.openxc.BinaryMessages.VehicleMessage.Type type_;
+     public boolean hasType() {
+       return ((bitField0_ & 0x00000001) == 0x00000001);
+     }
+     public com.openxc.BinaryMessages.VehicleMessage.Type getType() {
+       return type_;
+     }
+     
+     // optional .openxc.CanMessage can_message = 2;
+     public static final int CAN_MESSAGE_FIELD_NUMBER = 2;
+     private com.openxc.BinaryMessages.CanMessage canMessage_;
+     public boolean hasCanMessage() {
+       return ((bitField0_ & 0x00000002) == 0x00000002);
+     }
+     public com.openxc.BinaryMessages.CanMessage getCanMessage() {
+       return canMessage_;
+     }
+     public com.openxc.BinaryMessages.CanMessageOrBuilder getCanMessageOrBuilder() {
+       return canMessage_;
+     }
+     
+     // optional .openxc.SimpleMessage simple_message = 3;
+     public static final int SIMPLE_MESSAGE_FIELD_NUMBER = 3;
+     private com.openxc.BinaryMessages.SimpleMessage simpleMessage_;
+     public boolean hasSimpleMessage() {
+       return ((bitField0_ & 0x00000004) == 0x00000004);
+     }
+     public com.openxc.BinaryMessages.SimpleMessage getSimpleMessage() {
+       return simpleMessage_;
+     }
+     public com.openxc.BinaryMessages.SimpleMessageOrBuilder getSimpleMessageOrBuilder() {
+       return simpleMessage_;
+     }
+     
+     // optional .openxc.DiagnosticResponse diagnostic_response = 4;
+     public static final int DIAGNOSTIC_RESPONSE_FIELD_NUMBER = 4;
+     private com.openxc.BinaryMessages.DiagnosticResponse diagnosticResponse_;
+     public boolean hasDiagnosticResponse() {
+       return ((bitField0_ & 0x00000008) == 0x00000008);
+     }
+     public com.openxc.BinaryMessages.DiagnosticResponse getDiagnosticResponse() {
+       return diagnosticResponse_;
+     }
+     public com.openxc.BinaryMessages.DiagnosticResponseOrBuilder getDiagnosticResponseOrBuilder() {
+       return diagnosticResponse_;
+     }
+     
+     // optional .openxc.ControlCommand control_command = 5;
+     public static final int CONTROL_COMMAND_FIELD_NUMBER = 5;
+     private com.openxc.BinaryMessages.ControlCommand controlCommand_;
+     public boolean hasControlCommand() {
+       return ((bitField0_ & 0x00000010) == 0x00000010);
+     }
+     public com.openxc.BinaryMessages.ControlCommand getControlCommand() {
+       return controlCommand_;
+     }
+     public com.openxc.BinaryMessages.ControlCommandOrBuilder getControlCommandOrBuilder() {
+       return controlCommand_;
+     }
+     
+     // optional .openxc.CommandResponse command_response = 6;
+     public static final int COMMAND_RESPONSE_FIELD_NUMBER = 6;
+     private com.openxc.BinaryMessages.CommandResponse commandResponse_;
+     public boolean hasCommandResponse() {
+       return ((bitField0_ & 0x00000020) == 0x00000020);
+     }
+     public com.openxc.BinaryMessages.CommandResponse getCommandResponse() {
+       return commandResponse_;
+     }
+     public com.openxc.BinaryMessages.CommandResponseOrBuilder getCommandResponseOrBuilder() {
+       return commandResponse_;
+     }
+     
+     // optional uint64 timestamp = 7;
+     public static final int TIMESTAMP_FIELD_NUMBER = 7;
+     private long timestamp_;
+     public boolean hasTimestamp() {
+       return ((bitField0_ & 0x00000040) == 0x00000040);
+     }
+     public long getTimestamp() {
+       return timestamp_;
+     }
+     
+     private void initFields() {
+       type_ = com.openxc.BinaryMessages.VehicleMessage.Type.CAN;
+       canMessage_ = com.openxc.BinaryMessages.CanMessage.getDefaultInstance();
+       simpleMessage_ = com.openxc.BinaryMessages.SimpleMessage.getDefaultInstance();
+       diagnosticResponse_ = com.openxc.BinaryMessages.DiagnosticResponse.getDefaultInstance();
+       controlCommand_ = com.openxc.BinaryMessages.ControlCommand.getDefaultInstance();
+       commandResponse_ = com.openxc.BinaryMessages.CommandResponse.getDefaultInstance();
+       timestamp_ = 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.writeEnum(1, type_.getNumber());
+       }
+       if (((bitField0_ & 0x00000002) == 0x00000002)) {
+         output.writeMessage(2, canMessage_);
+       }
+       if (((bitField0_ & 0x00000004) == 0x00000004)) {
+         output.writeMessage(3, simpleMessage_);
+       }
+       if (((bitField0_ & 0x00000008) == 0x00000008)) {
+         output.writeMessage(4, diagnosticResponse_);
+       }
+       if (((bitField0_ & 0x00000010) == 0x00000010)) {
+         output.writeMessage(5, controlCommand_);
+       }
+       if (((bitField0_ & 0x00000020) == 0x00000020)) {
+         output.writeMessage(6, commandResponse_);
+       }
+       if (((bitField0_ & 0x00000040) == 0x00000040)) {
+         output.writeUInt64(7, timestamp_);
+       }
+       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, canMessage_);
+       }
+       if (((bitField0_ & 0x00000004) == 0x00000004)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeMessageSize(3, simpleMessage_);
+       }
+       if (((bitField0_ & 0x00000008) == 0x00000008)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeMessageSize(4, diagnosticResponse_);
+       }
+       if (((bitField0_ & 0x00000010) == 0x00000010)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeMessageSize(5, controlCommand_);
+       }
+       if (((bitField0_ & 0x00000020) == 0x00000020)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeMessageSize(6, commandResponse_);
+       }
+       if (((bitField0_ & 0x00000040) == 0x00000040)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeUInt64Size(7, timestamp_);
+       }
+       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 com.openxc.BinaryMessages.VehicleMessage parseFrom(
+         com.google.protobuf.ByteString data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.VehicleMessage parseFrom(
+         com.google.protobuf.ByteString data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.VehicleMessage parseFrom(byte[] data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.VehicleMessage parseFrom(
+         byte[] data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.VehicleMessage parseFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.VehicleMessage parseFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.VehicleMessage parseDelimitedFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.VehicleMessage parseDelimitedFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.VehicleMessage parseFrom(
+         com.google.protobuf.CodedInputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.VehicleMessage parseFrom(
+         com.google.protobuf.CodedInputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     
+     public static Builder newBuilder() { return Builder.create(); }
+     public Builder newBuilderForType() { return newBuilder(); }
+     public static Builder newBuilder(com.openxc.BinaryMessages.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;
+     }
+     public static final class Builder extends
+         com.google.protobuf.GeneratedMessage.Builder<Builder>
+        implements com.openxc.BinaryMessages.VehicleMessageOrBuilder {
+       public static final com.google.protobuf.Descriptors.Descriptor
+           getDescriptor() {
+         return com.openxc.BinaryMessages.internal_static_openxc_VehicleMessage_descriptor;
+       }
+       
+       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+           internalGetFieldAccessorTable() {
+         return com.openxc.BinaryMessages.internal_static_openxc_VehicleMessage_fieldAccessorTable;
+       }
+       
+       // Construct using com.openxc.BinaryMessages.VehicleMessage.newBuilder()
+       private Builder() {
+         maybeForceBuilderInitialization();
+       }
+       
+       private Builder(BuilderParent parent) {
+         super(parent);
+         maybeForceBuilderInitialization();
+       }
+       private void maybeForceBuilderInitialization() {
+         if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+           getCanMessageFieldBuilder();
+           getSimpleMessageFieldBuilder();
+           getDiagnosticResponseFieldBuilder();
+           getControlCommandFieldBuilder();
+           getCommandResponseFieldBuilder();
+         }
+       }
+       private static Builder create() {
+         return new Builder();
+       }
+       
+       public Builder clear() {
+         super.clear();
+         type_ = com.openxc.BinaryMessages.VehicleMessage.Type.CAN;
+         bitField0_ = (bitField0_ & ~0x00000001);
+         if (canMessageBuilder_ == null) {
+           canMessage_ = com.openxc.BinaryMessages.CanMessage.getDefaultInstance();
+         } else {
+           canMessageBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000002);
+         if (simpleMessageBuilder_ == null) {
+           simpleMessage_ = com.openxc.BinaryMessages.SimpleMessage.getDefaultInstance();
+         } else {
+           simpleMessageBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000004);
+         if (diagnosticResponseBuilder_ == null) {
+           diagnosticResponse_ = com.openxc.BinaryMessages.DiagnosticResponse.getDefaultInstance();
+         } else {
+           diagnosticResponseBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000008);
+         if (controlCommandBuilder_ == null) {
+           controlCommand_ = com.openxc.BinaryMessages.ControlCommand.getDefaultInstance();
+         } else {
+           controlCommandBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000010);
+         if (commandResponseBuilder_ == null) {
+           commandResponse_ = com.openxc.BinaryMessages.CommandResponse.getDefaultInstance();
+         } else {
+           commandResponseBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000020);
+         timestamp_ = 0L;
+         bitField0_ = (bitField0_ & ~0x00000040);
+         return this;
+       }
+       
+       public Builder clone() {
+         return create().mergeFrom(buildPartial());
+       }
+       
+       public com.google.protobuf.Descriptors.Descriptor
+           getDescriptorForType() {
+         return com.openxc.BinaryMessages.VehicleMessage.getDescriptor();
+       }
+       
+       public com.openxc.BinaryMessages.VehicleMessage getDefaultInstanceForType() {
+         return com.openxc.BinaryMessages.VehicleMessage.getDefaultInstance();
+       }
+       
+       public com.openxc.BinaryMessages.VehicleMessage build() {
+         com.openxc.BinaryMessages.VehicleMessage result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(result);
+         }
+         return result;
+       }
+       
+       private com.openxc.BinaryMessages.VehicleMessage buildParsed()
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         com.openxc.BinaryMessages.VehicleMessage result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(
+             result).asInvalidProtocolBufferException();
+         }
+         return result;
+       }
+       
+       public com.openxc.BinaryMessages.VehicleMessage buildPartial() {
+         com.openxc.BinaryMessages.VehicleMessage result = new com.openxc.BinaryMessages.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 (canMessageBuilder_ == null) {
+           result.canMessage_ = canMessage_;
+         } else {
+           result.canMessage_ = canMessageBuilder_.build();
+         }
+         if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+           to_bitField0_ |= 0x00000004;
+         }
+         if (simpleMessageBuilder_ == null) {
+           result.simpleMessage_ = simpleMessage_;
+         } else {
+           result.simpleMessage_ = simpleMessageBuilder_.build();
+         }
+         if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
+           to_bitField0_ |= 0x00000008;
+         }
+         if (diagnosticResponseBuilder_ == null) {
+           result.diagnosticResponse_ = diagnosticResponse_;
+         } else {
+           result.diagnosticResponse_ = diagnosticResponseBuilder_.build();
+         }
+         if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
+           to_bitField0_ |= 0x00000010;
+         }
+         if (controlCommandBuilder_ == null) {
+           result.controlCommand_ = controlCommand_;
+         } else {
+           result.controlCommand_ = controlCommandBuilder_.build();
+         }
+         if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
+           to_bitField0_ |= 0x00000020;
+         }
+         if (commandResponseBuilder_ == null) {
+           result.commandResponse_ = commandResponse_;
+         } else {
+           result.commandResponse_ = commandResponseBuilder_.build();
+         }
+         if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
+           to_bitField0_ |= 0x00000040;
+         }
+         result.timestamp_ = timestamp_;
+         result.bitField0_ = to_bitField0_;
+         onBuilt();
+         return result;
+       }
+       
+       public Builder mergeFrom(com.google.protobuf.Message other) {
+         if (other instanceof com.openxc.BinaryMessages.VehicleMessage) {
+           return mergeFrom((com.openxc.BinaryMessages.VehicleMessage)other);
+         } else {
+           super.mergeFrom(other);
+           return this;
+         }
+       }
+       
+       public Builder mergeFrom(com.openxc.BinaryMessages.VehicleMessage other) {
+         if (other == com.openxc.BinaryMessages.VehicleMessage.getDefaultInstance()) return this;
+         if (other.hasType()) {
+           setType(other.getType());
+         }
+         if (other.hasCanMessage()) {
+           mergeCanMessage(other.getCanMessage());
+         }
+         if (other.hasSimpleMessage()) {
+           mergeSimpleMessage(other.getSimpleMessage());
+         }
+         if (other.hasDiagnosticResponse()) {
+           mergeDiagnosticResponse(other.getDiagnosticResponse());
+         }
+         if (other.hasControlCommand()) {
+           mergeControlCommand(other.getControlCommand());
+         }
+         if (other.hasCommandResponse()) {
+           mergeCommandResponse(other.getCommandResponse());
+         }
+         if (other.hasTimestamp()) {
+           setTimestamp(other.getTimestamp());
+         }
+         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 {
+         com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+           com.google.protobuf.UnknownFieldSet.newBuilder(
+             this.getUnknownFields());
+         while (true) {
+           int tag = input.readTag();
+           switch (tag) {
+             case 0:
+               this.setUnknownFields(unknownFields.build());
+               onChanged();
+               return this;
+             default: {
+               if (!parseUnknownField(input, unknownFields,
+                                      extensionRegistry, tag)) {
+                 this.setUnknownFields(unknownFields.build());
+                 onChanged();
+                 return this;
+               }
+               break;
+             }
+             case 8: {
+               int rawValue = input.readEnum();
+               com.openxc.BinaryMessages.VehicleMessage.Type value = com.openxc.BinaryMessages.VehicleMessage.Type.valueOf(rawValue);
+               if (value == null) {
+                 unknownFields.mergeVarintField(1, rawValue);
+               } else {
+                 bitField0_ |= 0x00000001;
+                 type_ = value;
+               }
+               break;
+             }
+             case 18: {
+               com.openxc.BinaryMessages.CanMessage.Builder subBuilder = com.openxc.BinaryMessages.CanMessage.newBuilder();
+               if (hasCanMessage()) {
+                 subBuilder.mergeFrom(getCanMessage());
+               }
+               input.readMessage(subBuilder, extensionRegistry);
+               setCanMessage(subBuilder.buildPartial());
+               break;
+             }
+             case 26: {
+               com.openxc.BinaryMessages.SimpleMessage.Builder subBuilder = com.openxc.BinaryMessages.SimpleMessage.newBuilder();
+               if (hasSimpleMessage()) {
+                 subBuilder.mergeFrom(getSimpleMessage());
+               }
+               input.readMessage(subBuilder, extensionRegistry);
+               setSimpleMessage(subBuilder.buildPartial());
+               break;
+             }
+             case 34: {
+               com.openxc.BinaryMessages.DiagnosticResponse.Builder subBuilder = com.openxc.BinaryMessages.DiagnosticResponse.newBuilder();
+               if (hasDiagnosticResponse()) {
+                 subBuilder.mergeFrom(getDiagnosticResponse());
+               }
+               input.readMessage(subBuilder, extensionRegistry);
+               setDiagnosticResponse(subBuilder.buildPartial());
+               break;
+             }
+             case 42: {
+               com.openxc.BinaryMessages.ControlCommand.Builder subBuilder = com.openxc.BinaryMessages.ControlCommand.newBuilder();
+               if (hasControlCommand()) {
+                 subBuilder.mergeFrom(getControlCommand());
+               }
+               input.readMessage(subBuilder, extensionRegistry);
+               setControlCommand(subBuilder.buildPartial());
+               break;
+             }
+             case 50: {
+               com.openxc.BinaryMessages.CommandResponse.Builder subBuilder = com.openxc.BinaryMessages.CommandResponse.newBuilder();
+               if (hasCommandResponse()) {
+                 subBuilder.mergeFrom(getCommandResponse());
+               }
+               input.readMessage(subBuilder, extensionRegistry);
+               setCommandResponse(subBuilder.buildPartial());
+               break;
+             }
+             case 56: {
+               bitField0_ |= 0x00000040;
+               timestamp_ = input.readUInt64();
+               break;
+             }
+           }
+         }
+       }
+       
+       private int bitField0_;
+       
+       // optional .openxc.VehicleMessage.Type type = 1;
+       private com.openxc.BinaryMessages.VehicleMessage.Type type_ = com.openxc.BinaryMessages.VehicleMessage.Type.CAN;
+       public boolean hasType() {
+         return ((bitField0_ & 0x00000001) == 0x00000001);
+       }
+       public com.openxc.BinaryMessages.VehicleMessage.Type getType() {
+         return type_;
+       }
+       public Builder setType(com.openxc.BinaryMessages.VehicleMessage.Type value) {
+         if (value == null) {
+           throw new NullPointerException();
+         }
+         bitField0_ |= 0x00000001;
+         type_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearType() {
+         bitField0_ = (bitField0_ & ~0x00000001);
+         type_ = com.openxc.BinaryMessages.VehicleMessage.Type.CAN;
+         onChanged();
+         return this;
+       }
+       
+       // optional .openxc.CanMessage can_message = 2;
+       private com.openxc.BinaryMessages.CanMessage canMessage_ = com.openxc.BinaryMessages.CanMessage.getDefaultInstance();
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.CanMessage, com.openxc.BinaryMessages.CanMessage.Builder, com.openxc.BinaryMessages.CanMessageOrBuilder> canMessageBuilder_;
+       public boolean hasCanMessage() {
+         return ((bitField0_ & 0x00000002) == 0x00000002);
+       }
+       public com.openxc.BinaryMessages.CanMessage getCanMessage() {
+         if (canMessageBuilder_ == null) {
+           return canMessage_;
+         } else {
+           return canMessageBuilder_.getMessage();
+         }
+       }
+       public Builder setCanMessage(com.openxc.BinaryMessages.CanMessage value) {
+         if (canMessageBuilder_ == null) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           canMessage_ = value;
+           onChanged();
+         } else {
+           canMessageBuilder_.setMessage(value);
+         }
+         bitField0_ |= 0x00000002;
+         return this;
+       }
+       public Builder setCanMessage(
+           com.openxc.BinaryMessages.CanMessage.Builder builderForValue) {
+         if (canMessageBuilder_ == null) {
+           canMessage_ = builderForValue.build();
+           onChanged();
+         } else {
+           canMessageBuilder_.setMessage(builderForValue.build());
+         }
+         bitField0_ |= 0x00000002;
+         return this;
+       }
+       public Builder mergeCanMessage(com.openxc.BinaryMessages.CanMessage value) {
+         if (canMessageBuilder_ == null) {
+           if (((bitField0_ & 0x00000002) == 0x00000002) &&
+               canMessage_ != com.openxc.BinaryMessages.CanMessage.getDefaultInstance()) {
+             canMessage_ =
+               com.openxc.BinaryMessages.CanMessage.newBuilder(canMessage_).mergeFrom(value).buildPartial();
+           } else {
+             canMessage_ = value;
+           }
+           onChanged();
+         } else {
+           canMessageBuilder_.mergeFrom(value);
+         }
+         bitField0_ |= 0x00000002;
+         return this;
+       }
+       public Builder clearCanMessage() {
+         if (canMessageBuilder_ == null) {
+           canMessage_ = com.openxc.BinaryMessages.CanMessage.getDefaultInstance();
+           onChanged();
+         } else {
+           canMessageBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000002);
+         return this;
+       }
+       public com.openxc.BinaryMessages.CanMessage.Builder getCanMessageBuilder() {
+         bitField0_ |= 0x00000002;
+         onChanged();
+         return getCanMessageFieldBuilder().getBuilder();
+       }
+       public com.openxc.BinaryMessages.CanMessageOrBuilder getCanMessageOrBuilder() {
+         if (canMessageBuilder_ != null) {
+           return canMessageBuilder_.getMessageOrBuilder();
+         } else {
+           return canMessage_;
+         }
+       }
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.CanMessage, com.openxc.BinaryMessages.CanMessage.Builder, com.openxc.BinaryMessages.CanMessageOrBuilder> 
+           getCanMessageFieldBuilder() {
+         if (canMessageBuilder_ == null) {
+           canMessageBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+               com.openxc.BinaryMessages.CanMessage, com.openxc.BinaryMessages.CanMessage.Builder, com.openxc.BinaryMessages.CanMessageOrBuilder>(
+                   canMessage_,
+                   getParentForChildren(),
+                   isClean());
+           canMessage_ = null;
+         }
+         return canMessageBuilder_;
+       }
+       
+       // optional .openxc.SimpleMessage simple_message = 3;
+       private com.openxc.BinaryMessages.SimpleMessage simpleMessage_ = com.openxc.BinaryMessages.SimpleMessage.getDefaultInstance();
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.SimpleMessage, com.openxc.BinaryMessages.SimpleMessage.Builder, com.openxc.BinaryMessages.SimpleMessageOrBuilder> simpleMessageBuilder_;
+       public boolean hasSimpleMessage() {
+         return ((bitField0_ & 0x00000004) == 0x00000004);
+       }
+       public com.openxc.BinaryMessages.SimpleMessage getSimpleMessage() {
+         if (simpleMessageBuilder_ == null) {
+           return simpleMessage_;
+         } else {
+           return simpleMessageBuilder_.getMessage();
+         }
+       }
+       public Builder setSimpleMessage(com.openxc.BinaryMessages.SimpleMessage value) {
+         if (simpleMessageBuilder_ == null) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           simpleMessage_ = value;
+           onChanged();
+         } else {
+           simpleMessageBuilder_.setMessage(value);
+         }
+         bitField0_ |= 0x00000004;
+         return this;
+       }
+       public Builder setSimpleMessage(
+           com.openxc.BinaryMessages.SimpleMessage.Builder builderForValue) {
+         if (simpleMessageBuilder_ == null) {
+           simpleMessage_ = builderForValue.build();
+           onChanged();
+         } else {
+           simpleMessageBuilder_.setMessage(builderForValue.build());
+         }
+         bitField0_ |= 0x00000004;
+         return this;
+       }
+       public Builder mergeSimpleMessage(com.openxc.BinaryMessages.SimpleMessage value) {
+         if (simpleMessageBuilder_ == null) {
+           if (((bitField0_ & 0x00000004) == 0x00000004) &&
+               simpleMessage_ != com.openxc.BinaryMessages.SimpleMessage.getDefaultInstance()) {
+             simpleMessage_ =
+               com.openxc.BinaryMessages.SimpleMessage.newBuilder(simpleMessage_).mergeFrom(value).buildPartial();
+           } else {
+             simpleMessage_ = value;
+           }
+           onChanged();
+         } else {
+           simpleMessageBuilder_.mergeFrom(value);
+         }
+         bitField0_ |= 0x00000004;
+         return this;
+       }
+       public Builder clearSimpleMessage() {
+         if (simpleMessageBuilder_ == null) {
+           simpleMessage_ = com.openxc.BinaryMessages.SimpleMessage.getDefaultInstance();
+           onChanged();
+         } else {
+           simpleMessageBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000004);
+         return this;
+       }
+       public com.openxc.BinaryMessages.SimpleMessage.Builder getSimpleMessageBuilder() {
+         bitField0_ |= 0x00000004;
+         onChanged();
+         return getSimpleMessageFieldBuilder().getBuilder();
+       }
+       public com.openxc.BinaryMessages.SimpleMessageOrBuilder getSimpleMessageOrBuilder() {
+         if (simpleMessageBuilder_ != null) {
+           return simpleMessageBuilder_.getMessageOrBuilder();
+         } else {
+           return simpleMessage_;
+         }
+       }
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.SimpleMessage, com.openxc.BinaryMessages.SimpleMessage.Builder, com.openxc.BinaryMessages.SimpleMessageOrBuilder> 
+           getSimpleMessageFieldBuilder() {
+         if (simpleMessageBuilder_ == null) {
+           simpleMessageBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+               com.openxc.BinaryMessages.SimpleMessage, com.openxc.BinaryMessages.SimpleMessage.Builder, com.openxc.BinaryMessages.SimpleMessageOrBuilder>(
+                   simpleMessage_,
+                   getParentForChildren(),
+                   isClean());
+           simpleMessage_ = null;
+         }
+         return simpleMessageBuilder_;
+       }
+       
+       // optional .openxc.DiagnosticResponse diagnostic_response = 4;
+       private com.openxc.BinaryMessages.DiagnosticResponse diagnosticResponse_ = com.openxc.BinaryMessages.DiagnosticResponse.getDefaultInstance();
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.DiagnosticResponse, com.openxc.BinaryMessages.DiagnosticResponse.Builder, com.openxc.BinaryMessages.DiagnosticResponseOrBuilder> diagnosticResponseBuilder_;
+       public boolean hasDiagnosticResponse() {
+         return ((bitField0_ & 0x00000008) == 0x00000008);
+       }
+       public com.openxc.BinaryMessages.DiagnosticResponse getDiagnosticResponse() {
+         if (diagnosticResponseBuilder_ == null) {
+           return diagnosticResponse_;
+         } else {
+           return diagnosticResponseBuilder_.getMessage();
+         }
+       }
+       public Builder setDiagnosticResponse(com.openxc.BinaryMessages.DiagnosticResponse value) {
+         if (diagnosticResponseBuilder_ == null) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           diagnosticResponse_ = value;
+           onChanged();
+         } else {
+           diagnosticResponseBuilder_.setMessage(value);
+         }
+         bitField0_ |= 0x00000008;
+         return this;
+       }
+       public Builder setDiagnosticResponse(
+           com.openxc.BinaryMessages.DiagnosticResponse.Builder builderForValue) {
+         if (diagnosticResponseBuilder_ == null) {
+           diagnosticResponse_ = builderForValue.build();
+           onChanged();
+         } else {
+           diagnosticResponseBuilder_.setMessage(builderForValue.build());
+         }
+         bitField0_ |= 0x00000008;
+         return this;
+       }
+       public Builder mergeDiagnosticResponse(com.openxc.BinaryMessages.DiagnosticResponse value) {
+         if (diagnosticResponseBuilder_ == null) {
+           if (((bitField0_ & 0x00000008) == 0x00000008) &&
+               diagnosticResponse_ != com.openxc.BinaryMessages.DiagnosticResponse.getDefaultInstance()) {
+             diagnosticResponse_ =
+               com.openxc.BinaryMessages.DiagnosticResponse.newBuilder(diagnosticResponse_).mergeFrom(value).buildPartial();
+           } else {
+             diagnosticResponse_ = value;
+           }
+           onChanged();
+         } else {
+           diagnosticResponseBuilder_.mergeFrom(value);
+         }
+         bitField0_ |= 0x00000008;
+         return this;
+       }
+       public Builder clearDiagnosticResponse() {
+         if (diagnosticResponseBuilder_ == null) {
+           diagnosticResponse_ = com.openxc.BinaryMessages.DiagnosticResponse.getDefaultInstance();
+           onChanged();
+         } else {
+           diagnosticResponseBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000008);
+         return this;
+       }
+       public com.openxc.BinaryMessages.DiagnosticResponse.Builder getDiagnosticResponseBuilder() {
+         bitField0_ |= 0x00000008;
+         onChanged();
+         return getDiagnosticResponseFieldBuilder().getBuilder();
+       }
+       public com.openxc.BinaryMessages.DiagnosticResponseOrBuilder getDiagnosticResponseOrBuilder() {
+         if (diagnosticResponseBuilder_ != null) {
+           return diagnosticResponseBuilder_.getMessageOrBuilder();
+         } else {
+           return diagnosticResponse_;
+         }
+       }
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.DiagnosticResponse, com.openxc.BinaryMessages.DiagnosticResponse.Builder, com.openxc.BinaryMessages.DiagnosticResponseOrBuilder> 
+           getDiagnosticResponseFieldBuilder() {
+         if (diagnosticResponseBuilder_ == null) {
+           diagnosticResponseBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+               com.openxc.BinaryMessages.DiagnosticResponse, com.openxc.BinaryMessages.DiagnosticResponse.Builder, com.openxc.BinaryMessages.DiagnosticResponseOrBuilder>(
+                   diagnosticResponse_,
+                   getParentForChildren(),
+                   isClean());
+           diagnosticResponse_ = null;
+         }
+         return diagnosticResponseBuilder_;
+       }
+       
+       // optional .openxc.ControlCommand control_command = 5;
+       private com.openxc.BinaryMessages.ControlCommand controlCommand_ = com.openxc.BinaryMessages.ControlCommand.getDefaultInstance();
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.ControlCommand, com.openxc.BinaryMessages.ControlCommand.Builder, com.openxc.BinaryMessages.ControlCommandOrBuilder> controlCommandBuilder_;
+       public boolean hasControlCommand() {
+         return ((bitField0_ & 0x00000010) == 0x00000010);
+       }
+       public com.openxc.BinaryMessages.ControlCommand getControlCommand() {
+         if (controlCommandBuilder_ == null) {
+           return controlCommand_;
+         } else {
+           return controlCommandBuilder_.getMessage();
+         }
+       }
+       public Builder setControlCommand(com.openxc.BinaryMessages.ControlCommand value) {
+         if (controlCommandBuilder_ == null) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           controlCommand_ = value;
+           onChanged();
+         } else {
+           controlCommandBuilder_.setMessage(value);
+         }
+         bitField0_ |= 0x00000010;
+         return this;
+       }
+       public Builder setControlCommand(
+           com.openxc.BinaryMessages.ControlCommand.Builder builderForValue) {
+         if (controlCommandBuilder_ == null) {
+           controlCommand_ = builderForValue.build();
+           onChanged();
+         } else {
+           controlCommandBuilder_.setMessage(builderForValue.build());
+         }
+         bitField0_ |= 0x00000010;
+         return this;
+       }
+       public Builder mergeControlCommand(com.openxc.BinaryMessages.ControlCommand value) {
+         if (controlCommandBuilder_ == null) {
+           if (((bitField0_ & 0x00000010) == 0x00000010) &&
+               controlCommand_ != com.openxc.BinaryMessages.ControlCommand.getDefaultInstance()) {
+             controlCommand_ =
+               com.openxc.BinaryMessages.ControlCommand.newBuilder(controlCommand_).mergeFrom(value).buildPartial();
+           } else {
+             controlCommand_ = value;
+           }
+           onChanged();
+         } else {
+           controlCommandBuilder_.mergeFrom(value);
+         }
+         bitField0_ |= 0x00000010;
+         return this;
+       }
+       public Builder clearControlCommand() {
+         if (controlCommandBuilder_ == null) {
+           controlCommand_ = com.openxc.BinaryMessages.ControlCommand.getDefaultInstance();
+           onChanged();
+         } else {
+           controlCommandBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000010);
+         return this;
+       }
+       public com.openxc.BinaryMessages.ControlCommand.Builder getControlCommandBuilder() {
+         bitField0_ |= 0x00000010;
+         onChanged();
+         return getControlCommandFieldBuilder().getBuilder();
+       }
+       public com.openxc.BinaryMessages.ControlCommandOrBuilder getControlCommandOrBuilder() {
+         if (controlCommandBuilder_ != null) {
+           return controlCommandBuilder_.getMessageOrBuilder();
+         } else {
+           return controlCommand_;
+         }
+       }
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.ControlCommand, com.openxc.BinaryMessages.ControlCommand.Builder, com.openxc.BinaryMessages.ControlCommandOrBuilder> 
+           getControlCommandFieldBuilder() {
+         if (controlCommandBuilder_ == null) {
+           controlCommandBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+               com.openxc.BinaryMessages.ControlCommand, com.openxc.BinaryMessages.ControlCommand.Builder, com.openxc.BinaryMessages.ControlCommandOrBuilder>(
+                   controlCommand_,
+                   getParentForChildren(),
+                   isClean());
+           controlCommand_ = null;
+         }
+         return controlCommandBuilder_;
+       }
+       
+       // optional .openxc.CommandResponse command_response = 6;
+       private com.openxc.BinaryMessages.CommandResponse commandResponse_ = com.openxc.BinaryMessages.CommandResponse.getDefaultInstance();
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.CommandResponse, com.openxc.BinaryMessages.CommandResponse.Builder, com.openxc.BinaryMessages.CommandResponseOrBuilder> commandResponseBuilder_;
+       public boolean hasCommandResponse() {
+         return ((bitField0_ & 0x00000020) == 0x00000020);
+       }
+       public com.openxc.BinaryMessages.CommandResponse getCommandResponse() {
+         if (commandResponseBuilder_ == null) {
+           return commandResponse_;
+         } else {
+           return commandResponseBuilder_.getMessage();
+         }
+       }
+       public Builder setCommandResponse(com.openxc.BinaryMessages.CommandResponse value) {
+         if (commandResponseBuilder_ == null) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           commandResponse_ = value;
+           onChanged();
+         } else {
+           commandResponseBuilder_.setMessage(value);
+         }
+         bitField0_ |= 0x00000020;
+         return this;
+       }
+       public Builder setCommandResponse(
+           com.openxc.BinaryMessages.CommandResponse.Builder builderForValue) {
+         if (commandResponseBuilder_ == null) {
+           commandResponse_ = builderForValue.build();
+           onChanged();
+         } else {
+           commandResponseBuilder_.setMessage(builderForValue.build());
+         }
+         bitField0_ |= 0x00000020;
+         return this;
+       }
+       public Builder mergeCommandResponse(com.openxc.BinaryMessages.CommandResponse value) {
+         if (commandResponseBuilder_ == null) {
+           if (((bitField0_ & 0x00000020) == 0x00000020) &&
+               commandResponse_ != com.openxc.BinaryMessages.CommandResponse.getDefaultInstance()) {
+             commandResponse_ =
+               com.openxc.BinaryMessages.CommandResponse.newBuilder(commandResponse_).mergeFrom(value).buildPartial();
+           } else {
+             commandResponse_ = value;
+           }
+           onChanged();
+         } else {
+           commandResponseBuilder_.mergeFrom(value);
+         }
+         bitField0_ |= 0x00000020;
+         return this;
+       }
+       public Builder clearCommandResponse() {
+         if (commandResponseBuilder_ == null) {
+           commandResponse_ = com.openxc.BinaryMessages.CommandResponse.getDefaultInstance();
+           onChanged();
+         } else {
+           commandResponseBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000020);
+         return this;
+       }
+       public com.openxc.BinaryMessages.CommandResponse.Builder getCommandResponseBuilder() {
+         bitField0_ |= 0x00000020;
+         onChanged();
+         return getCommandResponseFieldBuilder().getBuilder();
+       }
+       public com.openxc.BinaryMessages.CommandResponseOrBuilder getCommandResponseOrBuilder() {
+         if (commandResponseBuilder_ != null) {
+           return commandResponseBuilder_.getMessageOrBuilder();
+         } else {
+           return commandResponse_;
+         }
+       }
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.CommandResponse, com.openxc.BinaryMessages.CommandResponse.Builder, com.openxc.BinaryMessages.CommandResponseOrBuilder> 
+           getCommandResponseFieldBuilder() {
+         if (commandResponseBuilder_ == null) {
+           commandResponseBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+               com.openxc.BinaryMessages.CommandResponse, com.openxc.BinaryMessages.CommandResponse.Builder, com.openxc.BinaryMessages.CommandResponseOrBuilder>(
+                   commandResponse_,
+                   getParentForChildren(),
+                   isClean());
+           commandResponse_ = null;
+         }
+         return commandResponseBuilder_;
+       }
+       
+       // optional uint64 timestamp = 7;
+       private long timestamp_ ;
+       public boolean hasTimestamp() {
+         return ((bitField0_ & 0x00000040) == 0x00000040);
+       }
+       public long getTimestamp() {
+         return timestamp_;
+       }
+       public Builder setTimestamp(long value) {
+         bitField0_ |= 0x00000040;
+         timestamp_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearTimestamp() {
+         bitField0_ = (bitField0_ & ~0x00000040);
+         timestamp_ = 0L;
+         onChanged();
+         return this;
+       }
+       
+       // @@protoc_insertion_point(builder_scope:openxc.VehicleMessage)
+     }
+     
+     static {
+       defaultInstance = new VehicleMessage(true);
+       defaultInstance.initFields();
+     }
+     
+     // @@protoc_insertion_point(class_scope:openxc.VehicleMessage)
+   }
+   
+   public interface CanMessageOrBuilder
+       extends com.google.protobuf.MessageOrBuilder {
+     
+     // optional int32 bus = 1;
+     boolean hasBus();
+     int getBus();
+     
+     // optional uint32 id = 2;
+     boolean hasId();
+     int getId();
+     
+     // optional bytes data = 3;
+     boolean hasData();
+     com.google.protobuf.ByteString getData();
+     
+     // optional .openxc.CanMessage.FrameFormat frame_format = 4;
+     boolean hasFrameFormat();
+     com.openxc.BinaryMessages.CanMessage.FrameFormat getFrameFormat();
+   }
+   public static final class CanMessage extends
+       com.google.protobuf.GeneratedMessage
+       implements CanMessageOrBuilder {
+     // Use CanMessage.newBuilder() to construct.
+     private CanMessage(Builder builder) {
+       super(builder);
+     }
+     private CanMessage(boolean noInit) {}
+     
+     private static final CanMessage defaultInstance;
+     public static CanMessage getDefaultInstance() {
+       return defaultInstance;
+     }
+     
+     public CanMessage getDefaultInstanceForType() {
+       return defaultInstance;
+     }
+     
+     public static final com.google.protobuf.Descriptors.Descriptor
+         getDescriptor() {
+       return com.openxc.BinaryMessages.internal_static_openxc_CanMessage_descriptor;
+     }
+     
+     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+         internalGetFieldAccessorTable() {
+       return com.openxc.BinaryMessages.internal_static_openxc_CanMessage_fieldAccessorTable;
+     }
+     
+     public enum FrameFormat
+         implements com.google.protobuf.ProtocolMessageEnum {
+       STANDARD(0, 1),
+       EXTENDED(1, 2),
+       ;
+       
+       public static final int STANDARD_VALUE = 1;
+       public static final int EXTENDED_VALUE = 2;
+       
+       
+       public final int getNumber() { return value; }
+       
+       public static FrameFormat valueOf(int value) {
+         switch (value) {
+           case 1: return STANDARD;
+           case 2: return EXTENDED;
+           default: return null;
+         }
+       }
+       
+       public static com.google.protobuf.Internal.EnumLiteMap<FrameFormat>
+           internalGetValueMap() {
+         return internalValueMap;
+       }
+       private static com.google.protobuf.Internal.EnumLiteMap<FrameFormat>
+           internalValueMap =
+             new com.google.protobuf.Internal.EnumLiteMap<FrameFormat>() {
+               public FrameFormat findValueByNumber(int number) {
+                 return FrameFormat.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 com.openxc.BinaryMessages.CanMessage.getDescriptor().getEnumTypes().get(0);
+       }
+       
+       private static final FrameFormat[] VALUES = {
+         STANDARD, EXTENDED, 
+       };
+       
+       public static FrameFormat 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 FrameFormat(int index, int value) {
+         this.index = index;
+         this.value = value;
+       }
+       
+       // @@protoc_insertion_point(enum_scope:openxc.CanMessage.FrameFormat)
+     }
+     
+     private int bitField0_;
+     // optional int32 bus = 1;
+     public static final int BUS_FIELD_NUMBER = 1;
+     private int bus_;
+     public boolean hasBus() {
+       return ((bitField0_ & 0x00000001) == 0x00000001);
+     }
+     public int getBus() {
+       return bus_;
+     }
+     
+     // optional uint32 id = 2;
+     public static final int ID_FIELD_NUMBER = 2;
+     private int id_;
+     public boolean hasId() {
+       return ((bitField0_ & 0x00000002) == 0x00000002);
+     }
+     public int getId() {
+       return id_;
+     }
+     
+     // optional bytes data = 3;
+     public static final int DATA_FIELD_NUMBER = 3;
+     private com.google.protobuf.ByteString data_;
+     public boolean hasData() {
+       return ((bitField0_ & 0x00000004) == 0x00000004);
+     }
+     public com.google.protobuf.ByteString getData() {
+       return data_;
+     }
+     
+     // optional .openxc.CanMessage.FrameFormat frame_format = 4;
+     public static final int FRAME_FORMAT_FIELD_NUMBER = 4;
+     private com.openxc.BinaryMessages.CanMessage.FrameFormat frameFormat_;
+     public boolean hasFrameFormat() {
+       return ((bitField0_ & 0x00000008) == 0x00000008);
+     }
+     public com.openxc.BinaryMessages.CanMessage.FrameFormat getFrameFormat() {
+       return frameFormat_;
+     }
+     
+     private void initFields() {
+       bus_ = 0;
+       id_ = 0;
+       data_ = com.google.protobuf.ByteString.EMPTY;
+       frameFormat_ = com.openxc.BinaryMessages.CanMessage.FrameFormat.STANDARD;
+     }
+     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, id_);
+       }
+       if (((bitField0_ & 0x00000004) == 0x00000004)) {
+         output.writeBytes(3, data_);
+       }
+       if (((bitField0_ & 0x00000008) == 0x00000008)) {
+         output.writeEnum(4, frameFormat_.getNumber());
+       }
+       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, id_);
+       }
+       if (((bitField0_ & 0x00000004) == 0x00000004)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeBytesSize(3, data_);
+       }
+       if (((bitField0_ & 0x00000008) == 0x00000008)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeEnumSize(4, frameFormat_.getNumber());
+       }
+       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 com.openxc.BinaryMessages.CanMessage parseFrom(
+         com.google.protobuf.ByteString data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.CanMessage parseFrom(
+         com.google.protobuf.ByteString data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.CanMessage parseFrom(byte[] data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.CanMessage parseFrom(
+         byte[] data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.CanMessage parseFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.CanMessage parseFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.CanMessage parseDelimitedFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.CanMessage parseDelimitedFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.CanMessage parseFrom(
+         com.google.protobuf.CodedInputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.CanMessage parseFrom(
+         com.google.protobuf.CodedInputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     
+     public static Builder newBuilder() { return Builder.create(); }
+     public Builder newBuilderForType() { return newBuilder(); }
+     public static Builder newBuilder(com.openxc.BinaryMessages.CanMessage 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;
+     }
+     public static final class Builder extends
+         com.google.protobuf.GeneratedMessage.Builder<Builder>
+        implements com.openxc.BinaryMessages.CanMessageOrBuilder {
+       public static final com.google.protobuf.Descriptors.Descriptor
+           getDescriptor() {
+         return com.openxc.BinaryMessages.internal_static_openxc_CanMessage_descriptor;
+       }
+       
+       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+           internalGetFieldAccessorTable() {
+         return com.openxc.BinaryMessages.internal_static_openxc_CanMessage_fieldAccessorTable;
+       }
+       
+       // Construct using com.openxc.BinaryMessages.CanMessage.newBuilder()
+       private Builder() {
+         maybeForceBuilderInitialization();
+       }
+       
+       private Builder(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);
+         id_ = 0;
+         bitField0_ = (bitField0_ & ~0x00000002);
+         data_ = com.google.protobuf.ByteString.EMPTY;
+         bitField0_ = (bitField0_ & ~0x00000004);
+         frameFormat_ = com.openxc.BinaryMessages.CanMessage.FrameFormat.STANDARD;
+         bitField0_ = (bitField0_ & ~0x00000008);
+         return this;
+       }
+       
+       public Builder clone() {
+         return create().mergeFrom(buildPartial());
+       }
+       
+       public com.google.protobuf.Descriptors.Descriptor
+           getDescriptorForType() {
+         return com.openxc.BinaryMessages.CanMessage.getDescriptor();
+       }
+       
+       public com.openxc.BinaryMessages.CanMessage getDefaultInstanceForType() {
+         return com.openxc.BinaryMessages.CanMessage.getDefaultInstance();
+       }
+       
+       public com.openxc.BinaryMessages.CanMessage build() {
+         com.openxc.BinaryMessages.CanMessage result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(result);
+         }
+         return result;
+       }
+       
+       private com.openxc.BinaryMessages.CanMessage buildParsed()
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         com.openxc.BinaryMessages.CanMessage result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(
+             result).asInvalidProtocolBufferException();
+         }
+         return result;
+       }
+       
+       public com.openxc.BinaryMessages.CanMessage buildPartial() {
+         com.openxc.BinaryMessages.CanMessage result = new com.openxc.BinaryMessages.CanMessage(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.id_ = id_;
+         if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+           to_bitField0_ |= 0x00000004;
+         }
+         result.data_ = data_;
+         if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
+           to_bitField0_ |= 0x00000008;
+         }
+         result.frameFormat_ = frameFormat_;
+         result.bitField0_ = to_bitField0_;
+         onBuilt();
+         return result;
+       }
+       
+       public Builder mergeFrom(com.google.protobuf.Message other) {
+         if (other instanceof com.openxc.BinaryMessages.CanMessage) {
+           return mergeFrom((com.openxc.BinaryMessages.CanMessage)other);
+         } else {
+           super.mergeFrom(other);
+           return this;
+         }
+       }
+       
+       public Builder mergeFrom(com.openxc.BinaryMessages.CanMessage other) {
+         if (other == com.openxc.BinaryMessages.CanMessage.getDefaultInstance()) return this;
+         if (other.hasBus()) {
+           setBus(other.getBus());
+         }
+         if (other.hasId()) {
+           setId(other.getId());
+         }
+         if (other.hasData()) {
+           setData(other.getData());
+         }
+         if (other.hasFrameFormat()) {
+           setFrameFormat(other.getFrameFormat());
+         }
+         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 {
+         com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+           com.google.protobuf.UnknownFieldSet.newBuilder(
+             this.getUnknownFields());
+         while (true) {
+           int tag = input.readTag();
+           switch (tag) {
+             case 0:
+               this.setUnknownFields(unknownFields.build());
+               onChanged();
+               return this;
+             default: {
+               if (!parseUnknownField(input, unknownFields,
+                                      extensionRegistry, tag)) {
+                 this.setUnknownFields(unknownFields.build());
+                 onChanged();
+                 return this;
+               }
+               break;
+             }
+             case 8: {
+               bitField0_ |= 0x00000001;
+               bus_ = input.readInt32();
+               break;
+             }
+             case 16: {
+               bitField0_ |= 0x00000002;
+               id_ = input.readUInt32();
+               break;
+             }
+             case 26: {
+               bitField0_ |= 0x00000004;
+               data_ = input.readBytes();
+               break;
+             }
+             case 32: {
+               int rawValue = input.readEnum();
+               com.openxc.BinaryMessages.CanMessage.FrameFormat value = com.openxc.BinaryMessages.CanMessage.FrameFormat.valueOf(rawValue);
+               if (value == null) {
+                 unknownFields.mergeVarintField(4, rawValue);
+               } else {
+                 bitField0_ |= 0x00000008;
+                 frameFormat_ = value;
+               }
+               break;
+             }
+           }
+         }
+       }
+       
+       private int bitField0_;
+       
+       // optional int32 bus = 1;
+       private int bus_ ;
+       public boolean hasBus() {
+         return ((bitField0_ & 0x00000001) == 0x00000001);
+       }
+       public int getBus() {
+         return bus_;
+       }
+       public Builder setBus(int value) {
+         bitField0_ |= 0x00000001;
+         bus_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearBus() {
+         bitField0_ = (bitField0_ & ~0x00000001);
+         bus_ = 0;
+         onChanged();
+         return this;
+       }
+       
+       // optional uint32 id = 2;
+       private int id_ ;
+       public boolean hasId() {
+         return ((bitField0_ & 0x00000002) == 0x00000002);
+       }
+       public int getId() {
+         return id_;
+       }
+       public Builder setId(int value) {
+         bitField0_ |= 0x00000002;
+         id_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearId() {
+         bitField0_ = (bitField0_ & ~0x00000002);
+         id_ = 0;
+         onChanged();
+         return this;
+       }
+       
+       // optional bytes data = 3;
+       private com.google.protobuf.ByteString data_ = com.google.protobuf.ByteString.EMPTY;
+       public boolean hasData() {
+         return ((bitField0_ & 0x00000004) == 0x00000004);
+       }
+       public com.google.protobuf.ByteString getData() {
+         return data_;
+       }
+       public Builder setData(com.google.protobuf.ByteString value) {
+         if (value == null) {
+     throw new NullPointerException();
+   }
+   bitField0_ |= 0x00000004;
+         data_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearData() {
+         bitField0_ = (bitField0_ & ~0x00000004);
+         data_ = getDefaultInstance().getData();
+         onChanged();
+         return this;
+       }
+       
+       // optional .openxc.CanMessage.FrameFormat frame_format = 4;
+       private com.openxc.BinaryMessages.CanMessage.FrameFormat frameFormat_ = com.openxc.BinaryMessages.CanMessage.FrameFormat.STANDARD;
+       public boolean hasFrameFormat() {
+         return ((bitField0_ & 0x00000008) == 0x00000008);
+       }
+       public com.openxc.BinaryMessages.CanMessage.FrameFormat getFrameFormat() {
+         return frameFormat_;
+       }
+       public Builder setFrameFormat(com.openxc.BinaryMessages.CanMessage.FrameFormat value) {
+         if (value == null) {
+           throw new NullPointerException();
+         }
+         bitField0_ |= 0x00000008;
+         frameFormat_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearFrameFormat() {
+         bitField0_ = (bitField0_ & ~0x00000008);
+         frameFormat_ = com.openxc.BinaryMessages.CanMessage.FrameFormat.STANDARD;
+         onChanged();
+         return this;
+       }
+       
+       // @@protoc_insertion_point(builder_scope:openxc.CanMessage)
+     }
+     
+     static {
+       defaultInstance = new CanMessage(true);
+       defaultInstance.initFields();
+     }
+     
+     // @@protoc_insertion_point(class_scope:openxc.CanMessage)
+   }
+   
+   public interface ControlCommandOrBuilder
+       extends com.google.protobuf.MessageOrBuilder {
+     
+     // optional .openxc.ControlCommand.Type type = 1;
+     boolean hasType();
+     com.openxc.BinaryMessages.ControlCommand.Type getType();
+     
+     // optional .openxc.DiagnosticControlCommand diagnostic_request = 2;
+     boolean hasDiagnosticRequest();
+     com.openxc.BinaryMessages.DiagnosticControlCommand getDiagnosticRequest();
+     com.openxc.BinaryMessages.DiagnosticControlCommandOrBuilder getDiagnosticRequestOrBuilder();
+     
+     // optional .openxc.PassthroughModeControlCommand passthrough_mode_request = 3;
+     boolean hasPassthroughModeRequest();
+     com.openxc.BinaryMessages.PassthroughModeControlCommand getPassthroughModeRequest();
+     com.openxc.BinaryMessages.PassthroughModeControlCommandOrBuilder getPassthroughModeRequestOrBuilder();
+     
+     // optional .openxc.AcceptanceFilterBypassCommand acceptance_filter_bypass_command = 4;
+     boolean hasAcceptanceFilterBypassCommand();
+     com.openxc.BinaryMessages.AcceptanceFilterBypassCommand getAcceptanceFilterBypassCommand();
+     com.openxc.BinaryMessages.AcceptanceFilterBypassCommandOrBuilder getAcceptanceFilterBypassCommandOrBuilder();
+     
+     // optional .openxc.PayloadFormatCommand payload_format_command = 5;
+     boolean hasPayloadFormatCommand();
+     com.openxc.BinaryMessages.PayloadFormatCommand getPayloadFormatCommand();
+     com.openxc.BinaryMessages.PayloadFormatCommandOrBuilder getPayloadFormatCommandOrBuilder();
+     
+     // optional .openxc.PredefinedObd2RequestsCommand predefined_obd2_requests_command = 6;
+     boolean hasPredefinedObd2RequestsCommand();
+     com.openxc.BinaryMessages.PredefinedObd2RequestsCommand getPredefinedObd2RequestsCommand();
+     com.openxc.BinaryMessages.PredefinedObd2RequestsCommandOrBuilder getPredefinedObd2RequestsCommandOrBuilder();
+     
+     // optional .openxc.ModemConfigurationCommand modem_configuration_command = 7;
+     boolean hasModemConfigurationCommand();
+     com.openxc.BinaryMessages.ModemConfigurationCommand getModemConfigurationCommand();
+     com.openxc.BinaryMessages.ModemConfigurationCommandOrBuilder getModemConfigurationCommandOrBuilder();
+     
+     // optional .openxc.RTCConfigurationCommand rtc_configuration_command = 8;
+     boolean hasRtcConfigurationCommand();
+     com.openxc.BinaryMessages.RTCConfigurationCommand getRtcConfigurationCommand();
+     com.openxc.BinaryMessages.RTCConfigurationCommandOrBuilder getRtcConfigurationCommandOrBuilder();
+   }
+   public static final class ControlCommand extends
+       com.google.protobuf.GeneratedMessage
+       implements ControlCommandOrBuilder {
+     // Use ControlCommand.newBuilder() to construct.
+     private ControlCommand(Builder builder) {
+       super(builder);
+     }
+     private ControlCommand(boolean noInit) {}
+     
+     private static final ControlCommand defaultInstance;
+     public static ControlCommand getDefaultInstance() {
+       return defaultInstance;
+     }
+     
+     public ControlCommand getDefaultInstanceForType() {
+       return defaultInstance;
+     }
+     
+     public static final com.google.protobuf.Descriptors.Descriptor
+         getDescriptor() {
+       return com.openxc.BinaryMessages.internal_static_openxc_ControlCommand_descriptor;
+     }
+     
+     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+         internalGetFieldAccessorTable() {
+       return com.openxc.BinaryMessages.internal_static_openxc_ControlCommand_fieldAccessorTable;
+     }
+     
+     public enum Type
+         implements com.google.protobuf.ProtocolMessageEnum {
+       VERSION(0, 1),
+       DEVICE_ID(1, 2),
+       DIAGNOSTIC(2, 3),
+       PASSTHROUGH(3, 4),
+       ACCEPTANCE_FILTER_BYPASS(4, 5),
+       PAYLOAD_FORMAT(5, 6),
+       PREDEFINED_OBD2_REQUESTS(6, 7),
+       MODEM_CONFIGURATION(7, 8),
+       RTC_CONFIGURATION(8, 9),
+       SD_MOUNT_STATUS(9, 10),
+       PLATFORM(10, 11),
+       ;
+       
+       public static final int VERSION_VALUE = 1;
+       public static final int DEVICE_ID_VALUE = 2;
+       public static final int DIAGNOSTIC_VALUE = 3;
+       public static final int PASSTHROUGH_VALUE = 4;
+       public static final int ACCEPTANCE_FILTER_BYPASS_VALUE = 5;
+       public static final int PAYLOAD_FORMAT_VALUE = 6;
+       public static final int PREDEFINED_OBD2_REQUESTS_VALUE = 7;
+       public static final int MODEM_CONFIGURATION_VALUE = 8;
+       public static final int RTC_CONFIGURATION_VALUE = 9;
+       public static final int SD_MOUNT_STATUS_VALUE = 10;
+       public static final int PLATFORM_VALUE = 11;
+       
+       
+       public final int getNumber() { return value; }
+       
+       public static Type valueOf(int value) {
+         switch (value) {
+           case 1: return VERSION;
+           case 2: return DEVICE_ID;
+           case 3: return DIAGNOSTIC;
+           case 4: return PASSTHROUGH;
+           case 5: return ACCEPTANCE_FILTER_BYPASS;
+           case 6: return PAYLOAD_FORMAT;
+           case 7: return PREDEFINED_OBD2_REQUESTS;
+           case 8: return MODEM_CONFIGURATION;
+           case 9: return RTC_CONFIGURATION;
+           case 10: return SD_MOUNT_STATUS;
+           case 11: return PLATFORM;
+           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 com.openxc.BinaryMessages.ControlCommand.getDescriptor().getEnumTypes().get(0);
+       }
+       
+       private static final Type[] VALUES = {
+         VERSION, DEVICE_ID, DIAGNOSTIC, PASSTHROUGH, ACCEPTANCE_FILTER_BYPASS, PAYLOAD_FORMAT, PREDEFINED_OBD2_REQUESTS, MODEM_CONFIGURATION, RTC_CONFIGURATION, SD_MOUNT_STATUS, PLATFORM, 
+       };
+       
+       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.ControlCommand.Type)
+     }
+     
+     private int bitField0_;
+     // optional .openxc.ControlCommand.Type type = 1;
+     public static final int TYPE_FIELD_NUMBER = 1;
+     private com.openxc.BinaryMessages.ControlCommand.Type type_;
+     public boolean hasType() {
+       return ((bitField0_ & 0x00000001) == 0x00000001);
+     }
+     public com.openxc.BinaryMessages.ControlCommand.Type getType() {
+       return type_;
+     }
+     
+     // optional .openxc.DiagnosticControlCommand diagnostic_request = 2;
+     public static final int DIAGNOSTIC_REQUEST_FIELD_NUMBER = 2;
+     private com.openxc.BinaryMessages.DiagnosticControlCommand diagnosticRequest_;
+     public boolean hasDiagnosticRequest() {
+       return ((bitField0_ & 0x00000002) == 0x00000002);
+     }
+     public com.openxc.BinaryMessages.DiagnosticControlCommand getDiagnosticRequest() {
+       return diagnosticRequest_;
+     }
+     public com.openxc.BinaryMessages.DiagnosticControlCommandOrBuilder getDiagnosticRequestOrBuilder() {
+       return diagnosticRequest_;
+     }
+     
+     // optional .openxc.PassthroughModeControlCommand passthrough_mode_request = 3;
+     public static final int PASSTHROUGH_MODE_REQUEST_FIELD_NUMBER = 3;
+     private com.openxc.BinaryMessages.PassthroughModeControlCommand passthroughModeRequest_;
+     public boolean hasPassthroughModeRequest() {
+       return ((bitField0_ & 0x00000004) == 0x00000004);
+     }
+     public com.openxc.BinaryMessages.PassthroughModeControlCommand getPassthroughModeRequest() {
+       return passthroughModeRequest_;
+     }
+     public com.openxc.BinaryMessages.PassthroughModeControlCommandOrBuilder getPassthroughModeRequestOrBuilder() {
+       return passthroughModeRequest_;
+     }
+     
+     // optional .openxc.AcceptanceFilterBypassCommand acceptance_filter_bypass_command = 4;
+     public static final int ACCEPTANCE_FILTER_BYPASS_COMMAND_FIELD_NUMBER = 4;
+     private com.openxc.BinaryMessages.AcceptanceFilterBypassCommand acceptanceFilterBypassCommand_;
+     public boolean hasAcceptanceFilterBypassCommand() {
+       return ((bitField0_ & 0x00000008) == 0x00000008);
+     }
+     public com.openxc.BinaryMessages.AcceptanceFilterBypassCommand getAcceptanceFilterBypassCommand() {
+       return acceptanceFilterBypassCommand_;
+     }
+     public com.openxc.BinaryMessages.AcceptanceFilterBypassCommandOrBuilder getAcceptanceFilterBypassCommandOrBuilder() {
+       return acceptanceFilterBypassCommand_;
+     }
+     
+     // optional .openxc.PayloadFormatCommand payload_format_command = 5;
+     public static final int PAYLOAD_FORMAT_COMMAND_FIELD_NUMBER = 5;
+     private com.openxc.BinaryMessages.PayloadFormatCommand payloadFormatCommand_;
+     public boolean hasPayloadFormatCommand() {
+       return ((bitField0_ & 0x00000010) == 0x00000010);
+     }
+     public com.openxc.BinaryMessages.PayloadFormatCommand getPayloadFormatCommand() {
+       return payloadFormatCommand_;
+     }
+     public com.openxc.BinaryMessages.PayloadFormatCommandOrBuilder getPayloadFormatCommandOrBuilder() {
+       return payloadFormatCommand_;
+     }
+     
+     // optional .openxc.PredefinedObd2RequestsCommand predefined_obd2_requests_command = 6;
+     public static final int PREDEFINED_OBD2_REQUESTS_COMMAND_FIELD_NUMBER = 6;
+     private com.openxc.BinaryMessages.PredefinedObd2RequestsCommand predefinedObd2RequestsCommand_;
+     public boolean hasPredefinedObd2RequestsCommand() {
+       return ((bitField0_ & 0x00000020) == 0x00000020);
+     }
+     public com.openxc.BinaryMessages.PredefinedObd2RequestsCommand getPredefinedObd2RequestsCommand() {
+       return predefinedObd2RequestsCommand_;
+     }
+     public com.openxc.BinaryMessages.PredefinedObd2RequestsCommandOrBuilder getPredefinedObd2RequestsCommandOrBuilder() {
+       return predefinedObd2RequestsCommand_;
+     }
+     
+     // optional .openxc.ModemConfigurationCommand modem_configuration_command = 7;
+     public static final int MODEM_CONFIGURATION_COMMAND_FIELD_NUMBER = 7;
+     private com.openxc.BinaryMessages.ModemConfigurationCommand modemConfigurationCommand_;
+     public boolean hasModemConfigurationCommand() {
+       return ((bitField0_ & 0x00000040) == 0x00000040);
+     }
+     public com.openxc.BinaryMessages.ModemConfigurationCommand getModemConfigurationCommand() {
+       return modemConfigurationCommand_;
+     }
+     public com.openxc.BinaryMessages.ModemConfigurationCommandOrBuilder getModemConfigurationCommandOrBuilder() {
+       return modemConfigurationCommand_;
+     }
+     
+     // optional .openxc.RTCConfigurationCommand rtc_configuration_command = 8;
+     public static final int RTC_CONFIGURATION_COMMAND_FIELD_NUMBER = 8;
+     private com.openxc.BinaryMessages.RTCConfigurationCommand rtcConfigurationCommand_;
+     public boolean hasRtcConfigurationCommand() {
+       return ((bitField0_ & 0x00000080) == 0x00000080);
+     }
+     public com.openxc.BinaryMessages.RTCConfigurationCommand getRtcConfigurationCommand() {
+       return rtcConfigurationCommand_;
+     }
+     public com.openxc.BinaryMessages.RTCConfigurationCommandOrBuilder getRtcConfigurationCommandOrBuilder() {
+       return rtcConfigurationCommand_;
+     }
+     
+     private void initFields() {
+       type_ = com.openxc.BinaryMessages.ControlCommand.Type.VERSION;
+       diagnosticRequest_ = com.openxc.BinaryMessages.DiagnosticControlCommand.getDefaultInstance();
+       passthroughModeRequest_ = com.openxc.BinaryMessages.PassthroughModeControlCommand.getDefaultInstance();
+       acceptanceFilterBypassCommand_ = com.openxc.BinaryMessages.AcceptanceFilterBypassCommand.getDefaultInstance();
+       payloadFormatCommand_ = com.openxc.BinaryMessages.PayloadFormatCommand.getDefaultInstance();
+       predefinedObd2RequestsCommand_ = com.openxc.BinaryMessages.PredefinedObd2RequestsCommand.getDefaultInstance();
+       modemConfigurationCommand_ = com.openxc.BinaryMessages.ModemConfigurationCommand.getDefaultInstance();
+       rtcConfigurationCommand_ = com.openxc.BinaryMessages.RTCConfigurationCommand.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, diagnosticRequest_);
+       }
+       if (((bitField0_ & 0x00000004) == 0x00000004)) {
+         output.writeMessage(3, passthroughModeRequest_);
+       }
+       if (((bitField0_ & 0x00000008) == 0x00000008)) {
+         output.writeMessage(4, acceptanceFilterBypassCommand_);
+       }
+       if (((bitField0_ & 0x00000010) == 0x00000010)) {
+         output.writeMessage(5, payloadFormatCommand_);
+       }
+       if (((bitField0_ & 0x00000020) == 0x00000020)) {
+         output.writeMessage(6, predefinedObd2RequestsCommand_);
+       }
+       if (((bitField0_ & 0x00000040) == 0x00000040)) {
+         output.writeMessage(7, modemConfigurationCommand_);
+       }
+       if (((bitField0_ & 0x00000080) == 0x00000080)) {
+         output.writeMessage(8, rtcConfigurationCommand_);
+       }
+       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, diagnosticRequest_);
+       }
+       if (((bitField0_ & 0x00000004) == 0x00000004)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeMessageSize(3, passthroughModeRequest_);
+       }
+       if (((bitField0_ & 0x00000008) == 0x00000008)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeMessageSize(4, acceptanceFilterBypassCommand_);
+       }
+       if (((bitField0_ & 0x00000010) == 0x00000010)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeMessageSize(5, payloadFormatCommand_);
+       }
+       if (((bitField0_ & 0x00000020) == 0x00000020)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeMessageSize(6, predefinedObd2RequestsCommand_);
+       }
+       if (((bitField0_ & 0x00000040) == 0x00000040)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeMessageSize(7, modemConfigurationCommand_);
+       }
+       if (((bitField0_ & 0x00000080) == 0x00000080)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeMessageSize(8, rtcConfigurationCommand_);
+       }
+       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 com.openxc.BinaryMessages.ControlCommand parseFrom(
+         com.google.protobuf.ByteString data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ControlCommand parseFrom(
+         com.google.protobuf.ByteString data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ControlCommand parseFrom(byte[] data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ControlCommand parseFrom(
+         byte[] data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ControlCommand parseFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ControlCommand parseFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ControlCommand parseDelimitedFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.ControlCommand parseDelimitedFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.ControlCommand parseFrom(
+         com.google.protobuf.CodedInputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ControlCommand parseFrom(
+         com.google.protobuf.CodedInputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     
+     public static Builder newBuilder() { return Builder.create(); }
+     public Builder newBuilderForType() { return newBuilder(); }
+     public static Builder newBuilder(com.openxc.BinaryMessages.ControlCommand 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;
+     }
+     public static final class Builder extends
+         com.google.protobuf.GeneratedMessage.Builder<Builder>
+        implements com.openxc.BinaryMessages.ControlCommandOrBuilder {
+       public static final com.google.protobuf.Descriptors.Descriptor
+           getDescriptor() {
+         return com.openxc.BinaryMessages.internal_static_openxc_ControlCommand_descriptor;
+       }
+       
+       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+           internalGetFieldAccessorTable() {
+         return com.openxc.BinaryMessages.internal_static_openxc_ControlCommand_fieldAccessorTable;
+       }
+       
+       // Construct using com.openxc.BinaryMessages.ControlCommand.newBuilder()
+       private Builder() {
+         maybeForceBuilderInitialization();
+       }
+       
+       private Builder(BuilderParent parent) {
+         super(parent);
+         maybeForceBuilderInitialization();
+       }
+       private void maybeForceBuilderInitialization() {
+         if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+           getDiagnosticRequestFieldBuilder();
+           getPassthroughModeRequestFieldBuilder();
+           getAcceptanceFilterBypassCommandFieldBuilder();
+           getPayloadFormatCommandFieldBuilder();
+           getPredefinedObd2RequestsCommandFieldBuilder();
+           getModemConfigurationCommandFieldBuilder();
+           getRtcConfigurationCommandFieldBuilder();
+         }
+       }
+       private static Builder create() {
+         return new Builder();
+       }
+       
+       public Builder clear() {
+         super.clear();
+         type_ = com.openxc.BinaryMessages.ControlCommand.Type.VERSION;
+         bitField0_ = (bitField0_ & ~0x00000001);
+         if (diagnosticRequestBuilder_ == null) {
+           diagnosticRequest_ = com.openxc.BinaryMessages.DiagnosticControlCommand.getDefaultInstance();
+         } else {
+           diagnosticRequestBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000002);
+         if (passthroughModeRequestBuilder_ == null) {
+           passthroughModeRequest_ = com.openxc.BinaryMessages.PassthroughModeControlCommand.getDefaultInstance();
+         } else {
+           passthroughModeRequestBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000004);
+         if (acceptanceFilterBypassCommandBuilder_ == null) {
+           acceptanceFilterBypassCommand_ = com.openxc.BinaryMessages.AcceptanceFilterBypassCommand.getDefaultInstance();
+         } else {
+           acceptanceFilterBypassCommandBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000008);
+         if (payloadFormatCommandBuilder_ == null) {
+           payloadFormatCommand_ = com.openxc.BinaryMessages.PayloadFormatCommand.getDefaultInstance();
+         } else {
+           payloadFormatCommandBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000010);
+         if (predefinedObd2RequestsCommandBuilder_ == null) {
+           predefinedObd2RequestsCommand_ = com.openxc.BinaryMessages.PredefinedObd2RequestsCommand.getDefaultInstance();
+         } else {
+           predefinedObd2RequestsCommandBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000020);
+         if (modemConfigurationCommandBuilder_ == null) {
+           modemConfigurationCommand_ = com.openxc.BinaryMessages.ModemConfigurationCommand.getDefaultInstance();
+         } else {
+           modemConfigurationCommandBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000040);
+         if (rtcConfigurationCommandBuilder_ == null) {
+           rtcConfigurationCommand_ = com.openxc.BinaryMessages.RTCConfigurationCommand.getDefaultInstance();
+         } else {
+           rtcConfigurationCommandBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000080);
+         return this;
+       }
+       
+       public Builder clone() {
+         return create().mergeFrom(buildPartial());
+       }
+       
+       public com.google.protobuf.Descriptors.Descriptor
+           getDescriptorForType() {
+         return com.openxc.BinaryMessages.ControlCommand.getDescriptor();
+       }
+       
+       public com.openxc.BinaryMessages.ControlCommand getDefaultInstanceForType() {
+         return com.openxc.BinaryMessages.ControlCommand.getDefaultInstance();
+       }
+       
+       public com.openxc.BinaryMessages.ControlCommand build() {
+         com.openxc.BinaryMessages.ControlCommand result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(result);
+         }
+         return result;
+       }
+       
+       private com.openxc.BinaryMessages.ControlCommand buildParsed()
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         com.openxc.BinaryMessages.ControlCommand result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(
+             result).asInvalidProtocolBufferException();
+         }
+         return result;
+       }
+       
+       public com.openxc.BinaryMessages.ControlCommand buildPartial() {
+         com.openxc.BinaryMessages.ControlCommand result = new com.openxc.BinaryMessages.ControlCommand(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 (diagnosticRequestBuilder_ == null) {
+           result.diagnosticRequest_ = diagnosticRequest_;
+         } else {
+           result.diagnosticRequest_ = diagnosticRequestBuilder_.build();
+         }
+         if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+           to_bitField0_ |= 0x00000004;
+         }
+         if (passthroughModeRequestBuilder_ == null) {
+           result.passthroughModeRequest_ = passthroughModeRequest_;
+         } else {
+           result.passthroughModeRequest_ = passthroughModeRequestBuilder_.build();
+         }
+         if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
+           to_bitField0_ |= 0x00000008;
+         }
+         if (acceptanceFilterBypassCommandBuilder_ == null) {
+           result.acceptanceFilterBypassCommand_ = acceptanceFilterBypassCommand_;
+         } else {
+           result.acceptanceFilterBypassCommand_ = acceptanceFilterBypassCommandBuilder_.build();
+         }
+         if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
+           to_bitField0_ |= 0x00000010;
+         }
+         if (payloadFormatCommandBuilder_ == null) {
+           result.payloadFormatCommand_ = payloadFormatCommand_;
+         } else {
+           result.payloadFormatCommand_ = payloadFormatCommandBuilder_.build();
+         }
+         if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
+           to_bitField0_ |= 0x00000020;
+         }
+         if (predefinedObd2RequestsCommandBuilder_ == null) {
+           result.predefinedObd2RequestsCommand_ = predefinedObd2RequestsCommand_;
+         } else {
+           result.predefinedObd2RequestsCommand_ = predefinedObd2RequestsCommandBuilder_.build();
+         }
+         if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
+           to_bitField0_ |= 0x00000040;
+         }
+         if (modemConfigurationCommandBuilder_ == null) {
+           result.modemConfigurationCommand_ = modemConfigurationCommand_;
+         } else {
+           result.modemConfigurationCommand_ = modemConfigurationCommandBuilder_.build();
+         }
+         if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
+           to_bitField0_ |= 0x00000080;
+         }
+         if (rtcConfigurationCommandBuilder_ == null) {
+           result.rtcConfigurationCommand_ = rtcConfigurationCommand_;
+         } else {
+           result.rtcConfigurationCommand_ = rtcConfigurationCommandBuilder_.build();
+         }
+         result.bitField0_ = to_bitField0_;
+         onBuilt();
+         return result;
+       }
+       
+       public Builder mergeFrom(com.google.protobuf.Message other) {
+         if (other instanceof com.openxc.BinaryMessages.ControlCommand) {
+           return mergeFrom((com.openxc.BinaryMessages.ControlCommand)other);
+         } else {
+           super.mergeFrom(other);
+           return this;
+         }
+       }
+       
+       public Builder mergeFrom(com.openxc.BinaryMessages.ControlCommand other) {
+         if (other == com.openxc.BinaryMessages.ControlCommand.getDefaultInstance()) return this;
+         if (other.hasType()) {
+           setType(other.getType());
+         }
+         if (other.hasDiagnosticRequest()) {
+           mergeDiagnosticRequest(other.getDiagnosticRequest());
+         }
+         if (other.hasPassthroughModeRequest()) {
+           mergePassthroughModeRequest(other.getPassthroughModeRequest());
+         }
+         if (other.hasAcceptanceFilterBypassCommand()) {
+           mergeAcceptanceFilterBypassCommand(other.getAcceptanceFilterBypassCommand());
+         }
+         if (other.hasPayloadFormatCommand()) {
+           mergePayloadFormatCommand(other.getPayloadFormatCommand());
+         }
+         if (other.hasPredefinedObd2RequestsCommand()) {
+           mergePredefinedObd2RequestsCommand(other.getPredefinedObd2RequestsCommand());
+         }
+         if (other.hasModemConfigurationCommand()) {
+           mergeModemConfigurationCommand(other.getModemConfigurationCommand());
+         }
+         if (other.hasRtcConfigurationCommand()) {
+           mergeRtcConfigurationCommand(other.getRtcConfigurationCommand());
+         }
+         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 {
+         com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+           com.google.protobuf.UnknownFieldSet.newBuilder(
+             this.getUnknownFields());
+         while (true) {
+           int tag = input.readTag();
+           switch (tag) {
+             case 0:
+               this.setUnknownFields(unknownFields.build());
+               onChanged();
+               return this;
+             default: {
+               if (!parseUnknownField(input, unknownFields,
+                                      extensionRegistry, tag)) {
+                 this.setUnknownFields(unknownFields.build());
+                 onChanged();
+                 return this;
+               }
+               break;
+             }
+             case 8: {
+               int rawValue = input.readEnum();
+               com.openxc.BinaryMessages.ControlCommand.Type value = com.openxc.BinaryMessages.ControlCommand.Type.valueOf(rawValue);
+               if (value == null) {
+                 unknownFields.mergeVarintField(1, rawValue);
+               } else {
+                 bitField0_ |= 0x00000001;
+                 type_ = value;
+               }
+               break;
+             }
+             case 18: {
+               com.openxc.BinaryMessages.DiagnosticControlCommand.Builder subBuilder = com.openxc.BinaryMessages.DiagnosticControlCommand.newBuilder();
+               if (hasDiagnosticRequest()) {
+                 subBuilder.mergeFrom(getDiagnosticRequest());
+               }
+               input.readMessage(subBuilder, extensionRegistry);
+               setDiagnosticRequest(subBuilder.buildPartial());
+               break;
+             }
+             case 26: {
+               com.openxc.BinaryMessages.PassthroughModeControlCommand.Builder subBuilder = com.openxc.BinaryMessages.PassthroughModeControlCommand.newBuilder();
+               if (hasPassthroughModeRequest()) {
+                 subBuilder.mergeFrom(getPassthroughModeRequest());
+               }
+               input.readMessage(subBuilder, extensionRegistry);
+               setPassthroughModeRequest(subBuilder.buildPartial());
+               break;
+             }
+             case 34: {
+               com.openxc.BinaryMessages.AcceptanceFilterBypassCommand.Builder subBuilder = com.openxc.BinaryMessages.AcceptanceFilterBypassCommand.newBuilder();
+               if (hasAcceptanceFilterBypassCommand()) {
+                 subBuilder.mergeFrom(getAcceptanceFilterBypassCommand());
+               }
+               input.readMessage(subBuilder, extensionRegistry);
+               setAcceptanceFilterBypassCommand(subBuilder.buildPartial());
+               break;
+             }
+             case 42: {
+               com.openxc.BinaryMessages.PayloadFormatCommand.Builder subBuilder = com.openxc.BinaryMessages.PayloadFormatCommand.newBuilder();
+               if (hasPayloadFormatCommand()) {
+                 subBuilder.mergeFrom(getPayloadFormatCommand());
+               }
+               input.readMessage(subBuilder, extensionRegistry);
+               setPayloadFormatCommand(subBuilder.buildPartial());
+               break;
+             }
+             case 50: {
+               com.openxc.BinaryMessages.PredefinedObd2RequestsCommand.Builder subBuilder = com.openxc.BinaryMessages.PredefinedObd2RequestsCommand.newBuilder();
+               if (hasPredefinedObd2RequestsCommand()) {
+                 subBuilder.mergeFrom(getPredefinedObd2RequestsCommand());
+               }
+               input.readMessage(subBuilder, extensionRegistry);
+               setPredefinedObd2RequestsCommand(subBuilder.buildPartial());
+               break;
+             }
+             case 58: {
+               com.openxc.BinaryMessages.ModemConfigurationCommand.Builder subBuilder = com.openxc.BinaryMessages.ModemConfigurationCommand.newBuilder();
+               if (hasModemConfigurationCommand()) {
+                 subBuilder.mergeFrom(getModemConfigurationCommand());
+               }
+               input.readMessage(subBuilder, extensionRegistry);
+               setModemConfigurationCommand(subBuilder.buildPartial());
+               break;
+             }
+             case 66: {
+               com.openxc.BinaryMessages.RTCConfigurationCommand.Builder subBuilder = com.openxc.BinaryMessages.RTCConfigurationCommand.newBuilder();
+               if (hasRtcConfigurationCommand()) {
+                 subBuilder.mergeFrom(getRtcConfigurationCommand());
+               }
+               input.readMessage(subBuilder, extensionRegistry);
+               setRtcConfigurationCommand(subBuilder.buildPartial());
+               break;
+             }
+           }
+         }
+       }
+       
+       private int bitField0_;
+       
+       // optional .openxc.ControlCommand.Type type = 1;
+       private com.openxc.BinaryMessages.ControlCommand.Type type_ = com.openxc.BinaryMessages.ControlCommand.Type.VERSION;
+       public boolean hasType() {
+         return ((bitField0_ & 0x00000001) == 0x00000001);
+       }
+       public com.openxc.BinaryMessages.ControlCommand.Type getType() {
+         return type_;
+       }
+       public Builder setType(com.openxc.BinaryMessages.ControlCommand.Type value) {
+         if (value == null) {
+           throw new NullPointerException();
+         }
+         bitField0_ |= 0x00000001;
+         type_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearType() {
+         bitField0_ = (bitField0_ & ~0x00000001);
+         type_ = com.openxc.BinaryMessages.ControlCommand.Type.VERSION;
+         onChanged();
+         return this;
+       }
+       
+       // optional .openxc.DiagnosticControlCommand diagnostic_request = 2;
+       private com.openxc.BinaryMessages.DiagnosticControlCommand diagnosticRequest_ = com.openxc.BinaryMessages.DiagnosticControlCommand.getDefaultInstance();
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.DiagnosticControlCommand, com.openxc.BinaryMessages.DiagnosticControlCommand.Builder, com.openxc.BinaryMessages.DiagnosticControlCommandOrBuilder> diagnosticRequestBuilder_;
+       public boolean hasDiagnosticRequest() {
+         return ((bitField0_ & 0x00000002) == 0x00000002);
+       }
+       public com.openxc.BinaryMessages.DiagnosticControlCommand getDiagnosticRequest() {
+         if (diagnosticRequestBuilder_ == null) {
+           return diagnosticRequest_;
+         } else {
+           return diagnosticRequestBuilder_.getMessage();
+         }
+       }
+       public Builder setDiagnosticRequest(com.openxc.BinaryMessages.DiagnosticControlCommand value) {
+         if (diagnosticRequestBuilder_ == null) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           diagnosticRequest_ = value;
+           onChanged();
+         } else {
+           diagnosticRequestBuilder_.setMessage(value);
+         }
+         bitField0_ |= 0x00000002;
+         return this;
+       }
+       public Builder setDiagnosticRequest(
+           com.openxc.BinaryMessages.DiagnosticControlCommand.Builder builderForValue) {
+         if (diagnosticRequestBuilder_ == null) {
+           diagnosticRequest_ = builderForValue.build();
+           onChanged();
+         } else {
+           diagnosticRequestBuilder_.setMessage(builderForValue.build());
+         }
+         bitField0_ |= 0x00000002;
+         return this;
+       }
+       public Builder mergeDiagnosticRequest(com.openxc.BinaryMessages.DiagnosticControlCommand value) {
+         if (diagnosticRequestBuilder_ == null) {
+           if (((bitField0_ & 0x00000002) == 0x00000002) &&
+               diagnosticRequest_ != com.openxc.BinaryMessages.DiagnosticControlCommand.getDefaultInstance()) {
+             diagnosticRequest_ =
+               com.openxc.BinaryMessages.DiagnosticControlCommand.newBuilder(diagnosticRequest_).mergeFrom(value).buildPartial();
+           } else {
+             diagnosticRequest_ = value;
+           }
+           onChanged();
+         } else {
+           diagnosticRequestBuilder_.mergeFrom(value);
+         }
+         bitField0_ |= 0x00000002;
+         return this;
+       }
+       public Builder clearDiagnosticRequest() {
+         if (diagnosticRequestBuilder_ == null) {
+           diagnosticRequest_ = com.openxc.BinaryMessages.DiagnosticControlCommand.getDefaultInstance();
+           onChanged();
+         } else {
+           diagnosticRequestBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000002);
+         return this;
+       }
+       public com.openxc.BinaryMessages.DiagnosticControlCommand.Builder getDiagnosticRequestBuilder() {
+         bitField0_ |= 0x00000002;
+         onChanged();
+         return getDiagnosticRequestFieldBuilder().getBuilder();
+       }
+       public com.openxc.BinaryMessages.DiagnosticControlCommandOrBuilder getDiagnosticRequestOrBuilder() {
+         if (diagnosticRequestBuilder_ != null) {
+           return diagnosticRequestBuilder_.getMessageOrBuilder();
+         } else {
+           return diagnosticRequest_;
+         }
+       }
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.DiagnosticControlCommand, com.openxc.BinaryMessages.DiagnosticControlCommand.Builder, com.openxc.BinaryMessages.DiagnosticControlCommandOrBuilder> 
+           getDiagnosticRequestFieldBuilder() {
+         if (diagnosticRequestBuilder_ == null) {
+           diagnosticRequestBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+               com.openxc.BinaryMessages.DiagnosticControlCommand, com.openxc.BinaryMessages.DiagnosticControlCommand.Builder, com.openxc.BinaryMessages.DiagnosticControlCommandOrBuilder>(
+                   diagnosticRequest_,
+                   getParentForChildren(),
+                   isClean());
+           diagnosticRequest_ = null;
+         }
+         return diagnosticRequestBuilder_;
+       }
+       
+       // optional .openxc.PassthroughModeControlCommand passthrough_mode_request = 3;
+       private com.openxc.BinaryMessages.PassthroughModeControlCommand passthroughModeRequest_ = com.openxc.BinaryMessages.PassthroughModeControlCommand.getDefaultInstance();
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.PassthroughModeControlCommand, com.openxc.BinaryMessages.PassthroughModeControlCommand.Builder, com.openxc.BinaryMessages.PassthroughModeControlCommandOrBuilder> passthroughModeRequestBuilder_;
+       public boolean hasPassthroughModeRequest() {
+         return ((bitField0_ & 0x00000004) == 0x00000004);
+       }
+       public com.openxc.BinaryMessages.PassthroughModeControlCommand getPassthroughModeRequest() {
+         if (passthroughModeRequestBuilder_ == null) {
+           return passthroughModeRequest_;
+         } else {
+           return passthroughModeRequestBuilder_.getMessage();
+         }
+       }
+       public Builder setPassthroughModeRequest(com.openxc.BinaryMessages.PassthroughModeControlCommand value) {
+         if (passthroughModeRequestBuilder_ == null) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           passthroughModeRequest_ = value;
+           onChanged();
+         } else {
+           passthroughModeRequestBuilder_.setMessage(value);
+         }
+         bitField0_ |= 0x00000004;
+         return this;
+       }
+       public Builder setPassthroughModeRequest(
+           com.openxc.BinaryMessages.PassthroughModeControlCommand.Builder builderForValue) {
+         if (passthroughModeRequestBuilder_ == null) {
+           passthroughModeRequest_ = builderForValue.build();
+           onChanged();
+         } else {
+           passthroughModeRequestBuilder_.setMessage(builderForValue.build());
+         }
+         bitField0_ |= 0x00000004;
+         return this;
+       }
+       public Builder mergePassthroughModeRequest(com.openxc.BinaryMessages.PassthroughModeControlCommand value) {
+         if (passthroughModeRequestBuilder_ == null) {
+           if (((bitField0_ & 0x00000004) == 0x00000004) &&
+               passthroughModeRequest_ != com.openxc.BinaryMessages.PassthroughModeControlCommand.getDefaultInstance()) {
+             passthroughModeRequest_ =
+               com.openxc.BinaryMessages.PassthroughModeControlCommand.newBuilder(passthroughModeRequest_).mergeFrom(value).buildPartial();
+           } else {
+             passthroughModeRequest_ = value;
+           }
+           onChanged();
+         } else {
+           passthroughModeRequestBuilder_.mergeFrom(value);
+         }
+         bitField0_ |= 0x00000004;
+         return this;
+       }
+       public Builder clearPassthroughModeRequest() {
+         if (passthroughModeRequestBuilder_ == null) {
+           passthroughModeRequest_ = com.openxc.BinaryMessages.PassthroughModeControlCommand.getDefaultInstance();
+           onChanged();
+         } else {
+           passthroughModeRequestBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000004);
+         return this;
+       }
+       public com.openxc.BinaryMessages.PassthroughModeControlCommand.Builder getPassthroughModeRequestBuilder() {
+         bitField0_ |= 0x00000004;
+         onChanged();
+         return getPassthroughModeRequestFieldBuilder().getBuilder();
+       }
+       public com.openxc.BinaryMessages.PassthroughModeControlCommandOrBuilder getPassthroughModeRequestOrBuilder() {
+         if (passthroughModeRequestBuilder_ != null) {
+           return passthroughModeRequestBuilder_.getMessageOrBuilder();
+         } else {
+           return passthroughModeRequest_;
+         }
+       }
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.PassthroughModeControlCommand, com.openxc.BinaryMessages.PassthroughModeControlCommand.Builder, com.openxc.BinaryMessages.PassthroughModeControlCommandOrBuilder> 
+           getPassthroughModeRequestFieldBuilder() {
+         if (passthroughModeRequestBuilder_ == null) {
+           passthroughModeRequestBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+               com.openxc.BinaryMessages.PassthroughModeControlCommand, com.openxc.BinaryMessages.PassthroughModeControlCommand.Builder, com.openxc.BinaryMessages.PassthroughModeControlCommandOrBuilder>(
+                   passthroughModeRequest_,
+                   getParentForChildren(),
+                   isClean());
+           passthroughModeRequest_ = null;
+         }
+         return passthroughModeRequestBuilder_;
+       }
+       
+       // optional .openxc.AcceptanceFilterBypassCommand acceptance_filter_bypass_command = 4;
+       private com.openxc.BinaryMessages.AcceptanceFilterBypassCommand acceptanceFilterBypassCommand_ = com.openxc.BinaryMessages.AcceptanceFilterBypassCommand.getDefaultInstance();
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.AcceptanceFilterBypassCommand, com.openxc.BinaryMessages.AcceptanceFilterBypassCommand.Builder, com.openxc.BinaryMessages.AcceptanceFilterBypassCommandOrBuilder> acceptanceFilterBypassCommandBuilder_;
+       public boolean hasAcceptanceFilterBypassCommand() {
+         return ((bitField0_ & 0x00000008) == 0x00000008);
+       }
+       public com.openxc.BinaryMessages.AcceptanceFilterBypassCommand getAcceptanceFilterBypassCommand() {
+         if (acceptanceFilterBypassCommandBuilder_ == null) {
+           return acceptanceFilterBypassCommand_;
+         } else {
+           return acceptanceFilterBypassCommandBuilder_.getMessage();
+         }
+       }
+       public Builder setAcceptanceFilterBypassCommand(com.openxc.BinaryMessages.AcceptanceFilterBypassCommand value) {
+         if (acceptanceFilterBypassCommandBuilder_ == null) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           acceptanceFilterBypassCommand_ = value;
+           onChanged();
+         } else {
+           acceptanceFilterBypassCommandBuilder_.setMessage(value);
+         }
+         bitField0_ |= 0x00000008;
+         return this;
+       }
+       public Builder setAcceptanceFilterBypassCommand(
+           com.openxc.BinaryMessages.AcceptanceFilterBypassCommand.Builder builderForValue) {
+         if (acceptanceFilterBypassCommandBuilder_ == null) {
+           acceptanceFilterBypassCommand_ = builderForValue.build();
+           onChanged();
+         } else {
+           acceptanceFilterBypassCommandBuilder_.setMessage(builderForValue.build());
+         }
+         bitField0_ |= 0x00000008;
+         return this;
+       }
+       public Builder mergeAcceptanceFilterBypassCommand(com.openxc.BinaryMessages.AcceptanceFilterBypassCommand value) {
+         if (acceptanceFilterBypassCommandBuilder_ == null) {
+           if (((bitField0_ & 0x00000008) == 0x00000008) &&
+               acceptanceFilterBypassCommand_ != com.openxc.BinaryMessages.AcceptanceFilterBypassCommand.getDefaultInstance()) {
+             acceptanceFilterBypassCommand_ =
+               com.openxc.BinaryMessages.AcceptanceFilterBypassCommand.newBuilder(acceptanceFilterBypassCommand_).mergeFrom(value).buildPartial();
+           } else {
+             acceptanceFilterBypassCommand_ = value;
+           }
+           onChanged();
+         } else {
+           acceptanceFilterBypassCommandBuilder_.mergeFrom(value);
+         }
+         bitField0_ |= 0x00000008;
+         return this;
+       }
+       public Builder clearAcceptanceFilterBypassCommand() {
+         if (acceptanceFilterBypassCommandBuilder_ == null) {
+           acceptanceFilterBypassCommand_ = com.openxc.BinaryMessages.AcceptanceFilterBypassCommand.getDefaultInstance();
+           onChanged();
+         } else {
+           acceptanceFilterBypassCommandBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000008);
+         return this;
+       }
+       public com.openxc.BinaryMessages.AcceptanceFilterBypassCommand.Builder getAcceptanceFilterBypassCommandBuilder() {
+         bitField0_ |= 0x00000008;
+         onChanged();
+         return getAcceptanceFilterBypassCommandFieldBuilder().getBuilder();
+       }
+       public com.openxc.BinaryMessages.AcceptanceFilterBypassCommandOrBuilder getAcceptanceFilterBypassCommandOrBuilder() {
+         if (acceptanceFilterBypassCommandBuilder_ != null) {
+           return acceptanceFilterBypassCommandBuilder_.getMessageOrBuilder();
+         } else {
+           return acceptanceFilterBypassCommand_;
+         }
+       }
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.AcceptanceFilterBypassCommand, com.openxc.BinaryMessages.AcceptanceFilterBypassCommand.Builder, com.openxc.BinaryMessages.AcceptanceFilterBypassCommandOrBuilder> 
+           getAcceptanceFilterBypassCommandFieldBuilder() {
+         if (acceptanceFilterBypassCommandBuilder_ == null) {
+           acceptanceFilterBypassCommandBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+               com.openxc.BinaryMessages.AcceptanceFilterBypassCommand, com.openxc.BinaryMessages.AcceptanceFilterBypassCommand.Builder, com.openxc.BinaryMessages.AcceptanceFilterBypassCommandOrBuilder>(
+                   acceptanceFilterBypassCommand_,
+                   getParentForChildren(),
+                   isClean());
+           acceptanceFilterBypassCommand_ = null;
+         }
+         return acceptanceFilterBypassCommandBuilder_;
+       }
+       
+       // optional .openxc.PayloadFormatCommand payload_format_command = 5;
+       private com.openxc.BinaryMessages.PayloadFormatCommand payloadFormatCommand_ = com.openxc.BinaryMessages.PayloadFormatCommand.getDefaultInstance();
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.PayloadFormatCommand, com.openxc.BinaryMessages.PayloadFormatCommand.Builder, com.openxc.BinaryMessages.PayloadFormatCommandOrBuilder> payloadFormatCommandBuilder_;
+       public boolean hasPayloadFormatCommand() {
+         return ((bitField0_ & 0x00000010) == 0x00000010);
+       }
+       public com.openxc.BinaryMessages.PayloadFormatCommand getPayloadFormatCommand() {
+         if (payloadFormatCommandBuilder_ == null) {
+           return payloadFormatCommand_;
+         } else {
+           return payloadFormatCommandBuilder_.getMessage();
+         }
+       }
+       public Builder setPayloadFormatCommand(com.openxc.BinaryMessages.PayloadFormatCommand value) {
+         if (payloadFormatCommandBuilder_ == null) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           payloadFormatCommand_ = value;
+           onChanged();
+         } else {
+           payloadFormatCommandBuilder_.setMessage(value);
+         }
+         bitField0_ |= 0x00000010;
+         return this;
+       }
+       public Builder setPayloadFormatCommand(
+           com.openxc.BinaryMessages.PayloadFormatCommand.Builder builderForValue) {
+         if (payloadFormatCommandBuilder_ == null) {
+           payloadFormatCommand_ = builderForValue.build();
+           onChanged();
+         } else {
+           payloadFormatCommandBuilder_.setMessage(builderForValue.build());
+         }
+         bitField0_ |= 0x00000010;
+         return this;
+       }
+       public Builder mergePayloadFormatCommand(com.openxc.BinaryMessages.PayloadFormatCommand value) {
+         if (payloadFormatCommandBuilder_ == null) {
+           if (((bitField0_ & 0x00000010) == 0x00000010) &&
+               payloadFormatCommand_ != com.openxc.BinaryMessages.PayloadFormatCommand.getDefaultInstance()) {
+             payloadFormatCommand_ =
+               com.openxc.BinaryMessages.PayloadFormatCommand.newBuilder(payloadFormatCommand_).mergeFrom(value).buildPartial();
+           } else {
+             payloadFormatCommand_ = value;
+           }
+           onChanged();
+         } else {
+           payloadFormatCommandBuilder_.mergeFrom(value);
+         }
+         bitField0_ |= 0x00000010;
+         return this;
+       }
+       public Builder clearPayloadFormatCommand() {
+         if (payloadFormatCommandBuilder_ == null) {
+           payloadFormatCommand_ = com.openxc.BinaryMessages.PayloadFormatCommand.getDefaultInstance();
+           onChanged();
+         } else {
+           payloadFormatCommandBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000010);
+         return this;
+       }
+       public com.openxc.BinaryMessages.PayloadFormatCommand.Builder getPayloadFormatCommandBuilder() {
+         bitField0_ |= 0x00000010;
+         onChanged();
+         return getPayloadFormatCommandFieldBuilder().getBuilder();
+       }
+       public com.openxc.BinaryMessages.PayloadFormatCommandOrBuilder getPayloadFormatCommandOrBuilder() {
+         if (payloadFormatCommandBuilder_ != null) {
+           return payloadFormatCommandBuilder_.getMessageOrBuilder();
+         } else {
+           return payloadFormatCommand_;
+         }
+       }
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.PayloadFormatCommand, com.openxc.BinaryMessages.PayloadFormatCommand.Builder, com.openxc.BinaryMessages.PayloadFormatCommandOrBuilder> 
+           getPayloadFormatCommandFieldBuilder() {
+         if (payloadFormatCommandBuilder_ == null) {
+           payloadFormatCommandBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+               com.openxc.BinaryMessages.PayloadFormatCommand, com.openxc.BinaryMessages.PayloadFormatCommand.Builder, com.openxc.BinaryMessages.PayloadFormatCommandOrBuilder>(
+                   payloadFormatCommand_,
+                   getParentForChildren(),
+                   isClean());
+           payloadFormatCommand_ = null;
+         }
+         return payloadFormatCommandBuilder_;
+       }
+       
+       // optional .openxc.PredefinedObd2RequestsCommand predefined_obd2_requests_command = 6;
+       private com.openxc.BinaryMessages.PredefinedObd2RequestsCommand predefinedObd2RequestsCommand_ = com.openxc.BinaryMessages.PredefinedObd2RequestsCommand.getDefaultInstance();
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.PredefinedObd2RequestsCommand, com.openxc.BinaryMessages.PredefinedObd2RequestsCommand.Builder, com.openxc.BinaryMessages.PredefinedObd2RequestsCommandOrBuilder> predefinedObd2RequestsCommandBuilder_;
+       public boolean hasPredefinedObd2RequestsCommand() {
+         return ((bitField0_ & 0x00000020) == 0x00000020);
+       }
+       public com.openxc.BinaryMessages.PredefinedObd2RequestsCommand getPredefinedObd2RequestsCommand() {
+         if (predefinedObd2RequestsCommandBuilder_ == null) {
+           return predefinedObd2RequestsCommand_;
+         } else {
+           return predefinedObd2RequestsCommandBuilder_.getMessage();
+         }
+       }
+       public Builder setPredefinedObd2RequestsCommand(com.openxc.BinaryMessages.PredefinedObd2RequestsCommand value) {
+         if (predefinedObd2RequestsCommandBuilder_ == null) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           predefinedObd2RequestsCommand_ = value;
+           onChanged();
+         } else {
+           predefinedObd2RequestsCommandBuilder_.setMessage(value);
+         }
+         bitField0_ |= 0x00000020;
+         return this;
+       }
+       public Builder setPredefinedObd2RequestsCommand(
+           com.openxc.BinaryMessages.PredefinedObd2RequestsCommand.Builder builderForValue) {
+         if (predefinedObd2RequestsCommandBuilder_ == null) {
+           predefinedObd2RequestsCommand_ = builderForValue.build();
+           onChanged();
+         } else {
+           predefinedObd2RequestsCommandBuilder_.setMessage(builderForValue.build());
+         }
+         bitField0_ |= 0x00000020;
+         return this;
+       }
+       public Builder mergePredefinedObd2RequestsCommand(com.openxc.BinaryMessages.PredefinedObd2RequestsCommand value) {
+         if (predefinedObd2RequestsCommandBuilder_ == null) {
+           if (((bitField0_ & 0x00000020) == 0x00000020) &&
+               predefinedObd2RequestsCommand_ != com.openxc.BinaryMessages.PredefinedObd2RequestsCommand.getDefaultInstance()) {
+             predefinedObd2RequestsCommand_ =
+               com.openxc.BinaryMessages.PredefinedObd2RequestsCommand.newBuilder(predefinedObd2RequestsCommand_).mergeFrom(value).buildPartial();
+           } else {
+             predefinedObd2RequestsCommand_ = value;
+           }
+           onChanged();
+         } else {
+           predefinedObd2RequestsCommandBuilder_.mergeFrom(value);
+         }
+         bitField0_ |= 0x00000020;
+         return this;
+       }
+       public Builder clearPredefinedObd2RequestsCommand() {
+         if (predefinedObd2RequestsCommandBuilder_ == null) {
+           predefinedObd2RequestsCommand_ = com.openxc.BinaryMessages.PredefinedObd2RequestsCommand.getDefaultInstance();
+           onChanged();
+         } else {
+           predefinedObd2RequestsCommandBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000020);
+         return this;
+       }
+       public com.openxc.BinaryMessages.PredefinedObd2RequestsCommand.Builder getPredefinedObd2RequestsCommandBuilder() {
+         bitField0_ |= 0x00000020;
+         onChanged();
+         return getPredefinedObd2RequestsCommandFieldBuilder().getBuilder();
+       }
+       public com.openxc.BinaryMessages.PredefinedObd2RequestsCommandOrBuilder getPredefinedObd2RequestsCommandOrBuilder() {
+         if (predefinedObd2RequestsCommandBuilder_ != null) {
+           return predefinedObd2RequestsCommandBuilder_.getMessageOrBuilder();
+         } else {
+           return predefinedObd2RequestsCommand_;
+         }
+       }
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.PredefinedObd2RequestsCommand, com.openxc.BinaryMessages.PredefinedObd2RequestsCommand.Builder, com.openxc.BinaryMessages.PredefinedObd2RequestsCommandOrBuilder> 
+           getPredefinedObd2RequestsCommandFieldBuilder() {
+         if (predefinedObd2RequestsCommandBuilder_ == null) {
+           predefinedObd2RequestsCommandBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+               com.openxc.BinaryMessages.PredefinedObd2RequestsCommand, com.openxc.BinaryMessages.PredefinedObd2RequestsCommand.Builder, com.openxc.BinaryMessages.PredefinedObd2RequestsCommandOrBuilder>(
+                   predefinedObd2RequestsCommand_,
+                   getParentForChildren(),
+                   isClean());
+           predefinedObd2RequestsCommand_ = null;
+         }
+         return predefinedObd2RequestsCommandBuilder_;
+       }
+       
+       // optional .openxc.ModemConfigurationCommand modem_configuration_command = 7;
+       private com.openxc.BinaryMessages.ModemConfigurationCommand modemConfigurationCommand_ = com.openxc.BinaryMessages.ModemConfigurationCommand.getDefaultInstance();
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.ModemConfigurationCommand, com.openxc.BinaryMessages.ModemConfigurationCommand.Builder, com.openxc.BinaryMessages.ModemConfigurationCommandOrBuilder> modemConfigurationCommandBuilder_;
+       public boolean hasModemConfigurationCommand() {
+         return ((bitField0_ & 0x00000040) == 0x00000040);
+       }
+       public com.openxc.BinaryMessages.ModemConfigurationCommand getModemConfigurationCommand() {
+         if (modemConfigurationCommandBuilder_ == null) {
+           return modemConfigurationCommand_;
+         } else {
+           return modemConfigurationCommandBuilder_.getMessage();
+         }
+       }
+       public Builder setModemConfigurationCommand(com.openxc.BinaryMessages.ModemConfigurationCommand value) {
+         if (modemConfigurationCommandBuilder_ == null) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           modemConfigurationCommand_ = value;
+           onChanged();
+         } else {
+           modemConfigurationCommandBuilder_.setMessage(value);
+         }
+         bitField0_ |= 0x00000040;
+         return this;
+       }
+       public Builder setModemConfigurationCommand(
+           com.openxc.BinaryMessages.ModemConfigurationCommand.Builder builderForValue) {
+         if (modemConfigurationCommandBuilder_ == null) {
+           modemConfigurationCommand_ = builderForValue.build();
+           onChanged();
+         } else {
+           modemConfigurationCommandBuilder_.setMessage(builderForValue.build());
+         }
+         bitField0_ |= 0x00000040;
+         return this;
+       }
+       public Builder mergeModemConfigurationCommand(com.openxc.BinaryMessages.ModemConfigurationCommand value) {
+         if (modemConfigurationCommandBuilder_ == null) {
+           if (((bitField0_ & 0x00000040) == 0x00000040) &&
+               modemConfigurationCommand_ != com.openxc.BinaryMessages.ModemConfigurationCommand.getDefaultInstance()) {
+             modemConfigurationCommand_ =
+               com.openxc.BinaryMessages.ModemConfigurationCommand.newBuilder(modemConfigurationCommand_).mergeFrom(value).buildPartial();
+           } else {
+             modemConfigurationCommand_ = value;
+           }
+           onChanged();
+         } else {
+           modemConfigurationCommandBuilder_.mergeFrom(value);
+         }
+         bitField0_ |= 0x00000040;
+         return this;
+       }
+       public Builder clearModemConfigurationCommand() {
+         if (modemConfigurationCommandBuilder_ == null) {
+           modemConfigurationCommand_ = com.openxc.BinaryMessages.ModemConfigurationCommand.getDefaultInstance();
+           onChanged();
+         } else {
+           modemConfigurationCommandBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000040);
+         return this;
+       }
+       public com.openxc.BinaryMessages.ModemConfigurationCommand.Builder getModemConfigurationCommandBuilder() {
+         bitField0_ |= 0x00000040;
+         onChanged();
+         return getModemConfigurationCommandFieldBuilder().getBuilder();
+       }
+       public com.openxc.BinaryMessages.ModemConfigurationCommandOrBuilder getModemConfigurationCommandOrBuilder() {
+         if (modemConfigurationCommandBuilder_ != null) {
+           return modemConfigurationCommandBuilder_.getMessageOrBuilder();
+         } else {
+           return modemConfigurationCommand_;
+         }
+       }
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.ModemConfigurationCommand, com.openxc.BinaryMessages.ModemConfigurationCommand.Builder, com.openxc.BinaryMessages.ModemConfigurationCommandOrBuilder> 
+           getModemConfigurationCommandFieldBuilder() {
+         if (modemConfigurationCommandBuilder_ == null) {
+           modemConfigurationCommandBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+               com.openxc.BinaryMessages.ModemConfigurationCommand, com.openxc.BinaryMessages.ModemConfigurationCommand.Builder, com.openxc.BinaryMessages.ModemConfigurationCommandOrBuilder>(
+                   modemConfigurationCommand_,
+                   getParentForChildren(),
+                   isClean());
+           modemConfigurationCommand_ = null;
+         }
+         return modemConfigurationCommandBuilder_;
+       }
+       
+       // optional .openxc.RTCConfigurationCommand rtc_configuration_command = 8;
+       private com.openxc.BinaryMessages.RTCConfigurationCommand rtcConfigurationCommand_ = com.openxc.BinaryMessages.RTCConfigurationCommand.getDefaultInstance();
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.RTCConfigurationCommand, com.openxc.BinaryMessages.RTCConfigurationCommand.Builder, com.openxc.BinaryMessages.RTCConfigurationCommandOrBuilder> rtcConfigurationCommandBuilder_;
+       public boolean hasRtcConfigurationCommand() {
+         return ((bitField0_ & 0x00000080) == 0x00000080);
+       }
+       public com.openxc.BinaryMessages.RTCConfigurationCommand getRtcConfigurationCommand() {
+         if (rtcConfigurationCommandBuilder_ == null) {
+           return rtcConfigurationCommand_;
+         } else {
+           return rtcConfigurationCommandBuilder_.getMessage();
+         }
+       }
+       public Builder setRtcConfigurationCommand(com.openxc.BinaryMessages.RTCConfigurationCommand value) {
+         if (rtcConfigurationCommandBuilder_ == null) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           rtcConfigurationCommand_ = value;
+           onChanged();
+         } else {
+           rtcConfigurationCommandBuilder_.setMessage(value);
+         }
+         bitField0_ |= 0x00000080;
+         return this;
+       }
+       public Builder setRtcConfigurationCommand(
+           com.openxc.BinaryMessages.RTCConfigurationCommand.Builder builderForValue) {
+         if (rtcConfigurationCommandBuilder_ == null) {
+           rtcConfigurationCommand_ = builderForValue.build();
+           onChanged();
+         } else {
+           rtcConfigurationCommandBuilder_.setMessage(builderForValue.build());
+         }
+         bitField0_ |= 0x00000080;
+         return this;
+       }
+       public Builder mergeRtcConfigurationCommand(com.openxc.BinaryMessages.RTCConfigurationCommand value) {
+         if (rtcConfigurationCommandBuilder_ == null) {
+           if (((bitField0_ & 0x00000080) == 0x00000080) &&
+               rtcConfigurationCommand_ != com.openxc.BinaryMessages.RTCConfigurationCommand.getDefaultInstance()) {
+             rtcConfigurationCommand_ =
+               com.openxc.BinaryMessages.RTCConfigurationCommand.newBuilder(rtcConfigurationCommand_).mergeFrom(value).buildPartial();
+           } else {
+             rtcConfigurationCommand_ = value;
+           }
+           onChanged();
+         } else {
+           rtcConfigurationCommandBuilder_.mergeFrom(value);
+         }
+         bitField0_ |= 0x00000080;
+         return this;
+       }
+       public Builder clearRtcConfigurationCommand() {
+         if (rtcConfigurationCommandBuilder_ == null) {
+           rtcConfigurationCommand_ = com.openxc.BinaryMessages.RTCConfigurationCommand.getDefaultInstance();
+           onChanged();
+         } else {
+           rtcConfigurationCommandBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000080);
+         return this;
+       }
+       public com.openxc.BinaryMessages.RTCConfigurationCommand.Builder getRtcConfigurationCommandBuilder() {
+         bitField0_ |= 0x00000080;
+         onChanged();
+         return getRtcConfigurationCommandFieldBuilder().getBuilder();
+       }
+       public com.openxc.BinaryMessages.RTCConfigurationCommandOrBuilder getRtcConfigurationCommandOrBuilder() {
+         if (rtcConfigurationCommandBuilder_ != null) {
+           return rtcConfigurationCommandBuilder_.getMessageOrBuilder();
+         } else {
+           return rtcConfigurationCommand_;
+         }
+       }
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.RTCConfigurationCommand, com.openxc.BinaryMessages.RTCConfigurationCommand.Builder, com.openxc.BinaryMessages.RTCConfigurationCommandOrBuilder> 
+           getRtcConfigurationCommandFieldBuilder() {
+         if (rtcConfigurationCommandBuilder_ == null) {
+           rtcConfigurationCommandBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+               com.openxc.BinaryMessages.RTCConfigurationCommand, com.openxc.BinaryMessages.RTCConfigurationCommand.Builder, com.openxc.BinaryMessages.RTCConfigurationCommandOrBuilder>(
+                   rtcConfigurationCommand_,
+                   getParentForChildren(),
+                   isClean());
+           rtcConfigurationCommand_ = null;
+         }
+         return rtcConfigurationCommandBuilder_;
+       }
+       
+       // @@protoc_insertion_point(builder_scope:openxc.ControlCommand)
+     }
+     
+     static {
+       defaultInstance = new ControlCommand(true);
+       defaultInstance.initFields();
+     }
+     
+     // @@protoc_insertion_point(class_scope:openxc.ControlCommand)
+   }
+   
+   public interface DiagnosticControlCommandOrBuilder
+       extends com.google.protobuf.MessageOrBuilder {
+     
+     // optional .openxc.DiagnosticRequest request = 1;
+     boolean hasRequest();
+     com.openxc.BinaryMessages.DiagnosticRequest getRequest();
+     com.openxc.BinaryMessages.DiagnosticRequestOrBuilder getRequestOrBuilder();
+     
+     // optional .openxc.DiagnosticControlCommand.Action action = 2;
+     boolean hasAction();
+     com.openxc.BinaryMessages.DiagnosticControlCommand.Action getAction();
+   }
+   public static final class DiagnosticControlCommand extends
+       com.google.protobuf.GeneratedMessage
+       implements DiagnosticControlCommandOrBuilder {
+     // Use DiagnosticControlCommand.newBuilder() to construct.
+     private DiagnosticControlCommand(Builder builder) {
+       super(builder);
+     }
+     private DiagnosticControlCommand(boolean noInit) {}
+     
+     private static final DiagnosticControlCommand defaultInstance;
+     public static DiagnosticControlCommand getDefaultInstance() {
+       return defaultInstance;
+     }
+     
+     public DiagnosticControlCommand getDefaultInstanceForType() {
+       return defaultInstance;
+     }
+     
+     public static final com.google.protobuf.Descriptors.Descriptor
+         getDescriptor() {
+       return com.openxc.BinaryMessages.internal_static_openxc_DiagnosticControlCommand_descriptor;
+     }
+     
+     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+         internalGetFieldAccessorTable() {
+       return com.openxc.BinaryMessages.internal_static_openxc_DiagnosticControlCommand_fieldAccessorTable;
+     }
+     
+     public enum Action
+         implements com.google.protobuf.ProtocolMessageEnum {
+       ADD(0, 1),
+       CANCEL(1, 2),
+       ;
+       
+       public static final int ADD_VALUE = 1;
+       public static final int CANCEL_VALUE = 2;
+       
+       
+       public final int getNumber() { return value; }
+       
+       public static Action valueOf(int value) {
+         switch (value) {
+           case 1: return ADD;
+           case 2: return CANCEL;
+           default: return null;
+         }
+       }
+       
+       public static com.google.protobuf.Internal.EnumLiteMap<Action>
+           internalGetValueMap() {
+         return internalValueMap;
+       }
+       private static com.google.protobuf.Internal.EnumLiteMap<Action>
+           internalValueMap =
+             new com.google.protobuf.Internal.EnumLiteMap<Action>() {
+               public Action findValueByNumber(int number) {
+                 return Action.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 com.openxc.BinaryMessages.DiagnosticControlCommand.getDescriptor().getEnumTypes().get(0);
+       }
+       
+       private static final Action[] VALUES = {
+         ADD, CANCEL, 
+       };
+       
+       public static Action 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 Action(int index, int value) {
+         this.index = index;
+         this.value = value;
+       }
+       
+       // @@protoc_insertion_point(enum_scope:openxc.DiagnosticControlCommand.Action)
+     }
+     
+     private int bitField0_;
+     // optional .openxc.DiagnosticRequest request = 1;
+     public static final int REQUEST_FIELD_NUMBER = 1;
+     private com.openxc.BinaryMessages.DiagnosticRequest request_;
+     public boolean hasRequest() {
+       return ((bitField0_ & 0x00000001) == 0x00000001);
+     }
+     public com.openxc.BinaryMessages.DiagnosticRequest getRequest() {
+       return request_;
+     }
+     public com.openxc.BinaryMessages.DiagnosticRequestOrBuilder getRequestOrBuilder() {
+       return request_;
+     }
+     
+     // optional .openxc.DiagnosticControlCommand.Action action = 2;
+     public static final int ACTION_FIELD_NUMBER = 2;
+     private com.openxc.BinaryMessages.DiagnosticControlCommand.Action action_;
+     public boolean hasAction() {
+       return ((bitField0_ & 0x00000002) == 0x00000002);
+     }
+     public com.openxc.BinaryMessages.DiagnosticControlCommand.Action getAction() {
+       return action_;
+     }
+     
+     private void initFields() {
+       request_ = com.openxc.BinaryMessages.DiagnosticRequest.getDefaultInstance();
+       action_ = com.openxc.BinaryMessages.DiagnosticControlCommand.Action.ADD;
+     }
+     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.writeMessage(1, request_);
+       }
+       if (((bitField0_ & 0x00000002) == 0x00000002)) {
+         output.writeEnum(2, action_.getNumber());
+       }
+       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
+           .computeMessageSize(1, request_);
+       }
+       if (((bitField0_ & 0x00000002) == 0x00000002)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeEnumSize(2, action_.getNumber());
+       }
+       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 com.openxc.BinaryMessages.DiagnosticControlCommand parseFrom(
+         com.google.protobuf.ByteString data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticControlCommand parseFrom(
+         com.google.protobuf.ByteString data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticControlCommand parseFrom(byte[] data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticControlCommand parseFrom(
+         byte[] data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticControlCommand parseFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticControlCommand parseFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticControlCommand parseDelimitedFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.DiagnosticControlCommand parseDelimitedFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.DiagnosticControlCommand parseFrom(
+         com.google.protobuf.CodedInputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticControlCommand parseFrom(
+         com.google.protobuf.CodedInputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     
+     public static Builder newBuilder() { return Builder.create(); }
+     public Builder newBuilderForType() { return newBuilder(); }
+     public static Builder newBuilder(com.openxc.BinaryMessages.DiagnosticControlCommand 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;
+     }
+     public static final class Builder extends
+         com.google.protobuf.GeneratedMessage.Builder<Builder>
+        implements com.openxc.BinaryMessages.DiagnosticControlCommandOrBuilder {
+       public static final com.google.protobuf.Descriptors.Descriptor
+           getDescriptor() {
+         return com.openxc.BinaryMessages.internal_static_openxc_DiagnosticControlCommand_descriptor;
+       }
+       
+       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+           internalGetFieldAccessorTable() {
+         return com.openxc.BinaryMessages.internal_static_openxc_DiagnosticControlCommand_fieldAccessorTable;
+       }
+       
+       // Construct using com.openxc.BinaryMessages.DiagnosticControlCommand.newBuilder()
+       private Builder() {
+         maybeForceBuilderInitialization();
+       }
+       
+       private Builder(BuilderParent parent) {
+         super(parent);
+         maybeForceBuilderInitialization();
+       }
+       private void maybeForceBuilderInitialization() {
+         if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+           getRequestFieldBuilder();
+         }
+       }
+       private static Builder create() {
+         return new Builder();
+       }
+       
+       public Builder clear() {
+         super.clear();
+         if (requestBuilder_ == null) {
+           request_ = com.openxc.BinaryMessages.DiagnosticRequest.getDefaultInstance();
+         } else {
+           requestBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000001);
+         action_ = com.openxc.BinaryMessages.DiagnosticControlCommand.Action.ADD;
+         bitField0_ = (bitField0_ & ~0x00000002);
+         return this;
+       }
+       
+       public Builder clone() {
+         return create().mergeFrom(buildPartial());
+       }
+       
+       public com.google.protobuf.Descriptors.Descriptor
+           getDescriptorForType() {
+         return com.openxc.BinaryMessages.DiagnosticControlCommand.getDescriptor();
+       }
+       
+       public com.openxc.BinaryMessages.DiagnosticControlCommand getDefaultInstanceForType() {
+         return com.openxc.BinaryMessages.DiagnosticControlCommand.getDefaultInstance();
+       }
+       
+       public com.openxc.BinaryMessages.DiagnosticControlCommand build() {
+         com.openxc.BinaryMessages.DiagnosticControlCommand result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(result);
+         }
+         return result;
+       }
+       
+       private com.openxc.BinaryMessages.DiagnosticControlCommand buildParsed()
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         com.openxc.BinaryMessages.DiagnosticControlCommand result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(
+             result).asInvalidProtocolBufferException();
+         }
+         return result;
+       }
+       
+       public com.openxc.BinaryMessages.DiagnosticControlCommand buildPartial() {
+         com.openxc.BinaryMessages.DiagnosticControlCommand result = new com.openxc.BinaryMessages.DiagnosticControlCommand(this);
+         int from_bitField0_ = bitField0_;
+         int to_bitField0_ = 0;
+         if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+           to_bitField0_ |= 0x00000001;
+         }
+         if (requestBuilder_ == null) {
+           result.request_ = request_;
+         } else {
+           result.request_ = requestBuilder_.build();
+         }
+         if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+           to_bitField0_ |= 0x00000002;
+         }
+         result.action_ = action_;
+         result.bitField0_ = to_bitField0_;
+         onBuilt();
+         return result;
+       }
+       
+       public Builder mergeFrom(com.google.protobuf.Message other) {
+         if (other instanceof com.openxc.BinaryMessages.DiagnosticControlCommand) {
+           return mergeFrom((com.openxc.BinaryMessages.DiagnosticControlCommand)other);
+         } else {
+           super.mergeFrom(other);
+           return this;
+         }
+       }
+       
+       public Builder mergeFrom(com.openxc.BinaryMessages.DiagnosticControlCommand other) {
+         if (other == com.openxc.BinaryMessages.DiagnosticControlCommand.getDefaultInstance()) return this;
+         if (other.hasRequest()) {
+           mergeRequest(other.getRequest());
+         }
+         if (other.hasAction()) {
+           setAction(other.getAction());
+         }
+         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 {
+         com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+           com.google.protobuf.UnknownFieldSet.newBuilder(
+             this.getUnknownFields());
+         while (true) {
+           int tag = input.readTag();
+           switch (tag) {
+             case 0:
+               this.setUnknownFields(unknownFields.build());
+               onChanged();
+               return this;
+             default: {
+               if (!parseUnknownField(input, unknownFields,
+                                      extensionRegistry, tag)) {
+                 this.setUnknownFields(unknownFields.build());
+                 onChanged();
+                 return this;
+               }
+               break;
+             }
+             case 10: {
+               com.openxc.BinaryMessages.DiagnosticRequest.Builder subBuilder = com.openxc.BinaryMessages.DiagnosticRequest.newBuilder();
+               if (hasRequest()) {
+                 subBuilder.mergeFrom(getRequest());
+               }
+               input.readMessage(subBuilder, extensionRegistry);
+               setRequest(subBuilder.buildPartial());
+               break;
+             }
+             case 16: {
+               int rawValue = input.readEnum();
+               com.openxc.BinaryMessages.DiagnosticControlCommand.Action value = com.openxc.BinaryMessages.DiagnosticControlCommand.Action.valueOf(rawValue);
+               if (value == null) {
+                 unknownFields.mergeVarintField(2, rawValue);
+               } else {
+                 bitField0_ |= 0x00000002;
+                 action_ = value;
+               }
+               break;
+             }
+           }
+         }
+       }
+       
+       private int bitField0_;
+       
+       // optional .openxc.DiagnosticRequest request = 1;
+       private com.openxc.BinaryMessages.DiagnosticRequest request_ = com.openxc.BinaryMessages.DiagnosticRequest.getDefaultInstance();
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.DiagnosticRequest, com.openxc.BinaryMessages.DiagnosticRequest.Builder, com.openxc.BinaryMessages.DiagnosticRequestOrBuilder> requestBuilder_;
+       public boolean hasRequest() {
+         return ((bitField0_ & 0x00000001) == 0x00000001);
+       }
+       public com.openxc.BinaryMessages.DiagnosticRequest getRequest() {
+         if (requestBuilder_ == null) {
+           return request_;
+         } else {
+           return requestBuilder_.getMessage();
+         }
+       }
+       public Builder setRequest(com.openxc.BinaryMessages.DiagnosticRequest value) {
+         if (requestBuilder_ == null) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           request_ = value;
+           onChanged();
+         } else {
+           requestBuilder_.setMessage(value);
+         }
+         bitField0_ |= 0x00000001;
+         return this;
+       }
+       public Builder setRequest(
+           com.openxc.BinaryMessages.DiagnosticRequest.Builder builderForValue) {
+         if (requestBuilder_ == null) {
+           request_ = builderForValue.build();
+           onChanged();
+         } else {
+           requestBuilder_.setMessage(builderForValue.build());
+         }
+         bitField0_ |= 0x00000001;
+         return this;
+       }
+       public Builder mergeRequest(com.openxc.BinaryMessages.DiagnosticRequest value) {
+         if (requestBuilder_ == null) {
+           if (((bitField0_ & 0x00000001) == 0x00000001) &&
+               request_ != com.openxc.BinaryMessages.DiagnosticRequest.getDefaultInstance()) {
+             request_ =
+               com.openxc.BinaryMessages.DiagnosticRequest.newBuilder(request_).mergeFrom(value).buildPartial();
+           } else {
+             request_ = value;
+           }
+           onChanged();
+         } else {
+           requestBuilder_.mergeFrom(value);
+         }
+         bitField0_ |= 0x00000001;
+         return this;
+       }
+       public Builder clearRequest() {
+         if (requestBuilder_ == null) {
+           request_ = com.openxc.BinaryMessages.DiagnosticRequest.getDefaultInstance();
+           onChanged();
+         } else {
+           requestBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000001);
+         return this;
+       }
+       public com.openxc.BinaryMessages.DiagnosticRequest.Builder getRequestBuilder() {
+         bitField0_ |= 0x00000001;
+         onChanged();
+         return getRequestFieldBuilder().getBuilder();
+       }
+       public com.openxc.BinaryMessages.DiagnosticRequestOrBuilder getRequestOrBuilder() {
+         if (requestBuilder_ != null) {
+           return requestBuilder_.getMessageOrBuilder();
+         } else {
+           return request_;
+         }
+       }
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.DiagnosticRequest, com.openxc.BinaryMessages.DiagnosticRequest.Builder, com.openxc.BinaryMessages.DiagnosticRequestOrBuilder> 
+           getRequestFieldBuilder() {
+         if (requestBuilder_ == null) {
+           requestBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+               com.openxc.BinaryMessages.DiagnosticRequest, com.openxc.BinaryMessages.DiagnosticRequest.Builder, com.openxc.BinaryMessages.DiagnosticRequestOrBuilder>(
+                   request_,
+                   getParentForChildren(),
+                   isClean());
+           request_ = null;
+         }
+         return requestBuilder_;
+       }
+       
+       // optional .openxc.DiagnosticControlCommand.Action action = 2;
+       private com.openxc.BinaryMessages.DiagnosticControlCommand.Action action_ = com.openxc.BinaryMessages.DiagnosticControlCommand.Action.ADD;
+       public boolean hasAction() {
+         return ((bitField0_ & 0x00000002) == 0x00000002);
+       }
+       public com.openxc.BinaryMessages.DiagnosticControlCommand.Action getAction() {
+         return action_;
+       }
+       public Builder setAction(com.openxc.BinaryMessages.DiagnosticControlCommand.Action value) {
+         if (value == null) {
+           throw new NullPointerException();
+         }
+         bitField0_ |= 0x00000002;
+         action_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearAction() {
+         bitField0_ = (bitField0_ & ~0x00000002);
+         action_ = com.openxc.BinaryMessages.DiagnosticControlCommand.Action.ADD;
+         onChanged();
+         return this;
+       }
+       
+       // @@protoc_insertion_point(builder_scope:openxc.DiagnosticControlCommand)
+     }
+     
+     static {
+       defaultInstance = new DiagnosticControlCommand(true);
+       defaultInstance.initFields();
+     }
+     
+     // @@protoc_insertion_point(class_scope:openxc.DiagnosticControlCommand)
+   }
+   
+   public interface PassthroughModeControlCommandOrBuilder
+       extends com.google.protobuf.MessageOrBuilder {
+     
+     // optional int32 bus = 1;
+     boolean hasBus();
+     int getBus();
+     
+     // optional bool enabled = 2;
+     boolean hasEnabled();
+     boolean getEnabled();
+   }
+   public static final class PassthroughModeControlCommand extends
+       com.google.protobuf.GeneratedMessage
+       implements PassthroughModeControlCommandOrBuilder {
+     // Use PassthroughModeControlCommand.newBuilder() to construct.
+     private PassthroughModeControlCommand(Builder builder) {
+       super(builder);
+     }
+     private PassthroughModeControlCommand(boolean noInit) {}
+     
+     private static final PassthroughModeControlCommand defaultInstance;
+     public static PassthroughModeControlCommand getDefaultInstance() {
+       return defaultInstance;
+     }
+     
+     public PassthroughModeControlCommand getDefaultInstanceForType() {
+       return defaultInstance;
+     }
+     
+     public static final com.google.protobuf.Descriptors.Descriptor
+         getDescriptor() {
+       return com.openxc.BinaryMessages.internal_static_openxc_PassthroughModeControlCommand_descriptor;
+     }
+     
+     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+         internalGetFieldAccessorTable() {
+       return com.openxc.BinaryMessages.internal_static_openxc_PassthroughModeControlCommand_fieldAccessorTable;
+     }
+     
+     private int bitField0_;
+     // optional int32 bus = 1;
+     public static final int BUS_FIELD_NUMBER = 1;
+     private int bus_;
+     public boolean hasBus() {
+       return ((bitField0_ & 0x00000001) == 0x00000001);
+     }
+     public int getBus() {
+       return bus_;
+     }
+     
+     // optional bool enabled = 2;
+     public static final int ENABLED_FIELD_NUMBER = 2;
+     private boolean enabled_;
+     public boolean hasEnabled() {
+       return ((bitField0_ & 0x00000002) == 0x00000002);
+     }
+     public boolean getEnabled() {
+       return enabled_;
+     }
+     
+     private void initFields() {
+       bus_ = 0;
+       enabled_ = 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.writeInt32(1, bus_);
+       }
+       if (((bitField0_ & 0x00000002) == 0x00000002)) {
+         output.writeBool(2, enabled_);
+       }
+       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
+           .computeBoolSize(2, enabled_);
+       }
+       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 com.openxc.BinaryMessages.PassthroughModeControlCommand parseFrom(
+         com.google.protobuf.ByteString data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PassthroughModeControlCommand parseFrom(
+         com.google.protobuf.ByteString data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PassthroughModeControlCommand parseFrom(byte[] data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PassthroughModeControlCommand parseFrom(
+         byte[] data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PassthroughModeControlCommand parseFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PassthroughModeControlCommand parseFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PassthroughModeControlCommand parseDelimitedFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.PassthroughModeControlCommand parseDelimitedFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.PassthroughModeControlCommand parseFrom(
+         com.google.protobuf.CodedInputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PassthroughModeControlCommand parseFrom(
+         com.google.protobuf.CodedInputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     
+     public static Builder newBuilder() { return Builder.create(); }
+     public Builder newBuilderForType() { return newBuilder(); }
+     public static Builder newBuilder(com.openxc.BinaryMessages.PassthroughModeControlCommand 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;
+     }
+     public static final class Builder extends
+         com.google.protobuf.GeneratedMessage.Builder<Builder>
+        implements com.openxc.BinaryMessages.PassthroughModeControlCommandOrBuilder {
+       public static final com.google.protobuf.Descriptors.Descriptor
+           getDescriptor() {
+         return com.openxc.BinaryMessages.internal_static_openxc_PassthroughModeControlCommand_descriptor;
+       }
+       
+       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+           internalGetFieldAccessorTable() {
+         return com.openxc.BinaryMessages.internal_static_openxc_PassthroughModeControlCommand_fieldAccessorTable;
+       }
+       
+       // Construct using com.openxc.BinaryMessages.PassthroughModeControlCommand.newBuilder()
+       private Builder() {
+         maybeForceBuilderInitialization();
+       }
+       
+       private Builder(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);
+         enabled_ = false;
+         bitField0_ = (bitField0_ & ~0x00000002);
+         return this;
+       }
+       
+       public Builder clone() {
+         return create().mergeFrom(buildPartial());
+       }
+       
+       public com.google.protobuf.Descriptors.Descriptor
+           getDescriptorForType() {
+         return com.openxc.BinaryMessages.PassthroughModeControlCommand.getDescriptor();
+       }
+       
+       public com.openxc.BinaryMessages.PassthroughModeControlCommand getDefaultInstanceForType() {
+         return com.openxc.BinaryMessages.PassthroughModeControlCommand.getDefaultInstance();
+       }
+       
+       public com.openxc.BinaryMessages.PassthroughModeControlCommand build() {
+         com.openxc.BinaryMessages.PassthroughModeControlCommand result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(result);
+         }
+         return result;
+       }
+       
+       private com.openxc.BinaryMessages.PassthroughModeControlCommand buildParsed()
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         com.openxc.BinaryMessages.PassthroughModeControlCommand result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(
+             result).asInvalidProtocolBufferException();
+         }
+         return result;
+       }
+       
+       public com.openxc.BinaryMessages.PassthroughModeControlCommand buildPartial() {
+         com.openxc.BinaryMessages.PassthroughModeControlCommand result = new com.openxc.BinaryMessages.PassthroughModeControlCommand(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.enabled_ = enabled_;
+         result.bitField0_ = to_bitField0_;
+         onBuilt();
+         return result;
+       }
+       
+       public Builder mergeFrom(com.google.protobuf.Message other) {
+         if (other instanceof com.openxc.BinaryMessages.PassthroughModeControlCommand) {
+           return mergeFrom((com.openxc.BinaryMessages.PassthroughModeControlCommand)other);
+         } else {
+           super.mergeFrom(other);
+           return this;
+         }
+       }
+       
+       public Builder mergeFrom(com.openxc.BinaryMessages.PassthroughModeControlCommand other) {
+         if (other == com.openxc.BinaryMessages.PassthroughModeControlCommand.getDefaultInstance()) return this;
+         if (other.hasBus()) {
+           setBus(other.getBus());
+         }
+         if (other.hasEnabled()) {
+           setEnabled(other.getEnabled());
+         }
+         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 {
+         com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+           com.google.protobuf.UnknownFieldSet.newBuilder(
+             this.getUnknownFields());
+         while (true) {
+           int tag = input.readTag();
+           switch (tag) {
+             case 0:
+               this.setUnknownFields(unknownFields.build());
+               onChanged();
+               return this;
+             default: {
+               if (!parseUnknownField(input, unknownFields,
+                                      extensionRegistry, tag)) {
+                 this.setUnknownFields(unknownFields.build());
+                 onChanged();
+                 return this;
+               }
+               break;
+             }
+             case 8: {
+               bitField0_ |= 0x00000001;
+               bus_ = input.readInt32();
+               break;
+             }
+             case 16: {
+               bitField0_ |= 0x00000002;
+               enabled_ = input.readBool();
+               break;
+             }
+           }
+         }
+       }
+       
+       private int bitField0_;
+       
+       // optional int32 bus = 1;
+       private int bus_ ;
+       public boolean hasBus() {
+         return ((bitField0_ & 0x00000001) == 0x00000001);
+       }
+       public int getBus() {
+         return bus_;
+       }
+       public Builder setBus(int value) {
+         bitField0_ |= 0x00000001;
+         bus_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearBus() {
+         bitField0_ = (bitField0_ & ~0x00000001);
+         bus_ = 0;
+         onChanged();
+         return this;
+       }
+       
+       // optional bool enabled = 2;
+       private boolean enabled_ ;
+       public boolean hasEnabled() {
+         return ((bitField0_ & 0x00000002) == 0x00000002);
+       }
+       public boolean getEnabled() {
+         return enabled_;
+       }
+       public Builder setEnabled(boolean value) {
+         bitField0_ |= 0x00000002;
+         enabled_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearEnabled() {
+         bitField0_ = (bitField0_ & ~0x00000002);
+         enabled_ = false;
+         onChanged();
+         return this;
+       }
+       
+       // @@protoc_insertion_point(builder_scope:openxc.PassthroughModeControlCommand)
+     }
+     
+     static {
+       defaultInstance = new PassthroughModeControlCommand(true);
+       defaultInstance.initFields();
+     }
+     
+     // @@protoc_insertion_point(class_scope:openxc.PassthroughModeControlCommand)
+   }
+   
+   public interface AcceptanceFilterBypassCommandOrBuilder
+       extends com.google.protobuf.MessageOrBuilder {
+     
+     // optional int32 bus = 1;
+     boolean hasBus();
+     int getBus();
+     
+     // optional bool bypass = 2;
+     boolean hasBypass();
+     boolean getBypass();
+   }
+   public static final class AcceptanceFilterBypassCommand extends
+       com.google.protobuf.GeneratedMessage
+       implements AcceptanceFilterBypassCommandOrBuilder {
+     // Use AcceptanceFilterBypassCommand.newBuilder() to construct.
+     private AcceptanceFilterBypassCommand(Builder builder) {
+       super(builder);
+     }
+     private AcceptanceFilterBypassCommand(boolean noInit) {}
+     
+     private static final AcceptanceFilterBypassCommand defaultInstance;
+     public static AcceptanceFilterBypassCommand getDefaultInstance() {
+       return defaultInstance;
+     }
+     
+     public AcceptanceFilterBypassCommand getDefaultInstanceForType() {
+       return defaultInstance;
+     }
+     
+     public static final com.google.protobuf.Descriptors.Descriptor
+         getDescriptor() {
+       return com.openxc.BinaryMessages.internal_static_openxc_AcceptanceFilterBypassCommand_descriptor;
+     }
+     
+     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+         internalGetFieldAccessorTable() {
+       return com.openxc.BinaryMessages.internal_static_openxc_AcceptanceFilterBypassCommand_fieldAccessorTable;
+     }
+     
+     private int bitField0_;
+     // optional int32 bus = 1;
+     public static final int BUS_FIELD_NUMBER = 1;
+     private int bus_;
+     public boolean hasBus() {
+       return ((bitField0_ & 0x00000001) == 0x00000001);
+     }
+     public int getBus() {
+       return bus_;
+     }
+     
+     // optional bool bypass = 2;
+     public static final int BYPASS_FIELD_NUMBER = 2;
+     private boolean bypass_;
+     public boolean hasBypass() {
+       return ((bitField0_ & 0x00000002) == 0x00000002);
+     }
+     public boolean getBypass() {
+       return bypass_;
+     }
+     
+     private void initFields() {
+       bus_ = 0;
+       bypass_ = 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.writeInt32(1, bus_);
+       }
+       if (((bitField0_ & 0x00000002) == 0x00000002)) {
+         output.writeBool(2, bypass_);
+       }
+       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
+           .computeBoolSize(2, bypass_);
+       }
+       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 com.openxc.BinaryMessages.AcceptanceFilterBypassCommand parseFrom(
+         com.google.protobuf.ByteString data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.AcceptanceFilterBypassCommand parseFrom(
+         com.google.protobuf.ByteString data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.AcceptanceFilterBypassCommand parseFrom(byte[] data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.AcceptanceFilterBypassCommand parseFrom(
+         byte[] data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.AcceptanceFilterBypassCommand parseFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.AcceptanceFilterBypassCommand parseFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.AcceptanceFilterBypassCommand parseDelimitedFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.AcceptanceFilterBypassCommand parseDelimitedFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.AcceptanceFilterBypassCommand parseFrom(
+         com.google.protobuf.CodedInputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.AcceptanceFilterBypassCommand parseFrom(
+         com.google.protobuf.CodedInputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     
+     public static Builder newBuilder() { return Builder.create(); }
+     public Builder newBuilderForType() { return newBuilder(); }
+     public static Builder newBuilder(com.openxc.BinaryMessages.AcceptanceFilterBypassCommand 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;
+     }
+     public static final class Builder extends
+         com.google.protobuf.GeneratedMessage.Builder<Builder>
+        implements com.openxc.BinaryMessages.AcceptanceFilterBypassCommandOrBuilder {
+       public static final com.google.protobuf.Descriptors.Descriptor
+           getDescriptor() {
+         return com.openxc.BinaryMessages.internal_static_openxc_AcceptanceFilterBypassCommand_descriptor;
+       }
+       
+       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+           internalGetFieldAccessorTable() {
+         return com.openxc.BinaryMessages.internal_static_openxc_AcceptanceFilterBypassCommand_fieldAccessorTable;
+       }
+       
+       // Construct using com.openxc.BinaryMessages.AcceptanceFilterBypassCommand.newBuilder()
+       private Builder() {
+         maybeForceBuilderInitialization();
+       }
+       
+       private Builder(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);
+         bypass_ = false;
+         bitField0_ = (bitField0_ & ~0x00000002);
+         return this;
+       }
+       
+       public Builder clone() {
+         return create().mergeFrom(buildPartial());
+       }
+       
+       public com.google.protobuf.Descriptors.Descriptor
+           getDescriptorForType() {
+         return com.openxc.BinaryMessages.AcceptanceFilterBypassCommand.getDescriptor();
+       }
+       
+       public com.openxc.BinaryMessages.AcceptanceFilterBypassCommand getDefaultInstanceForType() {
+         return com.openxc.BinaryMessages.AcceptanceFilterBypassCommand.getDefaultInstance();
+       }
+       
+       public com.openxc.BinaryMessages.AcceptanceFilterBypassCommand build() {
+         com.openxc.BinaryMessages.AcceptanceFilterBypassCommand result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(result);
+         }
+         return result;
+       }
+       
+       private com.openxc.BinaryMessages.AcceptanceFilterBypassCommand buildParsed()
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         com.openxc.BinaryMessages.AcceptanceFilterBypassCommand result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(
+             result).asInvalidProtocolBufferException();
+         }
+         return result;
+       }
+       
+       public com.openxc.BinaryMessages.AcceptanceFilterBypassCommand buildPartial() {
+         com.openxc.BinaryMessages.AcceptanceFilterBypassCommand result = new com.openxc.BinaryMessages.AcceptanceFilterBypassCommand(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.bypass_ = bypass_;
+         result.bitField0_ = to_bitField0_;
+         onBuilt();
+         return result;
+       }
+       
+       public Builder mergeFrom(com.google.protobuf.Message other) {
+         if (other instanceof com.openxc.BinaryMessages.AcceptanceFilterBypassCommand) {
+           return mergeFrom((com.openxc.BinaryMessages.AcceptanceFilterBypassCommand)other);
+         } else {
+           super.mergeFrom(other);
+           return this;
+         }
+       }
+       
+       public Builder mergeFrom(com.openxc.BinaryMessages.AcceptanceFilterBypassCommand other) {
+         if (other == com.openxc.BinaryMessages.AcceptanceFilterBypassCommand.getDefaultInstance()) return this;
+         if (other.hasBus()) {
+           setBus(other.getBus());
+         }
+         if (other.hasBypass()) {
+           setBypass(other.getBypass());
+         }
+         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 {
+         com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+           com.google.protobuf.UnknownFieldSet.newBuilder(
+             this.getUnknownFields());
+         while (true) {
+           int tag = input.readTag();
+           switch (tag) {
+             case 0:
+               this.setUnknownFields(unknownFields.build());
+               onChanged();
+               return this;
+             default: {
+               if (!parseUnknownField(input, unknownFields,
+                                      extensionRegistry, tag)) {
+                 this.setUnknownFields(unknownFields.build());
+                 onChanged();
+                 return this;
+               }
+               break;
+             }
+             case 8: {
+               bitField0_ |= 0x00000001;
+               bus_ = input.readInt32();
+               break;
+             }
+             case 16: {
+               bitField0_ |= 0x00000002;
+               bypass_ = input.readBool();
+               break;
+             }
+           }
+         }
+       }
+       
+       private int bitField0_;
+       
+       // optional int32 bus = 1;
+       private int bus_ ;
+       public boolean hasBus() {
+         return ((bitField0_ & 0x00000001) == 0x00000001);
+       }
+       public int getBus() {
+         return bus_;
+       }
+       public Builder setBus(int value) {
+         bitField0_ |= 0x00000001;
+         bus_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearBus() {
+         bitField0_ = (bitField0_ & ~0x00000001);
+         bus_ = 0;
+         onChanged();
+         return this;
+       }
+       
+       // optional bool bypass = 2;
+       private boolean bypass_ ;
+       public boolean hasBypass() {
+         return ((bitField0_ & 0x00000002) == 0x00000002);
+       }
+       public boolean getBypass() {
+         return bypass_;
+       }
+       public Builder setBypass(boolean value) {
+         bitField0_ |= 0x00000002;
+         bypass_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearBypass() {
+         bitField0_ = (bitField0_ & ~0x00000002);
+         bypass_ = false;
+         onChanged();
+         return this;
+       }
+       
+       // @@protoc_insertion_point(builder_scope:openxc.AcceptanceFilterBypassCommand)
+     }
+     
+     static {
+       defaultInstance = new AcceptanceFilterBypassCommand(true);
+       defaultInstance.initFields();
+     }
+     
+     // @@protoc_insertion_point(class_scope:openxc.AcceptanceFilterBypassCommand)
+   }
+   
+   public interface PayloadFormatCommandOrBuilder
+       extends com.google.protobuf.MessageOrBuilder {
+     
+     // optional .openxc.PayloadFormatCommand.PayloadFormat format = 1;
+     boolean hasFormat();
+     com.openxc.BinaryMessages.PayloadFormatCommand.PayloadFormat getFormat();
+   }
+   public static final class PayloadFormatCommand extends
+       com.google.protobuf.GeneratedMessage
+       implements PayloadFormatCommandOrBuilder {
+     // Use PayloadFormatCommand.newBuilder() to construct.
+     private PayloadFormatCommand(Builder builder) {
+       super(builder);
+     }
+     private PayloadFormatCommand(boolean noInit) {}
+     
+     private static final PayloadFormatCommand defaultInstance;
+     public static PayloadFormatCommand getDefaultInstance() {
+       return defaultInstance;
+     }
+     
+     public PayloadFormatCommand getDefaultInstanceForType() {
+       return defaultInstance;
+     }
+     
+     public static final com.google.protobuf.Descriptors.Descriptor
+         getDescriptor() {
+       return com.openxc.BinaryMessages.internal_static_openxc_PayloadFormatCommand_descriptor;
+     }
+     
+     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+         internalGetFieldAccessorTable() {
+       return com.openxc.BinaryMessages.internal_static_openxc_PayloadFormatCommand_fieldAccessorTable;
+     }
+     
+     public enum PayloadFormat
+         implements com.google.protobuf.ProtocolMessageEnum {
+       JSON(0, 1),
+       PROTOBUF(1, 2),
+       MESSAGEPACK(2, 3),
+       ;
+       
+       public static final int JSON_VALUE = 1;
+       public static final int PROTOBUF_VALUE = 2;
+       public static final int MESSAGEPACK_VALUE = 3;
+       
+       
+       public final int getNumber() { return value; }
+       
+       public static PayloadFormat valueOf(int value) {
+         switch (value) {
+           case 1: return JSON;
+           case 2: return PROTOBUF;
+           case 3: return MESSAGEPACK;
+           default: return null;
+         }
+       }
+       
+       public static com.google.protobuf.Internal.EnumLiteMap<PayloadFormat>
+           internalGetValueMap() {
+         return internalValueMap;
+       }
+       private static com.google.protobuf.Internal.EnumLiteMap<PayloadFormat>
+           internalValueMap =
+             new com.google.protobuf.Internal.EnumLiteMap<PayloadFormat>() {
+               public PayloadFormat findValueByNumber(int number) {
+                 return PayloadFormat.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 com.openxc.BinaryMessages.PayloadFormatCommand.getDescriptor().getEnumTypes().get(0);
+       }
+       
+       private static final PayloadFormat[] VALUES = {
+         JSON, PROTOBUF, MESSAGEPACK, 
+       };
+       
+       public static PayloadFormat 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 PayloadFormat(int index, int value) {
+         this.index = index;
+         this.value = value;
+       }
+       
+       // @@protoc_insertion_point(enum_scope:openxc.PayloadFormatCommand.PayloadFormat)
+     }
+     
+     private int bitField0_;
+     // optional .openxc.PayloadFormatCommand.PayloadFormat format = 1;
+     public static final int FORMAT_FIELD_NUMBER = 1;
+     private com.openxc.BinaryMessages.PayloadFormatCommand.PayloadFormat format_;
+     public boolean hasFormat() {
+       return ((bitField0_ & 0x00000001) == 0x00000001);
+     }
+     public com.openxc.BinaryMessages.PayloadFormatCommand.PayloadFormat getFormat() {
+       return format_;
+     }
+     
+     private void initFields() {
+       format_ = com.openxc.BinaryMessages.PayloadFormatCommand.PayloadFormat.JSON;
+     }
+     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, format_.getNumber());
+       }
+       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, format_.getNumber());
+       }
+       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 com.openxc.BinaryMessages.PayloadFormatCommand parseFrom(
+         com.google.protobuf.ByteString data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PayloadFormatCommand parseFrom(
+         com.google.protobuf.ByteString data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PayloadFormatCommand parseFrom(byte[] data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PayloadFormatCommand parseFrom(
+         byte[] data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PayloadFormatCommand parseFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PayloadFormatCommand parseFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PayloadFormatCommand parseDelimitedFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.PayloadFormatCommand parseDelimitedFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.PayloadFormatCommand parseFrom(
+         com.google.protobuf.CodedInputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PayloadFormatCommand parseFrom(
+         com.google.protobuf.CodedInputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     
+     public static Builder newBuilder() { return Builder.create(); }
+     public Builder newBuilderForType() { return newBuilder(); }
+     public static Builder newBuilder(com.openxc.BinaryMessages.PayloadFormatCommand 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;
+     }
+     public static final class Builder extends
+         com.google.protobuf.GeneratedMessage.Builder<Builder>
+        implements com.openxc.BinaryMessages.PayloadFormatCommandOrBuilder {
+       public static final com.google.protobuf.Descriptors.Descriptor
+           getDescriptor() {
+         return com.openxc.BinaryMessages.internal_static_openxc_PayloadFormatCommand_descriptor;
+       }
+       
+       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+           internalGetFieldAccessorTable() {
+         return com.openxc.BinaryMessages.internal_static_openxc_PayloadFormatCommand_fieldAccessorTable;
+       }
+       
+       // Construct using com.openxc.BinaryMessages.PayloadFormatCommand.newBuilder()
+       private Builder() {
+         maybeForceBuilderInitialization();
+       }
+       
+       private Builder(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();
+         format_ = com.openxc.BinaryMessages.PayloadFormatCommand.PayloadFormat.JSON;
+         bitField0_ = (bitField0_ & ~0x00000001);
+         return this;
+       }
+       
+       public Builder clone() {
+         return create().mergeFrom(buildPartial());
+       }
+       
+       public com.google.protobuf.Descriptors.Descriptor
+           getDescriptorForType() {
+         return com.openxc.BinaryMessages.PayloadFormatCommand.getDescriptor();
+       }
+       
+       public com.openxc.BinaryMessages.PayloadFormatCommand getDefaultInstanceForType() {
+         return com.openxc.BinaryMessages.PayloadFormatCommand.getDefaultInstance();
+       }
+       
+       public com.openxc.BinaryMessages.PayloadFormatCommand build() {
+         com.openxc.BinaryMessages.PayloadFormatCommand result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(result);
+         }
+         return result;
+       }
+       
+       private com.openxc.BinaryMessages.PayloadFormatCommand buildParsed()
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         com.openxc.BinaryMessages.PayloadFormatCommand result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(
+             result).asInvalidProtocolBufferException();
+         }
+         return result;
+       }
+       
+       public com.openxc.BinaryMessages.PayloadFormatCommand buildPartial() {
+         com.openxc.BinaryMessages.PayloadFormatCommand result = new com.openxc.BinaryMessages.PayloadFormatCommand(this);
+         int from_bitField0_ = bitField0_;
+         int to_bitField0_ = 0;
+         if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+           to_bitField0_ |= 0x00000001;
+         }
+         result.format_ = format_;
+         result.bitField0_ = to_bitField0_;
+         onBuilt();
+         return result;
+       }
+       
+       public Builder mergeFrom(com.google.protobuf.Message other) {
+         if (other instanceof com.openxc.BinaryMessages.PayloadFormatCommand) {
+           return mergeFrom((com.openxc.BinaryMessages.PayloadFormatCommand)other);
+         } else {
+           super.mergeFrom(other);
+           return this;
+         }
+       }
+       
+       public Builder mergeFrom(com.openxc.BinaryMessages.PayloadFormatCommand other) {
+         if (other == com.openxc.BinaryMessages.PayloadFormatCommand.getDefaultInstance()) return this;
+         if (other.hasFormat()) {
+           setFormat(other.getFormat());
+         }
+         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 {
+         com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+           com.google.protobuf.UnknownFieldSet.newBuilder(
+             this.getUnknownFields());
+         while (true) {
+           int tag = input.readTag();
+           switch (tag) {
+             case 0:
+               this.setUnknownFields(unknownFields.build());
+               onChanged();
+               return this;
+             default: {
+               if (!parseUnknownField(input, unknownFields,
+                                      extensionRegistry, tag)) {
+                 this.setUnknownFields(unknownFields.build());
+                 onChanged();
+                 return this;
+               }
+               break;
+             }
+             case 8: {
+               int rawValue = input.readEnum();
+               com.openxc.BinaryMessages.PayloadFormatCommand.PayloadFormat value = com.openxc.BinaryMessages.PayloadFormatCommand.PayloadFormat.valueOf(rawValue);
+               if (value == null) {
+                 unknownFields.mergeVarintField(1, rawValue);
+               } else {
+                 bitField0_ |= 0x00000001;
+                 format_ = value;
+               }
+               break;
+             }
+           }
+         }
+       }
+       
+       private int bitField0_;
+       
+       // optional .openxc.PayloadFormatCommand.PayloadFormat format = 1;
+       private com.openxc.BinaryMessages.PayloadFormatCommand.PayloadFormat format_ = com.openxc.BinaryMessages.PayloadFormatCommand.PayloadFormat.JSON;
+       public boolean hasFormat() {
+         return ((bitField0_ & 0x00000001) == 0x00000001);
+       }
+       public com.openxc.BinaryMessages.PayloadFormatCommand.PayloadFormat getFormat() {
+         return format_;
+       }
+       public Builder setFormat(com.openxc.BinaryMessages.PayloadFormatCommand.PayloadFormat value) {
+         if (value == null) {
+           throw new NullPointerException();
+         }
+         bitField0_ |= 0x00000001;
+         format_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearFormat() {
+         bitField0_ = (bitField0_ & ~0x00000001);
+         format_ = com.openxc.BinaryMessages.PayloadFormatCommand.PayloadFormat.JSON;
+         onChanged();
+         return this;
+       }
+       
+       // @@protoc_insertion_point(builder_scope:openxc.PayloadFormatCommand)
+     }
+     
+     static {
+       defaultInstance = new PayloadFormatCommand(true);
+       defaultInstance.initFields();
+     }
+     
+     // @@protoc_insertion_point(class_scope:openxc.PayloadFormatCommand)
+   }
+   
+   public interface PredefinedObd2RequestsCommandOrBuilder
+       extends com.google.protobuf.MessageOrBuilder {
+     
+     // optional bool enabled = 1;
+     boolean hasEnabled();
+     boolean getEnabled();
+   }
+   public static final class PredefinedObd2RequestsCommand extends
+       com.google.protobuf.GeneratedMessage
+       implements PredefinedObd2RequestsCommandOrBuilder {
+     // Use PredefinedObd2RequestsCommand.newBuilder() to construct.
+     private PredefinedObd2RequestsCommand(Builder builder) {
+       super(builder);
+     }
+     private PredefinedObd2RequestsCommand(boolean noInit) {}
+     
+     private static final PredefinedObd2RequestsCommand defaultInstance;
+     public static PredefinedObd2RequestsCommand getDefaultInstance() {
+       return defaultInstance;
+     }
+     
+     public PredefinedObd2RequestsCommand getDefaultInstanceForType() {
+       return defaultInstance;
+     }
+     
+     public static final com.google.protobuf.Descriptors.Descriptor
+         getDescriptor() {
+       return com.openxc.BinaryMessages.internal_static_openxc_PredefinedObd2RequestsCommand_descriptor;
+     }
+     
+     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+         internalGetFieldAccessorTable() {
+       return com.openxc.BinaryMessages.internal_static_openxc_PredefinedObd2RequestsCommand_fieldAccessorTable;
+     }
+     
+     private int bitField0_;
+     // optional bool enabled = 1;
+     public static final int ENABLED_FIELD_NUMBER = 1;
+     private boolean enabled_;
+     public boolean hasEnabled() {
+       return ((bitField0_ & 0x00000001) == 0x00000001);
+     }
+     public boolean getEnabled() {
+       return enabled_;
+     }
+     
+     private void initFields() {
+       enabled_ = 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.writeBool(1, enabled_);
+       }
+       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
+           .computeBoolSize(1, enabled_);
+       }
+       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 com.openxc.BinaryMessages.PredefinedObd2RequestsCommand parseFrom(
+         com.google.protobuf.ByteString data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PredefinedObd2RequestsCommand parseFrom(
+         com.google.protobuf.ByteString data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PredefinedObd2RequestsCommand parseFrom(byte[] data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PredefinedObd2RequestsCommand parseFrom(
+         byte[] data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PredefinedObd2RequestsCommand parseFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PredefinedObd2RequestsCommand parseFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PredefinedObd2RequestsCommand parseDelimitedFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.PredefinedObd2RequestsCommand parseDelimitedFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.PredefinedObd2RequestsCommand parseFrom(
+         com.google.protobuf.CodedInputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.PredefinedObd2RequestsCommand parseFrom(
+         com.google.protobuf.CodedInputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     
+     public static Builder newBuilder() { return Builder.create(); }
+     public Builder newBuilderForType() { return newBuilder(); }
+     public static Builder newBuilder(com.openxc.BinaryMessages.PredefinedObd2RequestsCommand 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;
+     }
+     public static final class Builder extends
+         com.google.protobuf.GeneratedMessage.Builder<Builder>
+        implements com.openxc.BinaryMessages.PredefinedObd2RequestsCommandOrBuilder {
+       public static final com.google.protobuf.Descriptors.Descriptor
+           getDescriptor() {
+         return com.openxc.BinaryMessages.internal_static_openxc_PredefinedObd2RequestsCommand_descriptor;
+       }
+       
+       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+           internalGetFieldAccessorTable() {
+         return com.openxc.BinaryMessages.internal_static_openxc_PredefinedObd2RequestsCommand_fieldAccessorTable;
+       }
+       
+       // Construct using com.openxc.BinaryMessages.PredefinedObd2RequestsCommand.newBuilder()
+       private Builder() {
+         maybeForceBuilderInitialization();
+       }
+       
+       private Builder(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();
+         enabled_ = false;
+         bitField0_ = (bitField0_ & ~0x00000001);
+         return this;
+       }
+       
+       public Builder clone() {
+         return create().mergeFrom(buildPartial());
+       }
+       
+       public com.google.protobuf.Descriptors.Descriptor
+           getDescriptorForType() {
+         return com.openxc.BinaryMessages.PredefinedObd2RequestsCommand.getDescriptor();
+       }
+       
+       public com.openxc.BinaryMessages.PredefinedObd2RequestsCommand getDefaultInstanceForType() {
+         return com.openxc.BinaryMessages.PredefinedObd2RequestsCommand.getDefaultInstance();
+       }
+       
+       public com.openxc.BinaryMessages.PredefinedObd2RequestsCommand build() {
+         com.openxc.BinaryMessages.PredefinedObd2RequestsCommand result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(result);
+         }
+         return result;
+       }
+       
+       private com.openxc.BinaryMessages.PredefinedObd2RequestsCommand buildParsed()
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         com.openxc.BinaryMessages.PredefinedObd2RequestsCommand result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(
+             result).asInvalidProtocolBufferException();
+         }
+         return result;
+       }
+       
+       public com.openxc.BinaryMessages.PredefinedObd2RequestsCommand buildPartial() {
+         com.openxc.BinaryMessages.PredefinedObd2RequestsCommand result = new com.openxc.BinaryMessages.PredefinedObd2RequestsCommand(this);
+         int from_bitField0_ = bitField0_;
+         int to_bitField0_ = 0;
+         if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+           to_bitField0_ |= 0x00000001;
+         }
+         result.enabled_ = enabled_;
+         result.bitField0_ = to_bitField0_;
+         onBuilt();
+         return result;
+       }
+       
+       public Builder mergeFrom(com.google.protobuf.Message other) {
+         if (other instanceof com.openxc.BinaryMessages.PredefinedObd2RequestsCommand) {
+           return mergeFrom((com.openxc.BinaryMessages.PredefinedObd2RequestsCommand)other);
+         } else {
+           super.mergeFrom(other);
+           return this;
+         }
+       }
+       
+       public Builder mergeFrom(com.openxc.BinaryMessages.PredefinedObd2RequestsCommand other) {
+         if (other == com.openxc.BinaryMessages.PredefinedObd2RequestsCommand.getDefaultInstance()) return this;
+         if (other.hasEnabled()) {
+           setEnabled(other.getEnabled());
+         }
+         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 {
+         com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+           com.google.protobuf.UnknownFieldSet.newBuilder(
+             this.getUnknownFields());
+         while (true) {
+           int tag = input.readTag();
+           switch (tag) {
+             case 0:
+               this.setUnknownFields(unknownFields.build());
+               onChanged();
+               return this;
+             default: {
+               if (!parseUnknownField(input, unknownFields,
+                                      extensionRegistry, tag)) {
+                 this.setUnknownFields(unknownFields.build());
+                 onChanged();
+                 return this;
+               }
+               break;
+             }
+             case 8: {
+               bitField0_ |= 0x00000001;
+               enabled_ = input.readBool();
+               break;
+             }
+           }
+         }
+       }
+       
+       private int bitField0_;
+       
+       // optional bool enabled = 1;
+       private boolean enabled_ ;
+       public boolean hasEnabled() {
+         return ((bitField0_ & 0x00000001) == 0x00000001);
+       }
+       public boolean getEnabled() {
+         return enabled_;
+       }
+       public Builder setEnabled(boolean value) {
+         bitField0_ |= 0x00000001;
+         enabled_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearEnabled() {
+         bitField0_ = (bitField0_ & ~0x00000001);
+         enabled_ = false;
+         onChanged();
+         return this;
+       }
+       
+       // @@protoc_insertion_point(builder_scope:openxc.PredefinedObd2RequestsCommand)
+     }
+     
+     static {
+       defaultInstance = new PredefinedObd2RequestsCommand(true);
+       defaultInstance.initFields();
+     }
+     
+     // @@protoc_insertion_point(class_scope:openxc.PredefinedObd2RequestsCommand)
+   }
+   
+   public interface NetworkOperatorSettingsOrBuilder
+       extends com.google.protobuf.MessageOrBuilder {
+     
+     // optional bool allowDataRoaming = 1;
+     boolean hasAllowDataRoaming();
+     boolean getAllowDataRoaming();
+     
+     // optional .openxc.NetworkOperatorSettings.OperatorSelectMode operatorSelectMode = 2;
+     boolean hasOperatorSelectMode();
+     com.openxc.BinaryMessages.NetworkOperatorSettings.OperatorSelectMode getOperatorSelectMode();
+     
+     // optional .openxc.NetworkOperatorSettings.NetworkDescriptor networkDescriptor = 3;
+     boolean hasNetworkDescriptor();
+     com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor getNetworkDescriptor();
+     com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptorOrBuilder getNetworkDescriptorOrBuilder();
+   }
+   public static final class NetworkOperatorSettings extends
+       com.google.protobuf.GeneratedMessage
+       implements NetworkOperatorSettingsOrBuilder {
+     // Use NetworkOperatorSettings.newBuilder() to construct.
+     private NetworkOperatorSettings(Builder builder) {
+       super(builder);
+     }
+     private NetworkOperatorSettings(boolean noInit) {}
+     
+     private static final NetworkOperatorSettings defaultInstance;
+     public static NetworkOperatorSettings getDefaultInstance() {
+       return defaultInstance;
+     }
+     
+     public NetworkOperatorSettings getDefaultInstanceForType() {
+       return defaultInstance;
+     }
+     
+     public static final com.google.protobuf.Descriptors.Descriptor
+         getDescriptor() {
+       return com.openxc.BinaryMessages.internal_static_openxc_NetworkOperatorSettings_descriptor;
+     }
+     
+     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+         internalGetFieldAccessorTable() {
+       return com.openxc.BinaryMessages.internal_static_openxc_NetworkOperatorSettings_fieldAccessorTable;
+     }
+     
+     public enum OperatorSelectMode
+         implements com.google.protobuf.ProtocolMessageEnum {
+       AUTOMATIC(0, 0),
+       MANUAL(1, 1),
+       DEREGISTER(2, 2),
+       SET_ONLY(3, 3),
+       MANUAL_AUTOMATIC(4, 4),
+       ;
+       
+       public static final int AUTOMATIC_VALUE = 0;
+       public static final int MANUAL_VALUE = 1;
+       public static final int DEREGISTER_VALUE = 2;
+       public static final int SET_ONLY_VALUE = 3;
+       public static final int MANUAL_AUTOMATIC_VALUE = 4;
+       
+       
+       public final int getNumber() { return value; }
+       
+       public static OperatorSelectMode valueOf(int value) {
+         switch (value) {
+           case 0: return AUTOMATIC;
+           case 1: return MANUAL;
+           case 2: return DEREGISTER;
+           case 3: return SET_ONLY;
+           case 4: return MANUAL_AUTOMATIC;
+           default: return null;
+         }
+       }
+       
+       public static com.google.protobuf.Internal.EnumLiteMap<OperatorSelectMode>
+           internalGetValueMap() {
+         return internalValueMap;
+       }
+       private static com.google.protobuf.Internal.EnumLiteMap<OperatorSelectMode>
+           internalValueMap =
+             new com.google.protobuf.Internal.EnumLiteMap<OperatorSelectMode>() {
+               public OperatorSelectMode findValueByNumber(int number) {
+                 return OperatorSelectMode.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 com.openxc.BinaryMessages.NetworkOperatorSettings.getDescriptor().getEnumTypes().get(0);
+       }
+       
+       private static final OperatorSelectMode[] VALUES = {
+         AUTOMATIC, MANUAL, DEREGISTER, SET_ONLY, MANUAL_AUTOMATIC, 
+       };
+       
+       public static OperatorSelectMode 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 OperatorSelectMode(int index, int value) {
+         this.index = index;
+         this.value = value;
+       }
+       
+       // @@protoc_insertion_point(enum_scope:openxc.NetworkOperatorSettings.OperatorSelectMode)
+     }
+     
+     public interface NetworkDescriptorOrBuilder
+         extends com.google.protobuf.MessageOrBuilder {
+       
+       // optional uint32 PLMN = 1;
+       boolean hasPLMN();
+       int getPLMN();
+       
+       // optional .openxc.NetworkOperatorSettings.NetworkDescriptor.NetworkType networkType = 2;
+       boolean hasNetworkType();
+       com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.NetworkType getNetworkType();
+     }
+     public static final class NetworkDescriptor extends
+         com.google.protobuf.GeneratedMessage
+         implements NetworkDescriptorOrBuilder {
+       // Use NetworkDescriptor.newBuilder() to construct.
+       private NetworkDescriptor(Builder builder) {
+         super(builder);
+       }
+       private NetworkDescriptor(boolean noInit) {}
+       
+       private static final NetworkDescriptor defaultInstance;
+       public static NetworkDescriptor getDefaultInstance() {
+         return defaultInstance;
+       }
+       
+       public NetworkDescriptor getDefaultInstanceForType() {
+         return defaultInstance;
+       }
+       
+       public static final com.google.protobuf.Descriptors.Descriptor
+           getDescriptor() {
+         return com.openxc.BinaryMessages.internal_static_openxc_NetworkOperatorSettings_NetworkDescriptor_descriptor;
+       }
+       
+       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+           internalGetFieldAccessorTable() {
+         return com.openxc.BinaryMessages.internal_static_openxc_NetworkOperatorSettings_NetworkDescriptor_fieldAccessorTable;
+       }
+       
+       public enum NetworkType
+           implements com.google.protobuf.ProtocolMessageEnum {
+         GSM(0, 0),
+         UTRAN(1, 2),
+         ;
+         
+         public static final int GSM_VALUE = 0;
+         public static final int UTRAN_VALUE = 2;
+         
+         
+         public final int getNumber() { return value; }
+         
+         public static NetworkType valueOf(int value) {
+           switch (value) {
+             case 0: return GSM;
+             case 2: return UTRAN;
+             default: return null;
+           }
+         }
+         
+         public static com.google.protobuf.Internal.EnumLiteMap<NetworkType>
+             internalGetValueMap() {
+           return internalValueMap;
+         }
+         private static com.google.protobuf.Internal.EnumLiteMap<NetworkType>
+             internalValueMap =
+               new com.google.protobuf.Internal.EnumLiteMap<NetworkType>() {
+                 public NetworkType findValueByNumber(int number) {
+                   return NetworkType.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 com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.getDescriptor().getEnumTypes().get(0);
+         }
+         
+         private static final NetworkType[] VALUES = {
+           GSM, UTRAN, 
+         };
+         
+         public static NetworkType 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 NetworkType(int index, int value) {
+           this.index = index;
+           this.value = value;
+         }
+         
+         // @@protoc_insertion_point(enum_scope:openxc.NetworkOperatorSettings.NetworkDescriptor.NetworkType)
+       }
+       
+       private int bitField0_;
+       // optional uint32 PLMN = 1;
+       public static final int PLMN_FIELD_NUMBER = 1;
+       private int pLMN_;
+       public boolean hasPLMN() {
+         return ((bitField0_ & 0x00000001) == 0x00000001);
+       }
+       public int getPLMN() {
+         return pLMN_;
+       }
+       
+       // optional .openxc.NetworkOperatorSettings.NetworkDescriptor.NetworkType networkType = 2;
+       public static final int NETWORKTYPE_FIELD_NUMBER = 2;
+       private com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.NetworkType networkType_;
+       public boolean hasNetworkType() {
+         return ((bitField0_ & 0x00000002) == 0x00000002);
+       }
+       public com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.NetworkType getNetworkType() {
+         return networkType_;
+       }
+       
+       private void initFields() {
+         pLMN_ = 0;
+         networkType_ = com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.NetworkType.GSM;
+       }
+       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.writeUInt32(1, pLMN_);
+         }
+         if (((bitField0_ & 0x00000002) == 0x00000002)) {
+           output.writeEnum(2, networkType_.getNumber());
+         }
+         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
+             .computeUInt32Size(1, pLMN_);
+         }
+         if (((bitField0_ & 0x00000002) == 0x00000002)) {
+           size += com.google.protobuf.CodedOutputStream
+             .computeEnumSize(2, networkType_.getNumber());
+         }
+         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 com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor parseFrom(
+           com.google.protobuf.ByteString data)
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         return newBuilder().mergeFrom(data).buildParsed();
+       }
+       public static com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor parseFrom(
+           com.google.protobuf.ByteString data,
+           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         return newBuilder().mergeFrom(data, extensionRegistry)
+                  .buildParsed();
+       }
+       public static com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor parseFrom(byte[] data)
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         return newBuilder().mergeFrom(data).buildParsed();
+       }
+       public static com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor parseFrom(
+           byte[] data,
+           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         return newBuilder().mergeFrom(data, extensionRegistry)
+                  .buildParsed();
+       }
+       public static com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor parseFrom(java.io.InputStream input)
+           throws java.io.IOException {
+         return newBuilder().mergeFrom(input).buildParsed();
+       }
+       public static com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor parseFrom(
+           java.io.InputStream input,
+           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+           throws java.io.IOException {
+         return newBuilder().mergeFrom(input, extensionRegistry)
+                  .buildParsed();
+       }
+       public static com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor parseDelimitedFrom(java.io.InputStream input)
+           throws java.io.IOException {
+         Builder builder = newBuilder();
+         if (builder.mergeDelimitedFrom(input)) {
+           return builder.buildParsed();
+         } else {
+           return null;
+         }
+       }
+       public static com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor parseDelimitedFrom(
+           java.io.InputStream input,
+           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+           throws java.io.IOException {
+         Builder builder = newBuilder();
+         if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+           return builder.buildParsed();
+         } else {
+           return null;
+         }
+       }
+       public static com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor parseFrom(
+           com.google.protobuf.CodedInputStream input)
+           throws java.io.IOException {
+         return newBuilder().mergeFrom(input).buildParsed();
+       }
+       public static com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor parseFrom(
+           com.google.protobuf.CodedInputStream input,
+           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+           throws java.io.IOException {
+         return newBuilder().mergeFrom(input, extensionRegistry)
+                  .buildParsed();
+       }
+       
+       public static Builder newBuilder() { return Builder.create(); }
+       public Builder newBuilderForType() { return newBuilder(); }
+       public static Builder newBuilder(com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor 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;
+       }
+       public static final class Builder extends
+           com.google.protobuf.GeneratedMessage.Builder<Builder>
+          implements com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptorOrBuilder {
+         public static final com.google.protobuf.Descriptors.Descriptor
+             getDescriptor() {
+           return com.openxc.BinaryMessages.internal_static_openxc_NetworkOperatorSettings_NetworkDescriptor_descriptor;
+         }
+         
+         protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+             internalGetFieldAccessorTable() {
+           return com.openxc.BinaryMessages.internal_static_openxc_NetworkOperatorSettings_NetworkDescriptor_fieldAccessorTable;
+         }
+         
+         // Construct using com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.newBuilder()
+         private Builder() {
+           maybeForceBuilderInitialization();
+         }
+         
+         private Builder(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();
+           pLMN_ = 0;
+           bitField0_ = (bitField0_ & ~0x00000001);
+           networkType_ = com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.NetworkType.GSM;
+           bitField0_ = (bitField0_ & ~0x00000002);
+           return this;
+         }
+         
+         public Builder clone() {
+           return create().mergeFrom(buildPartial());
+         }
+         
+         public com.google.protobuf.Descriptors.Descriptor
+             getDescriptorForType() {
+           return com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.getDescriptor();
+         }
+         
+         public com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor getDefaultInstanceForType() {
+           return com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.getDefaultInstance();
+         }
+         
+         public com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor build() {
+           com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor result = buildPartial();
+           if (!result.isInitialized()) {
+             throw newUninitializedMessageException(result);
+           }
+           return result;
+         }
+         
+         private com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor buildParsed()
+             throws com.google.protobuf.InvalidProtocolBufferException {
+           com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor result = buildPartial();
+           if (!result.isInitialized()) {
+             throw newUninitializedMessageException(
+               result).asInvalidProtocolBufferException();
+           }
+           return result;
+         }
+         
+         public com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor buildPartial() {
+           com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor result = new com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor(this);
+           int from_bitField0_ = bitField0_;
+           int to_bitField0_ = 0;
+           if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+             to_bitField0_ |= 0x00000001;
+           }
+           result.pLMN_ = pLMN_;
+           if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+             to_bitField0_ |= 0x00000002;
+           }
+           result.networkType_ = networkType_;
+           result.bitField0_ = to_bitField0_;
+           onBuilt();
+           return result;
+         }
+         
+         public Builder mergeFrom(com.google.protobuf.Message other) {
+           if (other instanceof com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor) {
+             return mergeFrom((com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor)other);
+           } else {
+             super.mergeFrom(other);
+             return this;
+           }
+         }
+         
+         public Builder mergeFrom(com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor other) {
+           if (other == com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.getDefaultInstance()) return this;
+           if (other.hasPLMN()) {
+             setPLMN(other.getPLMN());
+           }
+           if (other.hasNetworkType()) {
+             setNetworkType(other.getNetworkType());
+           }
+           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 {
+           com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+             com.google.protobuf.UnknownFieldSet.newBuilder(
+               this.getUnknownFields());
+           while (true) {
+             int tag = input.readTag();
+             switch (tag) {
+               case 0:
+                 this.setUnknownFields(unknownFields.build());
+                 onChanged();
+                 return this;
+               default: {
+                 if (!parseUnknownField(input, unknownFields,
+                                        extensionRegistry, tag)) {
+                   this.setUnknownFields(unknownFields.build());
+                   onChanged();
+                   return this;
+                 }
+                 break;
+               }
+               case 8: {
+                 bitField0_ |= 0x00000001;
+                 pLMN_ = input.readUInt32();
+                 break;
+               }
+               case 16: {
+                 int rawValue = input.readEnum();
+                 com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.NetworkType value = com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.NetworkType.valueOf(rawValue);
+                 if (value == null) {
+                   unknownFields.mergeVarintField(2, rawValue);
+                 } else {
+                   bitField0_ |= 0x00000002;
+                   networkType_ = value;
+                 }
+                 break;
+               }
+             }
+           }
+         }
+         
+         private int bitField0_;
+         
+         // optional uint32 PLMN = 1;
+         private int pLMN_ ;
+         public boolean hasPLMN() {
+           return ((bitField0_ & 0x00000001) == 0x00000001);
+         }
+         public int getPLMN() {
+           return pLMN_;
+         }
+         public Builder setPLMN(int value) {
+           bitField0_ |= 0x00000001;
+           pLMN_ = value;
+           onChanged();
+           return this;
+         }
+         public Builder clearPLMN() {
+           bitField0_ = (bitField0_ & ~0x00000001);
+           pLMN_ = 0;
+           onChanged();
+           return this;
+         }
+         
+         // optional .openxc.NetworkOperatorSettings.NetworkDescriptor.NetworkType networkType = 2;
+         private com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.NetworkType networkType_ = com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.NetworkType.GSM;
+         public boolean hasNetworkType() {
+           return ((bitField0_ & 0x00000002) == 0x00000002);
+         }
+         public com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.NetworkType getNetworkType() {
+           return networkType_;
+         }
+         public Builder setNetworkType(com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.NetworkType value) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           bitField0_ |= 0x00000002;
+           networkType_ = value;
+           onChanged();
+           return this;
+         }
+         public Builder clearNetworkType() {
+           bitField0_ = (bitField0_ & ~0x00000002);
+           networkType_ = com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.NetworkType.GSM;
+           onChanged();
+           return this;
+         }
+         
+         // @@protoc_insertion_point(builder_scope:openxc.NetworkOperatorSettings.NetworkDescriptor)
+       }
+       
+       static {
+         defaultInstance = new NetworkDescriptor(true);
+         defaultInstance.initFields();
+       }
+       
+       // @@protoc_insertion_point(class_scope:openxc.NetworkOperatorSettings.NetworkDescriptor)
+     }
+     
+     private int bitField0_;
+     // optional bool allowDataRoaming = 1;
+     public static final int ALLOWDATAROAMING_FIELD_NUMBER = 1;
+     private boolean allowDataRoaming_;
+     public boolean hasAllowDataRoaming() {
+       return ((bitField0_ & 0x00000001) == 0x00000001);
+     }
+     public boolean getAllowDataRoaming() {
+       return allowDataRoaming_;
+     }
+     
+     // optional .openxc.NetworkOperatorSettings.OperatorSelectMode operatorSelectMode = 2;
+     public static final int OPERATORSELECTMODE_FIELD_NUMBER = 2;
+     private com.openxc.BinaryMessages.NetworkOperatorSettings.OperatorSelectMode operatorSelectMode_;
+     public boolean hasOperatorSelectMode() {
+       return ((bitField0_ & 0x00000002) == 0x00000002);
+     }
+     public com.openxc.BinaryMessages.NetworkOperatorSettings.OperatorSelectMode getOperatorSelectMode() {
+       return operatorSelectMode_;
+     }
+     
+     // optional .openxc.NetworkOperatorSettings.NetworkDescriptor networkDescriptor = 3;
+     public static final int NETWORKDESCRIPTOR_FIELD_NUMBER = 3;
+     private com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor networkDescriptor_;
+     public boolean hasNetworkDescriptor() {
+       return ((bitField0_ & 0x00000004) == 0x00000004);
+     }
+     public com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor getNetworkDescriptor() {
+       return networkDescriptor_;
+     }
+     public com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptorOrBuilder getNetworkDescriptorOrBuilder() {
+       return networkDescriptor_;
+     }
+     
+     private void initFields() {
+       allowDataRoaming_ = false;
+       operatorSelectMode_ = com.openxc.BinaryMessages.NetworkOperatorSettings.OperatorSelectMode.AUTOMATIC;
+       networkDescriptor_ = com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.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.writeBool(1, allowDataRoaming_);
+       }
+       if (((bitField0_ & 0x00000002) == 0x00000002)) {
+         output.writeEnum(2, operatorSelectMode_.getNumber());
+       }
+       if (((bitField0_ & 0x00000004) == 0x00000004)) {
+         output.writeMessage(3, networkDescriptor_);
+       }
+       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
+           .computeBoolSize(1, allowDataRoaming_);
+       }
+       if (((bitField0_ & 0x00000002) == 0x00000002)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeEnumSize(2, operatorSelectMode_.getNumber());
+       }
+       if (((bitField0_ & 0x00000004) == 0x00000004)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeMessageSize(3, networkDescriptor_);
+       }
+       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 com.openxc.BinaryMessages.NetworkOperatorSettings parseFrom(
+         com.google.protobuf.ByteString data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.NetworkOperatorSettings parseFrom(
+         com.google.protobuf.ByteString data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.NetworkOperatorSettings parseFrom(byte[] data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.NetworkOperatorSettings parseFrom(
+         byte[] data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.NetworkOperatorSettings parseFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.NetworkOperatorSettings parseFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.NetworkOperatorSettings parseDelimitedFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.NetworkOperatorSettings parseDelimitedFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.NetworkOperatorSettings parseFrom(
+         com.google.protobuf.CodedInputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.NetworkOperatorSettings parseFrom(
+         com.google.protobuf.CodedInputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     
+     public static Builder newBuilder() { return Builder.create(); }
+     public Builder newBuilderForType() { return newBuilder(); }
+     public static Builder newBuilder(com.openxc.BinaryMessages.NetworkOperatorSettings 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;
+     }
+     public static final class Builder extends
+         com.google.protobuf.GeneratedMessage.Builder<Builder>
+        implements com.openxc.BinaryMessages.NetworkOperatorSettingsOrBuilder {
+       public static final com.google.protobuf.Descriptors.Descriptor
+           getDescriptor() {
+         return com.openxc.BinaryMessages.internal_static_openxc_NetworkOperatorSettings_descriptor;
+       }
+       
+       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+           internalGetFieldAccessorTable() {
+         return com.openxc.BinaryMessages.internal_static_openxc_NetworkOperatorSettings_fieldAccessorTable;
+       }
+       
+       // Construct using com.openxc.BinaryMessages.NetworkOperatorSettings.newBuilder()
+       private Builder() {
+         maybeForceBuilderInitialization();
+       }
+       
+       private Builder(BuilderParent parent) {
+         super(parent);
+         maybeForceBuilderInitialization();
+       }
+       private void maybeForceBuilderInitialization() {
+         if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+           getNetworkDescriptorFieldBuilder();
+         }
+       }
+       private static Builder create() {
+         return new Builder();
+       }
+       
+       public Builder clear() {
+         super.clear();
+         allowDataRoaming_ = false;
+         bitField0_ = (bitField0_ & ~0x00000001);
+         operatorSelectMode_ = com.openxc.BinaryMessages.NetworkOperatorSettings.OperatorSelectMode.AUTOMATIC;
+         bitField0_ = (bitField0_ & ~0x00000002);
+         if (networkDescriptorBuilder_ == null) {
+           networkDescriptor_ = com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.getDefaultInstance();
+         } else {
+           networkDescriptorBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000004);
+         return this;
+       }
+       
+       public Builder clone() {
+         return create().mergeFrom(buildPartial());
+       }
+       
+       public com.google.protobuf.Descriptors.Descriptor
+           getDescriptorForType() {
+         return com.openxc.BinaryMessages.NetworkOperatorSettings.getDescriptor();
+       }
+       
+       public com.openxc.BinaryMessages.NetworkOperatorSettings getDefaultInstanceForType() {
+         return com.openxc.BinaryMessages.NetworkOperatorSettings.getDefaultInstance();
+       }
+       
+       public com.openxc.BinaryMessages.NetworkOperatorSettings build() {
+         com.openxc.BinaryMessages.NetworkOperatorSettings result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(result);
+         }
+         return result;
+       }
+       
+       private com.openxc.BinaryMessages.NetworkOperatorSettings buildParsed()
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         com.openxc.BinaryMessages.NetworkOperatorSettings result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(
+             result).asInvalidProtocolBufferException();
+         }
+         return result;
+       }
+       
+       public com.openxc.BinaryMessages.NetworkOperatorSettings buildPartial() {
+         com.openxc.BinaryMessages.NetworkOperatorSettings result = new com.openxc.BinaryMessages.NetworkOperatorSettings(this);
+         int from_bitField0_ = bitField0_;
+         int to_bitField0_ = 0;
+         if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+           to_bitField0_ |= 0x00000001;
+         }
+         result.allowDataRoaming_ = allowDataRoaming_;
+         if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+           to_bitField0_ |= 0x00000002;
+         }
+         result.operatorSelectMode_ = operatorSelectMode_;
+         if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+           to_bitField0_ |= 0x00000004;
+         }
+         if (networkDescriptorBuilder_ == null) {
+           result.networkDescriptor_ = networkDescriptor_;
+         } else {
+           result.networkDescriptor_ = networkDescriptorBuilder_.build();
+         }
+         result.bitField0_ = to_bitField0_;
+         onBuilt();
+         return result;
+       }
+       
+       public Builder mergeFrom(com.google.protobuf.Message other) {
+         if (other instanceof com.openxc.BinaryMessages.NetworkOperatorSettings) {
+           return mergeFrom((com.openxc.BinaryMessages.NetworkOperatorSettings)other);
+         } else {
+           super.mergeFrom(other);
+           return this;
+         }
+       }
+       
+       public Builder mergeFrom(com.openxc.BinaryMessages.NetworkOperatorSettings other) {
+         if (other == com.openxc.BinaryMessages.NetworkOperatorSettings.getDefaultInstance()) return this;
+         if (other.hasAllowDataRoaming()) {
+           setAllowDataRoaming(other.getAllowDataRoaming());
+         }
+         if (other.hasOperatorSelectMode()) {
+           setOperatorSelectMode(other.getOperatorSelectMode());
+         }
+         if (other.hasNetworkDescriptor()) {
+           mergeNetworkDescriptor(other.getNetworkDescriptor());
+         }
+         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 {
+         com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+           com.google.protobuf.UnknownFieldSet.newBuilder(
+             this.getUnknownFields());
+         while (true) {
+           int tag = input.readTag();
+           switch (tag) {
+             case 0:
+               this.setUnknownFields(unknownFields.build());
+               onChanged();
+               return this;
+             default: {
+               if (!parseUnknownField(input, unknownFields,
+                                      extensionRegistry, tag)) {
+                 this.setUnknownFields(unknownFields.build());
+                 onChanged();
+                 return this;
+               }
+               break;
+             }
+             case 8: {
+               bitField0_ |= 0x00000001;
+               allowDataRoaming_ = input.readBool();
+               break;
+             }
+             case 16: {
+               int rawValue = input.readEnum();
+               com.openxc.BinaryMessages.NetworkOperatorSettings.OperatorSelectMode value = com.openxc.BinaryMessages.NetworkOperatorSettings.OperatorSelectMode.valueOf(rawValue);
+               if (value == null) {
+                 unknownFields.mergeVarintField(2, rawValue);
+               } else {
+                 bitField0_ |= 0x00000002;
+                 operatorSelectMode_ = value;
+               }
+               break;
+             }
+             case 26: {
+               com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.Builder subBuilder = com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.newBuilder();
+               if (hasNetworkDescriptor()) {
+                 subBuilder.mergeFrom(getNetworkDescriptor());
+               }
+               input.readMessage(subBuilder, extensionRegistry);
+               setNetworkDescriptor(subBuilder.buildPartial());
+               break;
+             }
+           }
+         }
+       }
+       
+       private int bitField0_;
+       
+       // optional bool allowDataRoaming = 1;
+       private boolean allowDataRoaming_ ;
+       public boolean hasAllowDataRoaming() {
+         return ((bitField0_ & 0x00000001) == 0x00000001);
+       }
+       public boolean getAllowDataRoaming() {
+         return allowDataRoaming_;
+       }
+       public Builder setAllowDataRoaming(boolean value) {
+         bitField0_ |= 0x00000001;
+         allowDataRoaming_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearAllowDataRoaming() {
+         bitField0_ = (bitField0_ & ~0x00000001);
+         allowDataRoaming_ = false;
+         onChanged();
+         return this;
+       }
+       
+       // optional .openxc.NetworkOperatorSettings.OperatorSelectMode operatorSelectMode = 2;
+       private com.openxc.BinaryMessages.NetworkOperatorSettings.OperatorSelectMode operatorSelectMode_ = com.openxc.BinaryMessages.NetworkOperatorSettings.OperatorSelectMode.AUTOMATIC;
+       public boolean hasOperatorSelectMode() {
+         return ((bitField0_ & 0x00000002) == 0x00000002);
+       }
+       public com.openxc.BinaryMessages.NetworkOperatorSettings.OperatorSelectMode getOperatorSelectMode() {
+         return operatorSelectMode_;
+       }
+       public Builder setOperatorSelectMode(com.openxc.BinaryMessages.NetworkOperatorSettings.OperatorSelectMode value) {
+         if (value == null) {
+           throw new NullPointerException();
+         }
+         bitField0_ |= 0x00000002;
+         operatorSelectMode_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearOperatorSelectMode() {
+         bitField0_ = (bitField0_ & ~0x00000002);
+         operatorSelectMode_ = com.openxc.BinaryMessages.NetworkOperatorSettings.OperatorSelectMode.AUTOMATIC;
+         onChanged();
+         return this;
+       }
+       
+       // optional .openxc.NetworkOperatorSettings.NetworkDescriptor networkDescriptor = 3;
+       private com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor networkDescriptor_ = com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.getDefaultInstance();
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor, com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.Builder, com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptorOrBuilder> networkDescriptorBuilder_;
+       public boolean hasNetworkDescriptor() {
+         return ((bitField0_ & 0x00000004) == 0x00000004);
+       }
+       public com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor getNetworkDescriptor() {
+         if (networkDescriptorBuilder_ == null) {
+           return networkDescriptor_;
+         } else {
+           return networkDescriptorBuilder_.getMessage();
+         }
+       }
+       public Builder setNetworkDescriptor(com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor value) {
+         if (networkDescriptorBuilder_ == null) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           networkDescriptor_ = value;
+           onChanged();
+         } else {
+           networkDescriptorBuilder_.setMessage(value);
+         }
+         bitField0_ |= 0x00000004;
+         return this;
+       }
+       public Builder setNetworkDescriptor(
+           com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.Builder builderForValue) {
+         if (networkDescriptorBuilder_ == null) {
+           networkDescriptor_ = builderForValue.build();
+           onChanged();
+         } else {
+           networkDescriptorBuilder_.setMessage(builderForValue.build());
+         }
+         bitField0_ |= 0x00000004;
+         return this;
+       }
+       public Builder mergeNetworkDescriptor(com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor value) {
+         if (networkDescriptorBuilder_ == null) {
+           if (((bitField0_ & 0x00000004) == 0x00000004) &&
+               networkDescriptor_ != com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.getDefaultInstance()) {
+             networkDescriptor_ =
+               com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.newBuilder(networkDescriptor_).mergeFrom(value).buildPartial();
+           } else {
+             networkDescriptor_ = value;
+           }
+           onChanged();
+         } else {
+           networkDescriptorBuilder_.mergeFrom(value);
+         }
+         bitField0_ |= 0x00000004;
+         return this;
+       }
+       public Builder clearNetworkDescriptor() {
+         if (networkDescriptorBuilder_ == null) {
+           networkDescriptor_ = com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.getDefaultInstance();
+           onChanged();
+         } else {
+           networkDescriptorBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000004);
+         return this;
+       }
+       public com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.Builder getNetworkDescriptorBuilder() {
+         bitField0_ |= 0x00000004;
+         onChanged();
+         return getNetworkDescriptorFieldBuilder().getBuilder();
+       }
+       public com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptorOrBuilder getNetworkDescriptorOrBuilder() {
+         if (networkDescriptorBuilder_ != null) {
+           return networkDescriptorBuilder_.getMessageOrBuilder();
+         } else {
+           return networkDescriptor_;
+         }
+       }
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor, com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.Builder, com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptorOrBuilder> 
+           getNetworkDescriptorFieldBuilder() {
+         if (networkDescriptorBuilder_ == null) {
+           networkDescriptorBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+               com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor, com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.Builder, com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptorOrBuilder>(
+                   networkDescriptor_,
+                   getParentForChildren(),
+                   isClean());
+           networkDescriptor_ = null;
+         }
+         return networkDescriptorBuilder_;
+       }
+       
+       // @@protoc_insertion_point(builder_scope:openxc.NetworkOperatorSettings)
+     }
+     
+     static {
+       defaultInstance = new NetworkOperatorSettings(true);
+       defaultInstance.initFields();
+     }
+     
+     // @@protoc_insertion_point(class_scope:openxc.NetworkOperatorSettings)
+   }
+   
+   public interface NetworkDataSettingsOrBuilder
+       extends com.google.protobuf.MessageOrBuilder {
+     
+     // optional string APN = 1;
+     boolean hasAPN();
+     String getAPN();
+   }
+   public static final class NetworkDataSettings extends
+       com.google.protobuf.GeneratedMessage
+       implements NetworkDataSettingsOrBuilder {
+     // Use NetworkDataSettings.newBuilder() to construct.
+     private NetworkDataSettings(Builder builder) {
+       super(builder);
+     }
+     private NetworkDataSettings(boolean noInit) {}
+     
+     private static final NetworkDataSettings defaultInstance;
+     public static NetworkDataSettings getDefaultInstance() {
+       return defaultInstance;
+     }
+     
+     public NetworkDataSettings getDefaultInstanceForType() {
+       return defaultInstance;
+     }
+     
+     public static final com.google.protobuf.Descriptors.Descriptor
+         getDescriptor() {
+       return com.openxc.BinaryMessages.internal_static_openxc_NetworkDataSettings_descriptor;
+     }
+     
+     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+         internalGetFieldAccessorTable() {
+       return com.openxc.BinaryMessages.internal_static_openxc_NetworkDataSettings_fieldAccessorTable;
+     }
+     
+     private int bitField0_;
+     // optional string APN = 1;
+     public static final int APN_FIELD_NUMBER = 1;
+     private java.lang.Object aPN_;
+     public boolean hasAPN() {
+       return ((bitField0_ & 0x00000001) == 0x00000001);
+     }
+     public String getAPN() {
+       java.lang.Object ref = aPN_;
+       if (ref instanceof String) {
+         return (String) ref;
+       } else {
+         com.google.protobuf.ByteString bs = 
+             (com.google.protobuf.ByteString) ref;
+         String s = bs.toStringUtf8();
+         if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+           aPN_ = s;
+         }
+         return s;
+       }
+     }
+     private com.google.protobuf.ByteString getAPNBytes() {
+       java.lang.Object ref = aPN_;
+       if (ref instanceof String) {
+         com.google.protobuf.ByteString b = 
+             com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+         aPN_ = b;
+         return b;
+       } else {
+         return (com.google.protobuf.ByteString) ref;
+       }
+     }
+     
+     private void initFields() {
+       aPN_ = "";
+     }
+     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, getAPNBytes());
+       }
+       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, getAPNBytes());
+       }
+       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 com.openxc.BinaryMessages.NetworkDataSettings parseFrom(
+         com.google.protobuf.ByteString data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.NetworkDataSettings parseFrom(
+         com.google.protobuf.ByteString data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.NetworkDataSettings parseFrom(byte[] data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.NetworkDataSettings parseFrom(
+         byte[] data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.NetworkDataSettings parseFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.NetworkDataSettings parseFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.NetworkDataSettings parseDelimitedFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.NetworkDataSettings parseDelimitedFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.NetworkDataSettings parseFrom(
+         com.google.protobuf.CodedInputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.NetworkDataSettings parseFrom(
+         com.google.protobuf.CodedInputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     
+     public static Builder newBuilder() { return Builder.create(); }
+     public Builder newBuilderForType() { return newBuilder(); }
+     public static Builder newBuilder(com.openxc.BinaryMessages.NetworkDataSettings 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;
+     }
+     public static final class Builder extends
+         com.google.protobuf.GeneratedMessage.Builder<Builder>
+        implements com.openxc.BinaryMessages.NetworkDataSettingsOrBuilder {
+       public static final com.google.protobuf.Descriptors.Descriptor
+           getDescriptor() {
+         return com.openxc.BinaryMessages.internal_static_openxc_NetworkDataSettings_descriptor;
+       }
+       
+       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+           internalGetFieldAccessorTable() {
+         return com.openxc.BinaryMessages.internal_static_openxc_NetworkDataSettings_fieldAccessorTable;
+       }
+       
+       // Construct using com.openxc.BinaryMessages.NetworkDataSettings.newBuilder()
+       private Builder() {
+         maybeForceBuilderInitialization();
+       }
+       
+       private Builder(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();
+         aPN_ = "";
+         bitField0_ = (bitField0_ & ~0x00000001);
+         return this;
+       }
+       
+       public Builder clone() {
+         return create().mergeFrom(buildPartial());
+       }
+       
+       public com.google.protobuf.Descriptors.Descriptor
+           getDescriptorForType() {
+         return com.openxc.BinaryMessages.NetworkDataSettings.getDescriptor();
+       }
+       
+       public com.openxc.BinaryMessages.NetworkDataSettings getDefaultInstanceForType() {
+         return com.openxc.BinaryMessages.NetworkDataSettings.getDefaultInstance();
+       }
+       
+       public com.openxc.BinaryMessages.NetworkDataSettings build() {
+         com.openxc.BinaryMessages.NetworkDataSettings result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(result);
+         }
+         return result;
+       }
+       
+       private com.openxc.BinaryMessages.NetworkDataSettings buildParsed()
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         com.openxc.BinaryMessages.NetworkDataSettings result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(
+             result).asInvalidProtocolBufferException();
+         }
+         return result;
+       }
+       
+       public com.openxc.BinaryMessages.NetworkDataSettings buildPartial() {
+         com.openxc.BinaryMessages.NetworkDataSettings result = new com.openxc.BinaryMessages.NetworkDataSettings(this);
+         int from_bitField0_ = bitField0_;
+         int to_bitField0_ = 0;
+         if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+           to_bitField0_ |= 0x00000001;
+         }
+         result.aPN_ = aPN_;
+         result.bitField0_ = to_bitField0_;
+         onBuilt();
+         return result;
+       }
+       
+       public Builder mergeFrom(com.google.protobuf.Message other) {
+         if (other instanceof com.openxc.BinaryMessages.NetworkDataSettings) {
+           return mergeFrom((com.openxc.BinaryMessages.NetworkDataSettings)other);
+         } else {
+           super.mergeFrom(other);
+           return this;
+         }
+       }
+       
+       public Builder mergeFrom(com.openxc.BinaryMessages.NetworkDataSettings other) {
+         if (other == com.openxc.BinaryMessages.NetworkDataSettings.getDefaultInstance()) return this;
+         if (other.hasAPN()) {
+           setAPN(other.getAPN());
+         }
+         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 {
+         com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+           com.google.protobuf.UnknownFieldSet.newBuilder(
+             this.getUnknownFields());
+         while (true) {
+           int tag = input.readTag();
+           switch (tag) {
+             case 0:
+               this.setUnknownFields(unknownFields.build());
+               onChanged();
+               return this;
+             default: {
+               if (!parseUnknownField(input, unknownFields,
+                                      extensionRegistry, tag)) {
+                 this.setUnknownFields(unknownFields.build());
+                 onChanged();
+                 return this;
+               }
+               break;
+             }
+             case 10: {
+               bitField0_ |= 0x00000001;
+               aPN_ = input.readBytes();
+               break;
+             }
+           }
+         }
+       }
+       
+       private int bitField0_;
+       
+       // optional string APN = 1;
+       private java.lang.Object aPN_ = "";
+       public boolean hasAPN() {
+         return ((bitField0_ & 0x00000001) == 0x00000001);
+       }
+       public String getAPN() {
+         java.lang.Object ref = aPN_;
+         if (!(ref instanceof String)) {
+           String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+           aPN_ = s;
+           return s;
+         } else {
+           return (String) ref;
+         }
+       }
+       public Builder setAPN(String value) {
+         if (value == null) {
+     throw new NullPointerException();
+   }
+   bitField0_ |= 0x00000001;
+         aPN_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearAPN() {
+         bitField0_ = (bitField0_ & ~0x00000001);
+         aPN_ = getDefaultInstance().getAPN();
+         onChanged();
+         return this;
+       }
+       void setAPN(com.google.protobuf.ByteString value) {
+         bitField0_ |= 0x00000001;
+         aPN_ = value;
+         onChanged();
+       }
+       
+       // @@protoc_insertion_point(builder_scope:openxc.NetworkDataSettings)
+     }
+     
+     static {
+       defaultInstance = new NetworkDataSettings(true);
+       defaultInstance.initFields();
+     }
+     
+     // @@protoc_insertion_point(class_scope:openxc.NetworkDataSettings)
+   }
+   
+   public interface ServerConnectSettingsOrBuilder
+       extends com.google.protobuf.MessageOrBuilder {
+     
+     // optional string host = 1;
+     boolean hasHost();
+     String getHost();
+     
+     // optional uint32 port = 2;
+     boolean hasPort();
+     int getPort();
+   }
+   public static final class ServerConnectSettings extends
+       com.google.protobuf.GeneratedMessage
+       implements ServerConnectSettingsOrBuilder {
+     // Use ServerConnectSettings.newBuilder() to construct.
+     private ServerConnectSettings(Builder builder) {
+       super(builder);
+     }
+     private ServerConnectSettings(boolean noInit) {}
+     
+     private static final ServerConnectSettings defaultInstance;
+     public static ServerConnectSettings getDefaultInstance() {
+       return defaultInstance;
+     }
+     
+     public ServerConnectSettings getDefaultInstanceForType() {
+       return defaultInstance;
+     }
+     
+     public static final com.google.protobuf.Descriptors.Descriptor
+         getDescriptor() {
+       return com.openxc.BinaryMessages.internal_static_openxc_ServerConnectSettings_descriptor;
+     }
+     
+     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+         internalGetFieldAccessorTable() {
+       return com.openxc.BinaryMessages.internal_static_openxc_ServerConnectSettings_fieldAccessorTable;
+     }
+     
+     private int bitField0_;
+     // optional string host = 1;
+     public static final int HOST_FIELD_NUMBER = 1;
+     private java.lang.Object host_;
+     public boolean hasHost() {
+       return ((bitField0_ & 0x00000001) == 0x00000001);
+     }
+     public String getHost() {
+       java.lang.Object ref = host_;
+       if (ref instanceof String) {
+         return (String) ref;
+       } else {
+         com.google.protobuf.ByteString bs = 
+             (com.google.protobuf.ByteString) ref;
+         String s = bs.toStringUtf8();
+         if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+           host_ = s;
+         }
+         return s;
+       }
+     }
+     private com.google.protobuf.ByteString getHostBytes() {
+       java.lang.Object ref = host_;
+       if (ref instanceof String) {
+         com.google.protobuf.ByteString b = 
+             com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+         host_ = b;
+         return b;
+       } else {
+         return (com.google.protobuf.ByteString) ref;
+       }
+     }
+     
+     // optional uint32 port = 2;
+     public static final int PORT_FIELD_NUMBER = 2;
+     private int port_;
+     public boolean hasPort() {
+       return ((bitField0_ & 0x00000002) == 0x00000002);
+     }
+     public int getPort() {
+       return port_;
+     }
+     
+     private void initFields() {
+       host_ = "";
+       port_ = 0;
+     }
+     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, getHostBytes());
+       }
+       if (((bitField0_ & 0x00000002) == 0x00000002)) {
+         output.writeUInt32(2, port_);
+       }
+       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, getHostBytes());
+       }
+       if (((bitField0_ & 0x00000002) == 0x00000002)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeUInt32Size(2, port_);
+       }
+       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 com.openxc.BinaryMessages.ServerConnectSettings parseFrom(
+         com.google.protobuf.ByteString data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ServerConnectSettings parseFrom(
+         com.google.protobuf.ByteString data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ServerConnectSettings parseFrom(byte[] data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ServerConnectSettings parseFrom(
+         byte[] data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ServerConnectSettings parseFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ServerConnectSettings parseFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ServerConnectSettings parseDelimitedFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.ServerConnectSettings parseDelimitedFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.ServerConnectSettings parseFrom(
+         com.google.protobuf.CodedInputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ServerConnectSettings parseFrom(
+         com.google.protobuf.CodedInputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     
+     public static Builder newBuilder() { return Builder.create(); }
+     public Builder newBuilderForType() { return newBuilder(); }
+     public static Builder newBuilder(com.openxc.BinaryMessages.ServerConnectSettings 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;
+     }
+     public static final class Builder extends
+         com.google.protobuf.GeneratedMessage.Builder<Builder>
+        implements com.openxc.BinaryMessages.ServerConnectSettingsOrBuilder {
+       public static final com.google.protobuf.Descriptors.Descriptor
+           getDescriptor() {
+         return com.openxc.BinaryMessages.internal_static_openxc_ServerConnectSettings_descriptor;
+       }
+       
+       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+           internalGetFieldAccessorTable() {
+         return com.openxc.BinaryMessages.internal_static_openxc_ServerConnectSettings_fieldAccessorTable;
+       }
+       
+       // Construct using com.openxc.BinaryMessages.ServerConnectSettings.newBuilder()
+       private Builder() {
+         maybeForceBuilderInitialization();
+       }
+       
+       private Builder(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();
+         host_ = "";
+         bitField0_ = (bitField0_ & ~0x00000001);
+         port_ = 0;
+         bitField0_ = (bitField0_ & ~0x00000002);
+         return this;
+       }
+       
+       public Builder clone() {
+         return create().mergeFrom(buildPartial());
+       }
+       
+       public com.google.protobuf.Descriptors.Descriptor
+           getDescriptorForType() {
+         return com.openxc.BinaryMessages.ServerConnectSettings.getDescriptor();
+       }
+       
+       public com.openxc.BinaryMessages.ServerConnectSettings getDefaultInstanceForType() {
+         return com.openxc.BinaryMessages.ServerConnectSettings.getDefaultInstance();
+       }
+       
+       public com.openxc.BinaryMessages.ServerConnectSettings build() {
+         com.openxc.BinaryMessages.ServerConnectSettings result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(result);
+         }
+         return result;
+       }
+       
+       private com.openxc.BinaryMessages.ServerConnectSettings buildParsed()
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         com.openxc.BinaryMessages.ServerConnectSettings result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(
+             result).asInvalidProtocolBufferException();
+         }
+         return result;
+       }
+       
+       public com.openxc.BinaryMessages.ServerConnectSettings buildPartial() {
+         com.openxc.BinaryMessages.ServerConnectSettings result = new com.openxc.BinaryMessages.ServerConnectSettings(this);
+         int from_bitField0_ = bitField0_;
+         int to_bitField0_ = 0;
+         if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+           to_bitField0_ |= 0x00000001;
+         }
+         result.host_ = host_;
+         if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+           to_bitField0_ |= 0x00000002;
+         }
+         result.port_ = port_;
+         result.bitField0_ = to_bitField0_;
+         onBuilt();
+         return result;
+       }
+       
+       public Builder mergeFrom(com.google.protobuf.Message other) {
+         if (other instanceof com.openxc.BinaryMessages.ServerConnectSettings) {
+           return mergeFrom((com.openxc.BinaryMessages.ServerConnectSettings)other);
+         } else {
+           super.mergeFrom(other);
+           return this;
+         }
+       }
+       
+       public Builder mergeFrom(com.openxc.BinaryMessages.ServerConnectSettings other) {
+         if (other == com.openxc.BinaryMessages.ServerConnectSettings.getDefaultInstance()) return this;
+         if (other.hasHost()) {
+           setHost(other.getHost());
+         }
+         if (other.hasPort()) {
+           setPort(other.getPort());
+         }
+         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 {
+         com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+           com.google.protobuf.UnknownFieldSet.newBuilder(
+             this.getUnknownFields());
+         while (true) {
+           int tag = input.readTag();
+           switch (tag) {
+             case 0:
+               this.setUnknownFields(unknownFields.build());
+               onChanged();
+               return this;
+             default: {
+               if (!parseUnknownField(input, unknownFields,
+                                      extensionRegistry, tag)) {
+                 this.setUnknownFields(unknownFields.build());
+                 onChanged();
+                 return this;
+               }
+               break;
+             }
+             case 10: {
+               bitField0_ |= 0x00000001;
+               host_ = input.readBytes();
+               break;
+             }
+             case 16: {
+               bitField0_ |= 0x00000002;
+               port_ = input.readUInt32();
+               break;
+             }
+           }
+         }
+       }
+       
+       private int bitField0_;
+       
+       // optional string host = 1;
+       private java.lang.Object host_ = "";
+       public boolean hasHost() {
+         return ((bitField0_ & 0x00000001) == 0x00000001);
+       }
+       public String getHost() {
+         java.lang.Object ref = host_;
+         if (!(ref instanceof String)) {
+           String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+           host_ = s;
+           return s;
+         } else {
+           return (String) ref;
+         }
+       }
+       public Builder setHost(String value) {
+         if (value == null) {
+     throw new NullPointerException();
+   }
+   bitField0_ |= 0x00000001;
+         host_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearHost() {
+         bitField0_ = (bitField0_ & ~0x00000001);
+         host_ = getDefaultInstance().getHost();
+         onChanged();
+         return this;
+       }
+       void setHost(com.google.protobuf.ByteString value) {
+         bitField0_ |= 0x00000001;
+         host_ = value;
+         onChanged();
+       }
+       
+       // optional uint32 port = 2;
+       private int port_ ;
+       public boolean hasPort() {
+         return ((bitField0_ & 0x00000002) == 0x00000002);
+       }
+       public int getPort() {
+         return port_;
+       }
+       public Builder setPort(int value) {
+         bitField0_ |= 0x00000002;
+         port_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearPort() {
+         bitField0_ = (bitField0_ & ~0x00000002);
+         port_ = 0;
+         onChanged();
+         return this;
+       }
+       
+       // @@protoc_insertion_point(builder_scope:openxc.ServerConnectSettings)
+     }
+     
+     static {
+       defaultInstance = new ServerConnectSettings(true);
+       defaultInstance.initFields();
+     }
+     
+     // @@protoc_insertion_point(class_scope:openxc.ServerConnectSettings)
+   }
+   
+   public interface ModemConfigurationCommandOrBuilder
+       extends com.google.protobuf.MessageOrBuilder {
+     
+     // optional .openxc.NetworkOperatorSettings networkOperatorSettings = 1;
+     boolean hasNetworkOperatorSettings();
+     com.openxc.BinaryMessages.NetworkOperatorSettings getNetworkOperatorSettings();
+     com.openxc.BinaryMessages.NetworkOperatorSettingsOrBuilder getNetworkOperatorSettingsOrBuilder();
+     
+     // optional .openxc.NetworkDataSettings networkDataSettings = 2;
+     boolean hasNetworkDataSettings();
+     com.openxc.BinaryMessages.NetworkDataSettings getNetworkDataSettings();
+     com.openxc.BinaryMessages.NetworkDataSettingsOrBuilder getNetworkDataSettingsOrBuilder();
+     
+     // optional .openxc.ServerConnectSettings serverConnectSettings = 3;
+     boolean hasServerConnectSettings();
+     com.openxc.BinaryMessages.ServerConnectSettings getServerConnectSettings();
+     com.openxc.BinaryMessages.ServerConnectSettingsOrBuilder getServerConnectSettingsOrBuilder();
+   }
+   public static final class ModemConfigurationCommand extends
+       com.google.protobuf.GeneratedMessage
+       implements ModemConfigurationCommandOrBuilder {
+     // Use ModemConfigurationCommand.newBuilder() to construct.
+     private ModemConfigurationCommand(Builder builder) {
+       super(builder);
+     }
+     private ModemConfigurationCommand(boolean noInit) {}
+     
+     private static final ModemConfigurationCommand defaultInstance;
+     public static ModemConfigurationCommand getDefaultInstance() {
+       return defaultInstance;
+     }
+     
+     public ModemConfigurationCommand getDefaultInstanceForType() {
+       return defaultInstance;
+     }
+     
+     public static final com.google.protobuf.Descriptors.Descriptor
+         getDescriptor() {
+       return com.openxc.BinaryMessages.internal_static_openxc_ModemConfigurationCommand_descriptor;
+     }
+     
+     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+         internalGetFieldAccessorTable() {
+       return com.openxc.BinaryMessages.internal_static_openxc_ModemConfigurationCommand_fieldAccessorTable;
+     }
+     
+     private int bitField0_;
+     // optional .openxc.NetworkOperatorSettings networkOperatorSettings = 1;
+     public static final int NETWORKOPERATORSETTINGS_FIELD_NUMBER = 1;
+     private com.openxc.BinaryMessages.NetworkOperatorSettings networkOperatorSettings_;
+     public boolean hasNetworkOperatorSettings() {
+       return ((bitField0_ & 0x00000001) == 0x00000001);
+     }
+     public com.openxc.BinaryMessages.NetworkOperatorSettings getNetworkOperatorSettings() {
+       return networkOperatorSettings_;
+     }
+     public com.openxc.BinaryMessages.NetworkOperatorSettingsOrBuilder getNetworkOperatorSettingsOrBuilder() {
+       return networkOperatorSettings_;
+     }
+     
+     // optional .openxc.NetworkDataSettings networkDataSettings = 2;
+     public static final int NETWORKDATASETTINGS_FIELD_NUMBER = 2;
+     private com.openxc.BinaryMessages.NetworkDataSettings networkDataSettings_;
+     public boolean hasNetworkDataSettings() {
+       return ((bitField0_ & 0x00000002) == 0x00000002);
+     }
+     public com.openxc.BinaryMessages.NetworkDataSettings getNetworkDataSettings() {
+       return networkDataSettings_;
+     }
+     public com.openxc.BinaryMessages.NetworkDataSettingsOrBuilder getNetworkDataSettingsOrBuilder() {
+       return networkDataSettings_;
+     }
+     
+     // optional .openxc.ServerConnectSettings serverConnectSettings = 3;
+     public static final int SERVERCONNECTSETTINGS_FIELD_NUMBER = 3;
+     private com.openxc.BinaryMessages.ServerConnectSettings serverConnectSettings_;
+     public boolean hasServerConnectSettings() {
+       return ((bitField0_ & 0x00000004) == 0x00000004);
+     }
+     public com.openxc.BinaryMessages.ServerConnectSettings getServerConnectSettings() {
+       return serverConnectSettings_;
+     }
+     public com.openxc.BinaryMessages.ServerConnectSettingsOrBuilder getServerConnectSettingsOrBuilder() {
+       return serverConnectSettings_;
+     }
+     
+     private void initFields() {
+       networkOperatorSettings_ = com.openxc.BinaryMessages.NetworkOperatorSettings.getDefaultInstance();
+       networkDataSettings_ = com.openxc.BinaryMessages.NetworkDataSettings.getDefaultInstance();
+       serverConnectSettings_ = com.openxc.BinaryMessages.ServerConnectSettings.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.writeMessage(1, networkOperatorSettings_);
+       }
+       if (((bitField0_ & 0x00000002) == 0x00000002)) {
+         output.writeMessage(2, networkDataSettings_);
+       }
+       if (((bitField0_ & 0x00000004) == 0x00000004)) {
+         output.writeMessage(3, serverConnectSettings_);
+       }
+       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
+           .computeMessageSize(1, networkOperatorSettings_);
+       }
+       if (((bitField0_ & 0x00000002) == 0x00000002)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeMessageSize(2, networkDataSettings_);
+       }
+       if (((bitField0_ & 0x00000004) == 0x00000004)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeMessageSize(3, serverConnectSettings_);
+       }
+       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 com.openxc.BinaryMessages.ModemConfigurationCommand parseFrom(
+         com.google.protobuf.ByteString data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ModemConfigurationCommand parseFrom(
+         com.google.protobuf.ByteString data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ModemConfigurationCommand parseFrom(byte[] data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ModemConfigurationCommand parseFrom(
+         byte[] data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ModemConfigurationCommand parseFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ModemConfigurationCommand parseFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ModemConfigurationCommand parseDelimitedFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.ModemConfigurationCommand parseDelimitedFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.ModemConfigurationCommand parseFrom(
+         com.google.protobuf.CodedInputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.ModemConfigurationCommand parseFrom(
+         com.google.protobuf.CodedInputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     
+     public static Builder newBuilder() { return Builder.create(); }
+     public Builder newBuilderForType() { return newBuilder(); }
+     public static Builder newBuilder(com.openxc.BinaryMessages.ModemConfigurationCommand 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;
+     }
+     public static final class Builder extends
+         com.google.protobuf.GeneratedMessage.Builder<Builder>
+        implements com.openxc.BinaryMessages.ModemConfigurationCommandOrBuilder {
+       public static final com.google.protobuf.Descriptors.Descriptor
+           getDescriptor() {
+         return com.openxc.BinaryMessages.internal_static_openxc_ModemConfigurationCommand_descriptor;
+       }
+       
+       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+           internalGetFieldAccessorTable() {
+         return com.openxc.BinaryMessages.internal_static_openxc_ModemConfigurationCommand_fieldAccessorTable;
+       }
+       
+       // Construct using com.openxc.BinaryMessages.ModemConfigurationCommand.newBuilder()
+       private Builder() {
+         maybeForceBuilderInitialization();
+       }
+       
+       private Builder(BuilderParent parent) {
+         super(parent);
+         maybeForceBuilderInitialization();
+       }
+       private void maybeForceBuilderInitialization() {
+         if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+           getNetworkOperatorSettingsFieldBuilder();
+           getNetworkDataSettingsFieldBuilder();
+           getServerConnectSettingsFieldBuilder();
+         }
+       }
+       private static Builder create() {
+         return new Builder();
+       }
+       
+       public Builder clear() {
+         super.clear();
+         if (networkOperatorSettingsBuilder_ == null) {
+           networkOperatorSettings_ = com.openxc.BinaryMessages.NetworkOperatorSettings.getDefaultInstance();
+         } else {
+           networkOperatorSettingsBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000001);
+         if (networkDataSettingsBuilder_ == null) {
+           networkDataSettings_ = com.openxc.BinaryMessages.NetworkDataSettings.getDefaultInstance();
+         } else {
+           networkDataSettingsBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000002);
+         if (serverConnectSettingsBuilder_ == null) {
+           serverConnectSettings_ = com.openxc.BinaryMessages.ServerConnectSettings.getDefaultInstance();
+         } else {
+           serverConnectSettingsBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000004);
+         return this;
+       }
+       
+       public Builder clone() {
+         return create().mergeFrom(buildPartial());
+       }
+       
+       public com.google.protobuf.Descriptors.Descriptor
+           getDescriptorForType() {
+         return com.openxc.BinaryMessages.ModemConfigurationCommand.getDescriptor();
+       }
+       
+       public com.openxc.BinaryMessages.ModemConfigurationCommand getDefaultInstanceForType() {
+         return com.openxc.BinaryMessages.ModemConfigurationCommand.getDefaultInstance();
+       }
+       
+       public com.openxc.BinaryMessages.ModemConfigurationCommand build() {
+         com.openxc.BinaryMessages.ModemConfigurationCommand result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(result);
+         }
+         return result;
+       }
+       
+       private com.openxc.BinaryMessages.ModemConfigurationCommand buildParsed()
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         com.openxc.BinaryMessages.ModemConfigurationCommand result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(
+             result).asInvalidProtocolBufferException();
+         }
+         return result;
+       }
+       
+       public com.openxc.BinaryMessages.ModemConfigurationCommand buildPartial() {
+         com.openxc.BinaryMessages.ModemConfigurationCommand result = new com.openxc.BinaryMessages.ModemConfigurationCommand(this);
+         int from_bitField0_ = bitField0_;
+         int to_bitField0_ = 0;
+         if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+           to_bitField0_ |= 0x00000001;
+         }
+         if (networkOperatorSettingsBuilder_ == null) {
+           result.networkOperatorSettings_ = networkOperatorSettings_;
+         } else {
+           result.networkOperatorSettings_ = networkOperatorSettingsBuilder_.build();
+         }
+         if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
+           to_bitField0_ |= 0x00000002;
+         }
+         if (networkDataSettingsBuilder_ == null) {
+           result.networkDataSettings_ = networkDataSettings_;
+         } else {
+           result.networkDataSettings_ = networkDataSettingsBuilder_.build();
+         }
+         if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+           to_bitField0_ |= 0x00000004;
+         }
+         if (serverConnectSettingsBuilder_ == null) {
+           result.serverConnectSettings_ = serverConnectSettings_;
+         } else {
+           result.serverConnectSettings_ = serverConnectSettingsBuilder_.build();
+         }
+         result.bitField0_ = to_bitField0_;
+         onBuilt();
+         return result;
+       }
+       
+       public Builder mergeFrom(com.google.protobuf.Message other) {
+         if (other instanceof com.openxc.BinaryMessages.ModemConfigurationCommand) {
+           return mergeFrom((com.openxc.BinaryMessages.ModemConfigurationCommand)other);
+         } else {
+           super.mergeFrom(other);
+           return this;
+         }
+       }
+       
+       public Builder mergeFrom(com.openxc.BinaryMessages.ModemConfigurationCommand other) {
+         if (other == com.openxc.BinaryMessages.ModemConfigurationCommand.getDefaultInstance()) return this;
+         if (other.hasNetworkOperatorSettings()) {
+           mergeNetworkOperatorSettings(other.getNetworkOperatorSettings());
+         }
+         if (other.hasNetworkDataSettings()) {
+           mergeNetworkDataSettings(other.getNetworkDataSettings());
+         }
+         if (other.hasServerConnectSettings()) {
+           mergeServerConnectSettings(other.getServerConnectSettings());
+         }
+         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 {
+         com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+           com.google.protobuf.UnknownFieldSet.newBuilder(
+             this.getUnknownFields());
+         while (true) {
+           int tag = input.readTag();
+           switch (tag) {
+             case 0:
+               this.setUnknownFields(unknownFields.build());
+               onChanged();
+               return this;
+             default: {
+               if (!parseUnknownField(input, unknownFields,
+                                      extensionRegistry, tag)) {
+                 this.setUnknownFields(unknownFields.build());
+                 onChanged();
+                 return this;
+               }
+               break;
+             }
+             case 10: {
+               com.openxc.BinaryMessages.NetworkOperatorSettings.Builder subBuilder = com.openxc.BinaryMessages.NetworkOperatorSettings.newBuilder();
+               if (hasNetworkOperatorSettings()) {
+                 subBuilder.mergeFrom(getNetworkOperatorSettings());
+               }
+               input.readMessage(subBuilder, extensionRegistry);
+               setNetworkOperatorSettings(subBuilder.buildPartial());
+               break;
+             }
+             case 18: {
+               com.openxc.BinaryMessages.NetworkDataSettings.Builder subBuilder = com.openxc.BinaryMessages.NetworkDataSettings.newBuilder();
+               if (hasNetworkDataSettings()) {
+                 subBuilder.mergeFrom(getNetworkDataSettings());
+               }
+               input.readMessage(subBuilder, extensionRegistry);
+               setNetworkDataSettings(subBuilder.buildPartial());
+               break;
+             }
+             case 26: {
+               com.openxc.BinaryMessages.ServerConnectSettings.Builder subBuilder = com.openxc.BinaryMessages.ServerConnectSettings.newBuilder();
+               if (hasServerConnectSettings()) {
+                 subBuilder.mergeFrom(getServerConnectSettings());
+               }
+               input.readMessage(subBuilder, extensionRegistry);
+               setServerConnectSettings(subBuilder.buildPartial());
+               break;
+             }
+           }
+         }
+       }
+       
+       private int bitField0_;
+       
+       // optional .openxc.NetworkOperatorSettings networkOperatorSettings = 1;
+       private com.openxc.BinaryMessages.NetworkOperatorSettings networkOperatorSettings_ = com.openxc.BinaryMessages.NetworkOperatorSettings.getDefaultInstance();
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.NetworkOperatorSettings, com.openxc.BinaryMessages.NetworkOperatorSettings.Builder, com.openxc.BinaryMessages.NetworkOperatorSettingsOrBuilder> networkOperatorSettingsBuilder_;
+       public boolean hasNetworkOperatorSettings() {
+         return ((bitField0_ & 0x00000001) == 0x00000001);
+       }
+       public com.openxc.BinaryMessages.NetworkOperatorSettings getNetworkOperatorSettings() {
+         if (networkOperatorSettingsBuilder_ == null) {
+           return networkOperatorSettings_;
+         } else {
+           return networkOperatorSettingsBuilder_.getMessage();
+         }
+       }
+       public Builder setNetworkOperatorSettings(com.openxc.BinaryMessages.NetworkOperatorSettings value) {
+         if (networkOperatorSettingsBuilder_ == null) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           networkOperatorSettings_ = value;
+           onChanged();
+         } else {
+           networkOperatorSettingsBuilder_.setMessage(value);
+         }
+         bitField0_ |= 0x00000001;
+         return this;
+       }
+       public Builder setNetworkOperatorSettings(
+           com.openxc.BinaryMessages.NetworkOperatorSettings.Builder builderForValue) {
+         if (networkOperatorSettingsBuilder_ == null) {
+           networkOperatorSettings_ = builderForValue.build();
+           onChanged();
+         } else {
+           networkOperatorSettingsBuilder_.setMessage(builderForValue.build());
+         }
+         bitField0_ |= 0x00000001;
+         return this;
+       }
+       public Builder mergeNetworkOperatorSettings(com.openxc.BinaryMessages.NetworkOperatorSettings value) {
+         if (networkOperatorSettingsBuilder_ == null) {
+           if (((bitField0_ & 0x00000001) == 0x00000001) &&
+               networkOperatorSettings_ != com.openxc.BinaryMessages.NetworkOperatorSettings.getDefaultInstance()) {
+             networkOperatorSettings_ =
+               com.openxc.BinaryMessages.NetworkOperatorSettings.newBuilder(networkOperatorSettings_).mergeFrom(value).buildPartial();
+           } else {
+             networkOperatorSettings_ = value;
+           }
+           onChanged();
+         } else {
+           networkOperatorSettingsBuilder_.mergeFrom(value);
+         }
+         bitField0_ |= 0x00000001;
+         return this;
+       }
+       public Builder clearNetworkOperatorSettings() {
+         if (networkOperatorSettingsBuilder_ == null) {
+           networkOperatorSettings_ = com.openxc.BinaryMessages.NetworkOperatorSettings.getDefaultInstance();
+           onChanged();
+         } else {
+           networkOperatorSettingsBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000001);
+         return this;
+       }
+       public com.openxc.BinaryMessages.NetworkOperatorSettings.Builder getNetworkOperatorSettingsBuilder() {
+         bitField0_ |= 0x00000001;
+         onChanged();
+         return getNetworkOperatorSettingsFieldBuilder().getBuilder();
+       }
+       public com.openxc.BinaryMessages.NetworkOperatorSettingsOrBuilder getNetworkOperatorSettingsOrBuilder() {
+         if (networkOperatorSettingsBuilder_ != null) {
+           return networkOperatorSettingsBuilder_.getMessageOrBuilder();
+         } else {
+           return networkOperatorSettings_;
+         }
+       }
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.NetworkOperatorSettings, com.openxc.BinaryMessages.NetworkOperatorSettings.Builder, com.openxc.BinaryMessages.NetworkOperatorSettingsOrBuilder> 
+           getNetworkOperatorSettingsFieldBuilder() {
+         if (networkOperatorSettingsBuilder_ == null) {
+           networkOperatorSettingsBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+               com.openxc.BinaryMessages.NetworkOperatorSettings, com.openxc.BinaryMessages.NetworkOperatorSettings.Builder, com.openxc.BinaryMessages.NetworkOperatorSettingsOrBuilder>(
+                   networkOperatorSettings_,
+                   getParentForChildren(),
+                   isClean());
+           networkOperatorSettings_ = null;
+         }
+         return networkOperatorSettingsBuilder_;
+       }
+       
+       // optional .openxc.NetworkDataSettings networkDataSettings = 2;
+       private com.openxc.BinaryMessages.NetworkDataSettings networkDataSettings_ = com.openxc.BinaryMessages.NetworkDataSettings.getDefaultInstance();
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.NetworkDataSettings, com.openxc.BinaryMessages.NetworkDataSettings.Builder, com.openxc.BinaryMessages.NetworkDataSettingsOrBuilder> networkDataSettingsBuilder_;
+       public boolean hasNetworkDataSettings() {
+         return ((bitField0_ & 0x00000002) == 0x00000002);
+       }
+       public com.openxc.BinaryMessages.NetworkDataSettings getNetworkDataSettings() {
+         if (networkDataSettingsBuilder_ == null) {
+           return networkDataSettings_;
+         } else {
+           return networkDataSettingsBuilder_.getMessage();
+         }
+       }
+       public Builder setNetworkDataSettings(com.openxc.BinaryMessages.NetworkDataSettings value) {
+         if (networkDataSettingsBuilder_ == null) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           networkDataSettings_ = value;
+           onChanged();
+         } else {
+           networkDataSettingsBuilder_.setMessage(value);
+         }
+         bitField0_ |= 0x00000002;
+         return this;
+       }
+       public Builder setNetworkDataSettings(
+           com.openxc.BinaryMessages.NetworkDataSettings.Builder builderForValue) {
+         if (networkDataSettingsBuilder_ == null) {
+           networkDataSettings_ = builderForValue.build();
+           onChanged();
+         } else {
+           networkDataSettingsBuilder_.setMessage(builderForValue.build());
+         }
+         bitField0_ |= 0x00000002;
+         return this;
+       }
+       public Builder mergeNetworkDataSettings(com.openxc.BinaryMessages.NetworkDataSettings value) {
+         if (networkDataSettingsBuilder_ == null) {
+           if (((bitField0_ & 0x00000002) == 0x00000002) &&
+               networkDataSettings_ != com.openxc.BinaryMessages.NetworkDataSettings.getDefaultInstance()) {
+             networkDataSettings_ =
+               com.openxc.BinaryMessages.NetworkDataSettings.newBuilder(networkDataSettings_).mergeFrom(value).buildPartial();
+           } else {
+             networkDataSettings_ = value;
+           }
+           onChanged();
+         } else {
+           networkDataSettingsBuilder_.mergeFrom(value);
+         }
+         bitField0_ |= 0x00000002;
+         return this;
+       }
+       public Builder clearNetworkDataSettings() {
+         if (networkDataSettingsBuilder_ == null) {
+           networkDataSettings_ = com.openxc.BinaryMessages.NetworkDataSettings.getDefaultInstance();
+           onChanged();
+         } else {
+           networkDataSettingsBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000002);
+         return this;
+       }
+       public com.openxc.BinaryMessages.NetworkDataSettings.Builder getNetworkDataSettingsBuilder() {
+         bitField0_ |= 0x00000002;
+         onChanged();
+         return getNetworkDataSettingsFieldBuilder().getBuilder();
+       }
+       public com.openxc.BinaryMessages.NetworkDataSettingsOrBuilder getNetworkDataSettingsOrBuilder() {
+         if (networkDataSettingsBuilder_ != null) {
+           return networkDataSettingsBuilder_.getMessageOrBuilder();
+         } else {
+           return networkDataSettings_;
+         }
+       }
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.NetworkDataSettings, com.openxc.BinaryMessages.NetworkDataSettings.Builder, com.openxc.BinaryMessages.NetworkDataSettingsOrBuilder> 
+           getNetworkDataSettingsFieldBuilder() {
+         if (networkDataSettingsBuilder_ == null) {
+           networkDataSettingsBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+               com.openxc.BinaryMessages.NetworkDataSettings, com.openxc.BinaryMessages.NetworkDataSettings.Builder, com.openxc.BinaryMessages.NetworkDataSettingsOrBuilder>(
+                   networkDataSettings_,
+                   getParentForChildren(),
+                   isClean());
+           networkDataSettings_ = null;
+         }
+         return networkDataSettingsBuilder_;
+       }
+       
+       // optional .openxc.ServerConnectSettings serverConnectSettings = 3;
+       private com.openxc.BinaryMessages.ServerConnectSettings serverConnectSettings_ = com.openxc.BinaryMessages.ServerConnectSettings.getDefaultInstance();
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.ServerConnectSettings, com.openxc.BinaryMessages.ServerConnectSettings.Builder, com.openxc.BinaryMessages.ServerConnectSettingsOrBuilder> serverConnectSettingsBuilder_;
+       public boolean hasServerConnectSettings() {
+         return ((bitField0_ & 0x00000004) == 0x00000004);
+       }
+       public com.openxc.BinaryMessages.ServerConnectSettings getServerConnectSettings() {
+         if (serverConnectSettingsBuilder_ == null) {
+           return serverConnectSettings_;
+         } else {
+           return serverConnectSettingsBuilder_.getMessage();
+         }
+       }
+       public Builder setServerConnectSettings(com.openxc.BinaryMessages.ServerConnectSettings value) {
+         if (serverConnectSettingsBuilder_ == null) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           serverConnectSettings_ = value;
+           onChanged();
+         } else {
+           serverConnectSettingsBuilder_.setMessage(value);
+         }
+         bitField0_ |= 0x00000004;
+         return this;
+       }
+       public Builder setServerConnectSettings(
+           com.openxc.BinaryMessages.ServerConnectSettings.Builder builderForValue) {
+         if (serverConnectSettingsBuilder_ == null) {
+           serverConnectSettings_ = builderForValue.build();
+           onChanged();
+         } else {
+           serverConnectSettingsBuilder_.setMessage(builderForValue.build());
+         }
+         bitField0_ |= 0x00000004;
+         return this;
+       }
+       public Builder mergeServerConnectSettings(com.openxc.BinaryMessages.ServerConnectSettings value) {
+         if (serverConnectSettingsBuilder_ == null) {
+           if (((bitField0_ & 0x00000004) == 0x00000004) &&
+               serverConnectSettings_ != com.openxc.BinaryMessages.ServerConnectSettings.getDefaultInstance()) {
+             serverConnectSettings_ =
+               com.openxc.BinaryMessages.ServerConnectSettings.newBuilder(serverConnectSettings_).mergeFrom(value).buildPartial();
+           } else {
+             serverConnectSettings_ = value;
+           }
+           onChanged();
+         } else {
+           serverConnectSettingsBuilder_.mergeFrom(value);
+         }
+         bitField0_ |= 0x00000004;
+         return this;
+       }
+       public Builder clearServerConnectSettings() {
+         if (serverConnectSettingsBuilder_ == null) {
+           serverConnectSettings_ = com.openxc.BinaryMessages.ServerConnectSettings.getDefaultInstance();
+           onChanged();
+         } else {
+           serverConnectSettingsBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000004);
+         return this;
+       }
+       public com.openxc.BinaryMessages.ServerConnectSettings.Builder getServerConnectSettingsBuilder() {
+         bitField0_ |= 0x00000004;
+         onChanged();
+         return getServerConnectSettingsFieldBuilder().getBuilder();
+       }
+       public com.openxc.BinaryMessages.ServerConnectSettingsOrBuilder getServerConnectSettingsOrBuilder() {
+         if (serverConnectSettingsBuilder_ != null) {
+           return serverConnectSettingsBuilder_.getMessageOrBuilder();
+         } else {
+           return serverConnectSettings_;
+         }
+       }
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.ServerConnectSettings, com.openxc.BinaryMessages.ServerConnectSettings.Builder, com.openxc.BinaryMessages.ServerConnectSettingsOrBuilder> 
+           getServerConnectSettingsFieldBuilder() {
+         if (serverConnectSettingsBuilder_ == null) {
+           serverConnectSettingsBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+               com.openxc.BinaryMessages.ServerConnectSettings, com.openxc.BinaryMessages.ServerConnectSettings.Builder, com.openxc.BinaryMessages.ServerConnectSettingsOrBuilder>(
+                   serverConnectSettings_,
+                   getParentForChildren(),
+                   isClean());
+           serverConnectSettings_ = null;
+         }
+         return serverConnectSettingsBuilder_;
+       }
+       
+       // @@protoc_insertion_point(builder_scope:openxc.ModemConfigurationCommand)
+     }
+     
+     static {
+       defaultInstance = new ModemConfigurationCommand(true);
+       defaultInstance.initFields();
+     }
+     
+     // @@protoc_insertion_point(class_scope:openxc.ModemConfigurationCommand)
+   }
+   
+   public interface RTCConfigurationCommandOrBuilder
+       extends com.google.protobuf.MessageOrBuilder {
+     
+     // optional uint32 unix_time = 1;
+     boolean hasUnixTime();
+     int getUnixTime();
+   }
+   public static final class RTCConfigurationCommand extends
+       com.google.protobuf.GeneratedMessage
+       implements RTCConfigurationCommandOrBuilder {
+     // Use RTCConfigurationCommand.newBuilder() to construct.
+     private RTCConfigurationCommand(Builder builder) {
+       super(builder);
+     }
+     private RTCConfigurationCommand(boolean noInit) {}
+     
+     private static final RTCConfigurationCommand defaultInstance;
+     public static RTCConfigurationCommand getDefaultInstance() {
+       return defaultInstance;
+     }
+     
+     public RTCConfigurationCommand getDefaultInstanceForType() {
+       return defaultInstance;
+     }
+     
+     public static final com.google.protobuf.Descriptors.Descriptor
+         getDescriptor() {
+       return com.openxc.BinaryMessages.internal_static_openxc_RTCConfigurationCommand_descriptor;
+     }
+     
+     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+         internalGetFieldAccessorTable() {
+       return com.openxc.BinaryMessages.internal_static_openxc_RTCConfigurationCommand_fieldAccessorTable;
+     }
+     
+     private int bitField0_;
+     // optional uint32 unix_time = 1;
+     public static final int UNIX_TIME_FIELD_NUMBER = 1;
+     private int unixTime_;
+     public boolean hasUnixTime() {
+       return ((bitField0_ & 0x00000001) == 0x00000001);
+     }
+     public int getUnixTime() {
+       return unixTime_;
+     }
+     
+     private void initFields() {
+       unixTime_ = 0;
+     }
+     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.writeUInt32(1, unixTime_);
+       }
+       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
+           .computeUInt32Size(1, unixTime_);
+       }
+       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 com.openxc.BinaryMessages.RTCConfigurationCommand parseFrom(
+         com.google.protobuf.ByteString data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.RTCConfigurationCommand parseFrom(
+         com.google.protobuf.ByteString data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.RTCConfigurationCommand parseFrom(byte[] data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.RTCConfigurationCommand parseFrom(
+         byte[] data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.RTCConfigurationCommand parseFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.RTCConfigurationCommand parseFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.RTCConfigurationCommand parseDelimitedFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.RTCConfigurationCommand parseDelimitedFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.RTCConfigurationCommand parseFrom(
+         com.google.protobuf.CodedInputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.RTCConfigurationCommand parseFrom(
+         com.google.protobuf.CodedInputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     
+     public static Builder newBuilder() { return Builder.create(); }
+     public Builder newBuilderForType() { return newBuilder(); }
+     public static Builder newBuilder(com.openxc.BinaryMessages.RTCConfigurationCommand 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;
+     }
+     public static final class Builder extends
+         com.google.protobuf.GeneratedMessage.Builder<Builder>
+        implements com.openxc.BinaryMessages.RTCConfigurationCommandOrBuilder {
+       public static final com.google.protobuf.Descriptors.Descriptor
+           getDescriptor() {
+         return com.openxc.BinaryMessages.internal_static_openxc_RTCConfigurationCommand_descriptor;
+       }
+       
+       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+           internalGetFieldAccessorTable() {
+         return com.openxc.BinaryMessages.internal_static_openxc_RTCConfigurationCommand_fieldAccessorTable;
+       }
+       
+       // Construct using com.openxc.BinaryMessages.RTCConfigurationCommand.newBuilder()
+       private Builder() {
+         maybeForceBuilderInitialization();
+       }
+       
+       private Builder(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();
+         unixTime_ = 0;
+         bitField0_ = (bitField0_ & ~0x00000001);
+         return this;
+       }
+       
+       public Builder clone() {
+         return create().mergeFrom(buildPartial());
+       }
+       
+       public com.google.protobuf.Descriptors.Descriptor
+           getDescriptorForType() {
+         return com.openxc.BinaryMessages.RTCConfigurationCommand.getDescriptor();
+       }
+       
+       public com.openxc.BinaryMessages.RTCConfigurationCommand getDefaultInstanceForType() {
+         return com.openxc.BinaryMessages.RTCConfigurationCommand.getDefaultInstance();
+       }
+       
+       public com.openxc.BinaryMessages.RTCConfigurationCommand build() {
+         com.openxc.BinaryMessages.RTCConfigurationCommand result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(result);
+         }
+         return result;
+       }
+       
+       private com.openxc.BinaryMessages.RTCConfigurationCommand buildParsed()
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         com.openxc.BinaryMessages.RTCConfigurationCommand result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(
+             result).asInvalidProtocolBufferException();
+         }
+         return result;
+       }
+       
+       public com.openxc.BinaryMessages.RTCConfigurationCommand buildPartial() {
+         com.openxc.BinaryMessages.RTCConfigurationCommand result = new com.openxc.BinaryMessages.RTCConfigurationCommand(this);
+         int from_bitField0_ = bitField0_;
+         int to_bitField0_ = 0;
+         if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
+           to_bitField0_ |= 0x00000001;
+         }
+         result.unixTime_ = unixTime_;
+         result.bitField0_ = to_bitField0_;
+         onBuilt();
+         return result;
+       }
+       
+       public Builder mergeFrom(com.google.protobuf.Message other) {
+         if (other instanceof com.openxc.BinaryMessages.RTCConfigurationCommand) {
+           return mergeFrom((com.openxc.BinaryMessages.RTCConfigurationCommand)other);
+         } else {
+           super.mergeFrom(other);
+           return this;
+         }
+       }
+       
+       public Builder mergeFrom(com.openxc.BinaryMessages.RTCConfigurationCommand other) {
+         if (other == com.openxc.BinaryMessages.RTCConfigurationCommand.getDefaultInstance()) return this;
+         if (other.hasUnixTime()) {
+           setUnixTime(other.getUnixTime());
+         }
+         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 {
+         com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+           com.google.protobuf.UnknownFieldSet.newBuilder(
+             this.getUnknownFields());
+         while (true) {
+           int tag = input.readTag();
+           switch (tag) {
+             case 0:
+               this.setUnknownFields(unknownFields.build());
+               onChanged();
+               return this;
+             default: {
+               if (!parseUnknownField(input, unknownFields,
+                                      extensionRegistry, tag)) {
+                 this.setUnknownFields(unknownFields.build());
+                 onChanged();
+                 return this;
+               }
+               break;
+             }
+             case 8: {
+               bitField0_ |= 0x00000001;
+               unixTime_ = input.readUInt32();
+               break;
+             }
+           }
+         }
+       }
+       
+       private int bitField0_;
+       
+       // optional uint32 unix_time = 1;
+       private int unixTime_ ;
+       public boolean hasUnixTime() {
+         return ((bitField0_ & 0x00000001) == 0x00000001);
+       }
+       public int getUnixTime() {
+         return unixTime_;
+       }
+       public Builder setUnixTime(int value) {
+         bitField0_ |= 0x00000001;
+         unixTime_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearUnixTime() {
+         bitField0_ = (bitField0_ & ~0x00000001);
+         unixTime_ = 0;
+         onChanged();
+         return this;
+       }
+       
+       // @@protoc_insertion_point(builder_scope:openxc.RTCConfigurationCommand)
+     }
+     
+     static {
+       defaultInstance = new RTCConfigurationCommand(true);
+       defaultInstance.initFields();
+     }
+     
+     // @@protoc_insertion_point(class_scope:openxc.RTCConfigurationCommand)
+   }
+   
+   public interface CommandResponseOrBuilder
+       extends com.google.protobuf.MessageOrBuilder {
+     
+     // optional .openxc.ControlCommand.Type type = 1;
+     boolean hasType();
+     com.openxc.BinaryMessages.ControlCommand.Type getType();
+     
+     // optional string message = 2;
+     boolean hasMessage();
+     String getMessage();
+     
+     // optional bool status = 3;
+     boolean hasStatus();
+     boolean getStatus();
+   }
+   public static final class CommandResponse extends
+       com.google.protobuf.GeneratedMessage
+       implements CommandResponseOrBuilder {
+     // Use CommandResponse.newBuilder() to construct.
+     private CommandResponse(Builder builder) {
+       super(builder);
+     }
+     private CommandResponse(boolean noInit) {}
+     
+     private static final CommandResponse defaultInstance;
+     public static CommandResponse getDefaultInstance() {
+       return defaultInstance;
+     }
+     
+     public CommandResponse getDefaultInstanceForType() {
+       return defaultInstance;
+     }
+     
+     public static final com.google.protobuf.Descriptors.Descriptor
+         getDescriptor() {
+       return com.openxc.BinaryMessages.internal_static_openxc_CommandResponse_descriptor;
+     }
+     
+     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+         internalGetFieldAccessorTable() {
+       return com.openxc.BinaryMessages.internal_static_openxc_CommandResponse_fieldAccessorTable;
+     }
+     
+     private int bitField0_;
+     // optional .openxc.ControlCommand.Type type = 1;
+     public static final int TYPE_FIELD_NUMBER = 1;
+     private com.openxc.BinaryMessages.ControlCommand.Type type_;
+     public boolean hasType() {
+       return ((bitField0_ & 0x00000001) == 0x00000001);
+     }
+     public com.openxc.BinaryMessages.ControlCommand.Type getType() {
+       return type_;
+     }
+     
+     // optional string message = 2;
+     public static final int MESSAGE_FIELD_NUMBER = 2;
+     private java.lang.Object message_;
+     public boolean hasMessage() {
+       return ((bitField0_ & 0x00000002) == 0x00000002);
+     }
+     public String getMessage() {
+       java.lang.Object ref = message_;
+       if (ref instanceof String) {
+         return (String) ref;
+       } else {
+         com.google.protobuf.ByteString bs = 
+             (com.google.protobuf.ByteString) ref;
+         String s = bs.toStringUtf8();
+         if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+           message_ = s;
+         }
+         return s;
+       }
+     }
+     private com.google.protobuf.ByteString getMessageBytes() {
+       java.lang.Object ref = message_;
+       if (ref instanceof String) {
+         com.google.protobuf.ByteString b = 
+             com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+         message_ = b;
+         return b;
+       } else {
+         return (com.google.protobuf.ByteString) ref;
+       }
+     }
+     
+     // optional bool status = 3;
+     public static final int STATUS_FIELD_NUMBER = 3;
+     private boolean status_;
+     public boolean hasStatus() {
+       return ((bitField0_ & 0x00000004) == 0x00000004);
+     }
+     public boolean getStatus() {
+       return status_;
+     }
+     
+     private void initFields() {
+       type_ = com.openxc.BinaryMessages.ControlCommand.Type.VERSION;
+       message_ = "";
+       status_ = 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.writeEnum(1, type_.getNumber());
+       }
+       if (((bitField0_ & 0x00000002) == 0x00000002)) {
+         output.writeBytes(2, getMessageBytes());
+       }
+       if (((bitField0_ & 0x00000004) == 0x00000004)) {
+         output.writeBool(3, status_);
+       }
+       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
+           .computeBytesSize(2, getMessageBytes());
+       }
+       if (((bitField0_ & 0x00000004) == 0x00000004)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeBoolSize(3, status_);
+       }
+       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 com.openxc.BinaryMessages.CommandResponse parseFrom(
+         com.google.protobuf.ByteString data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.CommandResponse parseFrom(
+         com.google.protobuf.ByteString data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.CommandResponse parseFrom(byte[] data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.CommandResponse parseFrom(
+         byte[] data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.CommandResponse parseFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.CommandResponse parseFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.CommandResponse parseDelimitedFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.CommandResponse parseDelimitedFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.CommandResponse parseFrom(
+         com.google.protobuf.CodedInputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.CommandResponse parseFrom(
+         com.google.protobuf.CodedInputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     
+     public static Builder newBuilder() { return Builder.create(); }
+     public Builder newBuilderForType() { return newBuilder(); }
+     public static Builder newBuilder(com.openxc.BinaryMessages.CommandResponse 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;
+     }
+     public static final class Builder extends
+         com.google.protobuf.GeneratedMessage.Builder<Builder>
+        implements com.openxc.BinaryMessages.CommandResponseOrBuilder {
+       public static final com.google.protobuf.Descriptors.Descriptor
+           getDescriptor() {
+         return com.openxc.BinaryMessages.internal_static_openxc_CommandResponse_descriptor;
+       }
+       
+       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+           internalGetFieldAccessorTable() {
+         return com.openxc.BinaryMessages.internal_static_openxc_CommandResponse_fieldAccessorTable;
+       }
+       
+       // Construct using com.openxc.BinaryMessages.CommandResponse.newBuilder()
+       private Builder() {
+         maybeForceBuilderInitialization();
+       }
+       
+       private Builder(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();
+         type_ = com.openxc.BinaryMessages.ControlCommand.Type.VERSION;
+         bitField0_ = (bitField0_ & ~0x00000001);
+         message_ = "";
+         bitField0_ = (bitField0_ & ~0x00000002);
+         status_ = false;
+         bitField0_ = (bitField0_ & ~0x00000004);
+         return this;
+       }
+       
+       public Builder clone() {
+         return create().mergeFrom(buildPartial());
+       }
+       
+       public com.google.protobuf.Descriptors.Descriptor
+           getDescriptorForType() {
+         return com.openxc.BinaryMessages.CommandResponse.getDescriptor();
+       }
+       
+       public com.openxc.BinaryMessages.CommandResponse getDefaultInstanceForType() {
+         return com.openxc.BinaryMessages.CommandResponse.getDefaultInstance();
+       }
+       
+       public com.openxc.BinaryMessages.CommandResponse build() {
+         com.openxc.BinaryMessages.CommandResponse result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(result);
+         }
+         return result;
+       }
+       
+       private com.openxc.BinaryMessages.CommandResponse buildParsed()
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         com.openxc.BinaryMessages.CommandResponse result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(
+             result).asInvalidProtocolBufferException();
+         }
+         return result;
+       }
+       
+       public com.openxc.BinaryMessages.CommandResponse buildPartial() {
+         com.openxc.BinaryMessages.CommandResponse result = new com.openxc.BinaryMessages.CommandResponse(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;
+         }
+         result.message_ = message_;
+         if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+           to_bitField0_ |= 0x00000004;
+         }
+         result.status_ = status_;
+         result.bitField0_ = to_bitField0_;
+         onBuilt();
+         return result;
+       }
+       
+       public Builder mergeFrom(com.google.protobuf.Message other) {
+         if (other instanceof com.openxc.BinaryMessages.CommandResponse) {
+           return mergeFrom((com.openxc.BinaryMessages.CommandResponse)other);
+         } else {
+           super.mergeFrom(other);
+           return this;
+         }
+       }
+       
+       public Builder mergeFrom(com.openxc.BinaryMessages.CommandResponse other) {
+         if (other == com.openxc.BinaryMessages.CommandResponse.getDefaultInstance()) return this;
+         if (other.hasType()) {
+           setType(other.getType());
+         }
+         if (other.hasMessage()) {
+           setMessage(other.getMessage());
+         }
+         if (other.hasStatus()) {
+           setStatus(other.getStatus());
+         }
+         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 {
+         com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+           com.google.protobuf.UnknownFieldSet.newBuilder(
+             this.getUnknownFields());
+         while (true) {
+           int tag = input.readTag();
+           switch (tag) {
+             case 0:
+               this.setUnknownFields(unknownFields.build());
+               onChanged();
+               return this;
+             default: {
+               if (!parseUnknownField(input, unknownFields,
+                                      extensionRegistry, tag)) {
+                 this.setUnknownFields(unknownFields.build());
+                 onChanged();
+                 return this;
+               }
+               break;
+             }
+             case 8: {
+               int rawValue = input.readEnum();
+               com.openxc.BinaryMessages.ControlCommand.Type value = com.openxc.BinaryMessages.ControlCommand.Type.valueOf(rawValue);
+               if (value == null) {
+                 unknownFields.mergeVarintField(1, rawValue);
+               } else {
+                 bitField0_ |= 0x00000001;
+                 type_ = value;
+               }
+               break;
+             }
+             case 18: {
+               bitField0_ |= 0x00000002;
+               message_ = input.readBytes();
+               break;
+             }
+             case 24: {
+               bitField0_ |= 0x00000004;
+               status_ = input.readBool();
+               break;
+             }
+           }
+         }
+       }
+       
+       private int bitField0_;
+       
+       // optional .openxc.ControlCommand.Type type = 1;
+       private com.openxc.BinaryMessages.ControlCommand.Type type_ = com.openxc.BinaryMessages.ControlCommand.Type.VERSION;
+       public boolean hasType() {
+         return ((bitField0_ & 0x00000001) == 0x00000001);
+       }
+       public com.openxc.BinaryMessages.ControlCommand.Type getType() {
+         return type_;
+       }
+       public Builder setType(com.openxc.BinaryMessages.ControlCommand.Type value) {
+         if (value == null) {
+           throw new NullPointerException();
+         }
+         bitField0_ |= 0x00000001;
+         type_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearType() {
+         bitField0_ = (bitField0_ & ~0x00000001);
+         type_ = com.openxc.BinaryMessages.ControlCommand.Type.VERSION;
+         onChanged();
+         return this;
+       }
+       
+       // optional string message = 2;
+       private java.lang.Object message_ = "";
+       public boolean hasMessage() {
+         return ((bitField0_ & 0x00000002) == 0x00000002);
+       }
+       public String getMessage() {
+         java.lang.Object ref = message_;
+         if (!(ref instanceof String)) {
+           String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+           message_ = s;
+           return s;
+         } else {
+           return (String) ref;
+         }
+       }
+       public Builder setMessage(String value) {
+         if (value == null) {
+     throw new NullPointerException();
+   }
+   bitField0_ |= 0x00000002;
+         message_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearMessage() {
+         bitField0_ = (bitField0_ & ~0x00000002);
+         message_ = getDefaultInstance().getMessage();
+         onChanged();
+         return this;
+       }
+       void setMessage(com.google.protobuf.ByteString value) {
+         bitField0_ |= 0x00000002;
+         message_ = value;
+         onChanged();
+       }
+       
+       // optional bool status = 3;
+       private boolean status_ ;
+       public boolean hasStatus() {
+         return ((bitField0_ & 0x00000004) == 0x00000004);
+       }
+       public boolean getStatus() {
+         return status_;
+       }
+       public Builder setStatus(boolean value) {
+         bitField0_ |= 0x00000004;
+         status_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearStatus() {
+         bitField0_ = (bitField0_ & ~0x00000004);
+         status_ = false;
+         onChanged();
+         return this;
+       }
+       
+       // @@protoc_insertion_point(builder_scope:openxc.CommandResponse)
+     }
+     
+     static {
+       defaultInstance = new CommandResponse(true);
+       defaultInstance.initFields();
+     }
+     
+     // @@protoc_insertion_point(class_scope:openxc.CommandResponse)
+   }
+   
+   public interface DiagnosticRequestOrBuilder
+       extends com.google.protobuf.MessageOrBuilder {
+     
+     // optional int32 bus = 1;
+     boolean hasBus();
+     int getBus();
+     
+     // optional uint32 message_id = 2;
+     boolean hasMessageId();
+     int getMessageId();
+     
+     // optional uint32 mode = 3;
+     boolean hasMode();
+     int getMode();
+     
+     // optional uint32 pid = 4;
+     boolean hasPid();
+     int getPid();
+     
+     // optional bytes payload = 5;
+     boolean hasPayload();
+     com.google.protobuf.ByteString getPayload();
+     
+     // optional bool multiple_responses = 6;
+     boolean hasMultipleResponses();
+     boolean getMultipleResponses();
+     
+     // optional double frequency = 7;
+     boolean hasFrequency();
+     double getFrequency();
+     
+     // optional string name = 8;
+     boolean hasName();
+     String getName();
+     
+     // optional .openxc.DiagnosticRequest.DecodedType decoded_type = 9;
+     boolean hasDecodedType();
+     com.openxc.BinaryMessages.DiagnosticRequest.DecodedType getDecodedType();
+   }
+   public static final class DiagnosticRequest extends
+       com.google.protobuf.GeneratedMessage
+       implements DiagnosticRequestOrBuilder {
+     // Use DiagnosticRequest.newBuilder() to construct.
+     private DiagnosticRequest(Builder builder) {
+       super(builder);
+     }
+     private DiagnosticRequest(boolean noInit) {}
+     
+     private static final DiagnosticRequest defaultInstance;
+     public static DiagnosticRequest getDefaultInstance() {
+       return defaultInstance;
+     }
+     
+     public DiagnosticRequest getDefaultInstanceForType() {
+       return defaultInstance;
+     }
+     
+     public static final com.google.protobuf.Descriptors.Descriptor
+         getDescriptor() {
+       return com.openxc.BinaryMessages.internal_static_openxc_DiagnosticRequest_descriptor;
+     }
+     
+     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+         internalGetFieldAccessorTable() {
+       return com.openxc.BinaryMessages.internal_static_openxc_DiagnosticRequest_fieldAccessorTable;
+     }
+     
+     public enum DecodedType
+         implements com.google.protobuf.ProtocolMessageEnum {
+       NONE(0, 1),
+       OBD2(1, 2),
+       ;
+       
+       public static final int NONE_VALUE = 1;
+       public static final int OBD2_VALUE = 2;
+       
+       
+       public final int getNumber() { return value; }
+       
+       public static DecodedType valueOf(int value) {
+         switch (value) {
+           case 1: return NONE;
+           case 2: return OBD2;
+           default: return null;
+         }
+       }
+       
+       public static com.google.protobuf.Internal.EnumLiteMap<DecodedType>
+           internalGetValueMap() {
+         return internalValueMap;
+       }
+       private static com.google.protobuf.Internal.EnumLiteMap<DecodedType>
+           internalValueMap =
+             new com.google.protobuf.Internal.EnumLiteMap<DecodedType>() {
+               public DecodedType findValueByNumber(int number) {
+                 return DecodedType.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 com.openxc.BinaryMessages.DiagnosticRequest.getDescriptor().getEnumTypes().get(0);
+       }
+       
+       private static final DecodedType[] VALUES = {
+         NONE, OBD2, 
+       };
+       
+       public static DecodedType 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 DecodedType(int index, int value) {
+         this.index = index;
+         this.value = value;
+       }
+       
+       // @@protoc_insertion_point(enum_scope:openxc.DiagnosticRequest.DecodedType)
+     }
+     
+     private int bitField0_;
+     // optional int32 bus = 1;
+     public static final int BUS_FIELD_NUMBER = 1;
+     private int bus_;
+     public boolean hasBus() {
+       return ((bitField0_ & 0x00000001) == 0x00000001);
+     }
+     public int getBus() {
+       return bus_;
+     }
+     
+     // optional uint32 message_id = 2;
+     public static final int MESSAGE_ID_FIELD_NUMBER = 2;
+     private int messageId_;
+     public boolean hasMessageId() {
+       return ((bitField0_ & 0x00000002) == 0x00000002);
+     }
+     public int getMessageId() {
+       return messageId_;
+     }
+     
+     // optional uint32 mode = 3;
+     public static final int MODE_FIELD_NUMBER = 3;
+     private int mode_;
+     public boolean hasMode() {
+       return ((bitField0_ & 0x00000004) == 0x00000004);
+     }
+     public int getMode() {
+       return mode_;
+     }
+     
+     // optional uint32 pid = 4;
+     public static final int PID_FIELD_NUMBER = 4;
+     private int pid_;
+     public boolean hasPid() {
+       return ((bitField0_ & 0x00000008) == 0x00000008);
+     }
+     public int getPid() {
+       return pid_;
+     }
+     
+     // optional bytes payload = 5;
+     public static final int PAYLOAD_FIELD_NUMBER = 5;
+     private com.google.protobuf.ByteString payload_;
+     public boolean hasPayload() {
+       return ((bitField0_ & 0x00000010) == 0x00000010);
+     }
+     public com.google.protobuf.ByteString getPayload() {
+       return payload_;
+     }
+     
+     // optional bool multiple_responses = 6;
+     public static final int MULTIPLE_RESPONSES_FIELD_NUMBER = 6;
+     private boolean multipleResponses_;
+     public boolean hasMultipleResponses() {
+       return ((bitField0_ & 0x00000020) == 0x00000020);
+     }
+     public boolean getMultipleResponses() {
+       return multipleResponses_;
+     }
+     
+     // optional double frequency = 7;
+     public static final int FREQUENCY_FIELD_NUMBER = 7;
+     private double frequency_;
+     public boolean hasFrequency() {
+       return ((bitField0_ & 0x00000040) == 0x00000040);
+     }
+     public double getFrequency() {
+       return frequency_;
+     }
+     
+     // optional string name = 8;
+     public static final int NAME_FIELD_NUMBER = 8;
+     private java.lang.Object name_;
+     public boolean hasName() {
+       return ((bitField0_ & 0x00000080) == 0x00000080);
+     }
+     public String getName() {
+       java.lang.Object ref = name_;
+       if (ref instanceof String) {
+         return (String) ref;
+       } else {
+         com.google.protobuf.ByteString bs = 
+             (com.google.protobuf.ByteString) ref;
+         String s = bs.toStringUtf8();
+         if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+           name_ = s;
+         }
+         return s;
+       }
+     }
+     private com.google.protobuf.ByteString getNameBytes() {
+       java.lang.Object ref = name_;
+       if (ref instanceof String) {
+         com.google.protobuf.ByteString b = 
+             com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+         name_ = b;
+         return b;
+       } else {
+         return (com.google.protobuf.ByteString) ref;
+       }
+     }
+     
+     // optional .openxc.DiagnosticRequest.DecodedType decoded_type = 9;
+     public static final int DECODED_TYPE_FIELD_NUMBER = 9;
+     private com.openxc.BinaryMessages.DiagnosticRequest.DecodedType decodedType_;
+     public boolean hasDecodedType() {
+       return ((bitField0_ & 0x00000100) == 0x00000100);
+     }
+     public com.openxc.BinaryMessages.DiagnosticRequest.DecodedType getDecodedType() {
+       return decodedType_;
+     }
+     
+     private void initFields() {
+       bus_ = 0;
+       messageId_ = 0;
+       mode_ = 0;
+       pid_ = 0;
+       payload_ = com.google.protobuf.ByteString.EMPTY;
+       multipleResponses_ = false;
+       frequency_ = 0D;
+       name_ = "";
+       decodedType_ = com.openxc.BinaryMessages.DiagnosticRequest.DecodedType.NONE;
+     }
+     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.writeUInt32(3, mode_);
+       }
+       if (((bitField0_ & 0x00000008) == 0x00000008)) {
+         output.writeUInt32(4, pid_);
+       }
+       if (((bitField0_ & 0x00000010) == 0x00000010)) {
+         output.writeBytes(5, payload_);
+       }
+       if (((bitField0_ & 0x00000020) == 0x00000020)) {
+         output.writeBool(6, multipleResponses_);
+       }
+       if (((bitField0_ & 0x00000040) == 0x00000040)) {
+         output.writeDouble(7, frequency_);
+       }
+       if (((bitField0_ & 0x00000080) == 0x00000080)) {
+         output.writeBytes(8, getNameBytes());
+       }
+       if (((bitField0_ & 0x00000100) == 0x00000100)) {
+         output.writeEnum(9, decodedType_.getNumber());
+       }
+       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
+           .computeUInt32Size(3, mode_);
+       }
+       if (((bitField0_ & 0x00000008) == 0x00000008)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeUInt32Size(4, pid_);
+       }
+       if (((bitField0_ & 0x00000010) == 0x00000010)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeBytesSize(5, payload_);
+       }
+       if (((bitField0_ & 0x00000020) == 0x00000020)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeBoolSize(6, multipleResponses_);
+       }
+       if (((bitField0_ & 0x00000040) == 0x00000040)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeDoubleSize(7, frequency_);
+       }
+       if (((bitField0_ & 0x00000080) == 0x00000080)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeBytesSize(8, getNameBytes());
+       }
+       if (((bitField0_ & 0x00000100) == 0x00000100)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeEnumSize(9, decodedType_.getNumber());
+       }
+       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 com.openxc.BinaryMessages.DiagnosticRequest parseFrom(
+         com.google.protobuf.ByteString data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticRequest parseFrom(
+         com.google.protobuf.ByteString data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticRequest parseFrom(byte[] data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticRequest parseFrom(
+         byte[] data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticRequest parseFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticRequest parseFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticRequest parseDelimitedFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.DiagnosticRequest parseDelimitedFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.DiagnosticRequest parseFrom(
+         com.google.protobuf.CodedInputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticRequest parseFrom(
+         com.google.protobuf.CodedInputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     
+     public static Builder newBuilder() { return Builder.create(); }
+     public Builder newBuilderForType() { return newBuilder(); }
+     public static Builder newBuilder(com.openxc.BinaryMessages.DiagnosticRequest 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;
+     }
+     public static final class Builder extends
+         com.google.protobuf.GeneratedMessage.Builder<Builder>
+        implements com.openxc.BinaryMessages.DiagnosticRequestOrBuilder {
+       public static final com.google.protobuf.Descriptors.Descriptor
+           getDescriptor() {
+         return com.openxc.BinaryMessages.internal_static_openxc_DiagnosticRequest_descriptor;
+       }
+       
+       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+           internalGetFieldAccessorTable() {
+         return com.openxc.BinaryMessages.internal_static_openxc_DiagnosticRequest_fieldAccessorTable;
+       }
+       
+       // Construct using com.openxc.BinaryMessages.DiagnosticRequest.newBuilder()
+       private Builder() {
+         maybeForceBuilderInitialization();
+       }
+       
+       private Builder(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);
+         mode_ = 0;
+         bitField0_ = (bitField0_ & ~0x00000004);
+         pid_ = 0;
+         bitField0_ = (bitField0_ & ~0x00000008);
+         payload_ = com.google.protobuf.ByteString.EMPTY;
+         bitField0_ = (bitField0_ & ~0x00000010);
+         multipleResponses_ = false;
+         bitField0_ = (bitField0_ & ~0x00000020);
+         frequency_ = 0D;
+         bitField0_ = (bitField0_ & ~0x00000040);
+         name_ = "";
+         bitField0_ = (bitField0_ & ~0x00000080);
+         decodedType_ = com.openxc.BinaryMessages.DiagnosticRequest.DecodedType.NONE;
+         bitField0_ = (bitField0_ & ~0x00000100);
+         return this;
+       }
+       
+       public Builder clone() {
+         return create().mergeFrom(buildPartial());
+       }
+       
+       public com.google.protobuf.Descriptors.Descriptor
+           getDescriptorForType() {
+         return com.openxc.BinaryMessages.DiagnosticRequest.getDescriptor();
+       }
+       
+       public com.openxc.BinaryMessages.DiagnosticRequest getDefaultInstanceForType() {
+         return com.openxc.BinaryMessages.DiagnosticRequest.getDefaultInstance();
+       }
+       
+       public com.openxc.BinaryMessages.DiagnosticRequest build() {
+         com.openxc.BinaryMessages.DiagnosticRequest result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(result);
+         }
+         return result;
+       }
+       
+       private com.openxc.BinaryMessages.DiagnosticRequest buildParsed()
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         com.openxc.BinaryMessages.DiagnosticRequest result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(
+             result).asInvalidProtocolBufferException();
+         }
+         return result;
+       }
+       
+       public com.openxc.BinaryMessages.DiagnosticRequest buildPartial() {
+         com.openxc.BinaryMessages.DiagnosticRequest result = new com.openxc.BinaryMessages.DiagnosticRequest(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.mode_ = mode_;
+         if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
+           to_bitField0_ |= 0x00000008;
+         }
+         result.pid_ = pid_;
+         if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
+           to_bitField0_ |= 0x00000010;
+         }
+         result.payload_ = payload_;
+         if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
+           to_bitField0_ |= 0x00000020;
+         }
+         result.multipleResponses_ = multipleResponses_;
+         if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
+           to_bitField0_ |= 0x00000040;
+         }
+         result.frequency_ = frequency_;
+         if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
+           to_bitField0_ |= 0x00000080;
+         }
+         result.name_ = name_;
+         if (((from_bitField0_ & 0x00000100) == 0x00000100)) {
+           to_bitField0_ |= 0x00000100;
+         }
+         result.decodedType_ = decodedType_;
+         result.bitField0_ = to_bitField0_;
+         onBuilt();
+         return result;
+       }
+       
+       public Builder mergeFrom(com.google.protobuf.Message other) {
+         if (other instanceof com.openxc.BinaryMessages.DiagnosticRequest) {
+           return mergeFrom((com.openxc.BinaryMessages.DiagnosticRequest)other);
+         } else {
+           super.mergeFrom(other);
+           return this;
+         }
+       }
+       
+       public Builder mergeFrom(com.openxc.BinaryMessages.DiagnosticRequest other) {
+         if (other == com.openxc.BinaryMessages.DiagnosticRequest.getDefaultInstance()) return this;
+         if (other.hasBus()) {
+           setBus(other.getBus());
+         }
+         if (other.hasMessageId()) {
+           setMessageId(other.getMessageId());
+         }
+         if (other.hasMode()) {
+           setMode(other.getMode());
+         }
+         if (other.hasPid()) {
+           setPid(other.getPid());
+         }
+         if (other.hasPayload()) {
+           setPayload(other.getPayload());
+         }
+         if (other.hasMultipleResponses()) {
+           setMultipleResponses(other.getMultipleResponses());
+         }
+         if (other.hasFrequency()) {
+           setFrequency(other.getFrequency());
+         }
+         if (other.hasName()) {
+           setName(other.getName());
+         }
+         if (other.hasDecodedType()) {
+           setDecodedType(other.getDecodedType());
+         }
+         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 {
+         com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+           com.google.protobuf.UnknownFieldSet.newBuilder(
+             this.getUnknownFields());
+         while (true) {
+           int tag = input.readTag();
+           switch (tag) {
+             case 0:
+               this.setUnknownFields(unknownFields.build());
+               onChanged();
+               return this;
+             default: {
+               if (!parseUnknownField(input, unknownFields,
+                                      extensionRegistry, tag)) {
+                 this.setUnknownFields(unknownFields.build());
+                 onChanged();
+                 return this;
+               }
+               break;
+             }
+             case 8: {
+               bitField0_ |= 0x00000001;
+               bus_ = input.readInt32();
+               break;
+             }
+             case 16: {
+               bitField0_ |= 0x00000002;
+               messageId_ = input.readUInt32();
+               break;
+             }
+             case 24: {
+               bitField0_ |= 0x00000004;
+               mode_ = input.readUInt32();
+               break;
+             }
+             case 32: {
+               bitField0_ |= 0x00000008;
+               pid_ = input.readUInt32();
+               break;
+             }
+             case 42: {
+               bitField0_ |= 0x00000010;
+               payload_ = input.readBytes();
+               break;
+             }
+             case 48: {
+               bitField0_ |= 0x00000020;
+               multipleResponses_ = input.readBool();
+               break;
+             }
+             case 57: {
+               bitField0_ |= 0x00000040;
+               frequency_ = input.readDouble();
+               break;
+             }
+             case 66: {
+               bitField0_ |= 0x00000080;
+               name_ = input.readBytes();
+               break;
+             }
+             case 72: {
+               int rawValue = input.readEnum();
+               com.openxc.BinaryMessages.DiagnosticRequest.DecodedType value = com.openxc.BinaryMessages.DiagnosticRequest.DecodedType.valueOf(rawValue);
+               if (value == null) {
+                 unknownFields.mergeVarintField(9, rawValue);
+               } else {
+                 bitField0_ |= 0x00000100;
+                 decodedType_ = value;
+               }
+               break;
+             }
+           }
+         }
+       }
+       
+       private int bitField0_;
+       
+       // optional int32 bus = 1;
+       private int bus_ ;
+       public boolean hasBus() {
+         return ((bitField0_ & 0x00000001) == 0x00000001);
+       }
+       public int getBus() {
+         return bus_;
+       }
+       public Builder setBus(int value) {
+         bitField0_ |= 0x00000001;
+         bus_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearBus() {
+         bitField0_ = (bitField0_ & ~0x00000001);
+         bus_ = 0;
+         onChanged();
+         return this;
+       }
+       
+       // optional uint32 message_id = 2;
+       private int messageId_ ;
+       public boolean hasMessageId() {
+         return ((bitField0_ & 0x00000002) == 0x00000002);
+       }
+       public int getMessageId() {
+         return messageId_;
+       }
+       public Builder setMessageId(int value) {
+         bitField0_ |= 0x00000002;
+         messageId_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearMessageId() {
+         bitField0_ = (bitField0_ & ~0x00000002);
+         messageId_ = 0;
+         onChanged();
+         return this;
+       }
+       
+       // optional uint32 mode = 3;
+       private int mode_ ;
+       public boolean hasMode() {
+         return ((bitField0_ & 0x00000004) == 0x00000004);
+       }
+       public int getMode() {
+         return mode_;
+       }
+       public Builder setMode(int value) {
+         bitField0_ |= 0x00000004;
+         mode_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearMode() {
+         bitField0_ = (bitField0_ & ~0x00000004);
+         mode_ = 0;
+         onChanged();
+         return this;
+       }
+       
+       // optional uint32 pid = 4;
+       private int pid_ ;
+       public boolean hasPid() {
+         return ((bitField0_ & 0x00000008) == 0x00000008);
+       }
+       public int getPid() {
+         return pid_;
+       }
+       public Builder setPid(int value) {
+         bitField0_ |= 0x00000008;
+         pid_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearPid() {
+         bitField0_ = (bitField0_ & ~0x00000008);
+         pid_ = 0;
+         onChanged();
+         return this;
+       }
+       
+       // optional bytes payload = 5;
+       private com.google.protobuf.ByteString payload_ = com.google.protobuf.ByteString.EMPTY;
+       public boolean hasPayload() {
+         return ((bitField0_ & 0x00000010) == 0x00000010);
+       }
+       public com.google.protobuf.ByteString getPayload() {
+         return payload_;
+       }
+       public Builder setPayload(com.google.protobuf.ByteString value) {
+         if (value == null) {
+     throw new NullPointerException();
+   }
+   bitField0_ |= 0x00000010;
+         payload_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearPayload() {
+         bitField0_ = (bitField0_ & ~0x00000010);
+         payload_ = getDefaultInstance().getPayload();
+         onChanged();
+         return this;
+       }
+       
+       // optional bool multiple_responses = 6;
+       private boolean multipleResponses_ ;
+       public boolean hasMultipleResponses() {
+         return ((bitField0_ & 0x00000020) == 0x00000020);
+       }
+       public boolean getMultipleResponses() {
+         return multipleResponses_;
+       }
+       public Builder setMultipleResponses(boolean value) {
+         bitField0_ |= 0x00000020;
+         multipleResponses_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearMultipleResponses() {
+         bitField0_ = (bitField0_ & ~0x00000020);
+         multipleResponses_ = false;
+         onChanged();
+         return this;
+       }
+       
+       // optional double frequency = 7;
+       private double frequency_ ;
+       public boolean hasFrequency() {
+         return ((bitField0_ & 0x00000040) == 0x00000040);
+       }
+       public double getFrequency() {
+         return frequency_;
+       }
+       public Builder setFrequency(double value) {
+         bitField0_ |= 0x00000040;
+         frequency_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearFrequency() {
+         bitField0_ = (bitField0_ & ~0x00000040);
+         frequency_ = 0D;
+         onChanged();
+         return this;
+       }
+       
+       // optional string name = 8;
+       private java.lang.Object name_ = "";
+       public boolean hasName() {
+         return ((bitField0_ & 0x00000080) == 0x00000080);
+       }
+       public String getName() {
+         java.lang.Object ref = name_;
+         if (!(ref instanceof String)) {
+           String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+           name_ = s;
+           return s;
+         } else {
+           return (String) ref;
+         }
+       }
+       public Builder setName(String value) {
+         if (value == null) {
+     throw new NullPointerException();
+   }
+   bitField0_ |= 0x00000080;
+         name_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearName() {
+         bitField0_ = (bitField0_ & ~0x00000080);
+         name_ = getDefaultInstance().getName();
+         onChanged();
+         return this;
+       }
+       void setName(com.google.protobuf.ByteString value) {
+         bitField0_ |= 0x00000080;
+         name_ = value;
+         onChanged();
+       }
+       
+       // optional .openxc.DiagnosticRequest.DecodedType decoded_type = 9;
+       private com.openxc.BinaryMessages.DiagnosticRequest.DecodedType decodedType_ = com.openxc.BinaryMessages.DiagnosticRequest.DecodedType.NONE;
+       public boolean hasDecodedType() {
+         return ((bitField0_ & 0x00000100) == 0x00000100);
+       }
+       public com.openxc.BinaryMessages.DiagnosticRequest.DecodedType getDecodedType() {
+         return decodedType_;
+       }
+       public Builder setDecodedType(com.openxc.BinaryMessages.DiagnosticRequest.DecodedType value) {
+         if (value == null) {
+           throw new NullPointerException();
+         }
+         bitField0_ |= 0x00000100;
+         decodedType_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearDecodedType() {
+         bitField0_ = (bitField0_ & ~0x00000100);
+         decodedType_ = com.openxc.BinaryMessages.DiagnosticRequest.DecodedType.NONE;
+         onChanged();
+         return this;
+       }
+       
+       // @@protoc_insertion_point(builder_scope:openxc.DiagnosticRequest)
+     }
+     
+     static {
+       defaultInstance = new DiagnosticRequest(true);
+       defaultInstance.initFields();
+     }
+     
+     // @@protoc_insertion_point(class_scope:openxc.DiagnosticRequest)
+   }
+   
+   public interface DiagnosticResponseOrBuilder
+       extends com.google.protobuf.MessageOrBuilder {
+     
+     // optional int32 bus = 1;
+     boolean hasBus();
+     int getBus();
+     
+     // optional uint32 message_id = 2;
+     boolean hasMessageId();
+     int getMessageId();
+     
+     // optional uint32 mode = 3;
+     boolean hasMode();
+     int getMode();
+     
+     // optional uint32 pid = 4;
+     boolean hasPid();
+     int getPid();
+     
+     // optional bool success = 5;
+     boolean hasSuccess();
+     boolean getSuccess();
+     
+     // optional uint32 negative_response_code = 6;
+     boolean hasNegativeResponseCode();
+     int getNegativeResponseCode();
+     
+     // optional bytes payload = 7;
+     boolean hasPayload();
+     com.google.protobuf.ByteString getPayload();
+     
+     // optional double value = 8;
+     boolean hasValue();
+     double getValue();
+   }
+   public static final class DiagnosticResponse extends
+       com.google.protobuf.GeneratedMessage
+       implements DiagnosticResponseOrBuilder {
+     // Use DiagnosticResponse.newBuilder() to construct.
+     private DiagnosticResponse(Builder builder) {
+       super(builder);
+     }
+     private DiagnosticResponse(boolean noInit) {}
+     
+     private static final DiagnosticResponse defaultInstance;
+     public static DiagnosticResponse getDefaultInstance() {
+       return defaultInstance;
+     }
+     
+     public DiagnosticResponse getDefaultInstanceForType() {
+       return defaultInstance;
+     }
+     
+     public static final com.google.protobuf.Descriptors.Descriptor
+         getDescriptor() {
+       return com.openxc.BinaryMessages.internal_static_openxc_DiagnosticResponse_descriptor;
+     }
+     
+     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+         internalGetFieldAccessorTable() {
+       return com.openxc.BinaryMessages.internal_static_openxc_DiagnosticResponse_fieldAccessorTable;
+     }
+     
+     private int bitField0_;
+     // optional int32 bus = 1;
+     public static final int BUS_FIELD_NUMBER = 1;
+     private int bus_;
+     public boolean hasBus() {
+       return ((bitField0_ & 0x00000001) == 0x00000001);
+     }
+     public int getBus() {
+       return bus_;
+     }
+     
+     // optional uint32 message_id = 2;
+     public static final int MESSAGE_ID_FIELD_NUMBER = 2;
+     private int messageId_;
+     public boolean hasMessageId() {
+       return ((bitField0_ & 0x00000002) == 0x00000002);
+     }
+     public int getMessageId() {
+       return messageId_;
+     }
+     
+     // optional uint32 mode = 3;
+     public static final int MODE_FIELD_NUMBER = 3;
+     private int mode_;
+     public boolean hasMode() {
+       return ((bitField0_ & 0x00000004) == 0x00000004);
+     }
+     public int getMode() {
+       return mode_;
+     }
+     
+     // optional uint32 pid = 4;
+     public static final int PID_FIELD_NUMBER = 4;
+     private int pid_;
+     public boolean hasPid() {
+       return ((bitField0_ & 0x00000008) == 0x00000008);
+     }
+     public int getPid() {
+       return pid_;
+     }
+     
+     // optional bool success = 5;
+     public static final int SUCCESS_FIELD_NUMBER = 5;
+     private boolean success_;
+     public boolean hasSuccess() {
+       return ((bitField0_ & 0x00000010) == 0x00000010);
+     }
+     public boolean getSuccess() {
+       return success_;
+     }
+     
+     // optional uint32 negative_response_code = 6;
+     public static final int NEGATIVE_RESPONSE_CODE_FIELD_NUMBER = 6;
+     private int negativeResponseCode_;
+     public boolean hasNegativeResponseCode() {
+       return ((bitField0_ & 0x00000020) == 0x00000020);
+     }
+     public int getNegativeResponseCode() {
+       return negativeResponseCode_;
+     }
+     
+     // optional bytes payload = 7;
+     public static final int PAYLOAD_FIELD_NUMBER = 7;
+     private com.google.protobuf.ByteString payload_;
+     public boolean hasPayload() {
+       return ((bitField0_ & 0x00000040) == 0x00000040);
+     }
+     public com.google.protobuf.ByteString getPayload() {
+       return payload_;
+     }
+     
+     // optional double value = 8;
+     public static final int VALUE_FIELD_NUMBER = 8;
+     private double value_;
+     public boolean hasValue() {
+       return ((bitField0_ & 0x00000080) == 0x00000080);
+     }
+     public double getValue() {
+       return value_;
+     }
+     
+     private void initFields() {
+       bus_ = 0;
+       messageId_ = 0;
+       mode_ = 0;
+       pid_ = 0;
+       success_ = false;
+       negativeResponseCode_ = 0;
+       payload_ = com.google.protobuf.ByteString.EMPTY;
+       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.writeInt32(1, bus_);
+       }
+       if (((bitField0_ & 0x00000002) == 0x00000002)) {
+         output.writeUInt32(2, messageId_);
+       }
+       if (((bitField0_ & 0x00000004) == 0x00000004)) {
+         output.writeUInt32(3, mode_);
+       }
+       if (((bitField0_ & 0x00000008) == 0x00000008)) {
+         output.writeUInt32(4, pid_);
+       }
+       if (((bitField0_ & 0x00000010) == 0x00000010)) {
+         output.writeBool(5, success_);
+       }
+       if (((bitField0_ & 0x00000020) == 0x00000020)) {
+         output.writeUInt32(6, negativeResponseCode_);
+       }
+       if (((bitField0_ & 0x00000040) == 0x00000040)) {
+         output.writeBytes(7, payload_);
+       }
+       if (((bitField0_ & 0x00000080) == 0x00000080)) {
+         output.writeDouble(8, 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
+           .computeInt32Size(1, bus_);
+       }
+       if (((bitField0_ & 0x00000002) == 0x00000002)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeUInt32Size(2, messageId_);
+       }
+       if (((bitField0_ & 0x00000004) == 0x00000004)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeUInt32Size(3, mode_);
+       }
+       if (((bitField0_ & 0x00000008) == 0x00000008)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeUInt32Size(4, pid_);
+       }
+       if (((bitField0_ & 0x00000010) == 0x00000010)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeBoolSize(5, success_);
+       }
+       if (((bitField0_ & 0x00000020) == 0x00000020)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeUInt32Size(6, negativeResponseCode_);
+       }
+       if (((bitField0_ & 0x00000040) == 0x00000040)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeBytesSize(7, payload_);
+       }
+       if (((bitField0_ & 0x00000080) == 0x00000080)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeDoubleSize(8, 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 com.openxc.BinaryMessages.DiagnosticResponse parseFrom(
+         com.google.protobuf.ByteString data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticResponse parseFrom(
+         com.google.protobuf.ByteString data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticResponse parseFrom(byte[] data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticResponse parseFrom(
+         byte[] data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticResponse parseFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticResponse parseFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticResponse parseDelimitedFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.DiagnosticResponse parseDelimitedFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.DiagnosticResponse parseFrom(
+         com.google.protobuf.CodedInputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DiagnosticResponse parseFrom(
+         com.google.protobuf.CodedInputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     
+     public static Builder newBuilder() { return Builder.create(); }
+     public Builder newBuilderForType() { return newBuilder(); }
+     public static Builder newBuilder(com.openxc.BinaryMessages.DiagnosticResponse 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;
+     }
+     public static final class Builder extends
+         com.google.protobuf.GeneratedMessage.Builder<Builder>
+        implements com.openxc.BinaryMessages.DiagnosticResponseOrBuilder {
+       public static final com.google.protobuf.Descriptors.Descriptor
+           getDescriptor() {
+         return com.openxc.BinaryMessages.internal_static_openxc_DiagnosticResponse_descriptor;
+       }
+       
+       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+           internalGetFieldAccessorTable() {
+         return com.openxc.BinaryMessages.internal_static_openxc_DiagnosticResponse_fieldAccessorTable;
+       }
+       
+       // Construct using com.openxc.BinaryMessages.DiagnosticResponse.newBuilder()
+       private Builder() {
+         maybeForceBuilderInitialization();
+       }
+       
+       private Builder(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);
+         mode_ = 0;
+         bitField0_ = (bitField0_ & ~0x00000004);
+         pid_ = 0;
+         bitField0_ = (bitField0_ & ~0x00000008);
+         success_ = false;
+         bitField0_ = (bitField0_ & ~0x00000010);
+         negativeResponseCode_ = 0;
+         bitField0_ = (bitField0_ & ~0x00000020);
+         payload_ = com.google.protobuf.ByteString.EMPTY;
+         bitField0_ = (bitField0_ & ~0x00000040);
+         value_ = 0D;
+         bitField0_ = (bitField0_ & ~0x00000080);
+         return this;
+       }
+       
+       public Builder clone() {
+         return create().mergeFrom(buildPartial());
+       }
+       
+       public com.google.protobuf.Descriptors.Descriptor
+           getDescriptorForType() {
+         return com.openxc.BinaryMessages.DiagnosticResponse.getDescriptor();
+       }
+       
+       public com.openxc.BinaryMessages.DiagnosticResponse getDefaultInstanceForType() {
+         return com.openxc.BinaryMessages.DiagnosticResponse.getDefaultInstance();
+       }
+       
+       public com.openxc.BinaryMessages.DiagnosticResponse build() {
+         com.openxc.BinaryMessages.DiagnosticResponse result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(result);
+         }
+         return result;
+       }
+       
+       private com.openxc.BinaryMessages.DiagnosticResponse buildParsed()
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         com.openxc.BinaryMessages.DiagnosticResponse result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(
+             result).asInvalidProtocolBufferException();
+         }
+         return result;
+       }
+       
+       public com.openxc.BinaryMessages.DiagnosticResponse buildPartial() {
+         com.openxc.BinaryMessages.DiagnosticResponse result = new com.openxc.BinaryMessages.DiagnosticResponse(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.mode_ = mode_;
+         if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
+           to_bitField0_ |= 0x00000008;
+         }
+         result.pid_ = pid_;
+         if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
+           to_bitField0_ |= 0x00000010;
+         }
+         result.success_ = success_;
+         if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
+           to_bitField0_ |= 0x00000020;
+         }
+         result.negativeResponseCode_ = negativeResponseCode_;
+         if (((from_bitField0_ & 0x00000040) == 0x00000040)) {
+           to_bitField0_ |= 0x00000040;
+         }
+         result.payload_ = payload_;
+         if (((from_bitField0_ & 0x00000080) == 0x00000080)) {
+           to_bitField0_ |= 0x00000080;
+         }
+         result.value_ = value_;
+         result.bitField0_ = to_bitField0_;
+         onBuilt();
+         return result;
+       }
+       
+       public Builder mergeFrom(com.google.protobuf.Message other) {
+         if (other instanceof com.openxc.BinaryMessages.DiagnosticResponse) {
+           return mergeFrom((com.openxc.BinaryMessages.DiagnosticResponse)other);
+         } else {
+           super.mergeFrom(other);
+           return this;
+         }
+       }
+       
+       public Builder mergeFrom(com.openxc.BinaryMessages.DiagnosticResponse other) {
+         if (other == com.openxc.BinaryMessages.DiagnosticResponse.getDefaultInstance()) return this;
+         if (other.hasBus()) {
+           setBus(other.getBus());
+         }
+         if (other.hasMessageId()) {
+           setMessageId(other.getMessageId());
+         }
+         if (other.hasMode()) {
+           setMode(other.getMode());
+         }
+         if (other.hasPid()) {
+           setPid(other.getPid());
+         }
+         if (other.hasSuccess()) {
+           setSuccess(other.getSuccess());
+         }
+         if (other.hasNegativeResponseCode()) {
+           setNegativeResponseCode(other.getNegativeResponseCode());
+         }
+         if (other.hasPayload()) {
+           setPayload(other.getPayload());
+         }
+         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 {
+         com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+           com.google.protobuf.UnknownFieldSet.newBuilder(
+             this.getUnknownFields());
+         while (true) {
+           int tag = input.readTag();
+           switch (tag) {
+             case 0:
+               this.setUnknownFields(unknownFields.build());
+               onChanged();
+               return this;
+             default: {
+               if (!parseUnknownField(input, unknownFields,
+                                      extensionRegistry, tag)) {
+                 this.setUnknownFields(unknownFields.build());
+                 onChanged();
+                 return this;
+               }
+               break;
+             }
+             case 8: {
+               bitField0_ |= 0x00000001;
+               bus_ = input.readInt32();
+               break;
+             }
+             case 16: {
+               bitField0_ |= 0x00000002;
+               messageId_ = input.readUInt32();
+               break;
+             }
+             case 24: {
+               bitField0_ |= 0x00000004;
+               mode_ = input.readUInt32();
+               break;
+             }
+             case 32: {
+               bitField0_ |= 0x00000008;
+               pid_ = input.readUInt32();
+               break;
+             }
+             case 40: {
+               bitField0_ |= 0x00000010;
+               success_ = input.readBool();
+               break;
+             }
+             case 48: {
+               bitField0_ |= 0x00000020;
+               negativeResponseCode_ = input.readUInt32();
+               break;
+             }
+             case 58: {
+               bitField0_ |= 0x00000040;
+               payload_ = input.readBytes();
+               break;
+             }
+             case 65: {
+               bitField0_ |= 0x00000080;
+               value_ = input.readDouble();
+               break;
+             }
+           }
+         }
+       }
+       
+       private int bitField0_;
+       
+       // optional int32 bus = 1;
+       private int bus_ ;
+       public boolean hasBus() {
+         return ((bitField0_ & 0x00000001) == 0x00000001);
+       }
+       public int getBus() {
+         return bus_;
+       }
+       public Builder setBus(int value) {
+         bitField0_ |= 0x00000001;
+         bus_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearBus() {
+         bitField0_ = (bitField0_ & ~0x00000001);
+         bus_ = 0;
+         onChanged();
+         return this;
+       }
+       
+       // optional uint32 message_id = 2;
+       private int messageId_ ;
+       public boolean hasMessageId() {
+         return ((bitField0_ & 0x00000002) == 0x00000002);
+       }
+       public int getMessageId() {
+         return messageId_;
+       }
+       public Builder setMessageId(int value) {
+         bitField0_ |= 0x00000002;
+         messageId_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearMessageId() {
+         bitField0_ = (bitField0_ & ~0x00000002);
+         messageId_ = 0;
+         onChanged();
+         return this;
+       }
+       
+       // optional uint32 mode = 3;
+       private int mode_ ;
+       public boolean hasMode() {
+         return ((bitField0_ & 0x00000004) == 0x00000004);
+       }
+       public int getMode() {
+         return mode_;
+       }
+       public Builder setMode(int value) {
+         bitField0_ |= 0x00000004;
+         mode_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearMode() {
+         bitField0_ = (bitField0_ & ~0x00000004);
+         mode_ = 0;
+         onChanged();
+         return this;
+       }
+       
+       // optional uint32 pid = 4;
+       private int pid_ ;
+       public boolean hasPid() {
+         return ((bitField0_ & 0x00000008) == 0x00000008);
+       }
+       public int getPid() {
+         return pid_;
+       }
+       public Builder setPid(int value) {
+         bitField0_ |= 0x00000008;
+         pid_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearPid() {
+         bitField0_ = (bitField0_ & ~0x00000008);
+         pid_ = 0;
+         onChanged();
+         return this;
+       }
+       
+       // optional bool success = 5;
+       private boolean success_ ;
+       public boolean hasSuccess() {
+         return ((bitField0_ & 0x00000010) == 0x00000010);
+       }
+       public boolean getSuccess() {
+         return success_;
+       }
+       public Builder setSuccess(boolean value) {
+         bitField0_ |= 0x00000010;
+         success_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearSuccess() {
+         bitField0_ = (bitField0_ & ~0x00000010);
+         success_ = false;
+         onChanged();
+         return this;
+       }
+       
+       // optional uint32 negative_response_code = 6;
+       private int negativeResponseCode_ ;
+       public boolean hasNegativeResponseCode() {
+         return ((bitField0_ & 0x00000020) == 0x00000020);
+       }
+       public int getNegativeResponseCode() {
+         return negativeResponseCode_;
+       }
+       public Builder setNegativeResponseCode(int value) {
+         bitField0_ |= 0x00000020;
+         negativeResponseCode_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearNegativeResponseCode() {
+         bitField0_ = (bitField0_ & ~0x00000020);
+         negativeResponseCode_ = 0;
+         onChanged();
+         return this;
+       }
+       
+       // optional bytes payload = 7;
+       private com.google.protobuf.ByteString payload_ = com.google.protobuf.ByteString.EMPTY;
+       public boolean hasPayload() {
+         return ((bitField0_ & 0x00000040) == 0x00000040);
+       }
+       public com.google.protobuf.ByteString getPayload() {
+         return payload_;
+       }
+       public Builder setPayload(com.google.protobuf.ByteString value) {
+         if (value == null) {
+     throw new NullPointerException();
+   }
+   bitField0_ |= 0x00000040;
+         payload_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearPayload() {
+         bitField0_ = (bitField0_ & ~0x00000040);
+         payload_ = getDefaultInstance().getPayload();
+         onChanged();
+         return this;
+       }
+       
+       // optional double value = 8;
+       private double value_ ;
+       public boolean hasValue() {
+         return ((bitField0_ & 0x00000080) == 0x00000080);
+       }
+       public double getValue() {
+         return value_;
+       }
+       public Builder setValue(double value) {
+         bitField0_ |= 0x00000080;
+         value_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearValue() {
+         bitField0_ = (bitField0_ & ~0x00000080);
+         value_ = 0D;
+         onChanged();
+         return this;
+       }
+       
+       // @@protoc_insertion_point(builder_scope:openxc.DiagnosticResponse)
+     }
+     
+     static {
+       defaultInstance = new DiagnosticResponse(true);
+       defaultInstance.initFields();
+     }
+     
+     // @@protoc_insertion_point(class_scope:openxc.DiagnosticResponse)
+   }
+   
+   public interface DynamicFieldOrBuilder
+       extends com.google.protobuf.MessageOrBuilder {
+     
+     // optional .openxc.DynamicField.Type type = 1;
+     boolean hasType();
+     com.openxc.BinaryMessages.DynamicField.Type getType();
+     
+     // optional string string_value = 2;
+     boolean hasStringValue();
+     String getStringValue();
+     
+     // optional double numeric_value = 3;
+     boolean hasNumericValue();
+     double getNumericValue();
+     
+     // optional bool boolean_value = 4;
+     boolean hasBooleanValue();
+     boolean getBooleanValue();
+   }
+   public static final class DynamicField extends
+       com.google.protobuf.GeneratedMessage
+       implements DynamicFieldOrBuilder {
+     // Use DynamicField.newBuilder() to construct.
+     private DynamicField(Builder builder) {
+       super(builder);
+     }
+     private DynamicField(boolean noInit) {}
+     
+     private static final DynamicField defaultInstance;
+     public static DynamicField getDefaultInstance() {
+       return defaultInstance;
+     }
+     
+     public DynamicField getDefaultInstanceForType() {
+       return defaultInstance;
+     }
+     
+     public static final com.google.protobuf.Descriptors.Descriptor
+         getDescriptor() {
+       return com.openxc.BinaryMessages.internal_static_openxc_DynamicField_descriptor;
+     }
+     
+     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+         internalGetFieldAccessorTable() {
+       return com.openxc.BinaryMessages.internal_static_openxc_DynamicField_fieldAccessorTable;
+     }
+     
+     public enum Type
+         implements com.google.protobuf.ProtocolMessageEnum {
+       STRING(0, 1),
+       NUM(1, 2),
+       BOOL(2, 3),
+       ;
+       
+       public static final int STRING_VALUE = 1;
+       public static final int NUM_VALUE = 2;
+       public static final int BOOL_VALUE = 3;
+       
+       
+       public final int getNumber() { return value; }
+       
+       public static Type valueOf(int value) {
+         switch (value) {
+           case 1: return STRING;
+           case 2: return NUM;
+           case 3: 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 com.openxc.BinaryMessages.DynamicField.getDescriptor().getEnumTypes().get(0);
+       }
+       
+       private static final Type[] VALUES = {
+         STRING, NUM, BOOL, 
+       };
+       
+       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.DynamicField.Type)
+     }
+     
+     private int bitField0_;
+     // optional .openxc.DynamicField.Type type = 1;
+     public static final int TYPE_FIELD_NUMBER = 1;
+     private com.openxc.BinaryMessages.DynamicField.Type type_;
+     public boolean hasType() {
+       return ((bitField0_ & 0x00000001) == 0x00000001);
+     }
+     public com.openxc.BinaryMessages.DynamicField.Type getType() {
+       return type_;
+     }
+     
+     // optional string string_value = 2;
+     public static final int STRING_VALUE_FIELD_NUMBER = 2;
+     private java.lang.Object stringValue_;
+     public boolean hasStringValue() {
+       return ((bitField0_ & 0x00000002) == 0x00000002);
+     }
+     public String getStringValue() {
+       java.lang.Object ref = stringValue_;
+       if (ref instanceof String) {
+         return (String) ref;
+       } else {
+         com.google.protobuf.ByteString bs = 
+             (com.google.protobuf.ByteString) ref;
+         String s = bs.toStringUtf8();
+         if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+           stringValue_ = s;
+         }
+         return s;
+       }
+     }
+     private com.google.protobuf.ByteString getStringValueBytes() {
+       java.lang.Object ref = stringValue_;
+       if (ref instanceof String) {
+         com.google.protobuf.ByteString b = 
+             com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+         stringValue_ = b;
+         return b;
+       } else {
+         return (com.google.protobuf.ByteString) ref;
+       }
+     }
+     
+     // optional double numeric_value = 3;
+     public static final int NUMERIC_VALUE_FIELD_NUMBER = 3;
+     private double numericValue_;
+     public boolean hasNumericValue() {
+       return ((bitField0_ & 0x00000004) == 0x00000004);
+     }
+     public double getNumericValue() {
+       return numericValue_;
+     }
+     
+     // optional bool boolean_value = 4;
+     public static final int BOOLEAN_VALUE_FIELD_NUMBER = 4;
+     private boolean booleanValue_;
+     public boolean hasBooleanValue() {
+       return ((bitField0_ & 0x00000008) == 0x00000008);
+     }
+     public boolean getBooleanValue() {
+       return booleanValue_;
+     }
+     
+     private void initFields() {
+       type_ = com.openxc.BinaryMessages.DynamicField.Type.STRING;
+       stringValue_ = "";
+       numericValue_ = 0D;
+       booleanValue_ = 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.writeEnum(1, type_.getNumber());
+       }
+       if (((bitField0_ & 0x00000002) == 0x00000002)) {
+         output.writeBytes(2, getStringValueBytes());
+       }
+       if (((bitField0_ & 0x00000004) == 0x00000004)) {
+         output.writeDouble(3, numericValue_);
+       }
+       if (((bitField0_ & 0x00000008) == 0x00000008)) {
+         output.writeBool(4, booleanValue_);
+       }
+       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
+           .computeBytesSize(2, getStringValueBytes());
+       }
+       if (((bitField0_ & 0x00000004) == 0x00000004)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeDoubleSize(3, numericValue_);
+       }
+       if (((bitField0_ & 0x00000008) == 0x00000008)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeBoolSize(4, booleanValue_);
+       }
+       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 com.openxc.BinaryMessages.DynamicField parseFrom(
+         com.google.protobuf.ByteString data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DynamicField parseFrom(
+         com.google.protobuf.ByteString data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DynamicField parseFrom(byte[] data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DynamicField parseFrom(
+         byte[] data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DynamicField parseFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DynamicField parseFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DynamicField parseDelimitedFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.DynamicField parseDelimitedFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.DynamicField parseFrom(
+         com.google.protobuf.CodedInputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.DynamicField parseFrom(
+         com.google.protobuf.CodedInputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     
+     public static Builder newBuilder() { return Builder.create(); }
+     public Builder newBuilderForType() { return newBuilder(); }
+     public static Builder newBuilder(com.openxc.BinaryMessages.DynamicField 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;
+     }
+     public static final class Builder extends
+         com.google.protobuf.GeneratedMessage.Builder<Builder>
+        implements com.openxc.BinaryMessages.DynamicFieldOrBuilder {
+       public static final com.google.protobuf.Descriptors.Descriptor
+           getDescriptor() {
+         return com.openxc.BinaryMessages.internal_static_openxc_DynamicField_descriptor;
+       }
+       
+       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+           internalGetFieldAccessorTable() {
+         return com.openxc.BinaryMessages.internal_static_openxc_DynamicField_fieldAccessorTable;
+       }
+       
+       // Construct using com.openxc.BinaryMessages.DynamicField.newBuilder()
+       private Builder() {
+         maybeForceBuilderInitialization();
+       }
+       
+       private Builder(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();
+         type_ = com.openxc.BinaryMessages.DynamicField.Type.STRING;
+         bitField0_ = (bitField0_ & ~0x00000001);
+         stringValue_ = "";
+         bitField0_ = (bitField0_ & ~0x00000002);
+         numericValue_ = 0D;
+         bitField0_ = (bitField0_ & ~0x00000004);
+         booleanValue_ = false;
+         bitField0_ = (bitField0_ & ~0x00000008);
+         return this;
+       }
+       
+       public Builder clone() {
+         return create().mergeFrom(buildPartial());
+       }
+       
+       public com.google.protobuf.Descriptors.Descriptor
+           getDescriptorForType() {
+         return com.openxc.BinaryMessages.DynamicField.getDescriptor();
+       }
+       
+       public com.openxc.BinaryMessages.DynamicField getDefaultInstanceForType() {
+         return com.openxc.BinaryMessages.DynamicField.getDefaultInstance();
+       }
+       
+       public com.openxc.BinaryMessages.DynamicField build() {
+         com.openxc.BinaryMessages.DynamicField result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(result);
+         }
+         return result;
+       }
+       
+       private com.openxc.BinaryMessages.DynamicField buildParsed()
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         com.openxc.BinaryMessages.DynamicField result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(
+             result).asInvalidProtocolBufferException();
+         }
+         return result;
+       }
+       
+       public com.openxc.BinaryMessages.DynamicField buildPartial() {
+         com.openxc.BinaryMessages.DynamicField result = new com.openxc.BinaryMessages.DynamicField(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;
+         }
+         result.stringValue_ = stringValue_;
+         if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+           to_bitField0_ |= 0x00000004;
+         }
+         result.numericValue_ = numericValue_;
+         if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
+           to_bitField0_ |= 0x00000008;
+         }
+         result.booleanValue_ = booleanValue_;
+         result.bitField0_ = to_bitField0_;
+         onBuilt();
+         return result;
+       }
+       
+       public Builder mergeFrom(com.google.protobuf.Message other) {
+         if (other instanceof com.openxc.BinaryMessages.DynamicField) {
+           return mergeFrom((com.openxc.BinaryMessages.DynamicField)other);
+         } else {
+           super.mergeFrom(other);
+           return this;
+         }
+       }
+       
+       public Builder mergeFrom(com.openxc.BinaryMessages.DynamicField other) {
+         if (other == com.openxc.BinaryMessages.DynamicField.getDefaultInstance()) return this;
+         if (other.hasType()) {
+           setType(other.getType());
+         }
+         if (other.hasStringValue()) {
+           setStringValue(other.getStringValue());
+         }
+         if (other.hasNumericValue()) {
+           setNumericValue(other.getNumericValue());
+         }
+         if (other.hasBooleanValue()) {
+           setBooleanValue(other.getBooleanValue());
+         }
+         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 {
+         com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+           com.google.protobuf.UnknownFieldSet.newBuilder(
+             this.getUnknownFields());
+         while (true) {
+           int tag = input.readTag();
+           switch (tag) {
+             case 0:
+               this.setUnknownFields(unknownFields.build());
+               onChanged();
+               return this;
+             default: {
+               if (!parseUnknownField(input, unknownFields,
+                                      extensionRegistry, tag)) {
+                 this.setUnknownFields(unknownFields.build());
+                 onChanged();
+                 return this;
+               }
+               break;
+             }
+             case 8: {
+               int rawValue = input.readEnum();
+               com.openxc.BinaryMessages.DynamicField.Type value = com.openxc.BinaryMessages.DynamicField.Type.valueOf(rawValue);
+               if (value == null) {
+                 unknownFields.mergeVarintField(1, rawValue);
+               } else {
+                 bitField0_ |= 0x00000001;
+                 type_ = value;
+               }
+               break;
+             }
+             case 18: {
+               bitField0_ |= 0x00000002;
+               stringValue_ = input.readBytes();
+               break;
+             }
+             case 25: {
+               bitField0_ |= 0x00000004;
+               numericValue_ = input.readDouble();
+               break;
+             }
+             case 32: {
+               bitField0_ |= 0x00000008;
+               booleanValue_ = input.readBool();
+               break;
+             }
+           }
+         }
+       }
+       
+       private int bitField0_;
+       
+       // optional .openxc.DynamicField.Type type = 1;
+       private com.openxc.BinaryMessages.DynamicField.Type type_ = com.openxc.BinaryMessages.DynamicField.Type.STRING;
+       public boolean hasType() {
+         return ((bitField0_ & 0x00000001) == 0x00000001);
+       }
+       public com.openxc.BinaryMessages.DynamicField.Type getType() {
+         return type_;
+       }
+       public Builder setType(com.openxc.BinaryMessages.DynamicField.Type value) {
+         if (value == null) {
+           throw new NullPointerException();
+         }
+         bitField0_ |= 0x00000001;
+         type_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearType() {
+         bitField0_ = (bitField0_ & ~0x00000001);
+         type_ = com.openxc.BinaryMessages.DynamicField.Type.STRING;
+         onChanged();
+         return this;
+       }
+       
+       // optional string string_value = 2;
+       private java.lang.Object stringValue_ = "";
+       public boolean hasStringValue() {
+         return ((bitField0_ & 0x00000002) == 0x00000002);
+       }
+       public String getStringValue() {
+         java.lang.Object ref = stringValue_;
+         if (!(ref instanceof String)) {
+           String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+           stringValue_ = s;
+           return s;
+         } else {
+           return (String) ref;
+         }
+       }
+       public Builder setStringValue(String value) {
+         if (value == null) {
+     throw new NullPointerException();
+   }
+   bitField0_ |= 0x00000002;
+         stringValue_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearStringValue() {
+         bitField0_ = (bitField0_ & ~0x00000002);
+         stringValue_ = getDefaultInstance().getStringValue();
+         onChanged();
+         return this;
+       }
+       void setStringValue(com.google.protobuf.ByteString value) {
+         bitField0_ |= 0x00000002;
+         stringValue_ = value;
+         onChanged();
+       }
+       
+       // optional double numeric_value = 3;
+       private double numericValue_ ;
+       public boolean hasNumericValue() {
+         return ((bitField0_ & 0x00000004) == 0x00000004);
+       }
+       public double getNumericValue() {
+         return numericValue_;
+       }
+       public Builder setNumericValue(double value) {
+         bitField0_ |= 0x00000004;
+         numericValue_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearNumericValue() {
+         bitField0_ = (bitField0_ & ~0x00000004);
+         numericValue_ = 0D;
+         onChanged();
+         return this;
+       }
+       
+       // optional bool boolean_value = 4;
+       private boolean booleanValue_ ;
+       public boolean hasBooleanValue() {
+         return ((bitField0_ & 0x00000008) == 0x00000008);
+       }
+       public boolean getBooleanValue() {
+         return booleanValue_;
+       }
+       public Builder setBooleanValue(boolean value) {
+         bitField0_ |= 0x00000008;
+         booleanValue_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearBooleanValue() {
+         bitField0_ = (bitField0_ & ~0x00000008);
+         booleanValue_ = false;
+         onChanged();
+         return this;
+       }
+       
+       // @@protoc_insertion_point(builder_scope:openxc.DynamicField)
+     }
+     
+     static {
+       defaultInstance = new DynamicField(true);
+       defaultInstance.initFields();
+     }
+     
+     // @@protoc_insertion_point(class_scope:openxc.DynamicField)
+   }
+   
+   public interface SimpleMessageOrBuilder
+       extends com.google.protobuf.MessageOrBuilder {
+     
+     // optional string name = 1;
+     boolean hasName();
+     String getName();
+     
+     // optional .openxc.DynamicField value = 2;
+     boolean hasValue();
+     com.openxc.BinaryMessages.DynamicField getValue();
+     com.openxc.BinaryMessages.DynamicFieldOrBuilder getValueOrBuilder();
+     
+     // optional .openxc.DynamicField event = 3;
+     boolean hasEvent();
+     com.openxc.BinaryMessages.DynamicField getEvent();
+     com.openxc.BinaryMessages.DynamicFieldOrBuilder getEventOrBuilder();
+   }
+   public static final class SimpleMessage extends
+       com.google.protobuf.GeneratedMessage
+       implements SimpleMessageOrBuilder {
+     // Use SimpleMessage.newBuilder() to construct.
+     private SimpleMessage(Builder builder) {
+       super(builder);
+     }
+     private SimpleMessage(boolean noInit) {}
+     
+     private static final SimpleMessage defaultInstance;
+     public static SimpleMessage getDefaultInstance() {
+       return defaultInstance;
+     }
+     
+     public SimpleMessage getDefaultInstanceForType() {
+       return defaultInstance;
+     }
+     
+     public static final com.google.protobuf.Descriptors.Descriptor
+         getDescriptor() {
+       return com.openxc.BinaryMessages.internal_static_openxc_SimpleMessage_descriptor;
+     }
+     
+     protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+         internalGetFieldAccessorTable() {
+       return com.openxc.BinaryMessages.internal_static_openxc_SimpleMessage_fieldAccessorTable;
+     }
+     
+     private int bitField0_;
+     // optional string name = 1;
+     public static final int NAME_FIELD_NUMBER = 1;
+     private java.lang.Object name_;
+     public boolean hasName() {
+       return ((bitField0_ & 0x00000001) == 0x00000001);
+     }
+     public String getName() {
+       java.lang.Object ref = name_;
+       if (ref instanceof String) {
+         return (String) ref;
+       } else {
+         com.google.protobuf.ByteString bs = 
+             (com.google.protobuf.ByteString) ref;
+         String s = bs.toStringUtf8();
+         if (com.google.protobuf.Internal.isValidUtf8(bs)) {
+           name_ = s;
+         }
+         return s;
+       }
+     }
+     private com.google.protobuf.ByteString getNameBytes() {
+       java.lang.Object ref = name_;
+       if (ref instanceof String) {
+         com.google.protobuf.ByteString b = 
+             com.google.protobuf.ByteString.copyFromUtf8((String) ref);
+         name_ = b;
+         return b;
+       } else {
+         return (com.google.protobuf.ByteString) ref;
+       }
+     }
+     
+     // optional .openxc.DynamicField value = 2;
+     public static final int VALUE_FIELD_NUMBER = 2;
+     private com.openxc.BinaryMessages.DynamicField value_;
+     public boolean hasValue() {
+       return ((bitField0_ & 0x00000002) == 0x00000002);
+     }
+     public com.openxc.BinaryMessages.DynamicField getValue() {
+       return value_;
+     }
+     public com.openxc.BinaryMessages.DynamicFieldOrBuilder getValueOrBuilder() {
+       return value_;
+     }
+     
+     // optional .openxc.DynamicField event = 3;
+     public static final int EVENT_FIELD_NUMBER = 3;
+     private com.openxc.BinaryMessages.DynamicField event_;
+     public boolean hasEvent() {
+       return ((bitField0_ & 0x00000004) == 0x00000004);
+     }
+     public com.openxc.BinaryMessages.DynamicField getEvent() {
+       return event_;
+     }
+     public com.openxc.BinaryMessages.DynamicFieldOrBuilder getEventOrBuilder() {
+       return event_;
+     }
+     
+     private void initFields() {
+       name_ = "";
+       value_ = com.openxc.BinaryMessages.DynamicField.getDefaultInstance();
+       event_ = com.openxc.BinaryMessages.DynamicField.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.writeBytes(1, getNameBytes());
+       }
+       if (((bitField0_ & 0x00000002) == 0x00000002)) {
+         output.writeMessage(2, value_);
+       }
+       if (((bitField0_ & 0x00000004) == 0x00000004)) {
+         output.writeMessage(3, event_);
+       }
+       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
+           .computeMessageSize(2, value_);
+       }
+       if (((bitField0_ & 0x00000004) == 0x00000004)) {
+         size += com.google.protobuf.CodedOutputStream
+           .computeMessageSize(3, event_);
+       }
+       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 com.openxc.BinaryMessages.SimpleMessage parseFrom(
+         com.google.protobuf.ByteString data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.SimpleMessage parseFrom(
+         com.google.protobuf.ByteString data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.SimpleMessage parseFrom(byte[] data)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.SimpleMessage parseFrom(
+         byte[] data,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws com.google.protobuf.InvalidProtocolBufferException {
+       return newBuilder().mergeFrom(data, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.SimpleMessage parseFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.SimpleMessage parseFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     public static com.openxc.BinaryMessages.SimpleMessage parseDelimitedFrom(java.io.InputStream input)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.SimpleMessage parseDelimitedFrom(
+         java.io.InputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       Builder builder = newBuilder();
+       if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
+         return builder.buildParsed();
+       } else {
+         return null;
+       }
+     }
+     public static com.openxc.BinaryMessages.SimpleMessage parseFrom(
+         com.google.protobuf.CodedInputStream input)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input).buildParsed();
+     }
+     public static com.openxc.BinaryMessages.SimpleMessage parseFrom(
+         com.google.protobuf.CodedInputStream input,
+         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+         throws java.io.IOException {
+       return newBuilder().mergeFrom(input, extensionRegistry)
+                .buildParsed();
+     }
+     
+     public static Builder newBuilder() { return Builder.create(); }
+     public Builder newBuilderForType() { return newBuilder(); }
+     public static Builder newBuilder(com.openxc.BinaryMessages.SimpleMessage 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;
+     }
+     public static final class Builder extends
+         com.google.protobuf.GeneratedMessage.Builder<Builder>
+        implements com.openxc.BinaryMessages.SimpleMessageOrBuilder {
+       public static final com.google.protobuf.Descriptors.Descriptor
+           getDescriptor() {
+         return com.openxc.BinaryMessages.internal_static_openxc_SimpleMessage_descriptor;
+       }
+       
+       protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
+           internalGetFieldAccessorTable() {
+         return com.openxc.BinaryMessages.internal_static_openxc_SimpleMessage_fieldAccessorTable;
+       }
+       
+       // Construct using com.openxc.BinaryMessages.SimpleMessage.newBuilder()
+       private Builder() {
+         maybeForceBuilderInitialization();
+       }
+       
+       private Builder(BuilderParent parent) {
+         super(parent);
+         maybeForceBuilderInitialization();
+       }
+       private void maybeForceBuilderInitialization() {
+         if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
+           getValueFieldBuilder();
+           getEventFieldBuilder();
+         }
+       }
+       private static Builder create() {
+         return new Builder();
+       }
+       
+       public Builder clear() {
+         super.clear();
+         name_ = "";
+         bitField0_ = (bitField0_ & ~0x00000001);
+         if (valueBuilder_ == null) {
+           value_ = com.openxc.BinaryMessages.DynamicField.getDefaultInstance();
+         } else {
+           valueBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000002);
+         if (eventBuilder_ == null) {
+           event_ = com.openxc.BinaryMessages.DynamicField.getDefaultInstance();
+         } else {
+           eventBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000004);
+         return this;
+       }
+       
+       public Builder clone() {
+         return create().mergeFrom(buildPartial());
+       }
+       
+       public com.google.protobuf.Descriptors.Descriptor
+           getDescriptorForType() {
+         return com.openxc.BinaryMessages.SimpleMessage.getDescriptor();
+       }
+       
+       public com.openxc.BinaryMessages.SimpleMessage getDefaultInstanceForType() {
+         return com.openxc.BinaryMessages.SimpleMessage.getDefaultInstance();
+       }
+       
+       public com.openxc.BinaryMessages.SimpleMessage build() {
+         com.openxc.BinaryMessages.SimpleMessage result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(result);
+         }
+         return result;
+       }
+       
+       private com.openxc.BinaryMessages.SimpleMessage buildParsed()
+           throws com.google.protobuf.InvalidProtocolBufferException {
+         com.openxc.BinaryMessages.SimpleMessage result = buildPartial();
+         if (!result.isInitialized()) {
+           throw newUninitializedMessageException(
+             result).asInvalidProtocolBufferException();
+         }
+         return result;
+       }
+       
+       public com.openxc.BinaryMessages.SimpleMessage buildPartial() {
+         com.openxc.BinaryMessages.SimpleMessage result = new com.openxc.BinaryMessages.SimpleMessage(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;
+         }
+         if (valueBuilder_ == null) {
+           result.value_ = value_;
+         } else {
+           result.value_ = valueBuilder_.build();
+         }
+         if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
+           to_bitField0_ |= 0x00000004;
+         }
+         if (eventBuilder_ == null) {
+           result.event_ = event_;
+         } else {
+           result.event_ = eventBuilder_.build();
+         }
+         result.bitField0_ = to_bitField0_;
+         onBuilt();
+         return result;
+       }
+       
+       public Builder mergeFrom(com.google.protobuf.Message other) {
+         if (other instanceof com.openxc.BinaryMessages.SimpleMessage) {
+           return mergeFrom((com.openxc.BinaryMessages.SimpleMessage)other);
+         } else {
+           super.mergeFrom(other);
+           return this;
+         }
+       }
+       
+       public Builder mergeFrom(com.openxc.BinaryMessages.SimpleMessage other) {
+         if (other == com.openxc.BinaryMessages.SimpleMessage.getDefaultInstance()) return this;
+         if (other.hasName()) {
+           setName(other.getName());
+         }
+         if (other.hasValue()) {
+           mergeValue(other.getValue());
+         }
+         if (other.hasEvent()) {
+           mergeEvent(other.getEvent());
+         }
+         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 {
+         com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+           com.google.protobuf.UnknownFieldSet.newBuilder(
+             this.getUnknownFields());
+         while (true) {
+           int tag = input.readTag();
+           switch (tag) {
+             case 0:
+               this.setUnknownFields(unknownFields.build());
+               onChanged();
+               return this;
+             default: {
+               if (!parseUnknownField(input, unknownFields,
+                                      extensionRegistry, tag)) {
+                 this.setUnknownFields(unknownFields.build());
+                 onChanged();
+                 return this;
+               }
+               break;
+             }
+             case 10: {
+               bitField0_ |= 0x00000001;
+               name_ = input.readBytes();
+               break;
+             }
+             case 18: {
+               com.openxc.BinaryMessages.DynamicField.Builder subBuilder = com.openxc.BinaryMessages.DynamicField.newBuilder();
+               if (hasValue()) {
+                 subBuilder.mergeFrom(getValue());
+               }
+               input.readMessage(subBuilder, extensionRegistry);
+               setValue(subBuilder.buildPartial());
+               break;
+             }
+             case 26: {
+               com.openxc.BinaryMessages.DynamicField.Builder subBuilder = com.openxc.BinaryMessages.DynamicField.newBuilder();
+               if (hasEvent()) {
+                 subBuilder.mergeFrom(getEvent());
+               }
+               input.readMessage(subBuilder, extensionRegistry);
+               setEvent(subBuilder.buildPartial());
+               break;
+             }
+           }
+         }
+       }
+       
+       private int bitField0_;
+       
+       // optional string name = 1;
+       private java.lang.Object name_ = "";
+       public boolean hasName() {
+         return ((bitField0_ & 0x00000001) == 0x00000001);
+       }
+       public String getName() {
+         java.lang.Object ref = name_;
+         if (!(ref instanceof String)) {
+           String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
+           name_ = s;
+           return s;
+         } else {
+           return (String) ref;
+         }
+       }
+       public Builder setName(String value) {
+         if (value == null) {
+     throw new NullPointerException();
+   }
+   bitField0_ |= 0x00000001;
+         name_ = value;
+         onChanged();
+         return this;
+       }
+       public Builder clearName() {
+         bitField0_ = (bitField0_ & ~0x00000001);
+         name_ = getDefaultInstance().getName();
+         onChanged();
+         return this;
+       }
+       void setName(com.google.protobuf.ByteString value) {
+         bitField0_ |= 0x00000001;
+         name_ = value;
+         onChanged();
+       }
+       
+       // optional .openxc.DynamicField value = 2;
+       private com.openxc.BinaryMessages.DynamicField value_ = com.openxc.BinaryMessages.DynamicField.getDefaultInstance();
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.DynamicField, com.openxc.BinaryMessages.DynamicField.Builder, com.openxc.BinaryMessages.DynamicFieldOrBuilder> valueBuilder_;
+       public boolean hasValue() {
+         return ((bitField0_ & 0x00000002) == 0x00000002);
+       }
+       public com.openxc.BinaryMessages.DynamicField getValue() {
+         if (valueBuilder_ == null) {
+           return value_;
+         } else {
+           return valueBuilder_.getMessage();
+         }
+       }
+       public Builder setValue(com.openxc.BinaryMessages.DynamicField value) {
+         if (valueBuilder_ == null) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           value_ = value;
+           onChanged();
+         } else {
+           valueBuilder_.setMessage(value);
+         }
+         bitField0_ |= 0x00000002;
+         return this;
+       }
+       public Builder setValue(
+           com.openxc.BinaryMessages.DynamicField.Builder builderForValue) {
+         if (valueBuilder_ == null) {
+           value_ = builderForValue.build();
+           onChanged();
+         } else {
+           valueBuilder_.setMessage(builderForValue.build());
+         }
+         bitField0_ |= 0x00000002;
+         return this;
+       }
+       public Builder mergeValue(com.openxc.BinaryMessages.DynamicField value) {
+         if (valueBuilder_ == null) {
+           if (((bitField0_ & 0x00000002) == 0x00000002) &&
+               value_ != com.openxc.BinaryMessages.DynamicField.getDefaultInstance()) {
+             value_ =
+               com.openxc.BinaryMessages.DynamicField.newBuilder(value_).mergeFrom(value).buildPartial();
+           } else {
+             value_ = value;
+           }
+           onChanged();
+         } else {
+           valueBuilder_.mergeFrom(value);
+         }
+         bitField0_ |= 0x00000002;
+         return this;
+       }
+       public Builder clearValue() {
+         if (valueBuilder_ == null) {
+           value_ = com.openxc.BinaryMessages.DynamicField.getDefaultInstance();
+           onChanged();
+         } else {
+           valueBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000002);
+         return this;
+       }
+       public com.openxc.BinaryMessages.DynamicField.Builder getValueBuilder() {
+         bitField0_ |= 0x00000002;
+         onChanged();
+         return getValueFieldBuilder().getBuilder();
+       }
+       public com.openxc.BinaryMessages.DynamicFieldOrBuilder getValueOrBuilder() {
+         if (valueBuilder_ != null) {
+           return valueBuilder_.getMessageOrBuilder();
+         } else {
+           return value_;
+         }
+       }
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.DynamicField, com.openxc.BinaryMessages.DynamicField.Builder, com.openxc.BinaryMessages.DynamicFieldOrBuilder> 
+           getValueFieldBuilder() {
+         if (valueBuilder_ == null) {
+           valueBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+               com.openxc.BinaryMessages.DynamicField, com.openxc.BinaryMessages.DynamicField.Builder, com.openxc.BinaryMessages.DynamicFieldOrBuilder>(
+                   value_,
+                   getParentForChildren(),
+                   isClean());
+           value_ = null;
+         }
+         return valueBuilder_;
+       }
+       
+       // optional .openxc.DynamicField event = 3;
+       private com.openxc.BinaryMessages.DynamicField event_ = com.openxc.BinaryMessages.DynamicField.getDefaultInstance();
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.DynamicField, com.openxc.BinaryMessages.DynamicField.Builder, com.openxc.BinaryMessages.DynamicFieldOrBuilder> eventBuilder_;
+       public boolean hasEvent() {
+         return ((bitField0_ & 0x00000004) == 0x00000004);
+       }
+       public com.openxc.BinaryMessages.DynamicField getEvent() {
+         if (eventBuilder_ == null) {
+           return event_;
+         } else {
+           return eventBuilder_.getMessage();
+         }
+       }
+       public Builder setEvent(com.openxc.BinaryMessages.DynamicField value) {
+         if (eventBuilder_ == null) {
+           if (value == null) {
+             throw new NullPointerException();
+           }
+           event_ = value;
+           onChanged();
+         } else {
+           eventBuilder_.setMessage(value);
+         }
+         bitField0_ |= 0x00000004;
+         return this;
+       }
+       public Builder setEvent(
+           com.openxc.BinaryMessages.DynamicField.Builder builderForValue) {
+         if (eventBuilder_ == null) {
+           event_ = builderForValue.build();
+           onChanged();
+         } else {
+           eventBuilder_.setMessage(builderForValue.build());
+         }
+         bitField0_ |= 0x00000004;
+         return this;
+       }
+       public Builder mergeEvent(com.openxc.BinaryMessages.DynamicField value) {
+         if (eventBuilder_ == null) {
+           if (((bitField0_ & 0x00000004) == 0x00000004) &&
+               event_ != com.openxc.BinaryMessages.DynamicField.getDefaultInstance()) {
+             event_ =
+               com.openxc.BinaryMessages.DynamicField.newBuilder(event_).mergeFrom(value).buildPartial();
+           } else {
+             event_ = value;
+           }
+           onChanged();
+         } else {
+           eventBuilder_.mergeFrom(value);
+         }
+         bitField0_ |= 0x00000004;
+         return this;
+       }
+       public Builder clearEvent() {
+         if (eventBuilder_ == null) {
+           event_ = com.openxc.BinaryMessages.DynamicField.getDefaultInstance();
+           onChanged();
+         } else {
+           eventBuilder_.clear();
+         }
+         bitField0_ = (bitField0_ & ~0x00000004);
+         return this;
+       }
+       public com.openxc.BinaryMessages.DynamicField.Builder getEventBuilder() {
+         bitField0_ |= 0x00000004;
+         onChanged();
+         return getEventFieldBuilder().getBuilder();
+       }
+       public com.openxc.BinaryMessages.DynamicFieldOrBuilder getEventOrBuilder() {
+         if (eventBuilder_ != null) {
+           return eventBuilder_.getMessageOrBuilder();
+         } else {
+           return event_;
+         }
+       }
+       private com.google.protobuf.SingleFieldBuilder<
+           com.openxc.BinaryMessages.DynamicField, com.openxc.BinaryMessages.DynamicField.Builder, com.openxc.BinaryMessages.DynamicFieldOrBuilder> 
+           getEventFieldBuilder() {
+         if (eventBuilder_ == null) {
+           eventBuilder_ = new com.google.protobuf.SingleFieldBuilder<
+               com.openxc.BinaryMessages.DynamicField, com.openxc.BinaryMessages.DynamicField.Builder, com.openxc.BinaryMessages.DynamicFieldOrBuilder>(
+                   event_,
+                   getParentForChildren(),
+                   isClean());
+           event_ = null;
+         }
+         return eventBuilder_;
+       }
+       
+       // @@protoc_insertion_point(builder_scope:openxc.SimpleMessage)
+     }
+     
+     static {
+       defaultInstance = new SimpleMessage(true);
+       defaultInstance.initFields();
+     }
+     
+     // @@protoc_insertion_point(class_scope:openxc.SimpleMessage)
+   }
+   
+   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_CanMessage_descriptor;
+   private static
+     com.google.protobuf.GeneratedMessage.FieldAccessorTable
+       internal_static_openxc_CanMessage_fieldAccessorTable;
+   private static com.google.protobuf.Descriptors.Descriptor
+     internal_static_openxc_ControlCommand_descriptor;
+   private static
+     com.google.protobuf.GeneratedMessage.FieldAccessorTable
+       internal_static_openxc_ControlCommand_fieldAccessorTable;
+   private static com.google.protobuf.Descriptors.Descriptor
+     internal_static_openxc_DiagnosticControlCommand_descriptor;
+   private static
+     com.google.protobuf.GeneratedMessage.FieldAccessorTable
+       internal_static_openxc_DiagnosticControlCommand_fieldAccessorTable;
+   private static com.google.protobuf.Descriptors.Descriptor
+     internal_static_openxc_PassthroughModeControlCommand_descriptor;
+   private static
+     com.google.protobuf.GeneratedMessage.FieldAccessorTable
+       internal_static_openxc_PassthroughModeControlCommand_fieldAccessorTable;
+   private static com.google.protobuf.Descriptors.Descriptor
+     internal_static_openxc_AcceptanceFilterBypassCommand_descriptor;
+   private static
+     com.google.protobuf.GeneratedMessage.FieldAccessorTable
+       internal_static_openxc_AcceptanceFilterBypassCommand_fieldAccessorTable;
+   private static com.google.protobuf.Descriptors.Descriptor
+     internal_static_openxc_PayloadFormatCommand_descriptor;
+   private static
+     com.google.protobuf.GeneratedMessage.FieldAccessorTable
+       internal_static_openxc_PayloadFormatCommand_fieldAccessorTable;
+   private static com.google.protobuf.Descriptors.Descriptor
+     internal_static_openxc_PredefinedObd2RequestsCommand_descriptor;
+   private static
+     com.google.protobuf.GeneratedMessage.FieldAccessorTable
+       internal_static_openxc_PredefinedObd2RequestsCommand_fieldAccessorTable;
+   private static com.google.protobuf.Descriptors.Descriptor
+     internal_static_openxc_NetworkOperatorSettings_descriptor;
+   private static
+     com.google.protobuf.GeneratedMessage.FieldAccessorTable
+       internal_static_openxc_NetworkOperatorSettings_fieldAccessorTable;
+   private static com.google.protobuf.Descriptors.Descriptor
+     internal_static_openxc_NetworkOperatorSettings_NetworkDescriptor_descriptor;
+   private static
+     com.google.protobuf.GeneratedMessage.FieldAccessorTable
+       internal_static_openxc_NetworkOperatorSettings_NetworkDescriptor_fieldAccessorTable;
+   private static com.google.protobuf.Descriptors.Descriptor
+     internal_static_openxc_NetworkDataSettings_descriptor;
+   private static
+     com.google.protobuf.GeneratedMessage.FieldAccessorTable
+       internal_static_openxc_NetworkDataSettings_fieldAccessorTable;
+   private static com.google.protobuf.Descriptors.Descriptor
+     internal_static_openxc_ServerConnectSettings_descriptor;
+   private static
+     com.google.protobuf.GeneratedMessage.FieldAccessorTable
+       internal_static_openxc_ServerConnectSettings_fieldAccessorTable;
+   private static com.google.protobuf.Descriptors.Descriptor
+     internal_static_openxc_ModemConfigurationCommand_descriptor;
+   private static
+     com.google.protobuf.GeneratedMessage.FieldAccessorTable
+       internal_static_openxc_ModemConfigurationCommand_fieldAccessorTable;
+   private static com.google.protobuf.Descriptors.Descriptor
+     internal_static_openxc_RTCConfigurationCommand_descriptor;
+   private static
+     com.google.protobuf.GeneratedMessage.FieldAccessorTable
+       internal_static_openxc_RTCConfigurationCommand_fieldAccessorTable;
+   private static com.google.protobuf.Descriptors.Descriptor
+     internal_static_openxc_CommandResponse_descriptor;
+   private static
+     com.google.protobuf.GeneratedMessage.FieldAccessorTable
+       internal_static_openxc_CommandResponse_fieldAccessorTable;
+   private static com.google.protobuf.Descriptors.Descriptor
+     internal_static_openxc_DiagnosticRequest_descriptor;
+   private static
+     com.google.protobuf.GeneratedMessage.FieldAccessorTable
+       internal_static_openxc_DiagnosticRequest_fieldAccessorTable;
+   private static com.google.protobuf.Descriptors.Descriptor
+     internal_static_openxc_DiagnosticResponse_descriptor;
+   private static
+     com.google.protobuf.GeneratedMessage.FieldAccessorTable
+       internal_static_openxc_DiagnosticResponse_fieldAccessorTable;
+   private static com.google.protobuf.Descriptors.Descriptor
+     internal_static_openxc_DynamicField_descriptor;
+   private static
+     com.google.protobuf.GeneratedMessage.FieldAccessorTable
+       internal_static_openxc_DynamicField_fieldAccessorTable;
+   private static com.google.protobuf.Descriptors.Descriptor
+     internal_static_openxc_SimpleMessage_descriptor;
+   private static
+     com.google.protobuf.GeneratedMessage.FieldAccessorTable
+       internal_static_openxc_SimpleMessage_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\"\233\003\n\016VehicleMessag" +
+       "e\022)\n\004type\030\001 \001(\0162\033.openxc.VehicleMessage." +
+       "Type\022\'\n\013can_message\030\002 \001(\0132\022.openxc.CanMe" +
+       "ssage\022-\n\016simple_message\030\003 \001(\0132\025.openxc.S" +
+       "impleMessage\0227\n\023diagnostic_response\030\004 \001(" +
+       "\0132\032.openxc.DiagnosticResponse\022/\n\017control" +
+       "_command\030\005 \001(\0132\026.openxc.ControlCommand\0221" +
+       "\n\020command_response\030\006 \001(\0132\027.openxc.Comman" +
+       "dResponse\022\021\n\ttimestamp\030\007 \001(\004\"V\n\004Type\022\007\n\003" +
+       "CAN\020\001\022\n\n\006SIMPLE\020\002\022\016\n\nDIAGNOSTIC\020\003\022\023\n\017CON",
+       "TROL_COMMAND\020\004\022\024\n\020COMMAND_RESPONSE\020\005\"\224\001\n" +
+       "\nCanMessage\022\013\n\003bus\030\001 \001(\005\022\n\n\002id\030\002 \001(\r\022\014\n\004" +
+       "data\030\003 \001(\014\0224\n\014frame_format\030\004 \001(\0162\036.openx" +
+       "c.CanMessage.FrameFormat\")\n\013FrameFormat\022" +
+       "\014\n\010STANDARD\020\001\022\014\n\010EXTENDED\020\002\"\227\006\n\016ControlC" +
+       "ommand\022)\n\004type\030\001 \001(\0162\033.openxc.ControlCom" +
+       "mand.Type\022<\n\022diagnostic_request\030\002 \001(\0132 ." +
+       "openxc.DiagnosticControlCommand\022G\n\030passt" +
+       "hrough_mode_request\030\003 \001(\0132%.openxc.Passt" +
+       "hroughModeControlCommand\022O\n acceptance_f",
+       "ilter_bypass_command\030\004 \001(\0132%.openxc.Acce" +
+       "ptanceFilterBypassCommand\022<\n\026payload_for" +
+       "mat_command\030\005 \001(\0132\034.openxc.PayloadFormat" +
+       "Command\022O\n predefined_obd2_requests_comm" +
+       "and\030\006 \001(\0132%.openxc.PredefinedObd2Request" +
+       "sCommand\022F\n\033modem_configuration_command\030" +
+       "\007 \001(\0132!.openxc.ModemConfigurationCommand" +
+       "\022B\n\031rtc_configuration_command\030\010 \001(\0132\037.op" +
+       "enxc.RTCConfigurationCommand\"\346\001\n\004Type\022\013\n" +
+       "\007VERSION\020\001\022\r\n\tDEVICE_ID\020\002\022\016\n\nDIAGNOSTIC\020",
+       "\003\022\017\n\013PASSTHROUGH\020\004\022\034\n\030ACCEPTANCE_FILTER_" +
+       "BYPASS\020\005\022\022\n\016PAYLOAD_FORMAT\020\006\022\034\n\030PREDEFIN" +
+       "ED_OBD2_REQUESTS\020\007\022\027\n\023MODEM_CONFIGURATIO" +
+       "N\020\010\022\025\n\021RTC_CONFIGURATION\020\t\022\023\n\017SD_MOUNT_S" +
+       "TATUS\020\n\022\014\n\010PLATFORM\020\013\"\236\001\n\030DiagnosticCont" +
+       "rolCommand\022*\n\007request\030\001 \001(\0132\031.openxc.Dia" +
+       "gnosticRequest\0227\n\006action\030\002 \001(\0162\'.openxc." +
+       "DiagnosticControlCommand.Action\"\035\n\006Actio" +
+       "n\022\007\n\003ADD\020\001\022\n\n\006CANCEL\020\002\"=\n\035PassthroughMod" +
+       "eControlCommand\022\013\n\003bus\030\001 \001(\005\022\017\n\007enabled\030",
+       "\002 \001(\010\"<\n\035AcceptanceFilterBypassCommand\022\013" +
+       "\n\003bus\030\001 \001(\005\022\016\n\006bypass\030\002 \001(\010\"\214\001\n\024PayloadF" +
+       "ormatCommand\022:\n\006format\030\001 \001(\0162*.openxc.Pa" +
+       "yloadFormatCommand.PayloadFormat\"8\n\rPayl" +
+       "oadFormat\022\010\n\004JSON\020\001\022\014\n\010PROTOBUF\020\002\022\017\n\013MES" +
+       "SAGEPACK\020\003\"0\n\035PredefinedObd2RequestsComm" +
+       "and\022\017\n\007enabled\030\001 \001(\010\"\321\003\n\027NetworkOperator" +
+       "Settings\022\030\n\020allowDataRoaming\030\001 \001(\010\022N\n\022op" +
+       "eratorSelectMode\030\002 \001(\01622.openxc.NetworkO" +
+       "peratorSettings.OperatorSelectMode\022L\n\021ne",
+       "tworkDescriptor\030\003 \001(\01321.openxc.NetworkOp" +
+       "eratorSettings.NetworkDescriptor\032\230\001\n\021Net" +
+       "workDescriptor\022\014\n\004PLMN\030\001 \001(\r\022R\n\013networkT" +
+       "ype\030\002 \001(\0162=.openxc.NetworkOperatorSettin" +
+       "gs.NetworkDescriptor.NetworkType\"!\n\013Netw" +
+       "orkType\022\007\n\003GSM\020\000\022\t\n\005UTRAN\020\002\"c\n\022OperatorS" +
+       "electMode\022\r\n\tAUTOMATIC\020\000\022\n\n\006MANUAL\020\001\022\016\n\n" +
+       "DEREGISTER\020\002\022\014\n\010SET_ONLY\020\003\022\024\n\020MANUAL_AUT" +
+       "OMATIC\020\004\"\"\n\023NetworkDataSettings\022\013\n\003APN\030\001" +
+       " \001(\t\"3\n\025ServerConnectSettings\022\014\n\004host\030\001 ",
+       "\001(\t\022\014\n\004port\030\002 \001(\r\"\325\001\n\031ModemConfiguration" +
+       "Command\022@\n\027networkOperatorSettings\030\001 \001(\013" +
+       "2\037.openxc.NetworkOperatorSettings\0228\n\023net" +
+       "workDataSettings\030\002 \001(\0132\033.openxc.NetworkD" +
+       "ataSettings\022<\n\025serverConnectSettings\030\003 \001" +
+       "(\0132\035.openxc.ServerConnectSettings\",\n\027RTC" +
+       "ConfigurationCommand\022\021\n\tunix_time\030\001 \001(\r\"" +
+       "]\n\017CommandResponse\022)\n\004type\030\001 \001(\0162\033.openx" +
+       "c.ControlCommand.Type\022\017\n\007message\030\002 \001(\t\022\016" +
+       "\n\006status\030\003 \001(\010\"\375\001\n\021DiagnosticRequest\022\013\n\003",
+       "bus\030\001 \001(\005\022\022\n\nmessage_id\030\002 \001(\r\022\014\n\004mode\030\003 " +
+       "\001(\r\022\013\n\003pid\030\004 \001(\r\022\017\n\007payload\030\005 \001(\014\022\032\n\022mul" +
+       "tiple_responses\030\006 \001(\010\022\021\n\tfrequency\030\007 \001(\001" +
+       "\022\014\n\004name\030\010 \001(\t\022;\n\014decoded_type\030\t \001(\0162%.o" +
+       "penxc.DiagnosticRequest.DecodedType\"!\n\013D" +
+       "ecodedType\022\010\n\004NONE\020\001\022\010\n\004OBD2\020\002\"\241\001\n\022Diagn" +
+       "osticResponse\022\013\n\003bus\030\001 \001(\005\022\022\n\nmessage_id" +
+       "\030\002 \001(\r\022\014\n\004mode\030\003 \001(\r\022\013\n\003pid\030\004 \001(\r\022\017\n\007suc" +
+       "cess\030\005 \001(\010\022\036\n\026negative_response_code\030\006 \001" +
+       "(\r\022\017\n\007payload\030\007 \001(\014\022\r\n\005value\030\010 \001(\001\"\242\001\n\014D",
+       "ynamicField\022\'\n\004type\030\001 \001(\0162\031.openxc.Dynam" +
+       "icField.Type\022\024\n\014string_value\030\002 \001(\t\022\025\n\rnu" +
+       "meric_value\030\003 \001(\001\022\025\n\rboolean_value\030\004 \001(\010" +
+       "\"%\n\004Type\022\n\n\006STRING\020\001\022\007\n\003NUM\020\002\022\010\n\004BOOL\020\003\"" +
+       "g\n\rSimpleMessage\022\014\n\004name\030\001 \001(\t\022#\n\005value\030" +
+       "\002 \001(\0132\024.openxc.DynamicField\022#\n\005event\030\003 \001" +
+       "(\0132\024.openxc.DynamicFieldB\034\n\ncom.openxcB\016" +
+       "BinaryMessages"
+     };
+     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", "CanMessage", "SimpleMessage", "DiagnosticResponse", "ControlCommand", "CommandResponse", "Timestamp", },
+               com.openxc.BinaryMessages.VehicleMessage.class,
+               com.openxc.BinaryMessages.VehicleMessage.Builder.class);
+           internal_static_openxc_CanMessage_descriptor =
+             getDescriptor().getMessageTypes().get(1);
+           internal_static_openxc_CanMessage_fieldAccessorTable = new
+             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+               internal_static_openxc_CanMessage_descriptor,
+               new java.lang.String[] { "Bus", "Id", "Data", "FrameFormat", },
+               com.openxc.BinaryMessages.CanMessage.class,
+               com.openxc.BinaryMessages.CanMessage.Builder.class);
+           internal_static_openxc_ControlCommand_descriptor =
+             getDescriptor().getMessageTypes().get(2);
+           internal_static_openxc_ControlCommand_fieldAccessorTable = new
+             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+               internal_static_openxc_ControlCommand_descriptor,
+               new java.lang.String[] { "Type", "DiagnosticRequest", "PassthroughModeRequest", "AcceptanceFilterBypassCommand", "PayloadFormatCommand", "PredefinedObd2RequestsCommand", "ModemConfigurationCommand", "RtcConfigurationCommand", },
+               com.openxc.BinaryMessages.ControlCommand.class,
+               com.openxc.BinaryMessages.ControlCommand.Builder.class);
+           internal_static_openxc_DiagnosticControlCommand_descriptor =
+             getDescriptor().getMessageTypes().get(3);
+           internal_static_openxc_DiagnosticControlCommand_fieldAccessorTable = new
+             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+               internal_static_openxc_DiagnosticControlCommand_descriptor,
+               new java.lang.String[] { "Request", "Action", },
+               com.openxc.BinaryMessages.DiagnosticControlCommand.class,
+               com.openxc.BinaryMessages.DiagnosticControlCommand.Builder.class);
+           internal_static_openxc_PassthroughModeControlCommand_descriptor =
+             getDescriptor().getMessageTypes().get(4);
+           internal_static_openxc_PassthroughModeControlCommand_fieldAccessorTable = new
+             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+               internal_static_openxc_PassthroughModeControlCommand_descriptor,
+               new java.lang.String[] { "Bus", "Enabled", },
+               com.openxc.BinaryMessages.PassthroughModeControlCommand.class,
+               com.openxc.BinaryMessages.PassthroughModeControlCommand.Builder.class);
+           internal_static_openxc_AcceptanceFilterBypassCommand_descriptor =
+             getDescriptor().getMessageTypes().get(5);
+           internal_static_openxc_AcceptanceFilterBypassCommand_fieldAccessorTable = new
+             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+               internal_static_openxc_AcceptanceFilterBypassCommand_descriptor,
+               new java.lang.String[] { "Bus", "Bypass", },
+               com.openxc.BinaryMessages.AcceptanceFilterBypassCommand.class,
+               com.openxc.BinaryMessages.AcceptanceFilterBypassCommand.Builder.class);
+           internal_static_openxc_PayloadFormatCommand_descriptor =
+             getDescriptor().getMessageTypes().get(6);
+           internal_static_openxc_PayloadFormatCommand_fieldAccessorTable = new
+             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+               internal_static_openxc_PayloadFormatCommand_descriptor,
+               new java.lang.String[] { "Format", },
+               com.openxc.BinaryMessages.PayloadFormatCommand.class,
+               com.openxc.BinaryMessages.PayloadFormatCommand.Builder.class);
+           internal_static_openxc_PredefinedObd2RequestsCommand_descriptor =
+             getDescriptor().getMessageTypes().get(7);
+           internal_static_openxc_PredefinedObd2RequestsCommand_fieldAccessorTable = new
+             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+               internal_static_openxc_PredefinedObd2RequestsCommand_descriptor,
+               new java.lang.String[] { "Enabled", },
+               com.openxc.BinaryMessages.PredefinedObd2RequestsCommand.class,
+               com.openxc.BinaryMessages.PredefinedObd2RequestsCommand.Builder.class);
+           internal_static_openxc_NetworkOperatorSettings_descriptor =
+             getDescriptor().getMessageTypes().get(8);
+           internal_static_openxc_NetworkOperatorSettings_fieldAccessorTable = new
+             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+               internal_static_openxc_NetworkOperatorSettings_descriptor,
+               new java.lang.String[] { "AllowDataRoaming", "OperatorSelectMode", "NetworkDescriptor", },
+               com.openxc.BinaryMessages.NetworkOperatorSettings.class,
+               com.openxc.BinaryMessages.NetworkOperatorSettings.Builder.class);
+           internal_static_openxc_NetworkOperatorSettings_NetworkDescriptor_descriptor =
+             internal_static_openxc_NetworkOperatorSettings_descriptor.getNestedTypes().get(0);
+           internal_static_openxc_NetworkOperatorSettings_NetworkDescriptor_fieldAccessorTable = new
+             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+               internal_static_openxc_NetworkOperatorSettings_NetworkDescriptor_descriptor,
+               new java.lang.String[] { "PLMN", "NetworkType", },
+               com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.class,
+               com.openxc.BinaryMessages.NetworkOperatorSettings.NetworkDescriptor.Builder.class);
+           internal_static_openxc_NetworkDataSettings_descriptor =
+             getDescriptor().getMessageTypes().get(9);
+           internal_static_openxc_NetworkDataSettings_fieldAccessorTable = new
+             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+               internal_static_openxc_NetworkDataSettings_descriptor,
+               new java.lang.String[] { "APN", },
+               com.openxc.BinaryMessages.NetworkDataSettings.class,
+               com.openxc.BinaryMessages.NetworkDataSettings.Builder.class);
+           internal_static_openxc_ServerConnectSettings_descriptor =
+             getDescriptor().getMessageTypes().get(10);
+           internal_static_openxc_ServerConnectSettings_fieldAccessorTable = new
+             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+               internal_static_openxc_ServerConnectSettings_descriptor,
+               new java.lang.String[] { "Host", "Port", },
+               com.openxc.BinaryMessages.ServerConnectSettings.class,
+               com.openxc.BinaryMessages.ServerConnectSettings.Builder.class);
+           internal_static_openxc_ModemConfigurationCommand_descriptor =
+             getDescriptor().getMessageTypes().get(11);
+           internal_static_openxc_ModemConfigurationCommand_fieldAccessorTable = new
+             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+               internal_static_openxc_ModemConfigurationCommand_descriptor,
+               new java.lang.String[] { "NetworkOperatorSettings", "NetworkDataSettings", "ServerConnectSettings", },
+               com.openxc.BinaryMessages.ModemConfigurationCommand.class,
+               com.openxc.BinaryMessages.ModemConfigurationCommand.Builder.class);
+           internal_static_openxc_RTCConfigurationCommand_descriptor =
+             getDescriptor().getMessageTypes().get(12);
+           internal_static_openxc_RTCConfigurationCommand_fieldAccessorTable = new
+             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+               internal_static_openxc_RTCConfigurationCommand_descriptor,
+               new java.lang.String[] { "UnixTime", },
+               com.openxc.BinaryMessages.RTCConfigurationCommand.class,
+               com.openxc.BinaryMessages.RTCConfigurationCommand.Builder.class);
+           internal_static_openxc_CommandResponse_descriptor =
+             getDescriptor().getMessageTypes().get(13);
+           internal_static_openxc_CommandResponse_fieldAccessorTable = new
+             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+               internal_static_openxc_CommandResponse_descriptor,
+               new java.lang.String[] { "Type", "Message", "Status", },
+               com.openxc.BinaryMessages.CommandResponse.class,
+               com.openxc.BinaryMessages.CommandResponse.Builder.class);
+           internal_static_openxc_DiagnosticRequest_descriptor =
+             getDescriptor().getMessageTypes().get(14);
+           internal_static_openxc_DiagnosticRequest_fieldAccessorTable = new
+             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+               internal_static_openxc_DiagnosticRequest_descriptor,
+               new java.lang.String[] { "Bus", "MessageId", "Mode", "Pid", "Payload", "MultipleResponses", "Frequency", "Name", "DecodedType", },
+               com.openxc.BinaryMessages.DiagnosticRequest.class,
+               com.openxc.BinaryMessages.DiagnosticRequest.Builder.class);
+           internal_static_openxc_DiagnosticResponse_descriptor =
+             getDescriptor().getMessageTypes().get(15);
+           internal_static_openxc_DiagnosticResponse_fieldAccessorTable = new
+             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+               internal_static_openxc_DiagnosticResponse_descriptor,
+               new java.lang.String[] { "Bus", "MessageId", "Mode", "Pid", "Success", "NegativeResponseCode", "Payload", "Value", },
+               com.openxc.BinaryMessages.DiagnosticResponse.class,
+               com.openxc.BinaryMessages.DiagnosticResponse.Builder.class);
+           internal_static_openxc_DynamicField_descriptor =
+             getDescriptor().getMessageTypes().get(16);
+           internal_static_openxc_DynamicField_fieldAccessorTable = new
+             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+               internal_static_openxc_DynamicField_descriptor,
+               new java.lang.String[] { "Type", "StringValue", "NumericValue", "BooleanValue", },
+               com.openxc.BinaryMessages.DynamicField.class,
+               com.openxc.BinaryMessages.DynamicField.Builder.class);
+           internal_static_openxc_SimpleMessage_descriptor =
+             getDescriptor().getMessageTypes().get(17);
+           internal_static_openxc_SimpleMessage_fieldAccessorTable = new
+             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+               internal_static_openxc_SimpleMessage_descriptor,
+               new java.lang.String[] { "Name", "Value", "Event", },
+               com.openxc.BinaryMessages.SimpleMessage.class,
+               com.openxc.BinaryMessages.SimpleMessage.Builder.class);
+           return null;
+         }
+       };
+     com.google.protobuf.Descriptors.FileDescriptor
+       .internalBuildGeneratedFileFrom(descriptorData,
+         new com.google.protobuf.Descriptors.FileDescriptor[] {
+         }, assigner);
+   }
+   
+   // @@protoc_insertion_point(outer_class_scope)
+ }
index 0000000,cd5ec5f..cd5ec5f
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,1316 +1,1316 @@@
+ # Generated by the protocol buffer compiler.  DO NOT EDIT!
+ from google.protobuf import descriptor
+ from google.protobuf import message
+ from google.protobuf import 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\"\x9b\x03\n\x0eVehicleMessage\x12)\n\x04type\x18\x01 \x01(\x0e\x32\x1b.openxc.VehicleMessage.Type\x12\'\n\x0b\x63\x61n_message\x18\x02 \x01(\x0b\x32\x12.openxc.CanMessage\x12-\n\x0esimple_message\x18\x03 \x01(\x0b\x32\x15.openxc.SimpleMessage\x12\x37\n\x13\x64iagnostic_response\x18\x04 \x01(\x0b\x32\x1a.openxc.DiagnosticResponse\x12/\n\x0f\x63ontrol_command\x18\x05 \x01(\x0b\x32\x16.openxc.ControlCommand\x12\x31\n\x10\x63ommand_response\x18\x06 \x01(\x0b\x32\x17.openxc.CommandResponse\x12\x11\n\ttimestamp\x18\x07 \x01(\x04\"V\n\x04Type\x12\x07\n\x03\x43\x41N\x10\x01\x12\n\n\x06SIMPLE\x10\x02\x12\x0e\n\nDIAGNOSTIC\x10\x03\x12\x13\n\x0f\x43ONTROL_COMMAND\x10\x04\x12\x14\n\x10\x43OMMAND_RESPONSE\x10\x05\"\x94\x01\n\nCanMessage\x12\x0b\n\x03\x62us\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\r\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\x12\x34\n\x0c\x66rame_format\x18\x04 \x01(\x0e\x32\x1e.openxc.CanMessage.FrameFormat\")\n\x0b\x46rameFormat\x12\x0c\n\x08STANDARD\x10\x01\x12\x0c\n\x08\x45XTENDED\x10\x02\"\x97\x06\n\x0e\x43ontrolCommand\x12)\n\x04type\x18\x01 \x01(\x0e\x32\x1b.openxc.ControlCommand.Type\x12<\n\x12\x64iagnostic_request\x18\x02 \x01(\x0b\x32 .openxc.DiagnosticControlCommand\x12G\n\x18passthrough_mode_request\x18\x03 \x01(\x0b\x32%.openxc.PassthroughModeControlCommand\x12O\n acceptance_filter_bypass_command\x18\x04 \x01(\x0b\x32%.openxc.AcceptanceFilterBypassCommand\x12<\n\x16payload_format_command\x18\x05 \x01(\x0b\x32\x1c.openxc.PayloadFormatCommand\x12O\n predefined_obd2_requests_command\x18\x06 \x01(\x0b\x32%.openxc.PredefinedObd2RequestsCommand\x12\x46\n\x1bmodem_configuration_command\x18\x07 \x01(\x0b\x32!.openxc.ModemConfigurationCommand\x12\x42\n\x19rtc_configuration_command\x18\x08 \x01(\x0b\x32\x1f.openxc.RTCConfigurationCommand\"\xe6\x01\n\x04Type\x12\x0b\n\x07VERSION\x10\x01\x12\r\n\tDEVICE_ID\x10\x02\x12\x0e\n\nDIAGNOSTIC\x10\x03\x12\x0f\n\x0bPASSTHROUGH\x10\x04\x12\x1c\n\x18\x41\x43\x43\x45PTANCE_FILTER_BYPASS\x10\x05\x12\x12\n\x0ePAYLOAD_FORMAT\x10\x06\x12\x1c\n\x18PREDEFINED_OBD2_REQUESTS\x10\x07\x12\x17\n\x13MODEM_CONFIGURATION\x10\x08\x12\x15\n\x11RTC_CONFIGURATION\x10\t\x12\x13\n\x0fSD_MOUNT_STATUS\x10\n\x12\x0c\n\x08PLATFORM\x10\x0b\"\x9e\x01\n\x18\x44iagnosticControlCommand\x12*\n\x07request\x18\x01 \x01(\x0b\x32\x19.openxc.DiagnosticRequest\x12\x37\n\x06\x61\x63tion\x18\x02 \x01(\x0e\x32\'.openxc.DiagnosticControlCommand.Action\"\x1d\n\x06\x41\x63tion\x12\x07\n\x03\x41\x44\x44\x10\x01\x12\n\n\x06\x43\x41NCEL\x10\x02\"=\n\x1dPassthroughModeControlCommand\x12\x0b\n\x03\x62us\x18\x01 \x01(\x05\x12\x0f\n\x07\x65nabled\x18\x02 \x01(\x08\"<\n\x1d\x41\x63\x63\x65ptanceFilterBypassCommand\x12\x0b\n\x03\x62us\x18\x01 \x01(\x05\x12\x0e\n\x06\x62ypass\x18\x02 \x01(\x08\"\x8c\x01\n\x14PayloadFormatCommand\x12:\n\x06\x66ormat\x18\x01 \x01(\x0e\x32*.openxc.PayloadFormatCommand.PayloadFormat\"8\n\rPayloadFormat\x12\x08\n\x04JSON\x10\x01\x12\x0c\n\x08PROTOBUF\x10\x02\x12\x0f\n\x0bMESSAGEPACK\x10\x03\"0\n\x1dPredefinedObd2RequestsCommand\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\"\xd1\x03\n\x17NetworkOperatorSettings\x12\x18\n\x10\x61llowDataRoaming\x18\x01 \x01(\x08\x12N\n\x12operatorSelectMode\x18\x02 \x01(\x0e\x32\x32.openxc.NetworkOperatorSettings.OperatorSelectMode\x12L\n\x11networkDescriptor\x18\x03 \x01(\x0b\x32\x31.openxc.NetworkOperatorSettings.NetworkDescriptor\x1a\x98\x01\n\x11NetworkDescriptor\x12\x0c\n\x04PLMN\x18\x01 \x01(\r\x12R\n\x0bnetworkType\x18\x02 \x01(\x0e\x32=.openxc.NetworkOperatorSettings.NetworkDescriptor.NetworkType\"!\n\x0bNetworkType\x12\x07\n\x03GSM\x10\x00\x12\t\n\x05UTRAN\x10\x02\"c\n\x12OperatorSelectMode\x12\r\n\tAUTOMATIC\x10\x00\x12\n\n\x06MANUAL\x10\x01\x12\x0e\n\nDEREGISTER\x10\x02\x12\x0c\n\x08SET_ONLY\x10\x03\x12\x14\n\x10MANUAL_AUTOMATIC\x10\x04\"\"\n\x13NetworkDataSettings\x12\x0b\n\x03\x41PN\x18\x01 \x01(\t\"3\n\x15ServerConnectSettings\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\r\"\xd5\x01\n\x19ModemConfigurationCommand\x12@\n\x17networkOperatorSettings\x18\x01 \x01(\x0b\x32\x1f.openxc.NetworkOperatorSettings\x12\x38\n\x13networkDataSettings\x18\x02 \x01(\x0b\x32\x1b.openxc.NetworkDataSettings\x12<\n\x15serverConnectSettings\x18\x03 \x01(\x0b\x32\x1d.openxc.ServerConnectSettings\",\n\x17RTCConfigurationCommand\x12\x11\n\tunix_time\x18\x01 \x01(\r\"]\n\x0f\x43ommandResponse\x12)\n\x04type\x18\x01 \x01(\x0e\x32\x1b.openxc.ControlCommand.Type\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\x08\"\xfd\x01\n\x11\x44iagnosticRequest\x12\x0b\n\x03\x62us\x18\x01 \x01(\x05\x12\x12\n\nmessage_id\x18\x02 \x01(\r\x12\x0c\n\x04mode\x18\x03 \x01(\r\x12\x0b\n\x03pid\x18\x04 \x01(\r\x12\x0f\n\x07payload\x18\x05 \x01(\x0c\x12\x1a\n\x12multiple_responses\x18\x06 \x01(\x08\x12\x11\n\tfrequency\x18\x07 \x01(\x01\x12\x0c\n\x04name\x18\x08 \x01(\t\x12;\n\x0c\x64\x65\x63oded_type\x18\t \x01(\x0e\x32%.openxc.DiagnosticRequest.DecodedType\"!\n\x0b\x44\x65\x63odedType\x12\x08\n\x04NONE\x10\x01\x12\x08\n\x04OBD2\x10\x02\"\xa1\x01\n\x12\x44iagnosticResponse\x12\x0b\n\x03\x62us\x18\x01 \x01(\x05\x12\x12\n\nmessage_id\x18\x02 \x01(\r\x12\x0c\n\x04mode\x18\x03 \x01(\r\x12\x0b\n\x03pid\x18\x04 \x01(\r\x12\x0f\n\x07success\x18\x05 \x01(\x08\x12\x1e\n\x16negative_response_code\x18\x06 \x01(\r\x12\x0f\n\x07payload\x18\x07 \x01(\x0c\x12\r\n\x05value\x18\x08 \x01(\x01\"\xa2\x01\n\x0c\x44ynamicField\x12\'\n\x04type\x18\x01 \x01(\x0e\x32\x19.openxc.DynamicField.Type\x12\x14\n\x0cstring_value\x18\x02 \x01(\t\x12\x15\n\rnumeric_value\x18\x03 \x01(\x01\x12\x15\n\rboolean_value\x18\x04 \x01(\x08\"%\n\x04Type\x12\n\n\x06STRING\x10\x01\x12\x07\n\x03NUM\x10\x02\x12\x08\n\x04\x42OOL\x10\x03\"g\n\rSimpleMessage\x12\x0c\n\x04name\x18\x01 \x01(\t\x12#\n\x05value\x18\x02 \x01(\x0b\x32\x14.openxc.DynamicField\x12#\n\x05\x65vent\x18\x03 \x01(\x0b\x32\x14.openxc.DynamicFieldB\x1c\n\ncom.openxcB\x0e\x42inaryMessages')
+ _VEHICLEMESSAGE_TYPE = descriptor.EnumDescriptor(
+   name='Type',
+   full_name='openxc.VehicleMessage.Type',
+   filename=None,
+   file=DESCRIPTOR,
+   values=[
+     descriptor.EnumValueDescriptor(
+       name='CAN', index=0, number=1,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='SIMPLE', index=1, number=2,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='DIAGNOSTIC', index=2, number=3,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='CONTROL_COMMAND', index=3, number=4,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='COMMAND_RESPONSE', index=4, number=5,
+       options=None,
+       type=None),
+   ],
+   containing_type=None,
+   options=None,
+   serialized_start=350,
+   serialized_end=436,
+ )
+ _CANMESSAGE_FRAMEFORMAT = descriptor.EnumDescriptor(
+   name='FrameFormat',
+   full_name='openxc.CanMessage.FrameFormat',
+   filename=None,
+   file=DESCRIPTOR,
+   values=[
+     descriptor.EnumValueDescriptor(
+       name='STANDARD', index=0, number=1,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='EXTENDED', index=1, number=2,
+       options=None,
+       type=None),
+   ],
+   containing_type=None,
+   options=None,
+   serialized_start=546,
+   serialized_end=587,
+ )
+ _CONTROLCOMMAND_TYPE = descriptor.EnumDescriptor(
+   name='Type',
+   full_name='openxc.ControlCommand.Type',
+   filename=None,
+   file=DESCRIPTOR,
+   values=[
+     descriptor.EnumValueDescriptor(
+       name='VERSION', index=0, number=1,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='DEVICE_ID', index=1, number=2,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='DIAGNOSTIC', index=2, number=3,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='PASSTHROUGH', index=3, number=4,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='ACCEPTANCE_FILTER_BYPASS', index=4, number=5,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='PAYLOAD_FORMAT', index=5, number=6,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='PREDEFINED_OBD2_REQUESTS', index=6, number=7,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='MODEM_CONFIGURATION', index=7, number=8,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='RTC_CONFIGURATION', index=8, number=9,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='SD_MOUNT_STATUS', index=9, number=10,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='PLATFORM', index=10, number=11,
+       options=None,
+       type=None),
+   ],
+   containing_type=None,
+   options=None,
+   serialized_start=1151,
+   serialized_end=1381,
+ )
+ _DIAGNOSTICCONTROLCOMMAND_ACTION = descriptor.EnumDescriptor(
+   name='Action',
+   full_name='openxc.DiagnosticControlCommand.Action',
+   filename=None,
+   file=DESCRIPTOR,
+   values=[
+     descriptor.EnumValueDescriptor(
+       name='ADD', index=0, number=1,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='CANCEL', index=1, number=2,
+       options=None,
+       type=None),
+   ],
+   containing_type=None,
+   options=None,
+   serialized_start=1513,
+   serialized_end=1542,
+ )
+ _PAYLOADFORMATCOMMAND_PAYLOADFORMAT = descriptor.EnumDescriptor(
+   name='PayloadFormat',
+   full_name='openxc.PayloadFormatCommand.PayloadFormat',
+   filename=None,
+   file=DESCRIPTOR,
+   values=[
+     descriptor.EnumValueDescriptor(
+       name='JSON', index=0, number=1,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='PROTOBUF', index=1, number=2,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='MESSAGEPACK', index=2, number=3,
+       options=None,
+       type=None),
+   ],
+   containing_type=None,
+   options=None,
+   serialized_start=1754,
+   serialized_end=1810,
+ )
+ _NETWORKOPERATORSETTINGS_NETWORKDESCRIPTOR_NETWORKTYPE = descriptor.EnumDescriptor(
+   name='NetworkType',
+   full_name='openxc.NetworkOperatorSettings.NetworkDescriptor.NetworkType',
+   filename=None,
+   file=DESCRIPTOR,
+   values=[
+     descriptor.EnumValueDescriptor(
+       name='GSM', index=0, number=0,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='UTRAN', index=1, number=2,
+       options=None,
+       type=None),
+   ],
+   containing_type=None,
+   options=None,
+   serialized_start=2194,
+   serialized_end=2227,
+ )
+ _NETWORKOPERATORSETTINGS_OPERATORSELECTMODE = descriptor.EnumDescriptor(
+   name='OperatorSelectMode',
+   full_name='openxc.NetworkOperatorSettings.OperatorSelectMode',
+   filename=None,
+   file=DESCRIPTOR,
+   values=[
+     descriptor.EnumValueDescriptor(
+       name='AUTOMATIC', index=0, number=0,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='MANUAL', index=1, number=1,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='DEREGISTER', index=2, number=2,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='SET_ONLY', index=3, number=3,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='MANUAL_AUTOMATIC', index=4, number=4,
+       options=None,
+       type=None),
+   ],
+   containing_type=None,
+   options=None,
+   serialized_start=2229,
+   serialized_end=2328,
+ )
+ _DIAGNOSTICREQUEST_DECODEDTYPE = descriptor.EnumDescriptor(
+   name='DecodedType',
+   full_name='openxc.DiagnosticRequest.DecodedType',
+   filename=None,
+   file=DESCRIPTOR,
+   values=[
+     descriptor.EnumValueDescriptor(
+       name='NONE', index=0, number=1,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='OBD2', index=1, number=2,
+       options=None,
+       type=None),
+   ],
+   containing_type=None,
+   options=None,
+   serialized_start=2997,
+   serialized_end=3030,
+ )
+ _DYNAMICFIELD_TYPE = descriptor.EnumDescriptor(
+   name='Type',
+   full_name='openxc.DynamicField.Type',
+   filename=None,
+   file=DESCRIPTOR,
+   values=[
+     descriptor.EnumValueDescriptor(
+       name='STRING', index=0, number=1,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='NUM', index=1, number=2,
+       options=None,
+       type=None),
+     descriptor.EnumValueDescriptor(
+       name='BOOL', index=2, number=3,
+       options=None,
+       type=None),
+   ],
+   containing_type=None,
+   options=None,
+   serialized_start=3322,
+   serialized_end=3359,
+ )
+ _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='can_message', full_name='openxc.VehicleMessage.can_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='simple_message', full_name='openxc.VehicleMessage.simple_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='diagnostic_response', full_name='openxc.VehicleMessage.diagnostic_response', 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='control_command', full_name='openxc.VehicleMessage.control_command', 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),
+     descriptor.FieldDescriptor(
+       name='command_response', full_name='openxc.VehicleMessage.command_response', index=5,
+       number=6, 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='timestamp', full_name='openxc.VehicleMessage.timestamp', index=6,
+       number=7, type=4, cpp_type=4, 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=[
+     _VEHICLEMESSAGE_TYPE,
+   ],
+   options=None,
+   is_extendable=False,
+   extension_ranges=[],
+   serialized_start=25,
+   serialized_end=436,
+ )
+ _CANMESSAGE = descriptor.Descriptor(
+   name='CanMessage',
+   full_name='openxc.CanMessage',
+   filename=None,
+   file=DESCRIPTOR,
+   containing_type=None,
+   fields=[
+     descriptor.FieldDescriptor(
+       name='bus', full_name='openxc.CanMessage.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='id', full_name='openxc.CanMessage.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.CanMessage.data', index=2,
+       number=3, type=12, cpp_type=9, label=1,
+       has_default_value=False, default_value="",
+       message_type=None, enum_type=None, containing_type=None,
+       is_extension=False, extension_scope=None,
+       options=None),
+     descriptor.FieldDescriptor(
+       name='frame_format', full_name='openxc.CanMessage.frame_format', index=3,
+       number=4, 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),
+   ],
+   extensions=[
+   ],
+   nested_types=[],
+   enum_types=[
+     _CANMESSAGE_FRAMEFORMAT,
+   ],
+   options=None,
+   is_extendable=False,
+   extension_ranges=[],
+   serialized_start=439,
+   serialized_end=587,
+ )
+ _CONTROLCOMMAND = descriptor.Descriptor(
+   name='ControlCommand',
+   full_name='openxc.ControlCommand',
+   filename=None,
+   file=DESCRIPTOR,
+   containing_type=None,
+   fields=[
+     descriptor.FieldDescriptor(
+       name='type', full_name='openxc.ControlCommand.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='diagnostic_request', full_name='openxc.ControlCommand.diagnostic_request', 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='passthrough_mode_request', full_name='openxc.ControlCommand.passthrough_mode_request', 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='acceptance_filter_bypass_command', full_name='openxc.ControlCommand.acceptance_filter_bypass_command', 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='payload_format_command', full_name='openxc.ControlCommand.payload_format_command', 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),
+     descriptor.FieldDescriptor(
+       name='predefined_obd2_requests_command', full_name='openxc.ControlCommand.predefined_obd2_requests_command', index=5,
+       number=6, 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='modem_configuration_command', full_name='openxc.ControlCommand.modem_configuration_command', index=6,
+       number=7, 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='rtc_configuration_command', full_name='openxc.ControlCommand.rtc_configuration_command', index=7,
+       number=8, 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=[
+     _CONTROLCOMMAND_TYPE,
+   ],
+   options=None,
+   is_extendable=False,
+   extension_ranges=[],
+   serialized_start=590,
+   serialized_end=1381,
+ )
+ _DIAGNOSTICCONTROLCOMMAND = descriptor.Descriptor(
+   name='DiagnosticControlCommand',
+   full_name='openxc.DiagnosticControlCommand',
+   filename=None,
+   file=DESCRIPTOR,
+   containing_type=None,
+   fields=[
+     descriptor.FieldDescriptor(
+       name='request', full_name='openxc.DiagnosticControlCommand.request', index=0,
+       number=1, 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='action', full_name='openxc.DiagnosticControlCommand.action', index=1,
+       number=2, 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),
+   ],
+   extensions=[
+   ],
+   nested_types=[],
+   enum_types=[
+     _DIAGNOSTICCONTROLCOMMAND_ACTION,
+   ],
+   options=None,
+   is_extendable=False,
+   extension_ranges=[],
+   serialized_start=1384,
+   serialized_end=1542,
+ )
+ _PASSTHROUGHMODECONTROLCOMMAND = descriptor.Descriptor(
+   name='PassthroughModeControlCommand',
+   full_name='openxc.PassthroughModeControlCommand',
+   filename=None,
+   file=DESCRIPTOR,
+   containing_type=None,
+   fields=[
+     descriptor.FieldDescriptor(
+       name='bus', full_name='openxc.PassthroughModeControlCommand.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='enabled', full_name='openxc.PassthroughModeControlCommand.enabled', 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=1544,
+   serialized_end=1605,
+ )
+ _ACCEPTANCEFILTERBYPASSCOMMAND = descriptor.Descriptor(
+   name='AcceptanceFilterBypassCommand',
+   full_name='openxc.AcceptanceFilterBypassCommand',
+   filename=None,
+   file=DESCRIPTOR,
+   containing_type=None,
+   fields=[
+     descriptor.FieldDescriptor(
+       name='bus', full_name='openxc.AcceptanceFilterBypassCommand.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='bypass', full_name='openxc.AcceptanceFilterBypassCommand.bypass', 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=1607,
+   serialized_end=1667,
+ )
+ _PAYLOADFORMATCOMMAND = descriptor.Descriptor(
+   name='PayloadFormatCommand',
+   full_name='openxc.PayloadFormatCommand',
+   filename=None,
+   file=DESCRIPTOR,
+   containing_type=None,
+   fields=[
+     descriptor.FieldDescriptor(
+       name='format', full_name='openxc.PayloadFormatCommand.format', 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),
+   ],
+   extensions=[
+   ],
+   nested_types=[],
+   enum_types=[
+     _PAYLOADFORMATCOMMAND_PAYLOADFORMAT,
+   ],
+   options=None,
+   is_extendable=False,
+   extension_ranges=[],
+   serialized_start=1670,
+   serialized_end=1810,
+ )
+ _PREDEFINEDOBD2REQUESTSCOMMAND = descriptor.Descriptor(
+   name='PredefinedObd2RequestsCommand',
+   full_name='openxc.PredefinedObd2RequestsCommand',
+   filename=None,
+   file=DESCRIPTOR,
+   containing_type=None,
+   fields=[
+     descriptor.FieldDescriptor(
+       name='enabled', full_name='openxc.PredefinedObd2RequestsCommand.enabled', index=0,
+       number=1, 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=1812,
+   serialized_end=1860,
+ )
+ _NETWORKOPERATORSETTINGS_NETWORKDESCRIPTOR = descriptor.Descriptor(
+   name='NetworkDescriptor',
+   full_name='openxc.NetworkOperatorSettings.NetworkDescriptor',
+   filename=None,
+   file=DESCRIPTOR,
+   containing_type=None,
+   fields=[
+     descriptor.FieldDescriptor(
+       name='PLMN', full_name='openxc.NetworkOperatorSettings.NetworkDescriptor.PLMN', index=0,
+       number=1, 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='networkType', full_name='openxc.NetworkOperatorSettings.NetworkDescriptor.networkType', index=1,
+       number=2, type=14, cpp_type=8, 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=[
+     _NETWORKOPERATORSETTINGS_NETWORKDESCRIPTOR_NETWORKTYPE,
+   ],
+   options=None,
+   is_extendable=False,
+   extension_ranges=[],
+   serialized_start=2075,
+   serialized_end=2227,
+ )
+ _NETWORKOPERATORSETTINGS = descriptor.Descriptor(
+   name='NetworkOperatorSettings',
+   full_name='openxc.NetworkOperatorSettings',
+   filename=None,
+   file=DESCRIPTOR,
+   containing_type=None,
+   fields=[
+     descriptor.FieldDescriptor(
+       name='allowDataRoaming', full_name='openxc.NetworkOperatorSettings.allowDataRoaming', index=0,
+       number=1, 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),
+     descriptor.FieldDescriptor(
+       name='operatorSelectMode', full_name='openxc.NetworkOperatorSettings.operatorSelectMode', index=1,
+       number=2, type=14, cpp_type=8, 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='networkDescriptor', full_name='openxc.NetworkOperatorSettings.networkDescriptor', 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),
+   ],
+   extensions=[
+   ],
+   nested_types=[_NETWORKOPERATORSETTINGS_NETWORKDESCRIPTOR, ],
+   enum_types=[
+     _NETWORKOPERATORSETTINGS_OPERATORSELECTMODE,
+   ],
+   options=None,
+   is_extendable=False,
+   extension_ranges=[],
+   serialized_start=1863,
+   serialized_end=2328,
+ )
+ _NETWORKDATASETTINGS = descriptor.Descriptor(
+   name='NetworkDataSettings',
+   full_name='openxc.NetworkDataSettings',
+   filename=None,
+   file=DESCRIPTOR,
+   containing_type=None,
+   fields=[
+     descriptor.FieldDescriptor(
+       name='APN', full_name='openxc.NetworkDataSettings.APN', 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),
+   ],
+   extensions=[
+   ],
+   nested_types=[],
+   enum_types=[
+   ],
+   options=None,
+   is_extendable=False,
+   extension_ranges=[],
+   serialized_start=2330,
+   serialized_end=2364,
+ )
+ _SERVERCONNECTSETTINGS = descriptor.Descriptor(
+   name='ServerConnectSettings',
+   full_name='openxc.ServerConnectSettings',
+   filename=None,
+   file=DESCRIPTOR,
+   containing_type=None,
+   fields=[
+     descriptor.FieldDescriptor(
+       name='host', full_name='openxc.ServerConnectSettings.host', 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='port', full_name='openxc.ServerConnectSettings.port', 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),
+   ],
+   extensions=[
+   ],
+   nested_types=[],
+   enum_types=[
+   ],
+   options=None,
+   is_extendable=False,
+   extension_ranges=[],
+   serialized_start=2366,
+   serialized_end=2417,
+ )
+ _MODEMCONFIGURATIONCOMMAND = descriptor.Descriptor(
+   name='ModemConfigurationCommand',
+   full_name='openxc.ModemConfigurationCommand',
+   filename=None,
+   file=DESCRIPTOR,
+   containing_type=None,
+   fields=[
+     descriptor.FieldDescriptor(
+       name='networkOperatorSettings', full_name='openxc.ModemConfigurationCommand.networkOperatorSettings', index=0,
+       number=1, 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='networkDataSettings', full_name='openxc.ModemConfigurationCommand.networkDataSettings', 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='serverConnectSettings', full_name='openxc.ModemConfigurationCommand.serverConnectSettings', 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),
+   ],
+   extensions=[
+   ],
+   nested_types=[],
+   enum_types=[
+   ],
+   options=None,
+   is_extendable=False,
+   extension_ranges=[],
+   serialized_start=2420,
+   serialized_end=2633,
+ )
+ _RTCCONFIGURATIONCOMMAND = descriptor.Descriptor(
+   name='RTCConfigurationCommand',
+   full_name='openxc.RTCConfigurationCommand',
+   filename=None,
+   file=DESCRIPTOR,
+   containing_type=None,
+   fields=[
+     descriptor.FieldDescriptor(
+       name='unix_time', full_name='openxc.RTCConfigurationCommand.unix_time', index=0,
+       number=1, 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),
+   ],
+   extensions=[
+   ],
+   nested_types=[],
+   enum_types=[
+   ],
+   options=None,
+   is_extendable=False,
+   extension_ranges=[],
+   serialized_start=2635,
+   serialized_end=2679,
+ )
+ _COMMANDRESPONSE = descriptor.Descriptor(
+   name='CommandResponse',
+   full_name='openxc.CommandResponse',
+   filename=None,
+   file=DESCRIPTOR,
+   containing_type=None,
+   fields=[
+     descriptor.FieldDescriptor(
+       name='type', full_name='openxc.CommandResponse.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='message', full_name='openxc.CommandResponse.message', 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),
+     descriptor.FieldDescriptor(
+       name='status', full_name='openxc.CommandResponse.status', index=2,
+       number=3, 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=2681,
+   serialized_end=2774,
+ )
+ _DIAGNOSTICREQUEST = descriptor.Descriptor(
+   name='DiagnosticRequest',
+   full_name='openxc.DiagnosticRequest',
+   filename=None,
+   file=DESCRIPTOR,
+   containing_type=None,
+   fields=[
+     descriptor.FieldDescriptor(
+       name='bus', full_name='openxc.DiagnosticRequest.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.DiagnosticRequest.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='mode', full_name='openxc.DiagnosticRequest.mode', index=2,
+       number=3, 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='pid', full_name='openxc.DiagnosticRequest.pid', index=3,
+       number=4, 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='payload', full_name='openxc.DiagnosticRequest.payload', index=4,
+       number=5, type=12, cpp_type=9, label=1,
+       has_default_value=False, default_value="",
+       message_type=None, enum_type=None, containing_type=None,
+       is_extension=False, extension_scope=None,
+       options=None),
+     descriptor.FieldDescriptor(
+       name='multiple_responses', full_name='openxc.DiagnosticRequest.multiple_responses', index=5,
+       number=6, 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),
+     descriptor.FieldDescriptor(
+       name='frequency', full_name='openxc.DiagnosticRequest.frequency', index=6,
+       number=7, 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),
+     descriptor.FieldDescriptor(
+       name='name', full_name='openxc.DiagnosticRequest.name', index=7,
+       number=8, 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='decoded_type', full_name='openxc.DiagnosticRequest.decoded_type', index=8,
+       number=9, 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),
+   ],
+   extensions=[
+   ],
+   nested_types=[],
+   enum_types=[
+     _DIAGNOSTICREQUEST_DECODEDTYPE,
+   ],
+   options=None,
+   is_extendable=False,
+   extension_ranges=[],
+   serialized_start=2777,
+   serialized_end=3030,
+ )
+ _DIAGNOSTICRESPONSE = descriptor.Descriptor(
+   name='DiagnosticResponse',
+   full_name='openxc.DiagnosticResponse',
+   filename=None,
+   file=DESCRIPTOR,
+   containing_type=None,
+   fields=[
+     descriptor.FieldDescriptor(
+       name='bus', full_name='openxc.DiagnosticResponse.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.DiagnosticResponse.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='mode', full_name='openxc.DiagnosticResponse.mode', index=2,
+       number=3, 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='pid', full_name='openxc.DiagnosticResponse.pid', index=3,
+       number=4, 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='success', full_name='openxc.DiagnosticResponse.success', index=4,
+       number=5, 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),
+     descriptor.FieldDescriptor(
+       name='negative_response_code', full_name='openxc.DiagnosticResponse.negative_response_code', index=5,
+       number=6, 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='payload', full_name='openxc.DiagnosticResponse.payload', index=6,
+       number=7, type=12, cpp_type=9, label=1,
+       has_default_value=False, default_value="",
+       message_type=None, enum_type=None, containing_type=None,
+       is_extension=False, extension_scope=None,
+       options=None),
+     descriptor.FieldDescriptor(
+       name='value', full_name='openxc.DiagnosticResponse.value', index=7,
+       number=8, 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=3033,
+   serialized_end=3194,
+ )
+ _DYNAMICFIELD = descriptor.Descriptor(
+   name='DynamicField',
+   full_name='openxc.DynamicField',
+   filename=None,
+   file=DESCRIPTOR,
+   containing_type=None,
+   fields=[
+     descriptor.FieldDescriptor(
+       name='type', full_name='openxc.DynamicField.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='string_value', full_name='openxc.DynamicField.string_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),
+     descriptor.FieldDescriptor(
+       name='numeric_value', full_name='openxc.DynamicField.numeric_value', index=2,
+       number=3, 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),
+     descriptor.FieldDescriptor(
+       name='boolean_value', full_name='openxc.DynamicField.boolean_value', index=3,
+       number=4, 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=[
+     _DYNAMICFIELD_TYPE,
+   ],
+   options=None,
+   is_extendable=False,
+   extension_ranges=[],
+   serialized_start=3197,
+   serialized_end=3359,
+ )
+ _SIMPLEMESSAGE = descriptor.Descriptor(
+   name='SimpleMessage',
+   full_name='openxc.SimpleMessage',
+   filename=None,
+   file=DESCRIPTOR,
+   containing_type=None,
+   fields=[
+     descriptor.FieldDescriptor(
+       name='name', full_name='openxc.SimpleMessage.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.SimpleMessage.value', 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='event', full_name='openxc.SimpleMessage.event', 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),
+   ],
+   extensions=[
+   ],
+   nested_types=[],
+   enum_types=[
+   ],
+   options=None,
+   is_extendable=False,
+   extension_ranges=[],
+   serialized_start=3361,
+   serialized_end=3464,
+ )
+ _VEHICLEMESSAGE.fields_by_name['type'].enum_type = _VEHICLEMESSAGE_TYPE
+ _VEHICLEMESSAGE.fields_by_name['can_message'].message_type = _CANMESSAGE
+ _VEHICLEMESSAGE.fields_by_name['simple_message'].message_type = _SIMPLEMESSAGE
+ _VEHICLEMESSAGE.fields_by_name['diagnostic_response'].message_type = _DIAGNOSTICRESPONSE
+ _VEHICLEMESSAGE.fields_by_name['control_command'].message_type = _CONTROLCOMMAND
+ _VEHICLEMESSAGE.fields_by_name['command_response'].message_type = _COMMANDRESPONSE
+ _VEHICLEMESSAGE_TYPE.containing_type = _VEHICLEMESSAGE;
+ _CANMESSAGE.fields_by_name['frame_format'].enum_type = _CANMESSAGE_FRAMEFORMAT
+ _CANMESSAGE_FRAMEFORMAT.containing_type = _CANMESSAGE;
+ _CONTROLCOMMAND.fields_by_name['type'].enum_type = _CONTROLCOMMAND_TYPE
+ _CONTROLCOMMAND.fields_by_name['diagnostic_request'].message_type = _DIAGNOSTICCONTROLCOMMAND
+ _CONTROLCOMMAND.fields_by_name['passthrough_mode_request'].message_type = _PASSTHROUGHMODECONTROLCOMMAND
+ _CONTROLCOMMAND.fields_by_name['acceptance_filter_bypass_command'].message_type = _ACCEPTANCEFILTERBYPASSCOMMAND
+ _CONTROLCOMMAND.fields_by_name['payload_format_command'].message_type = _PAYLOADFORMATCOMMAND
+ _CONTROLCOMMAND.fields_by_name['predefined_obd2_requests_command'].message_type = _PREDEFINEDOBD2REQUESTSCOMMAND
+ _CONTROLCOMMAND.fields_by_name['modem_configuration_command'].message_type = _MODEMCONFIGURATIONCOMMAND
+ _CONTROLCOMMAND.fields_by_name['rtc_configuration_command'].message_type = _RTCCONFIGURATIONCOMMAND
+ _CONTROLCOMMAND_TYPE.containing_type = _CONTROLCOMMAND;
+ _DIAGNOSTICCONTROLCOMMAND.fields_by_name['request'].message_type = _DIAGNOSTICREQUEST
+ _DIAGNOSTICCONTROLCOMMAND.fields_by_name['action'].enum_type = _DIAGNOSTICCONTROLCOMMAND_ACTION
+ _DIAGNOSTICCONTROLCOMMAND_ACTION.containing_type = _DIAGNOSTICCONTROLCOMMAND;
+ _PAYLOADFORMATCOMMAND.fields_by_name['format'].enum_type = _PAYLOADFORMATCOMMAND_PAYLOADFORMAT
+ _PAYLOADFORMATCOMMAND_PAYLOADFORMAT.containing_type = _PAYLOADFORMATCOMMAND;
+ _NETWORKOPERATORSETTINGS_NETWORKDESCRIPTOR.fields_by_name['networkType'].enum_type = _NETWORKOPERATORSETTINGS_NETWORKDESCRIPTOR_NETWORKTYPE
+ _NETWORKOPERATORSETTINGS_NETWORKDESCRIPTOR.containing_type = _NETWORKOPERATORSETTINGS;
+ _NETWORKOPERATORSETTINGS_NETWORKDESCRIPTOR_NETWORKTYPE.containing_type = _NETWORKOPERATORSETTINGS_NETWORKDESCRIPTOR;
+ _NETWORKOPERATORSETTINGS.fields_by_name['operatorSelectMode'].enum_type = _NETWORKOPERATORSETTINGS_OPERATORSELECTMODE
+ _NETWORKOPERATORSETTINGS.fields_by_name['networkDescriptor'].message_type = _NETWORKOPERATORSETTINGS_NETWORKDESCRIPTOR
+ _NETWORKOPERATORSETTINGS_OPERATORSELECTMODE.containing_type = _NETWORKOPERATORSETTINGS;
+ _MODEMCONFIGURATIONCOMMAND.fields_by_name['networkOperatorSettings'].message_type = _NETWORKOPERATORSETTINGS
+ _MODEMCONFIGURATIONCOMMAND.fields_by_name['networkDataSettings'].message_type = _NETWORKDATASETTINGS
+ _MODEMCONFIGURATIONCOMMAND.fields_by_name['serverConnectSettings'].message_type = _SERVERCONNECTSETTINGS
+ _COMMANDRESPONSE.fields_by_name['type'].enum_type = _CONTROLCOMMAND_TYPE
+ _DIAGNOSTICREQUEST.fields_by_name['decoded_type'].enum_type = _DIAGNOSTICREQUEST_DECODEDTYPE
+ _DIAGNOSTICREQUEST_DECODEDTYPE.containing_type = _DIAGNOSTICREQUEST;
+ _DYNAMICFIELD.fields_by_name['type'].enum_type = _DYNAMICFIELD_TYPE
+ _DYNAMICFIELD_TYPE.containing_type = _DYNAMICFIELD;
+ _SIMPLEMESSAGE.fields_by_name['value'].message_type = _DYNAMICFIELD
+ _SIMPLEMESSAGE.fields_by_name['event'].message_type = _DYNAMICFIELD
+ DESCRIPTOR.message_types_by_name['VehicleMessage'] = _VEHICLEMESSAGE
+ DESCRIPTOR.message_types_by_name['CanMessage'] = _CANMESSAGE
+ DESCRIPTOR.message_types_by_name['ControlCommand'] = _CONTROLCOMMAND
+ DESCRIPTOR.message_types_by_name['DiagnosticControlCommand'] = _DIAGNOSTICCONTROLCOMMAND
+ DESCRIPTOR.message_types_by_name['PassthroughModeControlCommand'] = _PASSTHROUGHMODECONTROLCOMMAND
+ DESCRIPTOR.message_types_by_name['AcceptanceFilterBypassCommand'] = _ACCEPTANCEFILTERBYPASSCOMMAND
+ DESCRIPTOR.message_types_by_name['PayloadFormatCommand'] = _PAYLOADFORMATCOMMAND
+ DESCRIPTOR.message_types_by_name['PredefinedObd2RequestsCommand'] = _PREDEFINEDOBD2REQUESTSCOMMAND
+ DESCRIPTOR.message_types_by_name['NetworkOperatorSettings'] = _NETWORKOPERATORSETTINGS
+ DESCRIPTOR.message_types_by_name['NetworkDataSettings'] = _NETWORKDATASETTINGS
+ DESCRIPTOR.message_types_by_name['ServerConnectSettings'] = _SERVERCONNECTSETTINGS
+ DESCRIPTOR.message_types_by_name['ModemConfigurationCommand'] = _MODEMCONFIGURATIONCOMMAND
+ DESCRIPTOR.message_types_by_name['RTCConfigurationCommand'] = _RTCCONFIGURATIONCOMMAND
+ DESCRIPTOR.message_types_by_name['CommandResponse'] = _COMMANDRESPONSE
+ DESCRIPTOR.message_types_by_name['DiagnosticRequest'] = _DIAGNOSTICREQUEST
+ DESCRIPTOR.message_types_by_name['DiagnosticResponse'] = _DIAGNOSTICRESPONSE
+ DESCRIPTOR.message_types_by_name['DynamicField'] = _DYNAMICFIELD
+ DESCRIPTOR.message_types_by_name['SimpleMessage'] = _SIMPLEMESSAGE
+ class VehicleMessage(message.Message):
+   __metaclass__ = reflection.GeneratedProtocolMessageType
+   DESCRIPTOR = _VEHICLEMESSAGE
+   
+   # @@protoc_insertion_point(class_scope:openxc.VehicleMessage)
+ class CanMessage(message.Message):
+   __metaclass__ = reflection.GeneratedProtocolMessageType
+   DESCRIPTOR = _CANMESSAGE
+   
+   # @@protoc_insertion_point(class_scope:openxc.CanMessage)
+ class ControlCommand(message.Message):
+   __metaclass__ = reflection.GeneratedProtocolMessageType
+   DESCRIPTOR = _CONTROLCOMMAND
+   
+   # @@protoc_insertion_point(class_scope:openxc.ControlCommand)
+ class DiagnosticControlCommand(message.Message):
+   __metaclass__ = reflection.GeneratedProtocolMessageType
+   DESCRIPTOR = _DIAGNOSTICCONTROLCOMMAND
+   
+   # @@protoc_insertion_point(class_scope:openxc.DiagnosticControlCommand)
+ class PassthroughModeControlCommand(message.Message):
+   __metaclass__ = reflection.GeneratedProtocolMessageType
+   DESCRIPTOR = _PASSTHROUGHMODECONTROLCOMMAND
+   
+   # @@protoc_insertion_point(class_scope:openxc.PassthroughModeControlCommand)
+ class AcceptanceFilterBypassCommand(message.Message):
+   __metaclass__ = reflection.GeneratedProtocolMessageType
+   DESCRIPTOR = _ACCEPTANCEFILTERBYPASSCOMMAND
+   
+   # @@protoc_insertion_point(class_scope:openxc.AcceptanceFilterBypassCommand)
+ class PayloadFormatCommand(message.Message):
+   __metaclass__ = reflection.GeneratedProtocolMessageType
+   DESCRIPTOR = _PAYLOADFORMATCOMMAND
+   
+   # @@protoc_insertion_point(class_scope:openxc.PayloadFormatCommand)
+ class PredefinedObd2RequestsCommand(message.Message):
+   __metaclass__ = reflection.GeneratedProtocolMessageType
+   DESCRIPTOR = _PREDEFINEDOBD2REQUESTSCOMMAND
+   
+   # @@protoc_insertion_point(class_scope:openxc.PredefinedObd2RequestsCommand)
+ class NetworkOperatorSettings(message.Message):
+   __metaclass__ = reflection.GeneratedProtocolMessageType
+   
+   class NetworkDescriptor(message.Message):
+     __metaclass__ = reflection.GeneratedProtocolMessageType
+     DESCRIPTOR = _NETWORKOPERATORSETTINGS_NETWORKDESCRIPTOR
+     
+     # @@protoc_insertion_point(class_scope:openxc.NetworkOperatorSettings.NetworkDescriptor)
+   DESCRIPTOR = _NETWORKOPERATORSETTINGS
+   
+   # @@protoc_insertion_point(class_scope:openxc.NetworkOperatorSettings)
+ class NetworkDataSettings(message.Message):
+   __metaclass__ = reflection.GeneratedProtocolMessageType
+   DESCRIPTOR = _NETWORKDATASETTINGS
+   
+   # @@protoc_insertion_point(class_scope:openxc.NetworkDataSettings)
+ class ServerConnectSettings(message.Message):
+   __metaclass__ = reflection.GeneratedProtocolMessageType
+   DESCRIPTOR = _SERVERCONNECTSETTINGS
+   
+   # @@protoc_insertion_point(class_scope:openxc.ServerConnectSettings)
+ class ModemConfigurationCommand(message.Message):
+   __metaclass__ = reflection.GeneratedProtocolMessageType
+   DESCRIPTOR = _MODEMCONFIGURATIONCOMMAND
+   
+   # @@protoc_insertion_point(class_scope:openxc.ModemConfigurationCommand)
+ class RTCConfigurationCommand(message.Message):
+   __metaclass__ = reflection.GeneratedProtocolMessageType
+   DESCRIPTOR = _RTCCONFIGURATIONCOMMAND
+   
+   # @@protoc_insertion_point(class_scope:openxc.RTCConfigurationCommand)
+ class CommandResponse(message.Message):
+   __metaclass__ = reflection.GeneratedProtocolMessageType
+   DESCRIPTOR = _COMMANDRESPONSE
+   
+   # @@protoc_insertion_point(class_scope:openxc.CommandResponse)
+ class DiagnosticRequest(message.Message):
+   __metaclass__ = reflection.GeneratedProtocolMessageType
+   DESCRIPTOR = _DIAGNOSTICREQUEST
+   
+   # @@protoc_insertion_point(class_scope:openxc.DiagnosticRequest)
+ class DiagnosticResponse(message.Message):
+   __metaclass__ = reflection.GeneratedProtocolMessageType
+   DESCRIPTOR = _DIAGNOSTICRESPONSE
+   
+   # @@protoc_insertion_point(class_scope:openxc.DiagnosticResponse)
+ class DynamicField(message.Message):
+   __metaclass__ = reflection.GeneratedProtocolMessageType
+   DESCRIPTOR = _DYNAMICFIELD
+   
+   # @@protoc_insertion_point(class_scope:openxc.DynamicField)
+ class SimpleMessage(message.Message):
+   __metaclass__ = reflection.GeneratedProtocolMessageType
+   DESCRIPTOR = _SIMPLEMESSAGE
+   
+   # @@protoc_insertion_point(class_scope:openxc.SimpleMessage)
+ # @@protoc_insertion_point(module_scope)
index 0000000,b947dc6..b947dc6
mode 000000,160000..160000
--- /dev/null
@@@ -1,0 -1,1 +1,1 @@@
+ Subproject commit b947dc6e2c0d63a29e83ebf9c8af450d2531aef2
index 0000000,53726fc..53726fc
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,10 +1,10 @@@
+ openxc.SimpleMessage.name max_size:100
+ openxc.DynamicField.string_value max_size:100
+ openxc.CommandResponse.message max_size:128
+ openxc.DiagnosticResponse.payload max_size:255
+ openxc.DiagnosticRequest.name max_size:10
+ openxc.DiagnosticRequest.payload max_size:8
+ openxc.CanMessage.data max_size:8
+ openxc.ServerConnectSettings.host max_size:128
+ openxc.NetworkDataSettings.apn max_size:64
index 0000000,db7164f..db7164f
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,174 +1,174 @@@
+ package openxc;
+ option java_package = "com.openxc";
+ option java_outer_classname = "BinaryMessages";
+ message VehicleMessage {
+     enum Type { CAN = 1; SIMPLE = 2; DIAGNOSTIC = 3; CONTROL_COMMAND = 4;
+             COMMAND_RESPONSE = 5; }
+     optional Type type = 1;
+     optional CanMessage can_message = 2;
+     optional SimpleMessage simple_message = 3;
+     optional DiagnosticResponse diagnostic_response = 4;
+     optional ControlCommand control_command = 5;
+     optional CommandResponse command_response = 6;
+     optional uint64 timestamp = 7;
+ }
+ message CanMessage {
+     enum FrameFormat {
+         STANDARD = 1;
+         EXTENDED = 2;
+     }
+     optional int32 bus = 1;
+     optional uint32 id = 2;
+     optional bytes data = 3;
+     optional FrameFormat frame_format = 4;
+ }
+ message ControlCommand {
+     enum Type {
+         VERSION = 1;
+         DEVICE_ID = 2;
+         DIAGNOSTIC = 3;
+         PASSTHROUGH = 4;
+         ACCEPTANCE_FILTER_BYPASS = 5;
+         PAYLOAD_FORMAT = 6;
+         PREDEFINED_OBD2_REQUESTS = 7;
+         MODEM_CONFIGURATION = 8;
+         RTC_CONFIGURATION = 9;
+         SD_MOUNT_STATUS = 10;
+         PLATFORM = 11;
+     }
+     optional Type type = 1;
+     optional DiagnosticControlCommand diagnostic_request = 2;
+     optional PassthroughModeControlCommand passthrough_mode_request = 3;
+     optional AcceptanceFilterBypassCommand acceptance_filter_bypass_command = 4;
+     optional PayloadFormatCommand payload_format_command = 5;
+     optional PredefinedObd2RequestsCommand predefined_obd2_requests_command = 6;
+     optional ModemConfigurationCommand modem_configuration_command = 7;
+     optional RTCConfigurationCommand rtc_configuration_command = 8;
+ }
+ message DiagnosticControlCommand {
+     enum Action { ADD = 1; CANCEL = 2; }
+     optional DiagnosticRequest request = 1;
+     optional Action action = 2;
+ }
+ message PassthroughModeControlCommand {
+     optional int32 bus = 1;
+     optional bool enabled = 2;
+ }
+ message AcceptanceFilterBypassCommand {
+     optional int32 bus = 1;
+     optional bool bypass = 2;
+ }
+ message PayloadFormatCommand {
+     enum PayloadFormat {
+         JSON = 1;
+         PROTOBUF = 2;
+       MESSAGEPACK = 3;
+     }
+     optional PayloadFormat format = 1;
+ }
+ message PredefinedObd2RequestsCommand {
+     optional bool enabled = 1;
+ }
+ message NetworkOperatorSettings {
+       enum OperatorSelectMode {
+               AUTOMATIC = 0;
+               MANUAL = 1;
+               DEREGISTER = 2;
+               SET_ONLY = 3;
+               MANUAL_AUTOMATIC = 4;
+       }
+       message NetworkDescriptor {
+               enum NetworkType {
+                       GSM = 0;
+                       UTRAN = 2;
+               }
+               optional uint32 PLMN = 1;
+               optional NetworkType networkType = 2;
+       }
+       optional bool allowDataRoaming = 1;
+       optional OperatorSelectMode operatorSelectMode = 2;
+       optional NetworkDescriptor networkDescriptor = 3;
+ }
+ message NetworkDataSettings {
+       optional string APN = 1;
+ }
+ message ServerConnectSettings {
+       optional string host = 1;
+       optional uint32 port = 2;
+ }
+ message ModemConfigurationCommand {
+       optional NetworkOperatorSettings networkOperatorSettings = 1;
+       optional NetworkDataSettings networkDataSettings = 2;
+       optional ServerConnectSettings serverConnectSettings = 3;
+ }
+ message RTCConfigurationCommand {
+       optional uint32 unix_time = 1;
+ }
+ message CommandResponse {
+     optional ControlCommand.Type type = 1;
+     optional string message = 2;
+     optional bool status = 3;
+ }
+ message DiagnosticRequest {
+     enum DecodedType { NONE = 1; OBD2 = 2; }
+     optional int32 bus = 1;
+     optional uint32 message_id = 2;
+     optional uint32 mode = 3;
+     optional uint32 pid = 4;
+     // TODO we are capping this at 8 bytes for now - need to change when we
+     // support multi-frame responses
+     optional bytes payload = 5;
+     optional bool multiple_responses = 6;
+     optional double frequency = 7;
+     optional string name = 8;
+     optional DecodedType decoded_type = 9;
+ }
+ message DiagnosticResponse {
+     optional int32 bus = 1;
+     optional uint32 message_id = 2;
+     optional uint32 mode = 3;
+     optional uint32 pid = 4;
+     optional bool success = 5;
+     optional uint32 negative_response_code = 6;
+     // TODO we are capping this at 8 bytes for now - need to change when we
+     // support multi-frame responses
+     optional bytes payload = 7;
+     optional double value = 8;
+ }
+ message DynamicField {
+     enum Type { STRING = 1; NUM = 2; BOOL = 3; }
+     optional Type type = 1;
+     optional string string_value = 2;
+     optional double numeric_value = 3;
+     optional bool boolean_value = 4;
+ }
+ message SimpleMessage {
+     optional string name = 1;
+     optional DynamicField value = 2;
+     optional DynamicField event = 3;
+ }
index 0000000,7f147d9..7f147d9
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,1 +1,1 @@@
+ protobuf==2.5.0
index 0000000,c042242..c042242
mode 000000,100755..100755
--- /dev/null
@@@ -1,0 -1,179 +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"