(╯°□°)╯︵ ┻━┻
Dependencies: mbed
main.cpp
- Committer:
- Andi104
- Date:
- 2016-06-22
- Revision:
- 1:8727231a97ab
- Parent:
- 0:d43885c9d5d8
File content as of revision 1:8727231a97ab:
#include "mbed.h" DigitalOut led(p20);//P1_13); Serial pc(USBTX,USBRX); BusOut leds(LED1,LED2,LED3,LED4); Timer tim; Ticker tick; char strRnd[5]; char strIn[50]; int tries=0,cnt=0; // States const int ST_BOOT = 0; const int ST_AUTH = 1; const int ST_STRING = 2; const int ST_INPUT = 3; const int ST_COMP = 4; const int ST_SUCC = 5; void blink(); // ---------------- Read String from Serial -------------------------- void ReadFromSerial(char *s, const int MAX_SIZE=50) { for (int i = 0; i < 50; i++) {s[i] = '\0';} //set entire string to NULL for (int i = 0; i < 50; i++) { char c = pc.getc(); if (c == '\n') break; s[i] = c; } } // ---------------- Random String Gen -------------------------- void gen_random(char *s, const int len) { static const char alphanum[] = "0123456789" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"; for (int i = 0; i < len; ++i) { s[i] = alphanum[rand() % (sizeof(alphanum) - 1)]; } s[len] = 0; } // ---------------- Event Klasse -------------------------- class SwEvent { InterruptIn _isr; bool _pressed; void _RisingISR(); public: SwEvent(PinName pin) : _isr(pin) { _pressed = false; } int CheckFlag(); // das muss im do-Zweig (while(true) Schleife) ständig abgefragt werden void InitIsr(); }; int SwEvent::CheckFlag() { if( _pressed ) { _pressed = false; return 1; } return 0; } void SwEvent::InitIsr() { _isr.rise(this, &SwEvent::_RisingISR); } void SwEvent::_RisingISR() { if( _isr.read() ) _pressed = true; } SwEvent sw2(P0_23); // ----------------- Stm Klasse ----------------------------- class Stm { public: Stm() { state=ST_BOOT; } void Boot(); void Auth(); void GenString(); void Input(); void Comp(); void Succ(); uint8_t state; }; void Stm::Boot() //ST-0 -> Boot Message { leds = 0x0; pc.printf("HELLO!\n"); tim.start(); while(true) { if(tim.read()>1) { tim.stop(); tim.reset(); state = ST_AUTH; return; } } } void Stm::Auth() //ST-1 -> Authentication { tick.attach(&blink,0.5); tim.reset(); pc.printf("Bitte betaetigen Sie die Taste <SW2> um fortzufahren\n"); while(true) { led=1; if(sw2.CheckFlag()) { tick.detach(); state = ST_STRING; return; } } } void Stm::GenString() //ST-2 -> Generate Random String { gen_random(strRnd, 5); pc.printf("%s\n",strRnd); tim.start(); leds=0x9; tick.attach(&blink,0.2); while(1) { state = ST_INPUT; return; } } void Stm::Input() //ST-3 -> Input from Serial { pc.printf("String eingeben!\n"); while(1) { strIn[0]='\0'; //pc.scanf("%s", strIn); ReadFromSerial(strIn); pc.printf("%s\n",strIn); tick.detach();leds = 0x0; state = ST_COMP; return; } } void Stm::Comp() //ST-4 -> Compare the Strings { if (strncmp(strRnd,strIn,5)==0) { //Strings sind gleich tim.stop(); leds=0xF; tries = 0; pc.printf("Erfolgreiche Eingabe in %.2f Sekunden\n",tim.read()); while(1) { state = ST_SUCC; return; } } else if (strncmp(strRnd,strIn,5)!=0 && tries == 2) { //3x falsch tim.reset(); tries +=1; pc.printf("3-fach Falsche Eingabe\n"); leds=0xF; while(1) { if (tim.read_ms()>200) { leds = ~leds; tim.reset(); } } } else { //falsch pc.printf("Falsche Eingabe\n"); tries +=1; leds=0x2; state=ST_INPUT; } } void Stm::Succ() //ST-5 -> Successful Input { while(1) { ReadFromSerial(strIn); if (strIn[0] == '.') { leds = 0x0; state = ST_AUTH; return; } if (strIn[0] != '\0') { cnt++; pc.printf("%i:%i> %s\n",cnt,strlen(strIn),strIn); } } } Stm stm; void stateMachine() { switch (stm.state) { case ST_BOOT: stm.Boot(); break; case ST_AUTH: stm.Auth(); break; case ST_STRING: stm.GenString(); break; case ST_INPUT: stm.Input(); break; case ST_COMP: stm.Comp(); break; case ST_SUCC: stm.Succ(); break; default: stm.Boot(); break; } } void blink(){ if (stm.state == ST_AUTH){ leds[0] = !leds[0];} if (stm.state == ST_INPUT){ leds = ~leds;} } int main() { sw2.InitIsr(); while(1) { stateMachine(); } }