#include "Pelican.h" #include "Pole.h" Pelican::Pelican(int x, int y) : pressed(false), RED_TIME(4), YELLOW_TIME(2), GREEN_TIME(3), FLASH_TIME(5), myPole(new Pole(x, y)), state(GREEN_IDLE) { myTimer = new TimerT(*this, &Pelican::timerExpired); myPole->setTrafficLights(getState()); myPole->setWaitLight(isPressed()); } Pelican::~Pelican() { delete myPole; } void Pelican::press(void) { if (state == GREEN_IDLE) { state = YELLOW_STATE; myTimer->timeoutRequest(YELLOW_TIME); pressed = true; myPole->setTrafficLights(getState()); myPole->setWaitLight(isPressed()); } else if (state != RED_STATE) { pressed = true; myPole->setTrafficLights(getState()); myPole->setWaitLight(isPressed()); } } 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; } myPole->setTrafficLights(getState()); myPole->setWaitLight(isPressed()); }