summaryrefslogtreecommitdiffstats
path: root/meta-agl-bsp/conf/layer.conf
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2019-08-13 14:39:15 +0200
committerJosé Bollo <jose.bollo@iot.bzh>2019-08-16 09:47:57 +0200
commitf896bb055edb01931e4e3b79360aae86d7abb6b0 (patch)
tree0356b211f338d460517f06c45fe54966683154a1 /meta-agl-bsp/conf/layer.conf
parentf5a64290ac4ee630234c2137256ed4fb848a35f1 (diff)
dbus-cynara: Simplifies build recipe
Simplifies the way of building dbus-cynara by removing the specific recipes in favour of a recipe for dbus that handles the class-target build feature. It requires to remove fake dependencies of cynara. This is a suggestion of Tom Rini. Bug-AGL: SPEC-1839 Change-Id: Id7a736eb4b73cdb679fa9dde30e9ad8e56c2894e Signed-off-by: José Bollo <jose.bollo@iot.bzh>
Diffstat (limited to 'meta-agl-bsp/conf/layer.conf')
0 files changed, 0 insertions, 0 deletions
'n156' href='#n156'>156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
Unified Diagnostic Services (UDS) Support Library in C
======================================================

This is a platform agnostic C library that implements the Unified Diagnostics
Services protocol for automotive electronics. UDS is documented in ISO 14229 and
is the underpinning for the more well-known On-board Diagnostics (OBD) standard.
The library currently supports UDS running over CAN (ISO 15765-4), which uses
the ISO-TP (ISO 15765-2) protocol for message framing.

This library doesn't assume anything about the source of your diagnostic message
requests or underlying interface to the CAN bus. It uses dependency injection to
give you complete control.

## Usage

First, create some shim functions to let this library use your lower level
system:

    // required, this must send a single CAN message with the given arbitration
    // ID (i.e. the CAN message ID) and data. The size will never be more than 8
    // bytes.
    bool send_can(const uint32_t arbitration_id, const uint8_t* data,
            const uint8_t size) {
        ...
    }

    // optional, provide to receive debugging log messages
    void debug(const char* format, ...) {
        ...
    }


    // not used in the current version
    void set_timer(uint16_t time_ms, void (*callback)) {
        ...
    }

With your shims in place, create a `DiagnosticShims` object to pass them around:

    DiagnosticShims shims = diagnostic_init_shims(debug, send_can, set_timer);

With your shims in hand, send a simple PID request to the standard broadcast
address, `0x7df` (we use the constant `OBD2_FUNCTIONAL_BROADCAST_ID` here):

    // Optional: This is your callback that will be called the response to your
    // diagnostic request is received.
    void response_received_handler(const DiagnosticResponse* response) {
        // You received a response! Do something with it.
    }

    DiagnosticRequestHandle handle = diagnostic_request_pid(&shims,
            DIAGNOSTIC_STANDARD_PID, // this is a standard PID request, not an extended or enhanced one
            OBD2_FUNCTIONAL_BROADCAST_ID, // the request is going out to the broadcast arbitration ID
            0x2, // we want PID 0x2
            response_received_handler); // our callback (optional, use NULL if you don't have one)

    if(handle.completed) {
        if(!handle.success) {
            // something happened and it already failed - possibly we aren't
            // able to send CAN messages
            return;
        } else {
            // this should never occur right away - you need to receive a fresh
            // CAN message first
        }
    } else {
        while(true) {
            // Continue to read from CAN, passing off each message to the handle.
            // This will return a 'completed' DiagnosticResponse when the when
            // the request is completely sent and the response is received
            // (which may take more than 1 CAN frames)
            DiagnosticResponse response = diagnostic_receive_can_frame(&shims,
                &handle, can_message_id, can_data, sizeof(can_data));

            if(response.completed && handle.completed) {
                if(handle.success) {
                  if(response.success) {
                      // The request was sent successfully, the response was
                      // received successfully, and it was a positive response - we
                      // got back some data!
                  } else {
                      // The request was sent successfully, the response was
                      // received successfully, BUT it was a negative response
                      // from the other node.
                      printf("This is the error code: %d", response.negative_response_code);
                  }
                } else {
                    // Some other fatal error ocurred - we weren't able to send
                    // the request or receive the response. The CAN connection
                    // may be down.
                }
            }
        }
    }

### Requests for other modes

If you want to do more besides PID requests on mode 0x1 and 0x22, there's a
lower level API you can use. Here's how to make a mode 3 request to get DTCs.

    DiagnosticRequest request = {
        arbitration_id: OBD2_FUNCTIONAL_BROADCAST_ID,
        mode: OBD2_MODE_EMISSIONS_DTC_REQUEST
    };
    DiagnosticRequestHandle handle = diagnostic_request(&SHIMS, &request, NULL);

    if(handle.completed) {
        if(!handle.success) {
            // something happened and it already failed - possibly we aren't
            // able to send CAN messages
            return;
        } else {
            // this should never occur right away - you need to receive a fresh
            // CAN message first
        }
    } else {
        while(true) {
            // Continue to read from CAN, passing off each message to the handle.
            // This will return a 'completed' DiagnosticResponse when the when
            // the request is completely sent and the response is received
            // (which may take more than 1 CAN frames)
            DiagnosticResponse response = diagnostic_receive_can_frame(&shims,
                &handle, can_message_id, can_data, sizeof(can_data));

            if(response.completed && handle.completed) {
                if(handle.success) {
                  if(response.success) {
                      // The request was sent successfully, the response was
                      // received successfully, and it was a positive response - we
                      // got back some data!
                      printf("The DTCs are: ");
                      for(int i = 0; i < response.payload_length; i++) {
                        printf("0x%x ", response.payload[i]);
                      }
                  } else {
                      // The request was sent successfully, the response was
                      // received successfully, BUT it was a negative response
                      // from the other node.
                      printf("This is the error code: %d", response.negative_response_code);
                  }
                } else {
                    // Some other fatal error ocurred - we weren't able to send
                    // the request or receive the response. The CAN connection
                    // may be down.
                }
            }
        }
    }

## Dependencies

This library requires 2 dependencies:

* [isotp-c](https://github.com/openxc/isotp-c)
* [bitfield-c](https://github.com/openxc/bitfield-c)

## Testing

The library includes a test suite that uses the `check` C unit test library.

    $ make test

You can also see the test coverage if you have `lcov` installed and the
`BROWSER` environment variable set to your choice of web browsers:

    $ BROWSER=google-chrome-stable make coverage

## OBD-II Basics

TODO diagram out a request, response and error response

* store the request arb id, mode, pid, and payload locally
* send a can message
* get all new can messages passed to it
* Check the incoming can message to see if it matches one of the standard ECU
  response IDs, or our arb ID + 0x8
* if it matches, parse the diagnostic response and call the callback


## Future Notes

you're going to request a few PIDs over and over again at some frequency
you're going to request DTCs once and read the response
you're going to clear DTCs once

we need another layer on top of that to handle the repeated requests.

## Authors

Chris Peplin cpeplin@ford.com

## License

Copyright (c) 2013 Ford Motor Company

Licensed under the BSD license.