2020-08-26 21:13:16 +02:00
|
|
|
#include "obus_can.h"
|
|
|
|
#include "obus_module.h"
|
|
|
|
|
2020-08-26 23:35:13 +02:00
|
|
|
#define RED_LED A4
|
|
|
|
#define GREEN_LED A5
|
|
|
|
|
|
|
|
#define MCP_INT 2
|
|
|
|
|
2020-08-26 21:13:16 +02:00
|
|
|
namespace obus_module {
|
|
|
|
|
2020-08-26 23:35:13 +02:00
|
|
|
|
2020-08-26 21:13:16 +02:00
|
|
|
struct obus_can::module this_module;
|
|
|
|
uint8_t strike_count;
|
2020-08-26 23:35:13 +02:00
|
|
|
bool running;
|
|
|
|
uint32_t time_stop_strike_led;
|
2020-08-26 21:13:16 +02:00
|
|
|
|
|
|
|
void setup(uint8_t type, uint8_t id) {
|
|
|
|
this_module.type = type;
|
|
|
|
this_module.id = id;
|
|
|
|
|
|
|
|
obus_can::init();
|
|
|
|
|
|
|
|
strike_count = 0;
|
2020-08-26 23:35:13 +02:00
|
|
|
running = false;
|
|
|
|
pinMode(RED_LED, OUTPUT);
|
|
|
|
pinMode(GREEN_LED, OUTPUT);
|
|
|
|
digitalWrite(RED_LED, LOW);
|
|
|
|
digitalWrite(GREEN_LED, LOW);
|
2020-08-26 21:13:16 +02:00
|
|
|
}
|
|
|
|
|
2020-08-26 23:35:13 +02:00
|
|
|
bool loop(obus_can::message* message) {
|
2020-08-27 04:02:10 +02:00
|
|
|
// Check if we need to turn the red "strike" LED back off after
|
|
|
|
// turning it on because of a strike
|
2020-08-27 03:29:16 +02:00
|
|
|
if (time_stop_strike_led && time_stop_strike_led > millis()) {
|
|
|
|
digitalWrite(RED_LED, LOW);
|
2020-08-27 04:02:10 +02:00
|
|
|
time_stop_strike_led = 0;
|
2020-08-27 03:29:16 +02:00
|
|
|
}
|
|
|
|
// 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
|
|
|
|
// We will need to fork our CAN library for this, because the needed functions
|
|
|
|
// are private
|
|
|
|
if (obus_can::is_error_condition()) {
|
2020-08-26 23:35:13 +02:00
|
|
|
bool blink = false;
|
|
|
|
while (true) {
|
|
|
|
digitalWrite(RED_LED, blink);
|
|
|
|
digitalWrite(GREEN_LED, blink);
|
|
|
|
blink = !blink;
|
|
|
|
delay(500);
|
|
|
|
}
|
|
|
|
}
|
2020-08-27 04:02:10 +02:00
|
|
|
if (obus_can::receive(message)) {
|
|
|
|
switch(message->msg_type) {
|
|
|
|
case OBUS_MSGTYPE_C_GAMESTART:
|
|
|
|
running = true;
|
|
|
|
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:
|
|
|
|
running = false;
|
|
|
|
callback_game_stop();
|
|
|
|
break;
|
|
|
|
case OBUS_MSGTYPE_C_ACK:
|
|
|
|
break;
|
|
|
|
case OBUS_MSGTYPE_C_STATE:
|
|
|
|
return true;
|
2020-08-27 03:29:16 +02:00
|
|
|
}
|
|
|
|
return false;
|
2020-08-26 23:35:13 +02:00
|
|
|
}
|
2020-08-26 21:13:16 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void strike() {
|
|
|
|
strike_count++;
|
2020-08-26 23:35:13 +02:00
|
|
|
digitalWrite(RED_LED, HIGH);
|
|
|
|
time_stop_strike_led = millis() + 1000;
|
2020-08-26 21:13:16 +02:00
|
|
|
obus_can::send_m_strike(this_module, strike_count);
|
|
|
|
}
|
|
|
|
|
|
|
|
void solve() {
|
|
|
|
obus_can::send_m_solved(this_module);
|
2020-08-26 23:35:13 +02:00
|
|
|
digitalWrite(GREEN_LED, HIGH);
|
|
|
|
running = false;
|
2020-08-26 21:13:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|