AMPEL_SourceCode

Dependencies:   mbed

Fork of LAB_Ampel by Rudi Niki

Committer:
RudiNiki
Date:
Mon Feb 01 17:32:08 2016 +0000
Revision:
1:3be6e3390f29
Parent:
0:f93bf3159778
ampel

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RudiNiki 0:f93bf3159778 1 #include "mbed.h"
RudiNiki 0:f93bf3159778 2 #include "BtnEventM0.h"
RudiNiki 0:f93bf3159778 3
RudiNiki 0:f93bf3159778 4 // LSB MSB
RudiNiki 0:f93bf3159778 5 BusOut lb(P1_7,P1_6,P1_4,P1_3,P1_1,P1_0,LED4,LED3,LED2,LED1);
RudiNiki 0:f93bf3159778 6
RudiNiki 0:f93bf3159778 7 // Statusled zeigt uns in welchen Zustand die Statemachine gerade ist
RudiNiki 0:f93bf3159778 8 BusOut stLED(P1_13, P1_12);
RudiNiki 0:f93bf3159778 9
RudiNiki 0:f93bf3159778 10 // BtnEventM0 erledigt für uns die Abfrage der positiven Flanke
RudiNiki 0:f93bf3159778 11 BtnEventM0 sw4(P1_16), sw3(P0_23);
RudiNiki 0:f93bf3159778 12
RudiNiki 0:f93bf3159778 13 Serial pc(USBTX, USBRX);
RudiNiki 0:f93bf3159778 14
RudiNiki 0:f93bf3159778 15 const int ST_ROT = 1;
RudiNiki 0:f93bf3159778 16 const int ST_GELB = 2;
RudiNiki 0:f93bf3159778 17 const int ST_GRUEN = 3;
RudiNiki 0:f93bf3159778 18
RudiNiki 0:f93bf3159778 19 class Ampel
RudiNiki 0:f93bf3159778 20 {
RudiNiki 0:f93bf3159778 21 public:
RudiNiki 0:f93bf3159778 22 void Init()
RudiNiki 0:f93bf3159778 23 {
RudiNiki 0:f93bf3159778 24 state=ST_ROT; t1.start(); t2.start(); t3.start();
RudiNiki 0:f93bf3159778 25 }
RudiNiki 0:f93bf3159778 26 void ROT();
RudiNiki 0:f93bf3159778 27 void GELB();
RudiNiki 0:f93bf3159778 28 void GRUEN();
RudiNiki 1:3be6e3390f29 29 void GRUEN_BLINKEN();
RudiNiki 0:f93bf3159778 30 public:
RudiNiki 0:f93bf3159778 31 void RotAction();
RudiNiki 0:f93bf3159778 32 void GelbAction();
RudiNiki 0:f93bf3159778 33 void GruenAction();
RudiNiki 1:3be6e3390f29 34 void GruenBlinkAction();
RudiNiki 0:f93bf3159778 35 public:
RudiNiki 0:f93bf3159778 36 int state;
RudiNiki 0:f93bf3159778 37 Timer t1; // blinken
RudiNiki 0:f93bf3159778 38 Timer t2; // mit 10Hz Daten zur Anzeige schicken
RudiNiki 0:f93bf3159778 39 Timer t3; // Zeit bis zum umschalten ausmessen
RudiNiki 0:f93bf3159778 40 };
RudiNiki 0:f93bf3159778 41
RudiNiki 0:f93bf3159778 42 Ampel amp; // Objekt anlegen
RudiNiki 0:f93bf3159778 43
RudiNiki 0:f93bf3159778 44 int main(void)
RudiNiki 0:f93bf3159778 45 {
RudiNiki 0:f93bf3159778 46 amp.Init();
RudiNiki 0:f93bf3159778 47 sw4.Init(); sw3.Init();
RudiNiki 0:f93bf3159778 48 pc.baud(125000);
RudiNiki 0:f93bf3159778 49 while(1)
RudiNiki 0:f93bf3159778 50 {
RudiNiki 0:f93bf3159778 51 if (amp.state==1)
RudiNiki 0:f93bf3159778 52 amp.ROT();
RudiNiki 0:f93bf3159778 53 if (amp.state==2)
RudiNiki 0:f93bf3159778 54 amp.GELB();
RudiNiki 0:f93bf3159778 55 if (amp.state==3)
RudiNiki 0:f93bf3159778 56 amp.GRUEN();
RudiNiki 0:f93bf3159778 57 }
RudiNiki 0:f93bf3159778 58 }
RudiNiki 0:f93bf3159778 59
RudiNiki 0:f93bf3159778 60 void Ampel::ROT()
RudiNiki 0:f93bf3159778 61 {
RudiNiki 0:f93bf3159778 62 // Einmalige Eintrittsaktion
RudiNiki 0:f93bf3159778 63 // Zustand am Display anzeigen
RudiNiki 0:f93bf3159778 64 pc.printf("ROT\n");
RudiNiki 0:f93bf3159778 65 t3.reset();
RudiNiki 0:f93bf3159778 66 while (1)
RudiNiki 0:f93bf3159778 67 {
RudiNiki 0:f93bf3159778 68 if(t3.read_ms()>3000)
RudiNiki 0:f93bf3159778 69 {
RudiNiki 0:f93bf3159778 70 state=ST_GELB;
RudiNiki 0:f93bf3159778 71 return;
RudiNiki 0:f93bf3159778 72 }
RudiNiki 0:f93bf3159778 73 RotAction();
RudiNiki 0:f93bf3159778 74 }
RudiNiki 0:f93bf3159778 75 }
RudiNiki 0:f93bf3159778 76
RudiNiki 0:f93bf3159778 77 void Ampel::RotAction()
RudiNiki 0:f93bf3159778 78 {
RudiNiki 0:f93bf3159778 79 // Blinken
RudiNiki 0:f93bf3159778 80 if(t1.read_ms()>500)
RudiNiki 0:f93bf3159778 81 {
RudiNiki 0:f93bf3159778 82 t1.reset();
RudiNiki 0:f93bf3159778 83 if(lb==0)
RudiNiki 0:f93bf3159778 84 lb=1; // bei Gelb soll dann lb4
RudiNiki 0:f93bf3159778 85 else
RudiNiki 0:f93bf3159778 86 lb=0;
RudiNiki 0:f93bf3159778 87 }
RudiNiki 0:f93bf3159778 88 //Restzeit mit 10Hz zur Anzeige senden
RudiNiki 0:f93bf3159778 89 if(t2.read_ms()>100)
RudiNiki 0:f93bf3159778 90 {
RudiNiki 0:f93bf3159778 91 t2.reset();
RudiNiki 0:f93bf3159778 92 pc.printf("2 %d\n", t3.read_ms()/100); // Zeitanzeige auf 1/10 Sec genau
RudiNiki 0:f93bf3159778 93 }
RudiNiki 0:f93bf3159778 94 }
RudiNiki 0:f93bf3159778 95
RudiNiki 0:f93bf3159778 96 void Ampel::GELB()
RudiNiki 0:f93bf3159778 97 {
RudiNiki 0:f93bf3159778 98 // Einmalige Eintrittsaktion
RudiNiki 0:f93bf3159778 99 // Zustand am Display anzeigen
RudiNiki 0:f93bf3159778 100 pc.printf("GELB\n");
RudiNiki 0:f93bf3159778 101 t3.reset();
RudiNiki 0:f93bf3159778 102 while (1)
RudiNiki 0:f93bf3159778 103 {
RudiNiki 0:f93bf3159778 104 if(t3.read_ms()>3000)
RudiNiki 0:f93bf3159778 105 {
RudiNiki 0:f93bf3159778 106 state=ST_GRUEN;
RudiNiki 0:f93bf3159778 107 return;
RudiNiki 0:f93bf3159778 108 }
RudiNiki 0:f93bf3159778 109 GelbAction();
RudiNiki 0:f93bf3159778 110 if (sw4.CheckFlag())
RudiNiki 0:f93bf3159778 111 {
RudiNiki 0:f93bf3159778 112 state=ST_ROT;
RudiNiki 0:f93bf3159778 113 return;
RudiNiki 0:f93bf3159778 114 }
RudiNiki 0:f93bf3159778 115 }
RudiNiki 0:f93bf3159778 116 }
RudiNiki 0:f93bf3159778 117
RudiNiki 0:f93bf3159778 118 void Ampel::GelbAction()
RudiNiki 0:f93bf3159778 119 {
RudiNiki 0:f93bf3159778 120 // Blinken
RudiNiki 0:f93bf3159778 121 if(t1.read_ms()>250)
RudiNiki 0:f93bf3159778 122 {
RudiNiki 0:f93bf3159778 123 t1.reset();
RudiNiki 0:f93bf3159778 124 if(lb==0)
RudiNiki 0:f93bf3159778 125 lb=4;
RudiNiki 0:f93bf3159778 126 else
RudiNiki 0:f93bf3159778 127 lb=0;
RudiNiki 0:f93bf3159778 128 }
RudiNiki 0:f93bf3159778 129 //Restzeit mit 10Hz zur Anzeige senden
RudiNiki 0:f93bf3159778 130 if(t2.read_ms()>100)
RudiNiki 0:f93bf3159778 131 {
RudiNiki 0:f93bf3159778 132 t2.reset();
RudiNiki 0:f93bf3159778 133 pc.printf("2 %d\n", t3.read_ms()/100); // Zeitanzeige auf 1/10 Sec genau
RudiNiki 0:f93bf3159778 134 }
RudiNiki 0:f93bf3159778 135 }
RudiNiki 0:f93bf3159778 136
RudiNiki 0:f93bf3159778 137 void Ampel::GRUEN()
RudiNiki 0:f93bf3159778 138 {
RudiNiki 0:f93bf3159778 139 // Einmalige Eintrittsaktion
RudiNiki 0:f93bf3159778 140 // Zustand am Display anzeigen
RudiNiki 0:f93bf3159778 141 pc.printf("GRUEN\n");
RudiNiki 0:f93bf3159778 142 t3.reset();
RudiNiki 0:f93bf3159778 143 while (1)
RudiNiki 0:f93bf3159778 144 {
RudiNiki 0:f93bf3159778 145 if(t3.read_ms()>3000)
RudiNiki 0:f93bf3159778 146 {
RudiNiki 0:f93bf3159778 147 state=ST_ROT;
RudiNiki 0:f93bf3159778 148 return;
RudiNiki 0:f93bf3159778 149 }
RudiNiki 0:f93bf3159778 150 GruenAction();
RudiNiki 0:f93bf3159778 151 if (sw4.CheckFlag())
RudiNiki 0:f93bf3159778 152 {
RudiNiki 0:f93bf3159778 153 state=ST_ROT;
RudiNiki 0:f93bf3159778 154 return;
RudiNiki 0:f93bf3159778 155 }
RudiNiki 0:f93bf3159778 156 }
RudiNiki 0:f93bf3159778 157 }
RudiNiki 0:f93bf3159778 158 void Ampel::GruenAction()
RudiNiki 0:f93bf3159778 159 {
RudiNiki 0:f93bf3159778 160 // Blinken
RudiNiki 0:f93bf3159778 161 if(t1.read_ms()>100)
RudiNiki 0:f93bf3159778 162 {
RudiNiki 0:f93bf3159778 163 t1.reset();
RudiNiki 0:f93bf3159778 164 if(lb==0)
RudiNiki 0:f93bf3159778 165 lb=16;
RudiNiki 0:f93bf3159778 166 else
RudiNiki 0:f93bf3159778 167 lb=0;
RudiNiki 0:f93bf3159778 168 }
RudiNiki 0:f93bf3159778 169 //Restzeit mit 10Hz zur Anzeige senden
RudiNiki 0:f93bf3159778 170 if(t2.read_ms()>100)
RudiNiki 0:f93bf3159778 171 {
RudiNiki 0:f93bf3159778 172 t2.reset();
RudiNiki 0:f93bf3159778 173 pc.printf("2 %d\n", t3.read_ms()/100); // Zeitanzeige auf 1/10 Sec genau
RudiNiki 0:f93bf3159778 174 }
RudiNiki 0:f93bf3159778 175 }