HIMBED_3AHELI / Mbed 2 deprecated Kager_Project_Chap

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "SerialEvent.h"
00003 
00004 Serial pc(USBTX,USBRX);
00005 SerialEvent pc1(USBTX,USBRX);
00006 PwmOut red(p36);
00007 PwmOut green(p5);
00008 PwmOut blue(p34);
00009 DigitalOut led1(LED1);
00010 DigitalOut led2(LED2);
00011 DigitalOut led3(LED3);
00012 DigitalOut led4(LED4);
00013 DigitalOut led6(P1_0);
00014 Timer timer;
00015 Ticker tick1;
00016 Ticker tick2;
00017 Ticker tick3;
00018 Ticker tick4;
00019 
00020 // States
00021 //typedef enum {ST_EIN, ST_AUS, ST_ERROR, ST_STATE1} nextState;
00022 // alternativ
00023 const int ST_BOOT = 0;
00024 const int ST_AUTH = 1;
00025 const int ST_STRING = 2;
00026 const int ST_RECEIVE = 3;
00027 const int ST_COMP = 4;
00028 const int ST_SUCCESS = 5;
00029 const int ST_FAIL = 6;
00030 const int ST_END = 7;
00031 char inString[STRMAX];
00032 char stringRND[STRMAX];
00033 char message[STRMAX];
00034 int line= 0;
00035 int tries= 0 ;
00036 int poss = 0;
00037 void blink();
00038 void gen_random(char *s, const int len)
00039 {
00040     static const char alphanum[] =
00041         "0123456789"
00042         "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
00043         "abcdefghijklmnopqrstuvwxyz";
00044 
00045     for (int i = 0; i < len; ++i) {
00046         s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
00047     }
00048 }
00049 ////----------------------------------Ticker Klasse---------------------------------
00050 class Blinker {
00051 public:
00052     Blinker(PinName pin) : _pin(pin) {
00053         _pin = 0;
00054     }
00055     void blink() {
00056         _pin = !_pin;
00057     }
00058 private:
00059     DigitalOut _pin;
00060 };
00061 Blinker t1(LED1);
00062 Blinker t2(LED2);
00063 Blinker t3(LED3);
00064 Blinker t4(LED4);
00065 // ---------------- Event Klasse --------------------------
00066 class SwEvent
00067 {
00068     InterruptIn _isr;
00069     bool _pressed;
00070     void _RisingISR();
00071 
00072 public:
00073     SwEvent(PinName pin) : _isr(pin) {
00074         _pressed = false;
00075     }
00076     int CheckFlag();    // dies muss im do-Zweig (while(true) Schleife) ständig abgefragt werden
00077     void InitIsr();
00078 };
00079 
00080 int SwEvent::CheckFlag()
00081 {
00082     if( _pressed ) {
00083         _pressed = false;
00084         return 1;
00085     }
00086     return 0;
00087 }
00088 
00089 void SwEvent::InitIsr()
00090 {
00091     _isr.rise(this, &SwEvent::_RisingISR);
00092 }
00093 
00094 void SwEvent::_RisingISR()
00095 {
00096     if( _isr.read() )
00097         _pressed = true;
00098 }
00099 
00100 SwEvent sw1(P0_10);
00101 
00102 // ----------------- Stm Klasse -----------------------------
00103 class Stm
00104 {
00105 public:
00106     Stm() {
00107         state=ST_BOOT;
00108     }
00109 
00110     void Boot();
00111     void Auth();
00112     void String();
00113     void Receive();
00114     void Comp();
00115     void Success();
00116     void Fail();
00117     void End();
00118 
00119     int state;
00120 };
00121 
00122 
00123 void Stm::Boot()
00124 {   tick1.detach();
00125     tick2.detach();
00126     tick3.detach();
00127     tick4.detach();
00128     pc.printf("Hello\n");
00129     timer.start();
00130     while(true) {
00131         led1 = led2 = led3 = led4 = 0;
00132 
00133         if(timer.read() >= 1) {
00134             state = ST_AUTH;
00135             led1 = 1;
00136             timer.stop();
00137             timer.reset();
00138             return;
00139         }
00140     }
00141 }
00142 
00143 void Stm::Auth()
00144 {
00145     
00146     
00147     pc.printf("Press Sw 2\n");
00148     while(true) {
00149         led6 = 1;
00150         if(sw1.CheckFlag()) {
00151             led6 = 0;
00152             state = ST_STRING;
00153             return;
00154         }
00155         
00156     }
00157 }
00158 
00159 
00160 void Stm::String()
00161 {
00162     tick1.detach();
00163     tick2.detach();
00164     tick3.detach();
00165     tick4.detach();
00166     gen_random(stringRND,5);
00167     pc.printf("RND String lautet: %s \n", stringRND);
00168     pc.printf("Geben Sie ihn nun erneut ein: \n");
00169     timer.start();
00170     while(true) {
00171         led1 = 0;
00172         led2 = 1;
00173 
00174         //s[len] = 0;
00175         state = ST_RECEIVE;
00176         return;
00177     }
00178 }
00179 
00180 
00181 void Stm::Receive()
00182 {
00183     tick1.detach();
00184     tick2.detach();
00185     tick3.detach();
00186     tick4.detach();
00187     //pc1.pc_recv();
00188     if(pc1.checkFlag()) {
00189         pc1.getString(inString);
00190         //pc1.scanf(inString);
00191         pc.printf("%s\n", inString);
00192         state = ST_COMP;
00193         return;
00194 
00195     }
00196 }
00197 
00198 void Stm::Comp()
00199 {
00200     tick1.detach();
00201     tick2.detach();
00202     tick3.detach();
00203     tick4.detach();
00204     if(strncmp(stringRND,inString,5) == 0) {
00205         pc.printf("Sie haben %f Sekunden fuer Ihre Authentifikation benoetigt\n", timer.read());
00206         state = ST_SUCCESS;
00207         return;
00208     } else if( tries == 3) {
00209         state = ST_END;
00210         return;
00211     } else {
00212         tries++;
00213         poss = 4 - tries;
00214         pc.printf("Sie haben noch %d Moeglichkeiten, um sich richtig zu authentifizieren",poss);
00215         state = ST_RECEIVE;
00216     }
00217 }
00218 
00219 void Stm::Success()
00220 {
00221     tick1.detach();
00222     tick2.detach();
00223     tick3.detach();
00224     tick4.detach();
00225     printf("WELCOME!");
00226     led1 = led2 = led3 = led4 = 1;
00227     //message[STRMAX] = '\0';
00228     while(true) {
00229         if(pc1.checkFlag()) {
00230             pc1.getString(message);
00231             line++;
00232             pc.printf("%d:%d>%s\n",line,strlen(message),message);
00233             if(message[0] == '.') {
00234                 state = ST_AUTH;
00235                 return;
00236             }
00237         }
00238     }
00239 }
00240 
00241 void Stm::Fail()
00242 {
00243     tick1.detach();
00244     tick2.detach();
00245     tick3.detach();
00246     tick4.detach();
00247     while(true) {
00248 
00249         led1 = led3 = led4 = 0;
00250         led2 = 1;
00251         state = ST_END;
00252         return;
00253     }
00254 }
00255 
00256 
00257 void Stm::End()
00258 {
00259         //led1 = led2 = led3 = led4 = 1;
00260         tick1.attach(&t1, &Blinker::blink, 0.2);
00261         tick2.attach(&t2, &Blinker::blink, 0.2);
00262         tick3.attach(&t3, &Blinker::blink, 0.2);
00263         tick4.attach(&t4, &Blinker::blink, 0.2);
00264         /*while(true){
00265             if(timer.read_ms()%200 == 0){
00266             led1 =~ led1;
00267             led2 =~ led2;
00268             led3 =~ led3;
00269             led4 =~ led4;
00270             }
00271             }*/  
00272         tries = 0;
00273         pc.printf("%d", timer.read());
00274         state = ST_AUTH;
00275         return;
00276 }
00277 
00278 
00279 
00280 
00281 Stm stm;
00282 
00283 void stateMachine()
00284 {
00285     switch (stm.state) {
00286         case ST_BOOT:
00287             stm.Boot();
00288             break;
00289         case ST_AUTH:
00290             stm.Auth();
00291             break;
00292         case ST_STRING:
00293             stm.String();
00294             break;
00295         case ST_RECEIVE:
00296             stm.Receive();
00297             break;
00298         case ST_COMP:
00299             stm.Comp();
00300             break;
00301         case ST_SUCCESS:
00302             stm.Success();
00303             break;
00304         case ST_FAIL:
00305             stm.Fail();
00306             break;
00307         case ST_END:
00308             stm.End();
00309             break;
00310 
00311 
00312     }
00313 }
00314 
00315 int main()
00316 {
00317     //printf("Hello STM\n");
00318     sw1.InitIsr();
00319 
00320     red=green=1;
00321     while(1) {
00322         stateMachine();
00323     }
00324 }