diff options
author | Christopher Peplin <chris.peplin@rhubarbtech.com> | 2013-12-28 14:15:24 -0500 |
---|---|---|
committer | Christopher Peplin <chris.peplin@rhubarbtech.com> | 2013-12-28 14:15:24 -0500 |
commit | fd2f9c3b0d869e8243c871e66d31da62bc65887a (patch) | |
tree | befc24b26ceda4d0e957edd1efc1cc083c89ee81 /src/isotp/isotp.c | |
parent | 45530604e0d62843c75a49e25d2269f10dc9eb4f (diff) |
Encapsulate arb_id, payload and size into a data type.
Diffstat (limited to 'src/isotp/isotp.c')
-rw-r--r-- | src/isotp/isotp.c | 92 |
1 files changed, 5 insertions, 87 deletions
diff --git a/src/isotp/isotp.c b/src/isotp/isotp.c index d552e139..7c12d430 100644 --- a/src/isotp/isotp.c +++ b/src/isotp/isotp.c @@ -7,87 +7,6 @@ const uint16_t MAX_CAN_FRAME_SIZE = 8; const uint8_t ISO_TP_DEFAULT_RESPONSE_TIMEOUT = 100; const bool ISO_TP_DEFAULT_FRAME_PADDING_STATUS = true; -#define PCI_START_BIT 0 -#define PCI_WIDTH 4 -#define PAYLOAD_LENGTH_START_BIT PCI_START_BIT + PCI_WIDTH -#define PAYLOAD_LENGTH_WIDTH 4 -#define PAYLOAD_START_BIT PAYLOAD_LENGTH_START_BIT + PAYLOAD_LENGTH_WIDTH - -void isotp_receive_can_frame(IsoTpHandler* handler, - const uint16_t arbitration_id, const uint64_t data, - const uint8_t length) { - if(arbitration_id != handler->arbitration_id){ - return; - } - - // TODO use CanMessage struct from canutil library - allocate payload buffer - // on stack, 8 bytes - // TODO this function should receive uint64_t... - IsoTpProtocolControlInformation pci = (IsoTpProtocolControlInformation) - getBitField(data, 0, 4, false); - - // TODO this is messed up! need a better API for grabbing bytes - uint8_t payload_length = getBitField(data, 4, 4, false); - uint8_t payload[payload_length]; - uint64_t flipped_data = __builtin_bswap64(data); - if(payload_length > 0) { - memcpy(payload, &(((uint8_t*)&flipped_data)[1]), payload_length); - } - - switch(pci) { - case PCI_SINGLE: - isotp_handle_single_frame(handler, arbitration_id, payload, - payload_length); - break; - default: - handler->shims->log("Only single frame messages are supported"); - break; - } -} - -void isotp_complete_send(IsoTpHandler* handler, const uint8_t* payload, - uint8_t size, bool status) { - handler->message_sent_callback(handler->arbitration_id, payload, size, - status); -} - -bool isotp_send_single_frame(IsoTpHandler* handler, const uint8_t* payload, - uint8_t size) { - uint64_t data = 0; - setBitField(&data, PCI_SINGLE, PCI_START_BIT, PCI_WIDTH); - setBitField(&data, size, PAYLOAD_LENGTH_START_BIT, PAYLOAD_LENGTH_WIDTH); - // TODO need a better bitfield API to support this - use byte array instead - // of uint64_t and specify desired total width - for(int i = 0; i < size; i++) { - setBitField(&data, payload[i], PAYLOAD_START_BIT + i * 8, 8); - } - - uint8_t data_array[size + 1]; - for(int i = 0; i < sizeof(data_array); i++) { - // TODO need getByte(x) function - data_array[i] = getBitField(data, i * 8, 8, false); - } - handler->shims->send_can_message(handler->arbitration_id, data_array, sizeof(data_array)); - isotp_complete_send(handler, payload, size, true); - return true; -} - -bool isotp_send_multi_frame(IsoTpHandler* handler, const uint8_t* payload, - uint16_t size) { - handler->shims->log("Only single frame messages are supported"); - return false; -} - -bool isotp_send(IsoTpHandler* handler, const uint8_t* payload, - uint16_t size) { - // we determine if it's single/multi frame and start the send - if(size < 8) { - return isotp_send_single_frame(handler, payload, size); - } else { - return isotp_send_multi_frame(handler, payload, size); - } -} - void isotp_set_timeout(IsoTpHandler* handler, uint16_t timeout_ms) { handler->timeout_ms = timeout_ms; @@ -121,13 +40,12 @@ IsoTpHandler isotp_init(IsoTpShims* shims, uint16_t arbitration_id, } // TODO this would be better as a "isotp_message_to_string" -void log_isotp_message(const uint16_t arbitration_id, - const uint8_t* payload, const uint16_t size) { - debug("ID: 0x%02x", arbitration_id); - if(size > 0) { +void log_isotp_message(const IsoTpMessage* message) { + debug("ID: 0x%02x", message->arbitration_id); + if(message->size > 0) { debug("Payload:"); - for(int i = 0; i < size; i++) { - debug("0x%x", payload[i]); + for(int i = 0; i < message->size; i++) { + debug("0x%x", message->payload[i]); } } else { debug("(no payload)"); |