75 lines
1.3 KiB
C++
75 lines
1.3 KiB
C++
#include "NerfStatTrakConfig.h"
|
|
#include "Globals.h"
|
|
#include "StateHandler.h"
|
|
#include "LowPower.h"
|
|
|
|
|
|
SegmentDisplay* display;
|
|
Button* buttonA;
|
|
Button* buttonB;
|
|
Button* buttonArmed;
|
|
|
|
uint32_t shots = 0;
|
|
uint32_t hits = 0;
|
|
|
|
unsigned long currentTime;
|
|
AbstractStateHandler* currentState;
|
|
|
|
|
|
void setCurrentState(AbstractStateHandler* value)
|
|
{
|
|
buttonA->block();
|
|
buttonB->block();
|
|
|
|
currentState = value;
|
|
currentState->setup();
|
|
}
|
|
|
|
|
|
void update()
|
|
{
|
|
currentTime = millis();
|
|
|
|
buttonA->update(currentTime);
|
|
buttonB->update(currentTime);
|
|
buttonArmed->update(currentTime);
|
|
|
|
// Count the shot no matter which state we're in
|
|
if (buttonArmed->changed() && !buttonArmed->pressed())
|
|
shots++;
|
|
}
|
|
|
|
|
|
void wakeUp()
|
|
{
|
|
}
|
|
|
|
|
|
void sleep()
|
|
{
|
|
display->clear();
|
|
|
|
// Uses RocketScream's Low-Power library
|
|
// https://github.com/rocketscream/Low-Power
|
|
uint32_t interrupt = digitalPinToInterrupt(NerfButtonWakeUp);
|
|
|
|
attachInterrupt(interrupt, wakeUp, NerfButtonWakeUpState);
|
|
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
|
|
detachInterrupt(interrupt);
|
|
|
|
|
|
currentTime = millis();
|
|
|
|
// The button triggers the wake-up, so block the first release after
|
|
if (NerfButtonWakeUp == NerfButtonA)
|
|
{
|
|
buttonA->update(currentTime);
|
|
buttonA->block();
|
|
}
|
|
|
|
if (NerfButtonWakeUp == NerfButtonB)
|
|
{
|
|
buttonB->update(currentTime);
|
|
buttonB->block();
|
|
}
|
|
} |