## Binary (Protocol Buffers)
-The Protocol Buffer format is specified in the file `openxc.proto`. Those are
-published using the standard length-delimited method (any protobuf library
-should support this).
+The binary format is encoded using [Google Protocol
+Buffers](https://code.google.com/p/protobuf/). The format is specified in the
+file `openxc.proto`. Those are published 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.
## JSON
each type and field. Each JSON message published by a VI is delimited with a
`\0 ` character.
+The JSON format is best for most developers, as it is fairly efficient and very
+flexible.
+
### Extra Values
Any of the following JSON objects may optionally include an `extras`
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,
+ {"name": "steering_wheel_angle",
+ "value": 45,
"extras": {
"calibrated": false
}
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.
+ complete string must have an even number of characters. The `0x` prefix is
+ optional.
### Diagnostic Messages
#### Requests
-A request to add or update a diagnostic request is sent to a vehicle interface
-with this command format:
+A diagnostic request is added or cancelled with a JSON object like this example:
{ "command": "diagnostic_request",
+ "action": "add",
"request": {
"bus": 1,
"id": 1234,
}
}
+* 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",
+ "request": {
+ "bus": 1,
+ "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",
+ "request": {
+ "bus": 1,
+ "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",
+ "request": {
+ "bus": 1,
+ "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).
**id** - the CAN arbitration ID for the request.
-**mode** - the OBD-II mode of the request - 1 through 255 (1 through 9 are the
+**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 hexidecimal number in a string. Many JSON parser cannot
+ 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.
+ 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
see any additional responses after the first and it will just take up memory
in the VI for longer.
-**frequency** - (optional, defaults to 0) The frequency in Hz to send this
- request. To send a single non-recurring request, set this to 0 or leave it
- out.
+**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
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.
-A diagnostic request's `bus`, `id`, `mode` and `pid` (or lack of a `pid`)
-combine to create a unique key to identify a recurring request. This means that
-you cannot simultaneosly have recurring requests at 2Hz and 5Hz for the same PID
-from the same ID.
-
-If you send a new `diagnostic_request` command with a `bus + id + mode + pid`
-key matching an existing recurring request, it will update it with whatever
-other parameters you've provided (e.g. it will change the frequency if you
-specify one).
-
-To cancel a recurring request, send a `diagnostic_request` command with the
-matching request information (i.e. the `bus`, `id`, `mode` and `pid`) but a
-frequency of 0.
-
-Non-recurring requests may have the same `bus+id+mode(+pid)` key as a recurring
-request, and they will co-exist without issue. As soon as a non-recurring
-request is either completed or times out, it is removed from the active list.
-
-If you're just requesting a PID, you can use this minimal field set for the
-`request` object:
-
- {"bus": 1, "id": 1234, "mode": 1, "pid": 5}
-
#### Responses
The response to a successful request:
### Commands
+In addition to the `diagnostic_request` command described earlier, there are
+other possible values for the `command` field.
+
#### Version Query
The `version` command triggers the VI to inject a firmware version identifier
{ "command_response": "device_id", "message": "0012345678"}
+#### 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}
+
+#### Message Format Control
+
+The `message_format` command determines the format for output data from the VI
+and also the expected format of commands sent to the VI.
+
+Valid formats are `json` and `binary`.
+
+**Request**
+
+ { "command": "message_format",
+ "bus": 1,
+ "format": "json"
+ }
+
+**Response**
+
+If the format was changed successfully, the `status` in the response will be
+`true`. The response will be in the new message format.
+
+ { "command_response": "message_format", "status": true}
+
+
### Trace File Format
An OpenXC vehicle trace file is a plaintext file that contains JSON objects,