![](/media/cache/group/HIMBED0.jpg.50x50_q85.jpg)
(╯°□°)╯︵ ┻━┻
Dependencies: mbed
main.cpp@1:8727231a97ab, 2016-06-22 (annotated)
- Committer:
- Andi104
- Date:
- Wed Jun 22 06:57:54 2016 +0000
- Revision:
- 1:8727231a97ab
- Parent:
- 0:d43885c9d5d8
.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Andi104 | 0:d43885c9d5d8 | 1 | #include "mbed.h" |
Andi104 | 0:d43885c9d5d8 | 2 | |
Andi104 | 0:d43885c9d5d8 | 3 | DigitalOut led(p20);//P1_13); |
Andi104 | 0:d43885c9d5d8 | 4 | Serial pc(USBTX,USBRX); |
Andi104 | 0:d43885c9d5d8 | 5 | BusOut leds(LED1,LED2,LED3,LED4); |
Andi104 | 0:d43885c9d5d8 | 6 | Timer tim; |
Andi104 | 0:d43885c9d5d8 | 7 | Ticker tick; |
Andi104 | 0:d43885c9d5d8 | 8 | char strRnd[5]; |
Andi104 | 0:d43885c9d5d8 | 9 | char strIn[50]; |
Andi104 | 0:d43885c9d5d8 | 10 | int tries=0,cnt=0; |
Andi104 | 0:d43885c9d5d8 | 11 | |
Andi104 | 0:d43885c9d5d8 | 12 | // States |
Andi104 | 0:d43885c9d5d8 | 13 | const int ST_BOOT = 0; |
Andi104 | 0:d43885c9d5d8 | 14 | const int ST_AUTH = 1; |
Andi104 | 0:d43885c9d5d8 | 15 | const int ST_STRING = 2; |
Andi104 | 0:d43885c9d5d8 | 16 | const int ST_INPUT = 3; |
Andi104 | 0:d43885c9d5d8 | 17 | const int ST_COMP = 4; |
Andi104 | 0:d43885c9d5d8 | 18 | const int ST_SUCC = 5; |
Andi104 | 0:d43885c9d5d8 | 19 | |
Andi104 | 0:d43885c9d5d8 | 20 | void blink(); |
Andi104 | 0:d43885c9d5d8 | 21 | // ---------------- Read String from Serial -------------------------- |
Andi104 | 0:d43885c9d5d8 | 22 | void ReadFromSerial(char *s, const int MAX_SIZE=50) |
Andi104 | 0:d43885c9d5d8 | 23 | { |
Andi104 | 0:d43885c9d5d8 | 24 | for (int i = 0; i < 50; i++) {s[i] = '\0';} //set entire string to NULL |
Andi104 | 0:d43885c9d5d8 | 25 | for (int i = 0; i < 50; i++) { |
Andi104 | 0:d43885c9d5d8 | 26 | char c = pc.getc(); |
Andi104 | 0:d43885c9d5d8 | 27 | if (c == '\n') |
Andi104 | 0:d43885c9d5d8 | 28 | break; |
Andi104 | 0:d43885c9d5d8 | 29 | s[i] = c; |
Andi104 | 0:d43885c9d5d8 | 30 | } |
Andi104 | 0:d43885c9d5d8 | 31 | } |
Andi104 | 0:d43885c9d5d8 | 32 | // ---------------- Random String Gen -------------------------- |
Andi104 | 0:d43885c9d5d8 | 33 | void gen_random(char *s, const int len) |
Andi104 | 0:d43885c9d5d8 | 34 | { |
Andi104 | 0:d43885c9d5d8 | 35 | static const char alphanum[] = |
Andi104 | 0:d43885c9d5d8 | 36 | "0123456789" |
Andi104 | 0:d43885c9d5d8 | 37 | "ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
Andi104 | 0:d43885c9d5d8 | 38 | "abcdefghijklmnopqrstuvwxyz"; |
Andi104 | 0:d43885c9d5d8 | 39 | |
Andi104 | 0:d43885c9d5d8 | 40 | for (int i = 0; i < len; ++i) { |
Andi104 | 0:d43885c9d5d8 | 41 | s[i] = alphanum[rand() % (sizeof(alphanum) - 1)]; |
Andi104 | 0:d43885c9d5d8 | 42 | } |
Andi104 | 0:d43885c9d5d8 | 43 | |
Andi104 | 0:d43885c9d5d8 | 44 | s[len] = 0; |
Andi104 | 0:d43885c9d5d8 | 45 | } |
Andi104 | 0:d43885c9d5d8 | 46 | // ---------------- Event Klasse -------------------------- |
Andi104 | 0:d43885c9d5d8 | 47 | class SwEvent |
Andi104 | 0:d43885c9d5d8 | 48 | { |
Andi104 | 0:d43885c9d5d8 | 49 | InterruptIn _isr; |
Andi104 | 0:d43885c9d5d8 | 50 | bool _pressed; |
Andi104 | 0:d43885c9d5d8 | 51 | void _RisingISR(); |
Andi104 | 0:d43885c9d5d8 | 52 | |
Andi104 | 0:d43885c9d5d8 | 53 | public: |
Andi104 | 0:d43885c9d5d8 | 54 | SwEvent(PinName pin) : _isr(pin) { |
Andi104 | 0:d43885c9d5d8 | 55 | _pressed = false; |
Andi104 | 0:d43885c9d5d8 | 56 | } |
Andi104 | 0:d43885c9d5d8 | 57 | int CheckFlag(); // das muss im do-Zweig (while(true) Schleife) ständig abgefragt werden |
Andi104 | 0:d43885c9d5d8 | 58 | void InitIsr(); |
Andi104 | 0:d43885c9d5d8 | 59 | }; |
Andi104 | 0:d43885c9d5d8 | 60 | |
Andi104 | 0:d43885c9d5d8 | 61 | int SwEvent::CheckFlag() |
Andi104 | 0:d43885c9d5d8 | 62 | { |
Andi104 | 0:d43885c9d5d8 | 63 | if( _pressed ) { |
Andi104 | 0:d43885c9d5d8 | 64 | _pressed = false; |
Andi104 | 0:d43885c9d5d8 | 65 | return 1; |
Andi104 | 0:d43885c9d5d8 | 66 | } |
Andi104 | 0:d43885c9d5d8 | 67 | return 0; |
Andi104 | 0:d43885c9d5d8 | 68 | } |
Andi104 | 0:d43885c9d5d8 | 69 | |
Andi104 | 0:d43885c9d5d8 | 70 | void SwEvent::InitIsr() |
Andi104 | 0:d43885c9d5d8 | 71 | { |
Andi104 | 0:d43885c9d5d8 | 72 | _isr.rise(this, &SwEvent::_RisingISR); |
Andi104 | 0:d43885c9d5d8 | 73 | } |
Andi104 | 0:d43885c9d5d8 | 74 | |
Andi104 | 0:d43885c9d5d8 | 75 | void SwEvent::_RisingISR() |
Andi104 | 0:d43885c9d5d8 | 76 | { |
Andi104 | 0:d43885c9d5d8 | 77 | if( _isr.read() ) |
Andi104 | 0:d43885c9d5d8 | 78 | _pressed = true; |
Andi104 | 0:d43885c9d5d8 | 79 | } |
Andi104 | 0:d43885c9d5d8 | 80 | |
Andi104 | 0:d43885c9d5d8 | 81 | SwEvent sw2(P0_23); |
Andi104 | 0:d43885c9d5d8 | 82 | |
Andi104 | 0:d43885c9d5d8 | 83 | // ----------------- Stm Klasse ----------------------------- |
Andi104 | 0:d43885c9d5d8 | 84 | class Stm |
Andi104 | 0:d43885c9d5d8 | 85 | { |
Andi104 | 0:d43885c9d5d8 | 86 | public: |
Andi104 | 0:d43885c9d5d8 | 87 | Stm() { |
Andi104 | 0:d43885c9d5d8 | 88 | state=ST_BOOT; |
Andi104 | 0:d43885c9d5d8 | 89 | } |
Andi104 | 0:d43885c9d5d8 | 90 | |
Andi104 | 0:d43885c9d5d8 | 91 | void Boot(); |
Andi104 | 0:d43885c9d5d8 | 92 | void Auth(); |
Andi104 | 0:d43885c9d5d8 | 93 | void GenString(); |
Andi104 | 0:d43885c9d5d8 | 94 | void Input(); |
Andi104 | 0:d43885c9d5d8 | 95 | void Comp(); |
Andi104 | 0:d43885c9d5d8 | 96 | void Succ(); |
Andi104 | 0:d43885c9d5d8 | 97 | |
Andi104 | 0:d43885c9d5d8 | 98 | uint8_t state; |
Andi104 | 0:d43885c9d5d8 | 99 | }; |
Andi104 | 0:d43885c9d5d8 | 100 | |
Andi104 | 0:d43885c9d5d8 | 101 | |
Andi104 | 0:d43885c9d5d8 | 102 | void Stm::Boot() //ST-0 -> Boot Message |
Andi104 | 0:d43885c9d5d8 | 103 | { |
Andi104 | 0:d43885c9d5d8 | 104 | leds = 0x0; |
Andi104 | 0:d43885c9d5d8 | 105 | pc.printf("HELLO!\n"); |
Andi104 | 0:d43885c9d5d8 | 106 | tim.start(); |
Andi104 | 0:d43885c9d5d8 | 107 | while(true) { |
Andi104 | 0:d43885c9d5d8 | 108 | if(tim.read()>1) { |
Andi104 | 0:d43885c9d5d8 | 109 | tim.stop(); |
Andi104 | 0:d43885c9d5d8 | 110 | tim.reset(); |
Andi104 | 0:d43885c9d5d8 | 111 | state = ST_AUTH; |
Andi104 | 0:d43885c9d5d8 | 112 | return; |
Andi104 | 0:d43885c9d5d8 | 113 | } |
Andi104 | 0:d43885c9d5d8 | 114 | } |
Andi104 | 0:d43885c9d5d8 | 115 | } |
Andi104 | 0:d43885c9d5d8 | 116 | |
Andi104 | 0:d43885c9d5d8 | 117 | void Stm::Auth() //ST-1 -> Authentication |
Andi104 | 0:d43885c9d5d8 | 118 | { |
Andi104 | 0:d43885c9d5d8 | 119 | tick.attach(&blink,0.5); |
Andi104 | 0:d43885c9d5d8 | 120 | tim.reset(); |
Andi104 | 0:d43885c9d5d8 | 121 | pc.printf("Bitte betaetigen Sie die Taste <SW2> um fortzufahren\n"); |
Andi104 | 0:d43885c9d5d8 | 122 | while(true) { |
Andi104 | 0:d43885c9d5d8 | 123 | led=1; |
Andi104 | 0:d43885c9d5d8 | 124 | if(sw2.CheckFlag()) { |
Andi104 | 0:d43885c9d5d8 | 125 | tick.detach(); |
Andi104 | 0:d43885c9d5d8 | 126 | state = ST_STRING; |
Andi104 | 0:d43885c9d5d8 | 127 | return; |
Andi104 | 0:d43885c9d5d8 | 128 | } |
Andi104 | 0:d43885c9d5d8 | 129 | } |
Andi104 | 0:d43885c9d5d8 | 130 | } |
Andi104 | 0:d43885c9d5d8 | 131 | |
Andi104 | 0:d43885c9d5d8 | 132 | void Stm::GenString() //ST-2 -> Generate Random String |
Andi104 | 0:d43885c9d5d8 | 133 | { |
Andi104 | 0:d43885c9d5d8 | 134 | gen_random(strRnd, 5); |
Andi104 | 0:d43885c9d5d8 | 135 | pc.printf("%s\n",strRnd); |
Andi104 | 0:d43885c9d5d8 | 136 | tim.start(); |
Andi104 | 0:d43885c9d5d8 | 137 | leds=0x9; |
Andi104 | 0:d43885c9d5d8 | 138 | tick.attach(&blink,0.2); |
Andi104 | 0:d43885c9d5d8 | 139 | while(1) { |
Andi104 | 0:d43885c9d5d8 | 140 | state = ST_INPUT; |
Andi104 | 0:d43885c9d5d8 | 141 | return; |
Andi104 | 0:d43885c9d5d8 | 142 | } |
Andi104 | 0:d43885c9d5d8 | 143 | } |
Andi104 | 0:d43885c9d5d8 | 144 | |
Andi104 | 0:d43885c9d5d8 | 145 | |
Andi104 | 0:d43885c9d5d8 | 146 | void Stm::Input() //ST-3 -> Input from Serial |
Andi104 | 0:d43885c9d5d8 | 147 | { |
Andi104 | 0:d43885c9d5d8 | 148 | pc.printf("String eingeben!\n"); |
Andi104 | 0:d43885c9d5d8 | 149 | while(1) { |
Andi104 | 0:d43885c9d5d8 | 150 | strIn[0]='\0'; |
Andi104 | 0:d43885c9d5d8 | 151 | //pc.scanf("%s", strIn); |
Andi104 | 0:d43885c9d5d8 | 152 | ReadFromSerial(strIn); |
Andi104 | 0:d43885c9d5d8 | 153 | pc.printf("%s\n",strIn); |
Andi104 | 0:d43885c9d5d8 | 154 | tick.detach();leds = 0x0; |
Andi104 | 0:d43885c9d5d8 | 155 | state = ST_COMP; |
Andi104 | 0:d43885c9d5d8 | 156 | return; |
Andi104 | 0:d43885c9d5d8 | 157 | } |
Andi104 | 0:d43885c9d5d8 | 158 | } |
Andi104 | 0:d43885c9d5d8 | 159 | |
Andi104 | 0:d43885c9d5d8 | 160 | |
Andi104 | 0:d43885c9d5d8 | 161 | void Stm::Comp() //ST-4 -> Compare the Strings |
Andi104 | 0:d43885c9d5d8 | 162 | { |
Andi104 | 0:d43885c9d5d8 | 163 | if (strncmp(strRnd,strIn,5)==0) { //Strings sind gleich |
Andi104 | 0:d43885c9d5d8 | 164 | tim.stop(); |
Andi104 | 0:d43885c9d5d8 | 165 | leds=0xF; |
Andi104 | 0:d43885c9d5d8 | 166 | tries = 0; |
Andi104 | 0:d43885c9d5d8 | 167 | pc.printf("Erfolgreiche Eingabe in %.2f Sekunden\n",tim.read()); |
Andi104 | 0:d43885c9d5d8 | 168 | while(1) { |
Andi104 | 0:d43885c9d5d8 | 169 | state = ST_SUCC; |
Andi104 | 0:d43885c9d5d8 | 170 | return; |
Andi104 | 0:d43885c9d5d8 | 171 | } |
Andi104 | 0:d43885c9d5d8 | 172 | } else if (strncmp(strRnd,strIn,5)!=0 && tries == 2) { //3x falsch |
Andi104 | 0:d43885c9d5d8 | 173 | tim.reset(); |
Andi104 | 0:d43885c9d5d8 | 174 | tries +=1; |
Andi104 | 0:d43885c9d5d8 | 175 | pc.printf("3-fach Falsche Eingabe\n"); |
Andi104 | 0:d43885c9d5d8 | 176 | leds=0xF; |
Andi104 | 0:d43885c9d5d8 | 177 | while(1) { |
Andi104 | 0:d43885c9d5d8 | 178 | if (tim.read_ms()>200) { |
Andi104 | 0:d43885c9d5d8 | 179 | leds = ~leds; |
Andi104 | 0:d43885c9d5d8 | 180 | tim.reset(); |
Andi104 | 0:d43885c9d5d8 | 181 | } |
Andi104 | 0:d43885c9d5d8 | 182 | } |
Andi104 | 0:d43885c9d5d8 | 183 | } else { //falsch |
Andi104 | 0:d43885c9d5d8 | 184 | pc.printf("Falsche Eingabe\n"); |
Andi104 | 0:d43885c9d5d8 | 185 | tries +=1; |
Andi104 | 0:d43885c9d5d8 | 186 | leds=0x2; |
Andi104 | 0:d43885c9d5d8 | 187 | state=ST_INPUT; |
Andi104 | 0:d43885c9d5d8 | 188 | } |
Andi104 | 0:d43885c9d5d8 | 189 | } |
Andi104 | 0:d43885c9d5d8 | 190 | void Stm::Succ() //ST-5 -> Successful Input |
Andi104 | 0:d43885c9d5d8 | 191 | { |
Andi104 | 0:d43885c9d5d8 | 192 | while(1) { |
Andi104 | 0:d43885c9d5d8 | 193 | ReadFromSerial(strIn); |
Andi104 | 0:d43885c9d5d8 | 194 | if (strIn[0] == '.') { |
Andi104 | 0:d43885c9d5d8 | 195 | leds = 0x0; |
Andi104 | 0:d43885c9d5d8 | 196 | state = ST_AUTH; |
Andi104 | 0:d43885c9d5d8 | 197 | return; |
Andi104 | 0:d43885c9d5d8 | 198 | } |
Andi104 | 0:d43885c9d5d8 | 199 | if (strIn[0] != '\0') { |
Andi104 | 0:d43885c9d5d8 | 200 | cnt++; |
Andi104 | 0:d43885c9d5d8 | 201 | pc.printf("%i:%i> %s\n",cnt,strlen(strIn),strIn); |
Andi104 | 0:d43885c9d5d8 | 202 | } |
Andi104 | 0:d43885c9d5d8 | 203 | } |
Andi104 | 0:d43885c9d5d8 | 204 | } |
Andi104 | 0:d43885c9d5d8 | 205 | |
Andi104 | 0:d43885c9d5d8 | 206 | |
Andi104 | 0:d43885c9d5d8 | 207 | Stm stm; |
Andi104 | 0:d43885c9d5d8 | 208 | |
Andi104 | 0:d43885c9d5d8 | 209 | void stateMachine() |
Andi104 | 0:d43885c9d5d8 | 210 | { |
Andi104 | 0:d43885c9d5d8 | 211 | switch (stm.state) { |
Andi104 | 0:d43885c9d5d8 | 212 | case ST_BOOT: |
Andi104 | 0:d43885c9d5d8 | 213 | stm.Boot(); |
Andi104 | 0:d43885c9d5d8 | 214 | break; |
Andi104 | 0:d43885c9d5d8 | 215 | case ST_AUTH: |
Andi104 | 0:d43885c9d5d8 | 216 | stm.Auth(); |
Andi104 | 0:d43885c9d5d8 | 217 | break; |
Andi104 | 0:d43885c9d5d8 | 218 | case ST_STRING: |
Andi104 | 0:d43885c9d5d8 | 219 | stm.GenString(); |
Andi104 | 0:d43885c9d5d8 | 220 | break; |
Andi104 | 0:d43885c9d5d8 | 221 | case ST_INPUT: |
Andi104 | 0:d43885c9d5d8 | 222 | stm.Input(); |
Andi104 | 0:d43885c9d5d8 | 223 | break; |
Andi104 | 0:d43885c9d5d8 | 224 | case ST_COMP: |
Andi104 | 0:d43885c9d5d8 | 225 | stm.Comp(); |
Andi104 | 0:d43885c9d5d8 | 226 | break; |
Andi104 | 0:d43885c9d5d8 | 227 | case ST_SUCC: |
Andi104 | 0:d43885c9d5d8 | 228 | stm.Succ(); |
Andi104 | 0:d43885c9d5d8 | 229 | break; |
Andi104 | 0:d43885c9d5d8 | 230 | default: |
Andi104 | 0:d43885c9d5d8 | 231 | stm.Boot(); |
Andi104 | 0:d43885c9d5d8 | 232 | break; |
Andi104 | 0:d43885c9d5d8 | 233 | } |
Andi104 | 0:d43885c9d5d8 | 234 | } |
Andi104 | 0:d43885c9d5d8 | 235 | |
Andi104 | 0:d43885c9d5d8 | 236 | void blink(){ |
Andi104 | 0:d43885c9d5d8 | 237 | if (stm.state == ST_AUTH){ |
Andi104 | 0:d43885c9d5d8 | 238 | leds[0] = !leds[0];} |
Andi104 | 0:d43885c9d5d8 | 239 | if (stm.state == ST_INPUT){ |
Andi104 | 0:d43885c9d5d8 | 240 | leds = ~leds;} |
Andi104 | 0:d43885c9d5d8 | 241 | } |
Andi104 | 0:d43885c9d5d8 | 242 | |
Andi104 | 0:d43885c9d5d8 | 243 | int main() |
Andi104 | 0:d43885c9d5d8 | 244 | { |
Andi104 | 0:d43885c9d5d8 | 245 | sw2.InitIsr(); |
Andi104 | 0:d43885c9d5d8 | 246 | while(1) { |
Andi104 | 0:d43885c9d5d8 | 247 | stateMachine(); |
Andi104 | 0:d43885c9d5d8 | 248 | } |
Andi104 | 0:d43885c9d5d8 | 249 | } |