(╯°□°)╯︵ ┻━┻

Dependencies:   mbed

Committer:
Andi104
Date:
Wed Jun 22 06:34:36 2016 +0000
Revision:
0:d43885c9d5d8
Child:
1:8727231a97ab
(??????? ???

Who changed what in which revision?

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