Projekt TINF 7ABELI

Dependencies:   mbed C12832

Committer:
markus286
Date:
Thu Nov 29 17:15:55 2018 +0000
Revision:
0:603870fc1af3
Child:
1:125e4981a54c
Projekt TINF 7ABELI

Who changed what in which revision?

UserRevisionLine numberNew contents of line
markus286 0:603870fc1af3 1 #include "mbed.h"
markus286 0:603870fc1af3 2 #include "C12832.h"
markus286 0:603870fc1af3 3
markus286 0:603870fc1af3 4 BusOut doLeds(LED1,LED2,LED3,LED4);
markus286 0:603870fc1af3 5 InterruptIn SW1(p14);
markus286 0:603870fc1af3 6 InterruptIn SW2(p15);
markus286 0:603870fc1af3 7 InterruptIn SW3(p12);
markus286 0:603870fc1af3 8 InterruptIn SW4(p16);
markus286 0:603870fc1af3 9
markus286 0:603870fc1af3 10 Ticker T1;
markus286 0:603870fc1af3 11 Timer T2;
markus286 0:603870fc1af3 12 volatile float timerValue = 0;
markus286 0:603870fc1af3 13 volatile int blinkCount = 0;
markus286 0:603870fc1af3 14
markus286 0:603870fc1af3 15 //************** LCD ****************
markus286 0:603870fc1af3 16
markus286 0:603870fc1af3 17 C12832 lcd(p5, p7, p6, p8, p11);
markus286 0:603870fc1af3 18
markus286 0:603870fc1af3 19 //************* VARIABLEN ****************
markus286 0:603870fc1af3 20
markus286 0:603870fc1af3 21 enum State {ST_AUS=0, ST_EIN, ST_TIMEOUT};
markus286 0:603870fc1af3 22 State state;
markus286 0:603870fc1af3 23
markus286 0:603870fc1af3 24 bool pressed1 = false, pressed2 = false;
markus286 0:603870fc1af3 25
markus286 0:603870fc1af3 26 //************* andere Funktionen ****************
markus286 0:603870fc1af3 27
markus286 0:603870fc1af3 28 void blink()
markus286 0:603870fc1af3 29 {
markus286 0:603870fc1af3 30 blinkCount++;
markus286 0:603870fc1af3 31
markus286 0:603870fc1af3 32 Led4 = !Led4;
markus286 0:603870fc1af3 33 }
markus286 0:603870fc1af3 34
markus286 0:603870fc1af3 35
markus286 0:603870fc1af3 36 //************* EREIGNISSE ****************
markus286 0:603870fc1af3 37
markus286 0:603870fc1af3 38 void rise1(void)
markus286 0:603870fc1af3 39 {
markus286 0:603870fc1af3 40 wait_ms(100); //Entprellung
markus286 0:603870fc1af3 41 pressed1 = true;
markus286 0:603870fc1af3 42
markus286 0:603870fc1af3 43 timerValue = T2.read();
markus286 0:603870fc1af3 44 T2.reset();
markus286 0:603870fc1af3 45 T2.start();
markus286 0:603870fc1af3 46 }
markus286 0:603870fc1af3 47
markus286 0:603870fc1af3 48 bool CheckFlag1()
markus286 0:603870fc1af3 49 {
markus286 0:603870fc1af3 50 if (pressed1) {
markus286 0:603870fc1af3 51 pressed1=false;
markus286 0:603870fc1af3 52 return true;
markus286 0:603870fc1af3 53 }
markus286 0:603870fc1af3 54 return false;
markus286 0:603870fc1af3 55 }
markus286 0:603870fc1af3 56
markus286 0:603870fc1af3 57 void rise2(void)
markus286 0:603870fc1af3 58 {
markus286 0:603870fc1af3 59 wait_ms(100);
markus286 0:603870fc1af3 60 if(state == ST_EIN) pressed2 = true;
markus286 0:603870fc1af3 61 }
markus286 0:603870fc1af3 62
markus286 0:603870fc1af3 63 bool CheckFlag2()
markus286 0:603870fc1af3 64 {
markus286 0:603870fc1af3 65 if (pressed2) {
markus286 0:603870fc1af3 66 pressed2=false;
markus286 0:603870fc1af3 67 return true;
markus286 0:603870fc1af3 68 }
markus286 0:603870fc1af3 69 return false;
markus286 0:603870fc1af3 70 }
markus286 0:603870fc1af3 71
markus286 0:603870fc1af3 72 //************* STATES ****************
markus286 0:603870fc1af3 73
markus286 0:603870fc1af3 74 void ST_Aus (void)
markus286 0:603870fc1af3 75 {
markus286 0:603870fc1af3 76 //Status auf LCD und Serial
markus286 0:603870fc1af3 77 lcd.cls(); // löscht lcd (clear screen)
markus286 0:603870fc1af3 78 lcd.locate(0,0); // x-position, y-position (x: 0-128; y: 0-32)
markus286 0:603870fc1af3 79 lcd.printf("State: 1 (Aus)");
markus286 0:603870fc1af3 80 printf("State: 1 (Aus)");
markus286 0:603870fc1af3 81 // entry
markus286 0:603870fc1af3 82
markus286 0:603870fc1af3 83 // do
markus286 0:603870fc1af3 84 while(true) {
markus286 0:603870fc1af3 85 Led1 = 0;
markus286 0:603870fc1af3 86
markus286 0:603870fc1af3 87 if(CheckFlag1()) {
markus286 0:603870fc1af3 88 state = ST_EIN;
markus286 0:603870fc1af3 89
markus286 0:603870fc1af3 90 // exit
markus286 0:603870fc1af3 91 return;
markus286 0:603870fc1af3 92 }
markus286 0:603870fc1af3 93 }
markus286 0:603870fc1af3 94 }
markus286 0:603870fc1af3 95
markus286 0:603870fc1af3 96 void ST_Ein (void)
markus286 0:603870fc1af3 97 {
markus286 0:603870fc1af3 98 //Status auf LCD und Serial
markus286 0:603870fc1af3 99 lcd.cls(); // löscht lcd (clear screen)
markus286 0:603870fc1af3 100 lcd.locate(0,0); // x-position, y-position (x: 0-128; y: 0-32)
markus286 0:603870fc1af3 101 lcd.printf("State: 2 (Ein)");
markus286 0:603870fc1af3 102 printf("State: 2 (Ein)");
markus286 0:603870fc1af3 103
markus286 0:603870fc1af3 104 // entry
markus286 0:603870fc1af3 105 T1.attach(&blink, 0.3);
markus286 0:603870fc1af3 106 while (true)
markus286 0:603870fc1af3 107 {
markus286 0:603870fc1af3 108 if(blinkCount >= 4) break;
markus286 0:603870fc1af3 109 }
markus286 0:603870fc1af3 110 T1.detach();
markus286 0:603870fc1af3 111 blinkCount = 0;
markus286 0:603870fc1af3 112
markus286 0:603870fc1af3 113 // do
markus286 0:603870fc1af3 114 while(true) {
markus286 0:603870fc1af3 115 Led1 = 1;
markus286 0:603870fc1af3 116
markus286 0:603870fc1af3 117 if(CheckFlag1()) {
markus286 0:603870fc1af3 118 state = ST_AUS;
markus286 0:603870fc1af3 119 // exit
markus286 0:603870fc1af3 120 return;
markus286 0:603870fc1af3 121 }
markus286 0:603870fc1af3 122
markus286 0:603870fc1af3 123 if(CheckFlag2()) {
markus286 0:603870fc1af3 124 state = ST_TIMEOUT;
markus286 0:603870fc1af3 125 // exit
markus286 0:603870fc1af3 126 return;
markus286 0:603870fc1af3 127 }
markus286 0:603870fc1af3 128 }
markus286 0:603870fc1af3 129 }
markus286 0:603870fc1af3 130
markus286 0:603870fc1af3 131 void ST_TimeOut (void)
markus286 0:603870fc1af3 132 {
markus286 0:603870fc1af3 133 //Status auf LCD und Serial
markus286 0:603870fc1af3 134 lcd.cls(); // löscht lcd (clear screen)
markus286 0:603870fc1af3 135 lcd.locate(0,0); // x-position, y-position (x: 0-128; y: 0-32)
markus286 0:603870fc1af3 136 lcd.printf("State: 3 (TimeOut)");
markus286 0:603870fc1af3 137 printf("State: 3 (TimeOut)");
markus286 0:603870fc1af3 138
markus286 0:603870fc1af3 139 // entry
markus286 0:603870fc1af3 140
markus286 0:603870fc1af3 141
markus286 0:603870fc1af3 142 // do
markus286 0:603870fc1af3 143 while(true) {
markus286 0:603870fc1af3 144 lcd.locate(0,12); // x-position, y-position (x: 0-128; y: 0-32)
markus286 0:603870fc1af3 145 lcd.printf("Time: %f", timerValue);
markus286 0:603870fc1af3 146 printf("Time: %f", timerValue);
markus286 0:603870fc1af3 147
markus286 0:603870fc1af3 148 // exit
markus286 0:603870fc1af3 149
markus286 0:603870fc1af3 150 }
markus286 0:603870fc1af3 151 }
markus286 0:603870fc1af3 152
markus286 0:603870fc1af3 153 void ST_Error (void)
markus286 0:603870fc1af3 154 {
markus286 0:603870fc1af3 155 //Status auf LCD und Serial
markus286 0:603870fc1af3 156 lcd.cls(); // löscht lcd (clear screen)
markus286 0:603870fc1af3 157 lcd.locate(0,0); // x-position, y-position (x: 0-128; y: 0-32)
markus286 0:603870fc1af3 158 lcd.printf("State: ERROR!!!");
markus286 0:603870fc1af3 159 printf("State: ERROR!!!");
markus286 0:603870fc1af3 160 return;
markus286 0:603870fc1af3 161 }
markus286 0:603870fc1af3 162
markus286 0:603870fc1af3 163 //************* STATE MACHINE ****************
markus286 0:603870fc1af3 164
markus286 0:603870fc1af3 165 void stateMachine()
markus286 0:603870fc1af3 166 {
markus286 0:603870fc1af3 167 switch (state)
markus286 0:603870fc1af3 168 {
markus286 0:603870fc1af3 169 case ST_AUS: ST_Aus();
markus286 0:603870fc1af3 170 break;
markus286 0:603870fc1af3 171 case ST_EIN: ST_Ein();
markus286 0:603870fc1af3 172 break;
markus286 0:603870fc1af3 173 case ST_TIMEOUT: ST_TimeOut();
markus286 0:603870fc1af3 174 break;
markus286 0:603870fc1af3 175 default: ST_Error(); // sollte nicht auftreten :-)
markus286 0:603870fc1af3 176 break;
markus286 0:603870fc1af3 177 }
markus286 0:603870fc1af3 178 }
markus286 0:603870fc1af3 179
markus286 0:603870fc1af3 180 //************* MAIN ****************
markus286 0:603870fc1af3 181
markus286 0:603870fc1af3 182 int main()
markus286 0:603870fc1af3 183 {
markus286 0:603870fc1af3 184 SW1.rise(&rise1); //.fall(&fall);
markus286 0:603870fc1af3 185 SW2.rise(&rise2);
markus286 0:603870fc1af3 186 state = ST_AUS;
markus286 0:603870fc1af3 187 while(true){
markus286 0:603870fc1af3 188 stateMachine();
markus286 0:603870fc1af3 189 }
markus286 0:603870fc1af3 190 }
markus286 0:603870fc1af3 191
markus286 0:603870fc1af3 192 class IsAnEvent : public InterruptIn {
markus286 0:603870fc1af3 193 volatile int16_t _pressed;
markus286 0:603870fc1af3 194 void _RisingISR();
markus286 0:603870fc1af3 195 public:
markus286 0:603870fc1af3 196 IsAnEvent() : InterruptIn(p15) {};
markus286 0:603870fc1af3 197 IsAnEvent(PinName pin) : InterruptIn(pin) {
markus286 0:603870fc1af3 198 rise(callback(this, &IsAnEvent::_RisingISR));
markus286 0:603870fc1af3 199 _pressed=0;
markus286 0:603870fc1af3 200 };
markus286 0:603870fc1af3 201 int CheckFlag();
markus286 0:603870fc1af3 202 void InitIsr();
markus286 0:603870fc1af3 203 };
markus286 0:603870fc1af3 204
markus286 0:603870fc1af3 205 void IsAnEvent::InitIsr() {
markus286 0:603870fc1af3 206 rise(callback(this, &IsAnEvent::_RisingISR));
markus286 0:603870fc1af3 207 }
markus286 0:603870fc1af3 208
markus286 0:603870fc1af3 209 void IsAnEvent::_RisingISR() {
markus286 0:603870fc1af3 210 wait_ms(50);
markus286 0:603870fc1af3 211 if( read() )
markus286 0:603870fc1af3 212 _pressed = true;
markus286 0:603870fc1af3 213 }
markus286 0:603870fc1af3 214 int IsAnEvent::CheckFlag() {
markus286 0:603870fc1af3 215 if( _pressed ) {
markus286 0:603870fc1af3 216 _pressed = false;
markus286 0:603870fc1af3 217 return 1;
markus286 0:603870fc1af3 218 }
markus286 0:603870fc1af3 219 return 0;
markus286 0:603870fc1af3 220 }
markus286 0:603870fc1af3 221