From 1720365a53d93acb597c7b75987c4512488227a1 Mon Sep 17 00:00:00 2001 From: _N0x Date: Thu, 11 Nov 2021 18:30:45 +0100 Subject: [PATCH] Fixed issues with StopLight.c and cleand up the code --- EmbeddedSystemsTHM/StopLight.c | 222 ++++++++++++++++++--------------- EmbeddedSystemsTHM/StopLight.h | 9 ++ EmbeddedSystemsTHM/Taster.c | 2 +- 3 files changed, 129 insertions(+), 104 deletions(-) diff --git a/EmbeddedSystemsTHM/StopLight.c b/EmbeddedSystemsTHM/StopLight.c index 94be753..e7674f5 100644 --- a/EmbeddedSystemsTHM/StopLight.c +++ b/EmbeddedSystemsTHM/StopLight.c @@ -7,6 +7,7 @@ #include "Led.h"; #include "Taster.h"; +#include "Timer.h" #include ; /* enums */ @@ -19,12 +20,8 @@ enum{ /* Programmieren eine Ampelsteuerung auf einer Straßenkreuzung */ -/* handle the delays locally for easy changing */ -//int delayShort = 5000; -//int delayLong = 30000; - -/* Stoplight and the corresponding Leds - | GREEN | YELLOW | RED +/* Stoplight and the corresponding LEDs + | GREEN | YELLOW | RED ---------------------------------- SL 1 | Led1 | Led4 | Led6 SL 2 | Led2 | Led5 | Led7 @@ -41,24 +38,14 @@ uint16_t g_startMS; int delayShort = 5000; int delayLong = 30000; -void stopLightInit(){ - g_startMS=Timer_getTick(); -} - /* Task 3 (2021-11-11) */ void runStopLightTask1() { switch(StoplightState){ case INIT: - Led1_On(); // Set stoplight 1 to green - Led2_Off(); - Led3_Off(); - Led4_Off(); - Led5_Off(); - Led6_Off(); - Led7_On(); // Set stoplight 2 to red - Led8_Off(); + setS1ToGreen(); + setS2ToRed(); if(Timer_getTick() - g_startMS >= delayLong) { g_startMS=Timer_getTick(); @@ -67,8 +54,7 @@ runStopLightTask1() break; case S1_YELLOW: - Led1_Off(); - Led4_On(); + setS1ToYellow(); if(Timer_getTick() - g_startMS >= delayShort) { g_startMS=Timer_getTick(); @@ -77,8 +63,7 @@ runStopLightTask1() break; case S1_RED: - Led4_Off(); - Led6_On(); + setS1ToRed(); if(Timer_getTick() - g_startMS >= delayShort) { g_startMS=Timer_getTick(); @@ -87,8 +72,7 @@ runStopLightTask1() break; case S2_RED_YELLOW: - Led5_On(); - Led7_On(); + setS2ToRedYellow(); if(Timer_getTick() - g_startMS >= delayShort) { g_startMS=Timer_getTick(); @@ -97,9 +81,7 @@ runStopLightTask1() break; case S2_GREEN: - Led5_Off(); - Led7_Off(); - Led2_On(); + setS2ToGreen(); if(Timer_getTick() - g_startMS >= delayLong) { g_startMS=Timer_getTick(); @@ -108,8 +90,8 @@ runStopLightTask1() break; case S2_YELLOW: - Led2_Off(); - Led5_On(); + setS2ToYellow(); + if(Timer_getTick() - g_startMS >= delayShort) { g_startMS=Timer_getTick(); StoplightState = S2_RED; @@ -117,8 +99,8 @@ runStopLightTask1() break; case S2_RED: - Led5_Off(); - Led7_On(); + setS2ToRed(); + if(Timer_getTick() - g_startMS >= delayShort) { g_startMS=Timer_getTick(); StoplightState = S1_RED_YELLOW; @@ -126,8 +108,7 @@ runStopLightTask1() break; case S1_RED_YELLOW: - Led4_On(); - Led6_On(); + setS2ToRedYellow(); if(Timer_getTick() - g_startMS >= delayShort) { g_startMS=Timer_getTick(); StoplightState = S1_GREEN; @@ -135,9 +116,7 @@ runStopLightTask1() break; case S1_GREEN: - Led4_Off(); - Led6_Off(); - Led1_On(); + setS1ToGreen(); if(Timer_getTick() - g_startMS >= delayLong) { g_startMS=Timer_getTick(); StoplightState = S1_YELLOW; @@ -151,88 +130,125 @@ runStopLightTask2(void) { switch(StoplightState){ case INIT: - Led1_On(); // Set stoplight 1 to green - Led2_Off(); - Led3_Off(); - Led4_Off(); - Led5_Off(); - Led6_Off(); - Led7_On(); // Set stoplight 2 to red - Led8_Off(); - - if(Taster1_get()) { - StoplightState = S1_YELLOW; - } - break; + setS1ToGreen(); + setS2ToRed(); + + if(Taster1_get()) { + g_startMS=Timer_getTick(); + StoplightState = S1_YELLOW; + } + break; case S1_YELLOW: - Led1_Off(); - Led4_On(); - - if(Timer_getTick() - g_startMS >= delayShort) { - g_startMS=Timer_getTick(); - StoplightState = S1_RED; - } - break; + setS1ToYellow(); + + if(Timer_getTick() - g_startMS >= delayShort) { + g_startMS=Timer_getTick(); + StoplightState = S1_RED; + } + break; case S1_RED: - Led4_Off(); - Led6_On(); + setS1ToRed(); - if(Timer_getTick() - g_startMS >= delayShort) { - g_startMS=Timer_getTick(); - StoplightState = S2_GREEN; - } - break; + if(Timer_getTick() - g_startMS >= delayShort) { + g_startMS=Timer_getTick(); + StoplightState = S2_GREEN; + } + break; case S2_GREEN: - Led5_Off(); - Led7_Off(); - Led2_On(); + setS2ToGreen(); - if(Timer_getTick() - g_startMS >= delayLong) { - g_startMS=Timer_getTick(); - StoplightState = S2_YELLOW; - } - break; - - case S2_YELLOW: - Led2_Off(); - Led5_On(); - if(Timer_getTick() - g_startMS >= delayShort) { - g_startMS=Timer_getTick(); - StoplightState = S2_RED; - } - break; + if(Timer_getTick() - g_startMS >= delayLong) { + g_startMS=Timer_getTick(); + StoplightState = S2_RED; + } + break; case S2_RED: - Led5_Off(); - Led7_On(); - if(Timer_getTick() - g_startMS >= delayShort) { - g_startMS=Timer_getTick(); - StoplightState = S1_RED_YELLOW; - } - break; + setS2ToRed(); + if(Timer_getTick() - g_startMS >= delayShort) { + g_startMS=Timer_getTick(); + StoplightState = S1_RED_YELLOW; + } + break; case S1_RED_YELLOW: - Led4_On(); - Led6_On(); - if(Timer_getTick() - g_startMS >= delayShort) { - g_startMS=Timer_getTick(); - StoplightState = S1_GREEN; - } - break; + setS1ToRedYellow(); + if(Timer_getTick() - g_startMS >= delayShort) { + g_startMS=Timer_getTick(); + StoplightState = S1_GREEN; + } + break; case S1_GREEN: - Led4_Off(); - Led6_Off(); - Led1_On(); + setS1ToGreen(); - if( (Timer_getTick() - g_startMS >= delayLong) && Taster1_get()) { - g_startMS=Timer_getTick(); - StoplightState = S1_YELLOW; - } - break; + // 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(); +} //*/ \ No newline at end of file diff --git a/EmbeddedSystemsTHM/StopLight.h b/EmbeddedSystemsTHM/StopLight.h index 2a4236a..dbc4b6a 100644 --- a/EmbeddedSystemsTHM/StopLight.h +++ b/EmbeddedSystemsTHM/StopLight.h @@ -11,4 +11,13 @@ void runStopLightTask1(void); void runStopLightTask2(void); +void setS1ToGreen(void); +void setS1ToYellow(void); +void setS1ToRedYellow(void); +void setS1ToRed(void); +void setS2ToGreen(void); +void setS2ToYellow(void); +void setS2ToRedYellow(void); +void setS2ToRed(void); + #endif /* STOPLIGHT_H_ */ \ No newline at end of file diff --git a/EmbeddedSystemsTHM/Taster.c b/EmbeddedSystemsTHM/Taster.c index 2b217c5..80aad83 100644 --- a/EmbeddedSystemsTHM/Taster.c +++ b/EmbeddedSystemsTHM/Taster.c @@ -15,7 +15,7 @@ Taster_init (void){ * twice within four cycles to change its value. [...] */ MCUCR |= (1<