#include "Pelican.h" #include "PelicanTimer.h" #include "Subject.h" Pelican::Pelican() : pressed(false), RED_TIME(4), YELLOW_TIME(2), GREEN_TIME(3), FLASH_TIME(5), state(GREEN_IDLE) { myTimer = new PelicanTimer(*this, &Pelican::timerExpired); } void Pelican::press(void) { if (state == GREEN_IDLE) { state = YELLOW_STATE; myTimer->timeoutRequest(YELLOW_TIME); pressed = true; } else if (state != RED_STATE) { pressed = true; } notify(LightHint(state)); notify(WaitHint(pressed)); } void Pelican::timerExpired(void) { switch (state) { case RED_STATE: state = YELLOW_FLASHING; myTimer->timeoutRequest(FLASH_TIME); break; case YELLOW_FLASHING: state = GREEN_TIMING; myTimer->timeoutRequest(GREEN_TIME); break; case GREEN_TIMING: if (pressed) { state = YELLOW_STATE; myTimer->timeoutRequest(YELLOW_TIME); } else { state = GREEN_IDLE; } break; case GREEN_IDLE: // should never happen break; case YELLOW_STATE: state = RED_STATE; pressed = false; myTimer->timeoutRequest(RED_TIME); break; } notify(LightHint(state)); notify(WaitHint(pressed)); }