X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=README.md;h=dd5651edace5408612242f00644d833201d65312;hb=75ec5e7c6bf86b6af90168d8e39b3404f4ce6b1e;hp=9ff9b2ed23b4d10223e0b22972922a8018c919be;hpb=d97052ae126f93bcef30513bf33a468346ee8e13;p=apps%2Fagl-service-can-low-level.git diff --git a/README.md b/README.md index 9ff9b2ed..dd5651ed 100644 --- a/README.md +++ b/README.md @@ -7,15 +7,40 @@ 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). +## 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`. 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 + This document describes the JSON format and includes a high level description of each type and field. Each JSON message published by a VI is delimited with a -`\0` character. +`\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` +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: -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). + {"name": "steering_wheel_angle", + "value": 45, + "extras": { + "calibrated": false + } + } -## Single Valued +### Single Valued There may not be a 1:1 relationship between input and output signals - i.e. raw engine timing CAN signals may be summarized in an "engine performance" metric on @@ -25,7 +50,7 @@ The expected format of a single valued message is: {"name": "steering_wheel_angle", "value": 45} -## Evented +### Evented The expected format of an event message is: @@ -34,7 +59,7 @@ The expected format of an event message is: This format is good for something like a button event, where there are two discrete pieces of information in the measurement. -## Raw CAN Message format +### Raw CAN Message format The format for a raw CAN message: @@ -49,16 +74,17 @@ The format for a raw CAN message: 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 +### Diagnostic Messages -### Requests +#### 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, @@ -72,21 +98,82 @@ with this command format: } } +* 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 15 (1 through 9 are the - standardized modes). +**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 @@ -101,9 +188,8 @@ with this command format: 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 @@ -111,30 +197,7 @@ 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 +#### Responses The response to a successful request: @@ -185,9 +248,12 @@ The response to a simple PID request would look like this: {"success": true, "bus": 1, "id": 1234, "mode": 1, "pid": 5, "payload": "0x2"} -## Commands +### Commands + +In addition to the `diagnostic_request` command described earlier, there are +other possible values for the `command` field. -### Version Query +#### Version Query The `version` command triggers the VI to inject a firmware version identifier response into the outgoing data stream. @@ -200,7 +266,7 @@ response into the outgoing data stream. { "command_response": "version", "message": "v6.0-dev (default)"} -### Device ID Query +#### 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. @@ -213,7 +279,7 @@ MAC address of an included Bluetooth module) into into the outgoing data stream. { "command_response": "device_id", "message": "0012345678"} -## Trace File Format +### 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