const uint8_t ISO_TP_DEFAULT_RESPONSE_TIMEOUT = 100;
const bool ISO_TP_DEFAULT_FRAME_PADDING_STATUS = true;
-const uint8_t PCI_START_BIT = 0;
-const uint8_t PCI_WIDTH = 4;
-const uint8_t PAYLOAD_LENGTH_START_BIT = 4;
-const uint8_t PAYLOAD_LENGTH_WIDTH = 4;
-const uint8_t PAYLOAD_START_BIT = 8;
+#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,
bool isotp_send_single_frame(IsoTpHandler* handler, const uint8_t* payload,
uint8_t size) {
- uint64_t data;
+ uint64_t data = 0;
setBitField(&data, PCI_SINGLE, PCI_START_BIT, PCI_WIDTH);
setBitField(&data, size, PAYLOAD_LENGTH_START_BIT, PAYLOAD_LENGTH_WIDTH);
- // TODO this is probably wrong
- if(size > 0) {
- setBitField(&data, *payload, PAYLOAD_START_BIT, size * 8);
+ // 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, payload, size);
+ handler->shims->send_can_message(handler->arbitration_id, data_array, sizeof(data_array));
isotp_complete_send(handler, payload, size, true);
return true;
}
IsoTpHandler ISOTP_HANDLER;
uint16_t last_can_frame_sent_arb_id;
-uint8_t last_can_payload_sent;
+uint8_t last_can_payload_sent[8];
uint8_t last_can_payload_size;
bool can_frame_was_sent;
void mock_send_can(const uint16_t arbitration_id, const uint8_t* data,
const uint8_t size) {
+ can_frame_was_sent = true;
+ last_can_frame_sent_arb_id = arbitration_id;
+ last_can_payload_size = size;
+ if(size > 0) {
+ memcpy(last_can_payload_sent, data, size);
+ }
}
void mock_set_timer(uint16_t time_ms, void (*callback)) {
for(int i = 0; i < size; i++) {
debug("0x%x", payload[i]);
}
-
- can_frame_was_sent = true;
- last_can_frame_sent_arb_id = arbitration_id;
- last_can_payload_sent = size;
- if(size > 0) {
- memcpy(last_can_payload_sent, payload, size);
- }
}
void setup() {
can_frame_sent);
last_message_sent_payload = malloc(MAX_ISO_TP_MESSAGE_SIZE);
last_message_received_payload = malloc(MAX_ISO_TP_MESSAGE_SIZE);
+ memset(last_can_payload_sent, 0, sizeof(last_can_payload_sent));
last_message_sent_status = false;
message_was_received = false;
can_frame_was_sent = false;
extern IsoTpHandler ISOTP_HANDLER;
extern uint16_t last_can_frame_sent_arb_id;
-extern uint8_t last_can_payload_sent;
+extern uint8_t last_can_payload_sent[8];
extern uint8_t last_can_payload_size;
extern bool can_frame_was_sent;
fail_unless(last_message_sent_status);
ck_assert_int_eq(last_message_sent_payload[0], NULL);
ck_assert_int_eq(last_message_sent_payload_size, 0);
+
+ ck_assert_int_eq(last_can_frame_sent_arb_id, ISOTP_HANDLER.arbitration_id);
+ fail_unless(can_frame_was_sent);
+ ck_assert_int_eq(last_can_payload_sent[0], 0x0);
+ ck_assert_int_eq(last_can_payload_size, 1);
}
END_TEST
ck_assert_int_eq(last_message_sent_payload[0], 0x12);
ck_assert_int_eq(last_message_sent_payload[1], 0x34);
ck_assert_int_eq(last_message_sent_payload_size, 2);
+
+ ck_assert_int_eq(last_can_frame_sent_arb_id, ISOTP_HANDLER.arbitration_id);
+ fail_unless(can_frame_was_sent);
+ ck_assert_int_eq(last_can_payload_sent[0], 0x2);
+ ck_assert_int_eq(last_can_payload_sent[1], 0x12);
+ ck_assert_int_eq(last_can_payload_sent[2], 0x34);
+ ck_assert_int_eq(last_can_payload_size, 3);
}
END_TEST
0x45, 0x67, 0x89};
bool status = isotp_send(&ISOTP_HANDLER, &payload, sizeof(payload));
fail_if(status);
+ fail_if(last_message_sent_status);
+ fail_if(can_frame_was_sent);
}
END_TEST