(╯°□°)╯︵ ┻━┻

Dependencies:   mbed

Committer:
Andi104
Date:
Wed Jun 22 06:57:54 2016 +0000
Revision:
1:8727231a97ab
Parent:
0:d43885c9d5d8
.

Who changed what in which revision?

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