/* * StopLight.c * * Created: 11/11/2021 16:26:22 * Author: n0x */ #include "Led.h"; #include "Taster.h"; #include "Timer.h" #include ; /* enums */ enum{ S1_GREEN, S1_YELLOW, S1_RED, S1_RED_YELLOW, S2_GREEN, S2_YELLOW, S2_RED, S2_RED_YELLOW, INIT, } StoplightState = INIT; /* Emus for the stoplight task (task 3) */ /* Programmieren eine Ampelsteuerung auf einer Straßenkreuzung */ /* Stoplight and the corresponding LEDs | GREEN | YELLOW | RED ---------------------------------- SL 1 | Led1 | Led4 | Led6 SL 2 | Led2 | Led5 | Led7 General rundown: - State is entered - Wait till delay is passed - Switch off running LEDs - Switch on new LEDs - Set next state */ uint16_t g_startMS; int delayShort = 5000; int delayLong = 30000; /* Task 3 (2021-11-11) */ void runStopLightTask1() { switch(StoplightState){ case INIT: setS1ToGreen(); setS2ToRed(); if(Timer_getTick() - g_startMS >= delayLong) { g_startMS=Timer_getTick(); StoplightState = S1_YELLOW; } break; case S1_YELLOW: setS1ToYellow(); if(Timer_getTick() - g_startMS >= delayShort) { g_startMS=Timer_getTick(); StoplightState = S1_RED; } break; case S1_RED: setS1ToRed(); if(Timer_getTick() - g_startMS >= delayShort) { g_startMS=Timer_getTick(); StoplightState = S2_RED_YELLOW; } break; case S2_RED_YELLOW: setS2ToRedYellow(); if(Timer_getTick() - g_startMS >= delayShort) { g_startMS=Timer_getTick(); StoplightState = S2_GREEN; } break; case S2_GREEN: setS2ToGreen(); if(Timer_getTick() - g_startMS >= delayLong) { g_startMS=Timer_getTick(); StoplightState = S2_YELLOW; } break; case S2_YELLOW: setS2ToYellow(); if(Timer_getTick() - g_startMS >= delayShort) { g_startMS=Timer_getTick(); StoplightState = S2_RED; } break; case S2_RED: setS2ToRed(); if(Timer_getTick() - g_startMS >= delayShort) { g_startMS=Timer_getTick(); StoplightState = S1_RED_YELLOW; } break; case S1_RED_YELLOW: setS2ToRedYellow(); if(Timer_getTick() - g_startMS >= delayShort) { g_startMS=Timer_getTick(); StoplightState = S1_GREEN; } break; case S1_GREEN: setS1ToGreen(); if(Timer_getTick() - g_startMS >= delayLong) { g_startMS=Timer_getTick(); StoplightState = S1_YELLOW; } break; } } void runStopLightTask2(void) { switch(StoplightState){ case INIT: setS1ToGreen(); setS2ToRed(); if(Taster1_get()) { g_startMS=Timer_getTick(); StoplightState = S1_YELLOW; } break; case S1_YELLOW: setS1ToYellow(); if(Timer_getTick() - g_startMS >= delayShort) { g_startMS=Timer_getTick(); StoplightState = S1_RED; } break; case S1_RED: setS1ToRed(); if(Timer_getTick() - g_startMS >= delayShort) { g_startMS=Timer_getTick(); StoplightState = S2_GREEN; } break; case S2_GREEN: setS2ToGreen(); if(Timer_getTick() - g_startMS >= delayLong) { g_startMS=Timer_getTick(); StoplightState = S2_RED; } break; case S2_RED: setS2ToRed(); if(Timer_getTick() - g_startMS >= delayShort) { g_startMS=Timer_getTick(); StoplightState = S1_RED_YELLOW; } break; case S1_RED_YELLOW: setS1ToRedYellow(); if(Timer_getTick() - g_startMS >= delayShort) { g_startMS=Timer_getTick(); StoplightState = S1_GREEN; } break; case S1_GREEN: setS1ToGreen(); // Wait 30 seconds before allowing the button to be pressed again if( (Timer_getTick() - g_startMS >= delayLong) && Taster1_get()) { g_startMS=Timer_getTick(); StoplightState = S1_YELLOW; } break; } } /* LED Helper methods to keep the code a little cleaner */ void setS1ToGreen(void) { Led1_On(); Led4_Off(); Led6_Off(); } void setS1ToYellow(void) { Led1_Off(); Led4_On(); Led6_Off(); } void setS1ToRedYellow(void) { Led1_Off(); Led4_On(); Led6_On(); } void setS1ToRed(void) { Led1_Off(); Led4_Off(); Led6_On(); } void setS2ToGreen(void) { Led2_On(); Led5_Off(); Led7_Off(); } void setS2ToYellow(void) { Led2_Off(); Led5_On(); Led7_Off(); } void setS2ToRedYellow(void) { Led2_Off(); Led5_On(); Led7_On(); } void setS2ToRed(void) { Led2_Off(); Led5_Off(); Led7_On(); } //*/