diff --git a/lib/obus_can.cpp b/lib/obus_can.cpp index a5828e0..3d851be 100644 --- a/lib/obus_can.cpp +++ b/lib/obus_can.cpp @@ -134,11 +134,11 @@ bool receive(struct message *msg) { break; case OBUS_PAYLDTYPE_INFO: - if (receive_frame.can_dlc < 8) { - Serial.println(F("W Received illegal count msg: payload <8")); - return false; + { + uint8_t data_len = receive_frame.can_dlc - 1; + memcpy(msg->infomessage.data, &(receive_frame.data[1]), data_len); + msg->infomessage.len = data_len; } - memcpy(msg->infomessage, &(receive_frame.data[1]), OBUS_MSG_LENGTH - 1); break; default: Serial.println(F("W Couldn't determine payload type")); @@ -190,9 +190,10 @@ void send(struct message *msg) { break; case OBUS_PAYLDTYPE_INFO: - memcpy(&(send_frame.data[1]), msg->infomessage, OBUS_MSG_LENGTH - 1); - length = 8; + memcpy(&(send_frame.data[1]), msg->infomessage.data, msg->infomessage.len); + length = msg->infomessage.len + 1; break; + default: Serial.print(F("E Unknown payload type ")); Serial.println(pyld_type); diff --git a/lib/obus_can.h b/lib/obus_can.h index ecdb0d3..1f70d99 100644 --- a/lib/obus_can.h +++ b/lib/obus_can.h @@ -36,6 +36,8 @@ #define OBUS_PAYLDTYPE_COUNT 2 #define OBUS_PAYLDTYPE_INFO 3 +#define OBUS_PAYLD_INFO_MAXLEN (OBUS_MSG_LENGTH - 1) + namespace obus_can { struct module { @@ -49,6 +51,10 @@ struct payld_gamestatus { uint8_t strikes; uint8_t max_strikes; }; +struct payld_infomessage { + uint8_t len; + uint8_t data[OBUS_PAYLD_INFO_MAXLEN]; +}; struct message { @@ -59,7 +65,7 @@ struct message { struct payld_empty empty; struct payld_gamestatus gamestatus; uint8_t count; - uint8_t infomessage[OBUS_MSG_LENGTH - 1]; + struct payld_infomessage infomessage; }; }; @@ -234,10 +240,21 @@ inline void send_m_solved(struct module from) { send(&msg); } -inline void send_i_infomessage(struct module from, uint8_t infomessage[OBUS_MSG_LENGTH - 1]) { +/** + * Send an info module "information" OBUS message + */ +inline void send_i_infomessage(struct module from, uint8_t *data, uint8_t data_len) { assert(from.type == OBUS_TYPE_INFO && from.id != OBUS_CONTROLLER_ID); + + if (data_len > OBUS_PAYLD_INFO_MAXLEN) { + Serial.println(F("E Info payload too long")); + return; + } + struct message msg = _msg(from, false, OBUS_MSGTYPE_I_INFOMESSAGE); - memcpy(infomessage, msg.infomessage, OBUS_MSG_LENGTH - 1); + msg.infomessage.len = data_len; + memset(msg.infomessage.data, 0, OBUS_PAYLD_INFO_MAXLEN); + memcpy(msg.infomessage.data, data, data_len); send(&msg); } diff --git a/lib/obus_module.cpp b/lib/obus_module.cpp index 1797f07..02b6836 100644 --- a/lib/obus_module.cpp +++ b/lib/obus_module.cpp @@ -77,21 +77,25 @@ void _setLedBlink(struct color color, uint16_t delay) { } +void _resetState() { + strike_count = 0; + active = false; + + if (this_module.type == OBUS_TYPE_PUZZLE || this_module.type == OBUS_TYPE_NEEDY) { + pinMode(RED_LED, OUTPUT); + pinMode(GREEN_LED, OUTPUT); + + _setLedBlink(COLOR_GREEN, BLINK_DELAY_SLOW); + } +} + void setup(uint8_t type, uint8_t id) { this_module.type = type; this_module.id = id; obus_can::init(); - strike_count = 0; - active = true; - - if (type == OBUS_TYPE_PUZZLE || type == OBUS_TYPE_NEEDY) { - pinMode(RED_LED, OUTPUT); - pinMode(GREEN_LED, OUTPUT); - - _setLedBlink(COLOR_GREEN, BLINK_DELAY_SLOW); - } + _resetState(); } bool loopPuzzle(obus_can::message* message, void (*callback_game_start)(), void (*callback_game_stop)()) { @@ -119,12 +123,14 @@ bool loopPuzzle(obus_can::message* message, void (*callback_game_start)(), void callback_game_start(); break; case OBUS_MSGTYPE_C_HELLO: + _resetState(); obus_can::send_m_hello(this_module); break; case OBUS_MSGTYPE_C_SOLVED: case OBUS_MSGTYPE_C_TIMEOUT: case OBUS_MSGTYPE_C_STRIKEOUT: active = false; + _setLed(COLOR_OFF); callback_game_stop(); break; case OBUS_MSGTYPE_C_ACK: @@ -148,15 +154,17 @@ bool loopNeedy(obus_can::message* message, void (*callback_game_start)(), void ( return loopPuzzle(message, callback_game_start, callback_game_stop); } -bool loopInfo(obus_can::message* message, int (*info_generator)(char*)) { +bool loopInfo(obus_can::message* message, int (*info_generator)(uint8_t*)) { bool interesting_message = false; if (obus_can::receive(message)) { if (message->from.type == OBUS_TYPE_CONTROLLER && message->from.id == 0) { switch (message->msg_type) { case OBUS_MSGTYPE_C_INFOSTART: - char info_message[8]; - int len = info_generator(info_message); - obus_can::send_i_infomessage(this_module, info_message); + { + uint8_t info_message[OBUS_PAYLD_INFO_MAXLEN]; + int len = info_generator(info_message); + obus_can::send_i_infomessage(this_module, info_message, len); + } break; case OBUS_MSGTYPE_C_STATE: interesting_message = true; diff --git a/src/modules/testmodule_info/testmodule_info.ino b/src/modules/testmodule_info/testmodule_info.ino index 9cb1ef9..f0cceaa 100644 --- a/src/modules/testmodule_info/testmodule_info.ino +++ b/src/modules/testmodule_info/testmodule_info.ino @@ -5,7 +5,7 @@ #include -char serial_number[7]; +uint8_t serial_number[7]; LiquidCrystal lcd(7, 6, 5, 4, 3, 2); @@ -27,7 +27,7 @@ void loop() { } } -int info_generator(char* buffer) { +int info_generator(uint8_t* buffer) { serial_number[0] = random('A', 'Z'); serial_number[1] = random('A', 'Z'); serial_number[2] = random('A', 'Z');