252 lines
4.1 KiB
C
252 lines
4.1 KiB
C
/*
|
|
* StopLight.c
|
|
*
|
|
* Created: 11/11/2021 16:26:22
|
|
* Author: n0x
|
|
*/
|
|
|
|
#include "Led.h";
|
|
#include "Taster.h";
|
|
#include "Timer.h"
|
|
#include "StopLight.h"
|
|
|
|
/* enums */
|
|
enum{
|
|
S1_GREEN, S1_YELLOW, S1_RED, S1_RED_YELLOW,
|
|
S2_GREEN, S2_YELLOW, S2_RED, S2_RED_YELLOW,
|
|
INIT, WAIT
|
|
} 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
|
|
|
|
*/
|
|
|
|
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:
|
|
setS1ToRedYellow();
|
|
|
|
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();
|
|
|
|
StoplightState = WAIT;
|
|
break;
|
|
|
|
case WAIT:
|
|
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();
|
|
if(Timer_getTick() - g_startMS >= delayLong) {
|
|
g_startMS=Timer_getTick();
|
|
StoplightState = WAIT;
|
|
}
|
|
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();
|
|
}
|
|
//*/
|