From ac2c8129a91cd89f2f94caeb1ba2ac2514aaa942 Mon Sep 17 00:00:00 2001 From: redfast00 Date: Thu, 27 Aug 2020 05:30:22 +0200 Subject: [PATCH] Add needy module, clean up code --- lib/obus_module.cpp | 28 ++++++-- lib/obus_module.h | 6 +- .../testmodule_buttons/testmodule_buttons.ino | 2 +- .../testmodule_needy_buttons/doc/index.md | 6 ++ .../testmodule_needy_buttons.ino | 68 +++++++++++++++++++ src/template_module/main.ino | 2 +- 6 files changed, 102 insertions(+), 10 deletions(-) create mode 100644 src/modules/testmodule_needy_buttons/doc/index.md create mode 100644 src/modules/testmodule_needy_buttons/testmodule_needy_buttons.ino diff --git a/lib/obus_module.cpp b/lib/obus_module.cpp index c0e1ff7..81ce44f 100644 --- a/lib/obus_module.cpp +++ b/lib/obus_module.cpp @@ -11,7 +11,7 @@ namespace obus_module { struct obus_can::module this_module; uint8_t strike_count; -bool running; +bool active; uint32_t time_stop_strike_led; void setup(uint8_t type, uint8_t id) { @@ -21,14 +21,14 @@ void setup(uint8_t type, uint8_t id) { obus_can::init(); strike_count = 0; - running = false; + active = false; pinMode(RED_LED, OUTPUT); pinMode(GREEN_LED, OUTPUT); digitalWrite(RED_LED, LOW); digitalWrite(GREEN_LED, LOW); } -bool loop(obus_can::message* message) { +bool loopPuzzle(obus_can::message* message) { // 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 && time_stop_strike_led > millis()) { @@ -37,7 +37,7 @@ bool loop(obus_can::message* message) { } // 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 + // We will need to fork our CAN library for this, because the needed functions // are private if (obus_can::is_error_condition()) { bool blink = false; @@ -51,7 +51,7 @@ bool loop(obus_can::message* message) { if (obus_can::receive(message)) { switch(message->msg_type) { case OBUS_MSGTYPE_C_GAMESTART: - running = true; + active = true; callback_game_start(); break; case OBUS_MSGTYPE_C_HELLO: @@ -60,7 +60,7 @@ bool loop(obus_can::message* message) { case OBUS_MSGTYPE_C_SOLVED: case OBUS_MSGTYPE_C_TIMEOUT: case OBUS_MSGTYPE_C_STRIKEOUT: - running = false; + active = false; callback_game_stop(); break; case OBUS_MSGTYPE_C_ACK: @@ -70,10 +70,17 @@ bool loop(obus_can::message* message) { } return false; } +} +bool loopNeedy(obus_can::message* message) { + // For now this is the same function + return loopPuzzle(message); } void strike() { + if (!active) { + return; + } strike_count++; digitalWrite(RED_LED, HIGH); time_stop_strike_led = millis() + 1000; @@ -81,9 +88,16 @@ void strike() { } void solve() { + if (!active) { + return; + } obus_can::send_m_solved(this_module); digitalWrite(GREEN_LED, HIGH); - running = false; + active = false; +} + +bool is_active() { + return active; } } diff --git a/lib/obus_module.h b/lib/obus_module.h index 10dca7b..e5ad254 100644 --- a/lib/obus_module.h +++ b/lib/obus_module.h @@ -12,12 +12,16 @@ namespace obus_module { void setup(uint8_t type, uint8_t id); -bool loop(obus_can::message* message); +bool loopPuzzle(obus_can::message* message); + +bool loopNeedy(obus_can::message* message); void strike(); void solve(); +bool is_active(); + } #endif /* end of include guard: OBUS_MODULE_H */ diff --git a/src/modules/testmodule_buttons/testmodule_buttons.ino b/src/modules/testmodule_buttons/testmodule_buttons.ino index 9ac77e7..501e17c 100644 --- a/src/modules/testmodule_buttons/testmodule_buttons.ino +++ b/src/modules/testmodule_buttons/testmodule_buttons.ino @@ -18,7 +18,7 @@ void setup() { obus_can::message message; void loop() { - bool received = obus_module::loop(&message); + bool received = obus_module::loopPuzzle(&message); // TODO handle update frames (not needed for this module, but could be useful as example code) red_button.loop(); diff --git a/src/modules/testmodule_needy_buttons/doc/index.md b/src/modules/testmodule_needy_buttons/doc/index.md new file mode 100644 index 0000000..56142da --- /dev/null +++ b/src/modules/testmodule_needy_buttons/doc/index.md @@ -0,0 +1,6 @@ +## Testmodule needy buttons + +If the module starts making a sound, press the button. + +### Credits +Module developed by redfast00. diff --git a/src/modules/testmodule_needy_buttons/testmodule_needy_buttons.ino b/src/modules/testmodule_needy_buttons/testmodule_needy_buttons.ino new file mode 100644 index 0000000..ab6b8df --- /dev/null +++ b/src/modules/testmodule_needy_buttons/testmodule_needy_buttons.ino @@ -0,0 +1,68 @@ +// (c) 2020, redfast00 +// See the LICENSE file for conditions for copying + +#include +#include + +#define SPEAKER_PIN 10 + +ezButton green_button(6); + +void setup() { + Serial.begin(115200); + // WARNING: do not use 255 for your module + obus_module::setup(OBUS_TYPE_NEEDY, 255); + green_button.setDebounceTime(100); +} + +obus_can::message message; + +uint32_t next_activation_time = 0; +uint32_t trigger_time = 0; + +void loop() { + bool is_message_valid = obus_module::loopNeedy(&message); + green_button.loop(); + + // Every second, have a 1/20 chance to trigger the countdown + if (obus_module::is_active() && !trigger_time && (millis() > next_activation_time)) { + next_activation_time = millis() + 1000; + if (random(20) == 0) { + trigger_time = millis() + 30000; + } + } + + // Strike if time runs out + if (trigger_time && millis() > trigger_time) { + obus_module::strike(); + trigger_time = 0; + } + + // If the button is pressed, reset countdown if countdown is running, else strike + if (green_button.getCount() > 0) { + green_button.resetCount(); + if (trigger_time) { + trigger_time = 0; + } else { + obus_module::strike(); + } + } + + // Play the appropriate sound + if (trigger_time && millis() > trigger_time - 15000) { + tone(SPEAKER_PIN, 440); + } + else if (trigger_time) { + tone(SPEAKER_PIN, 449); + } else { + noTone(SPEAKER_PIN); + } +} + +void callback_game_start() { + +} + +void callback_game_stop() { + +} diff --git a/src/template_module/main.ino b/src/template_module/main.ino index d98c8d7..a558084 100644 --- a/src/template_module/main.ino +++ b/src/template_module/main.ino @@ -10,7 +10,7 @@ void setup() { // Puzzle: a module that must be solved obus_module::setup(OBUS_TYPE_PUZZLE, /* Retrieve ID from MOANA */); // Needy: a module that periodically requires an action not to get strikes - // obusmodule_init(OBUS_TYPE_NEEDY, /* Retrieve ID from MOANA */); + // obus_module::setup(OBUS_TYPE_NEEDY, /* Retrieve ID from MOANA */); } obus_can::message message;