rewrite chaingame

This commit is contained in:
2021-10-22 16:31:26 +02:00
parent 85528a619d
commit 48a1126a1c
2 changed files with 115 additions and 38 deletions

View File

@@ -16,55 +16,117 @@ void c_chaingame::nextPattern(void)
void c_chaingame::runGame(void)
{
if (!patternFlag && !cheatButtonFlag)
switch (state)
{
case cg_reset:
{
// clear all vars
turnOffAllLed();
state = cg_idle;
}
break;
case cg_idle:
{
// wait for button
updateCheatButton();
turnOffAllLed();
// -> cg_play
if (buttonIsPressed(ledpattern[patternIndex]))
{
//pattern button pressed, turn on LED, set flag
turnOnLed(ledpattern[patternIndex]);
patternFlag = true;
cheatbutton = 0;
state = cg_play;
}
// -> cg_cheat
else if (buttonIsPressed(cheatbutton))
{
// cheatbutton pressed, turn on cheat led, set flag
turnOnLed(cheatbutton);
cheatButtonFlag = true;
}
else if (anybutton())
{
// if any other button is pressed, clear cheat button
//cheatbutton = 0;
state = cg_cheat;
}
}
if (!buttonIsPressed(ledpattern[patternIndex]))
break;
case cg_play:
{
// pattern switch is open, turn off pattern LED
turnOffLed(ledpattern[patternIndex]);
}
if (!buttonIsPressed(cheatbutton) && cheatButtonFlag)
{
// cheat switch is open, turn of cheat LED
turnOffLed(cheatbutton);
cheatButtonFlag = false;
cheatbutton = 0;
}
if (!anybutton())
{
//all switches are open, turn off all LEDs
turnOffAllLed();
if (patternFlag)
// enable pattern LED and wait for all switches OFF
if (buttonIsPressed(ledpattern[patternIndex]))
{
// pattern LED was triggerd, reset flag, move to next pattern
patternFlag = false;
turnOnLed(ledpattern[patternIndex]);
}
else
{
turnOffLed(ledpattern[patternIndex]);
}
if (!anybutton())
{
// -> cg_play_next
turnOffAllLed();
playNextTimer = millis();
state = cg_play_next;
}
}
break;
case cg_play_next:
{
uint32_t timeNow = millis();
if (anybutton())
{
// switched on again, return to cg_play state
state = cg_play;
}
if (timeNow - playNextTimer > PLAYNEXTTIMEOUT)
{
// increase patterm counter after 3sec timeout -> cg_idle
nextPattern();
state = cg_idle;
}
}
break;
case cg_cheat:
{
// enable CHEAT LED on
if (buttonIsPressed(cheatbutton))
{
turnOnLed(cheatbutton);
}
else
{
turnOffLed(cheatbutton);
}
if (!anybutton())
{
turnOffAllLed();
playNextTimer = millis();
state = cg_cheat_next;
}
// wait for all switches off
// -> cg_idle
}
break;
case cg_cheat_next:
{
uint32_t timeNow = millis();
if (anybutton())
{
// switched on again, return to cg_play state
state = cg_cheat;
}
if (timeNow - playNextTimer > PLAYNEXTTIMEOUT)
{
// increase patterm counter after 3sec timeout -> cg_idle
cheatbutton = 0;
state = cg_idle;
}
}
break;
default:
{
state = cg_reset;
}
}
//check cheatbuttons
}
void c_chaingame::updateCheatButton(void)
{
// check cheatbuttons
if (buttonIsPressed(4) && (cheatbutton == 0))
{
// cheatbutton 4 (momentary 1) was closed, set cheatbutton to 1
@@ -81,6 +143,7 @@ void c_chaingame::runGame(void)
cheatbutton = 3;
}
}
bool c_chaingame::initGame(void)
{
patternIndex = 0;

View File

@@ -5,6 +5,18 @@
#include "buttons.h"
#include "game.h"
#define PLAYNEXTTIMEOUT 3000 // 3sec * 1000ms
typedef enum
{
cg_idle,
cg_play,
cg_play_next,
cg_cheat,
cg_cheat_next,
cg_reset
} cg_states;
class c_chaingame : public c_game
{
private:
@@ -14,11 +26,14 @@ private:
bool cheatButtonFlag = false;
uint16_t ledpattern[4] = {1, 3, 1, 2};
int patternlength = sizeof(ledpattern) / sizeof(ledpattern[0]);
cg_states state = cg_reset;
uint32_t playNextTimer=0;
void nextPattern(void);
void updateCheatButton(void);
public:
c_chaingame(e_ledcolor gamecolor): c_game{chaingame, gamecolor} {}
c_chaingame(e_ledcolor gamecolor) : c_game{chaingame, gamecolor} {}
void runGame(void);
bool initGame(void);
void resetGame(void);
@@ -27,5 +42,4 @@ public:
// void HandleChainGame( bool newstate );
// void ResetChainGame(void);
#endif //CHAINGAMEH
#endif // CHAINGAMEH