obus/lib/obus_module.cpp
2020-08-26 23:41:00 +02:00

71 lines
1.3 KiB
C++

#include "obus_can.h"
#include "obus_module.h"
#define RED_LED A4
#define GREEN_LED A5
#define MCP_INT 2
namespace obus_module {
struct obus_can::module this_module;
uint8_t strike_count;
bool running;
bool error;
uint32_t time_stop_strike_led;
void interrupt_can_error() {
error = true;
}
void setup(uint8_t type, uint8_t id) {
this_module.type = type;
this_module.id = id;
obus_can::init();
strike_count = 0;
running = false;
error = false;
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, LOW);
attachInterrupt(digitalPinToInterrupt(MCP_INT), interrupt_can_error, RISING);
}
bool loop(obus_can::message* message) {
// Check if the message buffer overflowed
if (error) {
// Loop forever while blinking status led orange
bool blink = false;
while (true) {
digitalWrite(RED_LED, blink);
digitalWrite(GREEN_LED, blink);
blink = !blink;
delay(500);
}
}
if (time_stop_strike_led && time_stop_strike_led > millis()) {
digitalWrite(RED_LED, LOW);
}
// TODO receive CAN frame and call callback functions
}
void strike() {
strike_count++;
digitalWrite(RED_LED, HIGH);
time_stop_strike_led = millis() + 1000;
obus_can::send_m_strike(this_module, strike_count);
}
void solve() {
obus_can::send_m_solved(this_module);
digitalWrite(GREEN_LED, HIGH);
running = false;
}
}