Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
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 }
Generated on Wed Jul 27 2022 03:10:48 by
1.7.2