From 124e0bb43a4e45a83e5670744a652bb5cd40efcf Mon Sep 17 00:00:00 2001 From: redfast00 Date: Sat, 31 Jul 2021 22:21:48 +0200 Subject: [PATCH] Check initialization of CAN module (untested) --- lib/obus_can.cpp | 17 +++++++++++++++-- lib/obus_can.h | 4 +++- lib/obus_module.cpp | 28 ++++++++++++++-------------- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/lib/obus_can.cpp b/lib/obus_can.cpp index 2e32f62..c527fd8 100644 --- a/lib/obus_can.cpp +++ b/lib/obus_can.cpp @@ -76,11 +76,24 @@ uint8_t payload_type(uint8_t module_type, uint8_t module_id, uint8_t msg_type) { } -void init() { +bool init() { is_init = true; mcp2515.reset(); mcp2515.setBitrate(CAN_50KBPS); - mcp2515.setNormalMode(); + mcp2515.setLoopbackMode(); + struct can_frame test_msg; + test_msg.can_id = 0x01; + test_msg.can_dlc = 1; + test_msg.data[0] = 0x23; + mcp2515.sendMessage(&test_msg); + struct can_frame recv_msg; + delay(50); + if (mcp2515.readMessage(&recv_msg) == MCP2515::ERROR_OK && recv_msg.can_id == 0x01 && recv_msg.can_dlc == 1 && recv_msg.data[0] == 0x23) { + mcp2515.setNormalMode(); + return true; + } else { + return false; + } } diff --git a/lib/obus_can.h b/lib/obus_can.h index e8801a5..7f23274 100644 --- a/lib/obus_can.h +++ b/lib/obus_can.h @@ -91,8 +91,10 @@ uint8_t payload_type(uint8_t module_type, uint8_t message_type); /** * Initialize the CAN controller for OBUS messaging + * + * @return true if initialization and self-test succeeded, false otherwise */ -void init(); +bool init(); /** * Receive a message * diff --git a/lib/obus_module.cpp b/lib/obus_module.cpp index 87f0fd8..bd758f5 100644 --- a/lib/obus_module.cpp +++ b/lib/obus_module.cpp @@ -76,6 +76,16 @@ void _setLedBlink(struct color color, uint16_t delay) { _ledLoop(); } +void blink_error(String message) { + bool blink = false; + while (true) { + digitalWrite(PIN_LED_RED, blink); + digitalWrite(PIN_LED_GREEN, blink); + blink = !blink; + delay(blink ? BLINK_DELAY_SLOW : BLINK_DELAY_FAST); + Serial.println(message); + } +} void _resetState() { strike_count = 0; @@ -93,10 +103,11 @@ void _resetState() { void setup(uint8_t type, uint8_t id) { this_module.type = type; this_module.id = id; - - obus_can::init(); - _resetState(); + + if (!obus_can::init()) { + blink_error(F("CAN init failed")); + } } void empty_callback_info(uint8_t info_id, uint8_t infomessage[7]) { @@ -113,17 +124,6 @@ void empty_callback_state(uint32_t time_left, uint8_t strikes, uint8_t max_strik (void)puzzle_modules_left; } -void blink_error(String message) { - bool blink = false; - while (true) { - digitalWrite(PIN_LED_RED, blink); - digitalWrite(PIN_LED_GREEN, blink); - blink = !blink; - delay(blink ? BLINK_DELAY_SLOW : BLINK_DELAY_FAST); - Serial.println(message); - } -} - bool loopPuzzle(obus_can::message* message, void (*callback_game_start)(uint8_t puzzle_modules), void (*callback_game_stop)(), void (*callback_info)(uint8_t info_id, uint8_t infomessage[7]), void (*callback_state)(uint32_t time_left, uint8_t strikes, uint8_t max_strikes, uint8_t puzzle_modules_left)) { // TODO this can be more efficient by only enabling error interrupts and // reacting to the interrupt instead of checking if the flag is set in a loop