(/°o°)/

Dependencies:   mbed

Committer:
Deixi
Date:
Mon Jun 20 19:48:12 2016 +0000
Revision:
0:87788df2ae50
(/?o?)/ Aber ist jetzt nicht gerade ein Meisterwerk

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Deixi 0:87788df2ae50 1 #include "mbed.h"
Deixi 0:87788df2ae50 2
Deixi 0:87788df2ae50 3 PwmOut red(p36);
Deixi 0:87788df2ae50 4 PwmOut green(p5);
Deixi 0:87788df2ae50 5 PwmOut blue(p34);
Deixi 0:87788df2ae50 6 DigitalOut led[] = {(LED1),(LED2),(LED3),(LED4),(P1_0),(P1_1),(P1_3),(P1_4),(P1_6),(P1_7),(P1_12),(P1_13)};
Deixi 0:87788df2ae50 7 DigitalIn sw1(P0_10);
Deixi 0:87788df2ae50 8 DigitalIn sw3(P0_15);
Deixi 0:87788df2ae50 9 DigitalIn sw4(P1_16);
Deixi 0:87788df2ae50 10
Deixi 0:87788df2ae50 11 Serial pc(USBTX, USBRX);
Deixi 0:87788df2ae50 12 Timer timer;
Deixi 0:87788df2ae50 13 Ticker tick1;
Deixi 0:87788df2ae50 14 Ticker tick2;
Deixi 0:87788df2ae50 15 Ticker tick3;
Deixi 0:87788df2ae50 16 Ticker tick4;
Deixi 0:87788df2ae50 17
Deixi 0:87788df2ae50 18
Deixi 0:87788df2ae50 19 const uint8_t STRMAX = 20;
Deixi 0:87788df2ae50 20 const char EOT = '.';
Deixi 0:87788df2ae50 21 const char CRLF = '\n';
Deixi 0:87788df2ae50 22
Deixi 0:87788df2ae50 23 //States
Deixi 0:87788df2ae50 24 const int ST_Start = 1;
Deixi 0:87788df2ae50 25 const int ST_Aut = 2;
Deixi 0:87788df2ae50 26 const int ST_Eing = 3;
Deixi 0:87788df2ae50 27 const int ST_Out = 4;
Deixi 0:87788df2ae50 28 const int ST_Fail = 5;
Deixi 0:87788df2ae50 29 const int ST_Erf = 6;
Deixi 0:87788df2ae50 30 ////----------------------------------Ticker Class---------------------------------
Deixi 0:87788df2ae50 31 class Blinker {
Deixi 0:87788df2ae50 32 public:
Deixi 0:87788df2ae50 33 Blinker(PinName pin) : _pin(pin) {
Deixi 0:87788df2ae50 34 _pin = 0;
Deixi 0:87788df2ae50 35 }
Deixi 0:87788df2ae50 36 void blink() {
Deixi 0:87788df2ae50 37 _pin = !_pin;
Deixi 0:87788df2ae50 38 }
Deixi 0:87788df2ae50 39 private:
Deixi 0:87788df2ae50 40 DigitalOut _pin;
Deixi 0:87788df2ae50 41 };
Deixi 0:87788df2ae50 42 Blinker t1(LED1);
Deixi 0:87788df2ae50 43 Blinker t2(LED2);
Deixi 0:87788df2ae50 44 Blinker t3(LED3);
Deixi 0:87788df2ae50 45 Blinker t4(LED4);
Deixi 0:87788df2ae50 46 //-------------------------------------Event Class --------------------------------------------
Deixi 0:87788df2ae50 47 class SwEvent {
Deixi 0:87788df2ae50 48 InterruptIn _isr;
Deixi 0:87788df2ae50 49 bool _pressed;
Deixi 0:87788df2ae50 50 void _RisingISR();
Deixi 0:87788df2ae50 51
Deixi 0:87788df2ae50 52 public:
Deixi 0:87788df2ae50 53 SwEvent(PinName pin) : _isr(pin) {
Deixi 0:87788df2ae50 54 _pressed = false;
Deixi 0:87788df2ae50 55 }
Deixi 0:87788df2ae50 56 int CheckFlag(); // das muss im do-Zweig (while(true) Schleife) ständig abgefragt werden
Deixi 0:87788df2ae50 57 void InitIsr();
Deixi 0:87788df2ae50 58 };
Deixi 0:87788df2ae50 59
Deixi 0:87788df2ae50 60 int SwEvent::CheckFlag() {
Deixi 0:87788df2ae50 61 if( _pressed ) {
Deixi 0:87788df2ae50 62 _pressed = false;
Deixi 0:87788df2ae50 63 return 1;
Deixi 0:87788df2ae50 64 }
Deixi 0:87788df2ae50 65 return 0;
Deixi 0:87788df2ae50 66 }
Deixi 0:87788df2ae50 67
Deixi 0:87788df2ae50 68 void SwEvent::InitIsr() {
Deixi 0:87788df2ae50 69 _isr.rise(this, &SwEvent::_RisingISR);
Deixi 0:87788df2ae50 70 }
Deixi 0:87788df2ae50 71
Deixi 0:87788df2ae50 72 void SwEvent::_RisingISR() {
Deixi 0:87788df2ae50 73 if( _isr.read() )
Deixi 0:87788df2ae50 74 _pressed = true;
Deixi 0:87788df2ae50 75 }
Deixi 0:87788df2ae50 76
Deixi 0:87788df2ae50 77 SwEvent sw2(P0_23);
Deixi 0:87788df2ae50 78 int state;
Deixi 0:87788df2ae50 79 // ---------------- Serial RS232 Event Class --------------------------
Deixi 0:87788df2ae50 80 class SerialEvent {
Deixi 0:87788df2ae50 81 Serial _pc;
Deixi 0:87788df2ae50 82 void _risingISR();
Deixi 0:87788df2ae50 83 char _str[STRMAX];
Deixi 0:87788df2ae50 84 volatile bool _strOkFlag;
Deixi 0:87788df2ae50 85 int _index;
Deixi 0:87788df2ae50 86
Deixi 0:87788df2ae50 87
Deixi 0:87788df2ae50 88 public:
Deixi 0:87788df2ae50 89 SerialEvent(PinName tx, PinName rx) : _pc(tx, rx) { // create the Serial on the pin specified to SwEvent
Deixi 0:87788df2ae50 90 _pc.attach(this, &SerialEvent::pc_recv); // attach DataReceive-function of this SerialEvent instance
Deixi 0:87788df2ae50 91 _strOkFlag = false;
Deixi 0:87788df2ae50 92 _index=0;
Deixi 0:87788df2ae50 93
Deixi 0:87788df2ae50 94 }
Deixi 0:87788df2ae50 95 void pc_recv();
Deixi 0:87788df2ae50 96 void getString(char st[]);
Deixi 0:87788df2ae50 97 int checkFlag(); // must in do-condition (while(true)-loop) continuously interrogated
Deixi 0:87788df2ae50 98 };
Deixi 0:87788df2ae50 99 SerialEvent se(USBTX, USBRX);
Deixi 0:87788df2ae50 100 // ---------------- Serial Event Class Methodes --------------------------
Deixi 0:87788df2ae50 101 void SerialEvent::getString(char st[]) {
Deixi 0:87788df2ae50 102 for( int i=0; i <= _index; i++)
Deixi 0:87788df2ae50 103 st[i] = _str[i];
Deixi 0:87788df2ae50 104 _index=0;
Deixi 0:87788df2ae50 105 }
Deixi 0:87788df2ae50 106
Deixi 0:87788df2ae50 107 void SerialEvent::pc_recv() {
Deixi 0:87788df2ae50 108 char c;
Deixi 0:87788df2ae50 109 while(_pc.readable()){
Deixi 0:87788df2ae50 110 c = _pc.getc();
Deixi 0:87788df2ae50 111 if((c != CRLF) && (_index < STRMAX)) {
Deixi 0:87788df2ae50 112 _str[_index++] = c;
Deixi 0:87788df2ae50 113 }
Deixi 0:87788df2ae50 114 }
Deixi 0:87788df2ae50 115 if(( c == EOT)) { // end: . string not empty
Deixi 0:87788df2ae50 116 if(_index >= 1) {
Deixi 0:87788df2ae50 117 _strOkFlag = true;
Deixi 0:87788df2ae50 118 _str[--_index] = 0;
Deixi 0:87788df2ae50 119 }
Deixi 0:87788df2ae50 120 }
Deixi 0:87788df2ae50 121 }
Deixi 0:87788df2ae50 122
Deixi 0:87788df2ae50 123 int SerialEvent::checkFlag() {
Deixi 0:87788df2ae50 124 if( _strOkFlag ) {
Deixi 0:87788df2ae50 125 _strOkFlag = false;
Deixi 0:87788df2ae50 126 return 1;
Deixi 0:87788df2ae50 127 }
Deixi 0:87788df2ae50 128 return 0;
Deixi 0:87788df2ae50 129 }
Deixi 0:87788df2ae50 130 //-----------------------------------Zufall--------------------------------------------
Deixi 0:87788df2ae50 131 void gen_random(char *s, const int len) {
Deixi 0:87788df2ae50 132 static const char alphanum[] =
Deixi 0:87788df2ae50 133 "0123456789"
Deixi 0:87788df2ae50 134 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Deixi 0:87788df2ae50 135 "abcdefghijklmnopqrstuvwxyz";
Deixi 0:87788df2ae50 136
Deixi 0:87788df2ae50 137 for (int i = 0; i < len; ++i) {
Deixi 0:87788df2ae50 138 s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
Deixi 0:87788df2ae50 139 }
Deixi 0:87788df2ae50 140
Deixi 0:87788df2ae50 141 s[len] = 0;
Deixi 0:87788df2ae50 142 }
Deixi 0:87788df2ae50 143 //-----------------------------------STM class------------------------------------------
Deixi 0:87788df2ae50 144
Deixi 0:87788df2ae50 145 class STM {
Deixi 0:87788df2ae50 146 public:
Deixi 0:87788df2ae50 147 int fails;
Deixi 0:87788df2ae50 148 STM() {state = ST_Start;
Deixi 0:87788df2ae50 149 fails=0;}
Deixi 0:87788df2ae50 150 void start();
Deixi 0:87788df2ae50 151 void auforderung();
Deixi 0:87788df2ae50 152 void eingabe();
Deixi 0:87788df2ae50 153 void timeout();
Deixi 0:87788df2ae50 154 void fail();
Deixi 0:87788df2ae50 155 void erfolg();
Deixi 0:87788df2ae50 156
Deixi 0:87788df2ae50 157 };
Deixi 0:87788df2ae50 158 void STM::start()
Deixi 0:87788df2ae50 159 {
Deixi 0:87788df2ae50 160 //entry
Deixi 0:87788df2ae50 161 //do
Deixi 0:87788df2ae50 162 tick1.detach();
Deixi 0:87788df2ae50 163 tick2.detach();
Deixi 0:87788df2ae50 164 tick3.detach();
Deixi 0:87788df2ae50 165 tick4.detach();
Deixi 0:87788df2ae50 166 led[0]=0;
Deixi 0:87788df2ae50 167 led[1]=0;
Deixi 0:87788df2ae50 168 led[2]=0;
Deixi 0:87788df2ae50 169 led[3]=0;
Deixi 0:87788df2ae50 170 tick1.attach(&t1, &Blinker::blink, 1.0);
Deixi 0:87788df2ae50 171 pc.printf("Das ist ein Begruesungstext -Hallo-\n");
Deixi 0:87788df2ae50 172 pc.printf("Bitte Taste 2 druecken um zu Authentifizieren\n");
Deixi 0:87788df2ae50 173 //exit
Deixi 0:87788df2ae50 174 state = ST_Aut;
Deixi 0:87788df2ae50 175 }
Deixi 0:87788df2ae50 176 void STM::auforderung()
Deixi 0:87788df2ae50 177 {
Deixi 0:87788df2ae50 178 //entry
Deixi 0:87788df2ae50 179 while(true){
Deixi 0:87788df2ae50 180 led[7] = 1;
Deixi 0:87788df2ae50 181 if(sw2.CheckFlag()){
Deixi 0:87788df2ae50 182 led[7]=0;
Deixi 0:87788df2ae50 183 tick1.detach();
Deixi 0:87788df2ae50 184 tick2.detach();
Deixi 0:87788df2ae50 185 tick3.detach();
Deixi 0:87788df2ae50 186 tick4.detach();
Deixi 0:87788df2ae50 187 led[0]=0;
Deixi 0:87788df2ae50 188 led[1]=0;
Deixi 0:87788df2ae50 189 led[2]=0;
Deixi 0:87788df2ae50 190 led[3]=0;
Deixi 0:87788df2ae50 191 tick2.attach(&t2, &Blinker::blink, 0.2);
Deixi 0:87788df2ae50 192 state = ST_Eing;
Deixi 0:87788df2ae50 193 return;
Deixi 0:87788df2ae50 194 }
Deixi 0:87788df2ae50 195 }
Deixi 0:87788df2ae50 196 //do
Deixi 0:87788df2ae50 197 //exit
Deixi 0:87788df2ae50 198 }
Deixi 0:87788df2ae50 199 void STM::eingabe()
Deixi 0:87788df2ae50 200 {
Deixi 0:87788df2ae50 201 //entry
Deixi 0:87788df2ae50 202 char ghash[27];
Deixi 0:87788df2ae50 203 char ehash[27];
Deixi 0:87788df2ae50 204 bool equal=false;
Deixi 0:87788df2ae50 205 //do
Deixi 0:87788df2ae50 206 pc.printf("Geben sie diesen Hash ein\n");
Deixi 0:87788df2ae50 207 gen_random(ghash, 5);
Deixi 0:87788df2ae50 208 pc.printf("%s\n",ghash);
Deixi 0:87788df2ae50 209 timer.start();
Deixi 0:87788df2ae50 210 while(true){
Deixi 0:87788df2ae50 211 if(se.checkFlag()){
Deixi 0:87788df2ae50 212 se.getString(ehash);
Deixi 0:87788df2ae50 213 //pc.printf("%s\n",ehash);
Deixi 0:87788df2ae50 214 equal = !strcmp(ehash,ghash);
Deixi 0:87788df2ae50 215 if(fails==3){
Deixi 0:87788df2ae50 216 state= ST_Out;
Deixi 0:87788df2ae50 217 return;
Deixi 0:87788df2ae50 218 }
Deixi 0:87788df2ae50 219 if (equal){
Deixi 0:87788df2ae50 220 state= ST_Erf;
Deixi 0:87788df2ae50 221 return;
Deixi 0:87788df2ae50 222 }
Deixi 0:87788df2ae50 223 else{
Deixi 0:87788df2ae50 224 state= ST_Fail;
Deixi 0:87788df2ae50 225 return;
Deixi 0:87788df2ae50 226 }
Deixi 0:87788df2ae50 227 }
Deixi 0:87788df2ae50 228 }
Deixi 0:87788df2ae50 229 //exit
Deixi 0:87788df2ae50 230 }
Deixi 0:87788df2ae50 231 void STM::timeout()
Deixi 0:87788df2ae50 232 {
Deixi 0:87788df2ae50 233 //entry
Deixi 0:87788df2ae50 234 tick1.detach();
Deixi 0:87788df2ae50 235 tick2.detach();
Deixi 0:87788df2ae50 236 tick3.detach();
Deixi 0:87788df2ae50 237 tick4.detach();
Deixi 0:87788df2ae50 238 led[0]=0;
Deixi 0:87788df2ae50 239 led[1]=0;
Deixi 0:87788df2ae50 240 led[2]=0;
Deixi 0:87788df2ae50 241 led[3]=0;
Deixi 0:87788df2ae50 242 fails=0;
Deixi 0:87788df2ae50 243 //do
Deixi 0:87788df2ae50 244 timer.stop();
Deixi 0:87788df2ae50 245 pc.printf("Nach %f sind die versucheabgelaufen\n", timer.read());
Deixi 0:87788df2ae50 246 tick1.attach(&t1, &Blinker::blink, 0.2);
Deixi 0:87788df2ae50 247 tick2.attach(&t2, &Blinker::blink, 0.2);
Deixi 0:87788df2ae50 248 tick3.attach(&t3, &Blinker::blink, 0.2);
Deixi 0:87788df2ae50 249 tick4.attach(&t4, &Blinker::blink, 0.2);
Deixi 0:87788df2ae50 250 //exit
Deixi 0:87788df2ae50 251 state =ST_Aut;
Deixi 0:87788df2ae50 252 pc.printf("Bitte Taste 2 druecken um zu Authentifizieren\n");
Deixi 0:87788df2ae50 253 }
Deixi 0:87788df2ae50 254 void STM::fail()
Deixi 0:87788df2ae50 255 {
Deixi 0:87788df2ae50 256 //entry
Deixi 0:87788df2ae50 257 tick1.detach();
Deixi 0:87788df2ae50 258 tick2.detach();
Deixi 0:87788df2ae50 259 tick3.detach();
Deixi 0:87788df2ae50 260 tick4.detach();
Deixi 0:87788df2ae50 261 led[0]=0;
Deixi 0:87788df2ae50 262 led[1]=0;
Deixi 0:87788df2ae50 263 led[2]=0;
Deixi 0:87788df2ae50 264 led[3]=0;
Deixi 0:87788df2ae50 265 //do
Deixi 0:87788df2ae50 266 tick1.attach(&t1, &Blinker::blink, 0.1);
Deixi 0:87788df2ae50 267 tick2.attach(&t2, &Blinker::blink, 0.1);
Deixi 0:87788df2ae50 268 tick3.attach(&t3, &Blinker::blink, 0.1);
Deixi 0:87788df2ae50 269 tick4.attach(&t4, &Blinker::blink, 0.1);
Deixi 0:87788df2ae50 270 fails+=1;
Deixi 0:87788df2ae50 271 //exit
Deixi 0:87788df2ae50 272 state = ST_Eing;
Deixi 0:87788df2ae50 273 }
Deixi 0:87788df2ae50 274 void STM::erfolg()
Deixi 0:87788df2ae50 275 {
Deixi 0:87788df2ae50 276 //entry
Deixi 0:87788df2ae50 277 tick1.detach();
Deixi 0:87788df2ae50 278 tick2.detach();
Deixi 0:87788df2ae50 279 tick3.detach();
Deixi 0:87788df2ae50 280 tick4.detach();
Deixi 0:87788df2ae50 281 led[0]=0;
Deixi 0:87788df2ae50 282 led[1]=0;
Deixi 0:87788df2ae50 283 led[2]=0;
Deixi 0:87788df2ae50 284 led[3]=0;
Deixi 0:87788df2ae50 285 char text[27];
Deixi 0:87788df2ae50 286 int Nr=0;
Deixi 0:87788df2ae50 287 int length=0;
Deixi 0:87788df2ae50 288 char nix;
Deixi 0:87788df2ae50 289 fails = 0;
Deixi 0:87788df2ae50 290 //do
Deixi 0:87788df2ae50 291 timer.stop();
Deixi 0:87788df2ae50 292 pc.printf("Nach %fs wurde eien erfolgreiche Enigabe volzogen\n", timer.read());
Deixi 0:87788df2ae50 293 led[0]=1;
Deixi 0:87788df2ae50 294 led[1]=1;
Deixi 0:87788df2ae50 295 led[2]=1;
Deixi 0:87788df2ae50 296 led[3]=1;
Deixi 0:87788df2ae50 297 timer.reset();
Deixi 0:87788df2ae50 298 while(true){
Deixi 0:87788df2ae50 299 if(se.checkFlag()){
Deixi 0:87788df2ae50 300 se.getString(text);
Deixi 0:87788df2ae50 301 if(!strcmp(text,""))
Deixi 0:87788df2ae50 302 {
Deixi 0:87788df2ae50 303 state = ST_Aut;
Deixi 0:87788df2ae50 304 led[0]=0;
Deixi 0:87788df2ae50 305 led[1]=0;
Deixi 0:87788df2ae50 306 led[2]=0;
Deixi 0:87788df2ae50 307 led[3]=0;
Deixi 0:87788df2ae50 308 return;
Deixi 0:87788df2ae50 309 }
Deixi 0:87788df2ae50 310 Nr+=1;
Deixi 0:87788df2ae50 311 length=strlen(text);
Deixi 0:87788df2ae50 312 pc.printf("%i:%i>%s\n",Nr, length, text);
Deixi 0:87788df2ae50 313 length=0;
Deixi 0:87788df2ae50 314 }
Deixi 0:87788df2ae50 315 }
Deixi 0:87788df2ae50 316
Deixi 0:87788df2ae50 317 //exit
Deixi 0:87788df2ae50 318 }
Deixi 0:87788df2ae50 319 //---------------------------------------Hauptprogramm-----------------------------
Deixi 0:87788df2ae50 320
Deixi 0:87788df2ae50 321 STM stm;
Deixi 0:87788df2ae50 322
Deixi 0:87788df2ae50 323 void stateMachine(){
Deixi 0:87788df2ae50 324 switch(state)
Deixi 0:87788df2ae50 325 {
Deixi 0:87788df2ae50 326 case ST_Start: stm.start();
Deixi 0:87788df2ae50 327 break;
Deixi 0:87788df2ae50 328 case ST_Aut: stm.auforderung();
Deixi 0:87788df2ae50 329 break;
Deixi 0:87788df2ae50 330 case ST_Eing: stm.eingabe();
Deixi 0:87788df2ae50 331 break;
Deixi 0:87788df2ae50 332 case ST_Out: stm.timeout();
Deixi 0:87788df2ae50 333 break;
Deixi 0:87788df2ae50 334 case ST_Fail: stm.fail();
Deixi 0:87788df2ae50 335 break;
Deixi 0:87788df2ae50 336 case ST_Erf: stm.erfolg();
Deixi 0:87788df2ae50 337 break;
Deixi 0:87788df2ae50 338 }
Deixi 0:87788df2ae50 339 }
Deixi 0:87788df2ae50 340
Deixi 0:87788df2ae50 341 int main() {
Deixi 0:87788df2ae50 342 sw2.InitIsr();
Deixi 0:87788df2ae50 343 while(1) {
Deixi 0:87788df2ae50 344 stateMachine();
Deixi 0:87788df2ae50 345 }
Deixi 0:87788df2ae50 346 }