Handle button presses
This commit is contained in:
+22
-6
@@ -61,8 +61,12 @@ Adafruit_ST7735 display(TFT_CS, TFT_DC, TFT_RESET);
|
||||
|
||||
class State {
|
||||
public:
|
||||
virtual void enter() = 0;
|
||||
virtual void tick() = 0;
|
||||
// When the state is entered
|
||||
virtual void enter();
|
||||
// Called in the business loop
|
||||
virtual void tick();
|
||||
// Called when the button is pushed
|
||||
virtual void button();
|
||||
virtual ~State() = default;
|
||||
};
|
||||
|
||||
@@ -75,7 +79,6 @@ public:
|
||||
class StateFetching : public State {
|
||||
public:
|
||||
void enter() override;
|
||||
void tick() override;
|
||||
};
|
||||
|
||||
class StateShowingDepartures : public State {
|
||||
@@ -87,8 +90,15 @@ public:
|
||||
StateShowingDepartures(String&);
|
||||
void enter() override;
|
||||
void tick() override;
|
||||
void button() override;
|
||||
};
|
||||
|
||||
// Empty default implementations
|
||||
|
||||
void State::enter() {}
|
||||
void State::tick() {}
|
||||
void State::button() {}
|
||||
|
||||
// App state implementation
|
||||
|
||||
uint64_t currentTick = 0;
|
||||
@@ -143,9 +153,6 @@ void StateFetching::enter() {
|
||||
setState<StateShowingDepartures>(departuresRaw);
|
||||
};
|
||||
|
||||
void StateFetching::tick() {
|
||||
}
|
||||
|
||||
StateShowingDepartures::StateShowingDepartures(String &departuresRaw) {
|
||||
deserializeJson(departures, departuresRaw);
|
||||
}
|
||||
@@ -154,9 +161,11 @@ void StateShowingDepartures::enter() {
|
||||
Serial.println("Entering StateShowingDepartures");
|
||||
entered = millis();
|
||||
|
||||
// clear status and main areas
|
||||
display.fillRect(STATUS_X, STATUS_Y, STATUS_WIDTH, STATUS_HEIGHT, COLOR_BG);
|
||||
display.fillRect(MAIN_X, MAIN_Y, MAIN_WIDTH, MAIN_HEIGHT, COLOR_BG);
|
||||
|
||||
// draw timetable
|
||||
int line = 0;
|
||||
for (JsonVariant departure : departures["departures"].as<JsonArray>()) {
|
||||
display.setCursor(MAIN_X, MAIN_Y + (CY + 3) * line);
|
||||
@@ -183,6 +192,10 @@ void StateShowingDepartures::tick() {
|
||||
}
|
||||
}
|
||||
|
||||
void StateShowingDepartures::button() {
|
||||
setState<StateFetching>();
|
||||
}
|
||||
|
||||
int buttonPushed = false;
|
||||
|
||||
void ICACHE_RAM_ATTR onButtonFalling() {
|
||||
@@ -218,6 +231,9 @@ void loop() {
|
||||
stateChanged = false;
|
||||
// Note: enter() may call setState(). In that case we want to end up right back here.
|
||||
state->enter();
|
||||
} else if (buttonPushed) {
|
||||
buttonPushed = false;
|
||||
state->button();
|
||||
} else {
|
||||
state->tick();
|
||||
currentTick++;
|
||||
|
||||
Reference in New Issue
Block a user