ampel

Dependencies:   mbed

Committer:
RudiNiki
Date:
Mon Feb 01 17:15:40 2016 +0000
Revision:
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 0:f93bf3159778 29 public:
RudiNiki 0:f93bf3159778 30 void RotAction();
RudiNiki 0:f93bf3159778 31 void GelbAction();
RudiNiki 0:f93bf3159778 32 void GruenAction();
RudiNiki 0:f93bf3159778 33 public:
RudiNiki 0:f93bf3159778 34 int state;
RudiNiki 0:f93bf3159778 35 Timer t1; // blinken
RudiNiki 0:f93bf3159778 36 Timer t2; // mit 10Hz Daten zur Anzeige schicken
RudiNiki 0:f93bf3159778 37 Timer t3; // Zeit bis zum umschalten ausmessen
RudiNiki 0:f93bf3159778 38 };
RudiNiki 0:f93bf3159778 39
RudiNiki 0:f93bf3159778 40 Ampel amp; // Objekt anlegen
RudiNiki 0:f93bf3159778 41
RudiNiki 0:f93bf3159778 42 int main(void)
RudiNiki 0:f93bf3159778 43 {
RudiNiki 0:f93bf3159778 44 amp.Init();
RudiNiki 0:f93bf3159778 45 sw4.Init(); sw3.Init();
RudiNiki 0:f93bf3159778 46 pc.baud(125000);
RudiNiki 0:f93bf3159778 47 while(1)
RudiNiki 0:f93bf3159778 48 {
RudiNiki 0:f93bf3159778 49 if (amp.state==1)
RudiNiki 0:f93bf3159778 50 amp.ROT();
RudiNiki 0:f93bf3159778 51 if (amp.state==2)
RudiNiki 0:f93bf3159778 52 amp.GELB();
RudiNiki 0:f93bf3159778 53 if (amp.state==3)
RudiNiki 0:f93bf3159778 54 amp.GRUEN();
RudiNiki 0:f93bf3159778 55 }
RudiNiki 0:f93bf3159778 56 }
RudiNiki 0:f93bf3159778 57
RudiNiki 0:f93bf3159778 58 void Ampel::ROT()
RudiNiki 0:f93bf3159778 59 {
RudiNiki 0:f93bf3159778 60 // Einmalige Eintrittsaktion
RudiNiki 0:f93bf3159778 61 // Zustand am Display anzeigen
RudiNiki 0:f93bf3159778 62 pc.printf("ROT\n");
RudiNiki 0:f93bf3159778 63 t3.reset();
RudiNiki 0:f93bf3159778 64 while (1)
RudiNiki 0:f93bf3159778 65 {
RudiNiki 0:f93bf3159778 66 if(t3.read_ms()>3000)
RudiNiki 0:f93bf3159778 67 {
RudiNiki 0:f93bf3159778 68 state=ST_GELB;
RudiNiki 0:f93bf3159778 69 return;
RudiNiki 0:f93bf3159778 70 }
RudiNiki 0:f93bf3159778 71 RotAction();
RudiNiki 0:f93bf3159778 72 }
RudiNiki 0:f93bf3159778 73 }
RudiNiki 0:f93bf3159778 74
RudiNiki 0:f93bf3159778 75 void Ampel::RotAction()
RudiNiki 0:f93bf3159778 76 {
RudiNiki 0:f93bf3159778 77 // Blinken
RudiNiki 0:f93bf3159778 78 if(t1.read_ms()>500)
RudiNiki 0:f93bf3159778 79 {
RudiNiki 0:f93bf3159778 80 t1.reset();
RudiNiki 0:f93bf3159778 81 if(lb==0)
RudiNiki 0:f93bf3159778 82 lb=1; // bei Gelb soll dann lb4
RudiNiki 0:f93bf3159778 83 else
RudiNiki 0:f93bf3159778 84 lb=0;
RudiNiki 0:f93bf3159778 85 }
RudiNiki 0:f93bf3159778 86 //Restzeit mit 10Hz zur Anzeige senden
RudiNiki 0:f93bf3159778 87 if(t2.read_ms()>100)
RudiNiki 0:f93bf3159778 88 {
RudiNiki 0:f93bf3159778 89 t2.reset();
RudiNiki 0:f93bf3159778 90 pc.printf("2 %d\n", t3.read_ms()/100); // Zeitanzeige auf 1/10 Sec genau
RudiNiki 0:f93bf3159778 91 }
RudiNiki 0:f93bf3159778 92 }
RudiNiki 0:f93bf3159778 93
RudiNiki 0:f93bf3159778 94 void Ampel::GELB()
RudiNiki 0:f93bf3159778 95 {
RudiNiki 0:f93bf3159778 96 // Einmalige Eintrittsaktion
RudiNiki 0:f93bf3159778 97 // Zustand am Display anzeigen
RudiNiki 0:f93bf3159778 98 pc.printf("GELB\n");
RudiNiki 0:f93bf3159778 99 t3.reset();
RudiNiki 0:f93bf3159778 100 while (1)
RudiNiki 0:f93bf3159778 101 {
RudiNiki 0:f93bf3159778 102 if(t3.read_ms()>3000)
RudiNiki 0:f93bf3159778 103 {
RudiNiki 0:f93bf3159778 104 state=ST_GRUEN;
RudiNiki 0:f93bf3159778 105 return;
RudiNiki 0:f93bf3159778 106 }
RudiNiki 0:f93bf3159778 107 GelbAction();
RudiNiki 0:f93bf3159778 108 if (sw4.CheckFlag())
RudiNiki 0:f93bf3159778 109 {
RudiNiki 0:f93bf3159778 110 state=ST_ROT;
RudiNiki 0:f93bf3159778 111 return;
RudiNiki 0:f93bf3159778 112 }
RudiNiki 0:f93bf3159778 113 }
RudiNiki 0:f93bf3159778 114 }
RudiNiki 0:f93bf3159778 115
RudiNiki 0:f93bf3159778 116 void Ampel::GelbAction()
RudiNiki 0:f93bf3159778 117 {
RudiNiki 0:f93bf3159778 118 // Blinken
RudiNiki 0:f93bf3159778 119 if(t1.read_ms()>250)
RudiNiki 0:f93bf3159778 120 {
RudiNiki 0:f93bf3159778 121 t1.reset();
RudiNiki 0:f93bf3159778 122 if(lb==0)
RudiNiki 0:f93bf3159778 123 lb=4;
RudiNiki 0:f93bf3159778 124 else
RudiNiki 0:f93bf3159778 125 lb=0;
RudiNiki 0:f93bf3159778 126 }
RudiNiki 0:f93bf3159778 127 //Restzeit mit 10Hz zur Anzeige senden
RudiNiki 0:f93bf3159778 128 if(t2.read_ms()>100)
RudiNiki 0:f93bf3159778 129 {
RudiNiki 0:f93bf3159778 130 t2.reset();
RudiNiki 0:f93bf3159778 131 pc.printf("2 %d\n", t3.read_ms()/100); // Zeitanzeige auf 1/10 Sec genau
RudiNiki 0:f93bf3159778 132 }
RudiNiki 0:f93bf3159778 133 }
RudiNiki 0:f93bf3159778 134
RudiNiki 0:f93bf3159778 135 void Ampel::GRUEN()
RudiNiki 0:f93bf3159778 136 {
RudiNiki 0:f93bf3159778 137 // Einmalige Eintrittsaktion
RudiNiki 0:f93bf3159778 138 // Zustand am Display anzeigen
RudiNiki 0:f93bf3159778 139 pc.printf("GRUEN\n");
RudiNiki 0:f93bf3159778 140 t3.reset();
RudiNiki 0:f93bf3159778 141 while (1)
RudiNiki 0:f93bf3159778 142 {
RudiNiki 0:f93bf3159778 143 if(t3.read_ms()>3000)
RudiNiki 0:f93bf3159778 144 {
RudiNiki 0:f93bf3159778 145 state=ST_ROT;
RudiNiki 0:f93bf3159778 146 return;
RudiNiki 0:f93bf3159778 147 }
RudiNiki 0:f93bf3159778 148 GruenAction();
RudiNiki 0:f93bf3159778 149 if (sw4.CheckFlag())
RudiNiki 0:f93bf3159778 150 {
RudiNiki 0:f93bf3159778 151 state=ST_ROT;
RudiNiki 0:f93bf3159778 152 return;
RudiNiki 0:f93bf3159778 153 }
RudiNiki 0:f93bf3159778 154 }
RudiNiki 0:f93bf3159778 155 }
RudiNiki 0:f93bf3159778 156 void Ampel::GruenAction()
RudiNiki 0:f93bf3159778 157 {
RudiNiki 0:f93bf3159778 158 // Blinken
RudiNiki 0:f93bf3159778 159 if(t1.read_ms()>100)
RudiNiki 0:f93bf3159778 160 {
RudiNiki 0:f93bf3159778 161 t1.reset();
RudiNiki 0:f93bf3159778 162 if(lb==0)
RudiNiki 0:f93bf3159778 163 lb=16;
RudiNiki 0:f93bf3159778 164 else
RudiNiki 0:f93bf3159778 165 lb=0;
RudiNiki 0:f93bf3159778 166 }
RudiNiki 0:f93bf3159778 167 //Restzeit mit 10Hz zur Anzeige senden
RudiNiki 0:f93bf3159778 168 if(t2.read_ms()>100)
RudiNiki 0:f93bf3159778 169 {
RudiNiki 0:f93bf3159778 170 t2.reset();
RudiNiki 0:f93bf3159778 171 pc.printf("2 %d\n", t3.read_ms()/100); // Zeitanzeige auf 1/10 Sec genau
RudiNiki 0:f93bf3159778 172 }
RudiNiki 0:f93bf3159778 173 }