Merge pull request #9 from ZeusWPI/infomodule-api

Infomodule api
This commit is contained in:
redfast00 2020-09-09 20:44:30 +02:00 committed by GitHub
commit 2593d27cee
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 141 additions and 46 deletions

View file

@ -32,8 +32,8 @@ void _decode_can_id(uint16_t can_id, struct module *mod, bool *priority) {
assert(mod->type <= 0b11);
}
uint8_t payload_type(uint8_t module_type, uint8_t msg_type) {
if (module_type == OBUS_TYPE_CONTROLLER) {
uint8_t payload_type(uint8_t module_type, uint8_t module_id, uint8_t msg_type) {
if (module_type == OBUS_TYPE_CONTROLLER && module_id == OBUS_CONTROLLER_ID) {
switch (msg_type) {
case OBUS_MSGTYPE_C_ACK:
case OBUS_MSGTYPE_C_HELLO:
@ -50,7 +50,9 @@ uint8_t payload_type(uint8_t module_type, uint8_t msg_type) {
return false;
break;
}
} else if (module_type == OBUS_TYPE_INFO) {
// Info modules can only send 7 bytes of data
return OBUS_PAYLDTYPE_INFO;
// Module messages
} else {
switch (msg_type) {
@ -105,7 +107,7 @@ bool receive(struct message *msg) {
_decode_can_id(receive_frame.can_id, &from, &priority);
// Controller messages
switch (payload_type(from.type, msg_type)) {
switch (payload_type(from.type, from.id, msg_type)) {
case OBUS_PAYLDTYPE_EMPTY:
break;
@ -131,6 +133,13 @@ bool receive(struct message *msg) {
msg->count = receive_frame.data[1];
break;
case OBUS_PAYLDTYPE_INFO:
if (receive_frame.can_dlc < 8) {
Serial.println(F("W Received illegal count msg: payload <8"));
return false;
}
memcpy(msg->infomessage, &(receive_frame.data[1]), OBUS_MSG_LENGTH - 1);
break;
default:
Serial.println(F("W Couldn't determine payload type"));
return false;
@ -160,7 +169,7 @@ void send(struct message *msg) {
uint8_t length = 1;
send_frame.data[0] = msg->msg_type;
uint8_t pyld_type = payload_type(msg->from.type, msg->msg_type);
uint8_t pyld_type = payload_type(msg->from.type, msg->from.id, msg->msg_type);
switch (pyld_type) {
case OBUS_PAYLDTYPE_EMPTY:
break;
@ -180,6 +189,10 @@ void send(struct message *msg) {
length = 2;
break;
case OBUS_PAYLDTYPE_INFO:
memcpy(&(send_frame.data[1]), msg->infomessage, OBUS_MSG_LENGTH - 1);
length = 8;
break;
default:
Serial.print(F("E Unknown payload type "));
Serial.println(pyld_type);

View file

@ -23,14 +23,18 @@
#define OBUS_MSGTYPE_C_SOLVED 4
#define OBUS_MSGTYPE_C_TIMEOUT 5
#define OBUS_MSGTYPE_C_STRIKEOUT 6
#define OBUS_MSGTYPE_C_INFOSTART 7
#define OBUS_MSGTYPE_M_HELLO 0
#define OBUS_MSGTYPE_M_STRIKE 1
#define OBUS_MSGTYPE_M_SOLVED 2
#define OBUS_MSGTYPE_I_INFOMESSAGE 0
#define OBUS_PAYLDTYPE_EMPTY 0
#define OBUS_PAYLDTYPE_GAMESTATUS 1
#define OBUS_PAYLDTYPE_COUNT 2
#define OBUS_PAYLDTYPE_INFO 3
namespace obus_can {
@ -55,6 +59,7 @@ struct message {
struct payld_empty empty;
struct payld_gamestatus gamestatus;
uint8_t count;
uint8_t infomessage[OBUS_MSG_LENGTH - 1];
};
};
@ -229,6 +234,13 @@ 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]) {
assert(from.type == OBUS_TYPE_INFO && from.id != OBUS_CONTROLLER_ID);
struct message msg = _msg(from, false, OBUS_MSGTYPE_I_INFOMESSAGE);
memcpy(infomessage, msg.infomessage, OBUS_MSG_LENGTH - 1);
send(&msg);
}
}
#endif /* end of include guard: OBUS_CAN_H */

View file

@ -73,13 +73,15 @@ void setup(uint8_t type, uint8_t id) {
strike_count = 0;
active = true;
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
if (type == OBUS_TYPE_PUZZLE || type == OBUS_TYPE_NEEDY) {
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
_setLedBlink(COLOR_GREEN, BLINK_DELAY_SLOW);
_setLedBlink(COLOR_GREEN, BLINK_DELAY_SLOW);
}
}
bool loopPuzzle(obus_can::message* message) {
bool loopPuzzle(obus_can::message* message, void (*callback_game_start)(), void (*callback_game_stop)()) {
// Check if we need to turn the red "strike" LED back off after
// turning it on because of a strike
if (time_stop_strike_led && millis() > time_stop_strike_led) {
@ -102,28 +104,30 @@ bool loopPuzzle(obus_can::message* message) {
bool interesting_message = false;
if (obus_can::receive(message)) {
switch (message->msg_type) {
case OBUS_MSGTYPE_C_GAMESTART:
active = true;
_setLed(COLOR_OFF);
callback_game_start();
break;
case OBUS_MSGTYPE_C_HELLO:
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;
callback_game_stop();
break;
case OBUS_MSGTYPE_C_ACK:
break;
case OBUS_MSGTYPE_C_STATE:
interesting_message = true;
break;
default:
break;
if (message->from.type == OBUS_TYPE_CONTROLLER && message->from.id == 0) {
switch (message->msg_type) {
case OBUS_MSGTYPE_C_GAMESTART:
active = true;
_setLed(COLOR_OFF);
callback_game_start();
break;
case OBUS_MSGTYPE_C_HELLO:
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;
callback_game_stop();
break;
case OBUS_MSGTYPE_C_ACK:
break;
case OBUS_MSGTYPE_C_STATE:
interesting_message = true;
break;
default:
break;
}
}
}
@ -132,9 +136,30 @@ bool loopPuzzle(obus_can::message* message) {
return interesting_message;
}
bool loopNeedy(obus_can::message* message) {
bool loopNeedy(obus_can::message* message, void (*callback_game_start)(), void (*callback_game_stop)()) {
// For now this is the same function
return loopPuzzle(message);
return loopPuzzle(message, callback_game_start, callback_game_stop);
}
bool loopInfo(obus_can::message* message, int (*info_generator)(char*)) {
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);
break;
case OBUS_MSGTYPE_C_STATE:
interesting_message = true;
break;
default:
break;
}
}
}
return interesting_message;
}
void strike() {

View file

@ -8,17 +8,15 @@
#define OBUS_NEEDY_ID_DEVELOPMENT 255
#define OBUS_INFO_ID_DEVELOPMENT 255
void callback_game_start();
void callback_game_stop();
namespace obus_module {
void setup(uint8_t type, uint8_t id);
bool loopPuzzle(obus_can::message* message);
bool loopPuzzle(obus_can::message* message, void (*callback_game_start)(), void (*callback_game_stop)());
bool loopNeedy(obus_can::message* message);
bool loopNeedy(obus_can::message* message, void (*callback_game_start)(), void (*callback_game_stop)());
bool loopInfo(obus_can::message* message, int (*info_generator)(char*));
void strike();

View file

@ -17,7 +17,7 @@ void setup() {
obus_can::message message;
void loop() {
bool received = obus_module::loopPuzzle(&message);
bool received = obus_module::loopPuzzle(&message, callback_game_start, callback_game_stop);
// TODO handle update frames (not needed for this module, but could be useful as example code)
red_button.loop();

View file

@ -30,7 +30,7 @@ uint8_t correct_code[4] = {
DATE_MODE_STOP,
12,
34,
56
56
};
ezButton solve_button(DATE_SOLVE_BTN);
@ -47,7 +47,7 @@ void setup() {
obus_can::message message;
void loop() {
bool received = obus_module::loopPuzzle(&message);
bool received = obus_module::loopPuzzle(&message, callback_game_start, callback_game_stop);
// TODO handle update frames (not needed for this module, but could be useful as example code)
solve_button.loop();
if (solve_button.getCount() > 0) {
@ -102,12 +102,12 @@ void read_from_date_module(uint8_t* data_out) {
data_out[i] = 10*(data_out[i] & 0x0F) + ((data_out[i] & 0xF0) >> 4);
}
//for (int i = 0; i < 4; i++) {
// Serial.print(data_out[i]);
// Serial.print(" ");
//}
//Serial.println();
digitalWrite(DATE_CLOCK_PIN, LOW);
}

View file

@ -0,0 +1,6 @@
## Testmodule info
This is a simple info module
### Credits
Module developed by redfast00.

View file

@ -0,0 +1,41 @@
// (c) 2020, redfast00
// See the LICENSE file for conditions for copying
#include <obus_module.h>
#include <LiquidCrystal.h>
char serial_number[7];
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
void setup() {
Serial.begin(115200);
obus_module::setup(OBUS_TYPE_INFO, OBUS_INFO_ID_DEVELOPMENT);
info_generator(serial_number);
lcd.begin(16, 2);
lcd.clear();
}
obus_can::message message;
void loop() {
bool is_message_valid = obus_module::loopInfo(&message, info_generator);
lcd.home();
for (int i = 0; i < 7; i++) {
lcd.write(serial_number[i]);
}
}
int info_generator(char* buffer) {
serial_number[0] = random('A', 'Z');
serial_number[1] = random('A', 'Z');
serial_number[2] = random('A', 'Z');
serial_number[3] = random('0', '9');
serial_number[4] = random('0', '9');
serial_number[5] = random('A', 'Z');
serial_number[6] = random('0', '9');
memcpy(buffer, serial_number, 7);
lcd.clear();
return 7;
}

View file

@ -20,7 +20,7 @@ uint32_t next_activation_time = 0;
uint32_t trigger_time = 0;
void loop() {
bool is_message_valid = obus_module::loopNeedy(&message);
bool is_message_valid = obus_module::loopNeedy(&message, callback_game_start, callback_game_stop);
green_button.loop();
// Every second, have a 1/20 chance to trigger the countdown

View file

@ -16,7 +16,7 @@ void setup() {
obus_can::message message;
void loop() {
bool is_message_valid = obus_module::loop_puzzle(&message);
bool is_message_valid = obus_module::loop_puzzle(&message, callback_game_start, callback_game_stop);
// bool bool is_message_valid = obus_module::loop_needy(&message);
}