X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=README.md;h=cef6ea376698f6cedb1e0a01babc8453fe3471b7;hb=f3f00874c637bcd700ded55f39cee5b1a881bc7c;hp=bf6960a8ba9271a61faf2127f21db4a9618971ba;hpb=21842ae6bf4aa2c2d7ecab86abe375dd3ba5c481;p=apps%2Fagl-service-can-low-level.git diff --git a/README.md b/README.md index bf6960a8..cef6ea37 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,213 @@ 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 + +An OpenXC vehicle interface may also output raw CAN messages. Each CAN message +is sent as a JSON object, separated by newlines. The format of each object is: + + {"bus": 1, "id": 1234, "value": "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. + +## Diagnostic Messages + +### Requests + +A request to add or update a diagnostic request is sent to a vehicle interface +with this command format: + + { "command": "diagnostic_request", + "request": { + "bus": 1, + "id": 1234, + "mode": 1, + "pid": 5, + "payload": "0x1234", + "parse_payload": true, + "multiple_responses": false, + "factor": 1.0, + "offset": 0, + "frequency": 1, + "name": "my_pid" + } + } + } + +**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). + +**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 + 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. + +**parse_payload** - (optional, false by default) if `true`, the complete payload + in the response message will be parsed as a number and returned in the + `value` field of the response. The `payload` field will be omitted in + responses with a `value`. + +**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 + normal translated 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 arbitration 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. + +**factor** - (optional, 1.0 by default) if `parse_payload` is true, the value in + the payload will be multiplied by this factor before returning. The `factor` + is applied before the `offset`. + +**offset** - (optional, 0 by default) if `parse_payload` is true, this offset + will be added to the value in the payload before returning. The `offset` is + applied after the `factor`. + +**frequency** - (optional, defaults to 0) The frequency in Hz to send this + request. To send a single request, set this to 0 or leave it out. + +The `bus+id+mode+pid` key is unique, so if you send a create request with that +key twice, it'll overwrite the existing one (i.e. it will change the frequency, +the only other parameter). To cancel a recurring request, send this command with +the frequency set to 0. + +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: + + {"bus": 1, + "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, + "id": 1234, + "mode": 1, + "success": false, + "negative_response_code": 17} + +**bus** - the numerical identifier of the CAN bus where this response was + received. + +**id** - the CAN arbitration 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 and transformed with a factor and offset + provided with the request. + +The response to a simple PID request would look like this: + + {"success": true, "bus": 1, "id": 1234, "mode": 1, "pid": 5, "payload": "0x2"} + +## Commands + +### 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)"} + +### 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. + +**Request** + + { "command": "device_id"} + +**Response** + + { "command_response": "device_id", "message": "0012345678"} + +## Trace File Format + +An OpenXC vehicle trace file is a plaintext file that contains JSON objects, +separated by newlines. + +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 @@ -61,6 +268,7 @@ manufacturers may support custom message names. * gear_lever_position * states: neutral, park, reverse, drive, sport, low, first, second, third, fourth, fifth, sixth + * 1Hz, but sent immediately on change * odometer * Numerical, km 0 to 16777214.000 km, with about .2m resolution @@ -95,22 +303,6 @@ manufacturers may support custom message names. * numerical, -179.0 to 179.0 degrees with standard GPS accuracy * 1Hz -## Raw CAN Message format - -An OpenXC vehicle interface may also output raw CAN messages. Each CAN message -is sent as a JSON object, separated by newlines. The format of each object is: - - {"bus": 1, "id": 1234, "value": "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. - License =======