You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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();
}
//*/