Jiwen Cai / Mbed 2 deprecated HW2-1
Committer:
goodcjw
Date:
Tue Nov 30 23:52:14 2010 +0000
Revision:
0:71adeb0ac6a2

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
goodcjw 0:71adeb0ac6a2 1 #include "mbed.h"
goodcjw 0:71adeb0ac6a2 2
goodcjw 0:71adeb0ac6a2 3 #define NBUFF 10
goodcjw 0:71adeb0ac6a2 4
goodcjw 0:71adeb0ac6a2 5 typedef enum {s_0, s_HI, s_HE, s_WD, s_WI, s_TE, s_M} State_t;
goodcjw 0:71adeb0ac6a2 6 typedef enum {e_InvalidInput, e_ValidInput, e_DetectMatch, e_Start, e_1, e_0, e_E} Event_t;
goodcjw 0:71adeb0ac6a2 7
goodcjw 0:71adeb0ac6a2 8 int touchSense_1(void);
goodcjw 0:71adeb0ac6a2 9 int touchSense_2(void);
goodcjw 0:71adeb0ac6a2 10 void handleEvent(Event_t ev);
goodcjw 0:71adeb0ac6a2 11 void entry_HI();
goodcjw 0:71adeb0ac6a2 12 void entry_HE();
goodcjw 0:71adeb0ac6a2 13 void entry_WD();
goodcjw 0:71adeb0ac6a2 14 void entry_WI();
goodcjw 0:71adeb0ac6a2 15 void entry_TE();
goodcjw 0:71adeb0ac6a2 16 void entry_M();
goodcjw 0:71adeb0ac6a2 17 char readTouchInput();
goodcjw 0:71adeb0ac6a2 18
goodcjw 0:71adeb0ac6a2 19 DigitalOut myled_1(LED1);
goodcjw 0:71adeb0ac6a2 20 DigitalOut myled_2(LED2);
goodcjw 0:71adeb0ac6a2 21 AnalogIn input_1(p17);
goodcjw 0:71adeb0ac6a2 22 AnalogIn input_2(p20);
goodcjw 0:71adeb0ac6a2 23 DigitalIn charger_1(p16);
goodcjw 0:71adeb0ac6a2 24 DigitalIn charger_2(p19);
goodcjw 0:71adeb0ac6a2 25 DigitalOut ground_1(p15);
goodcjw 0:71adeb0ac6a2 26 DigitalOut ground_2(p18);
goodcjw 0:71adeb0ac6a2 27 Serial pc(USBTX, USBRX); // tx, rx
goodcjw 0:71adeb0ac6a2 28
goodcjw 0:71adeb0ac6a2 29 State_t state;
goodcjw 0:71adeb0ac6a2 30 Event_t currentEv;
goodcjw 0:71adeb0ac6a2 31 char trigger[128];
goodcjw 0:71adeb0ac6a2 32 int tr_len, tr_pos;
goodcjw 0:71adeb0ac6a2 33
goodcjw 0:71adeb0ac6a2 34 int buff_1, buff_2;
goodcjw 0:71adeb0ac6a2 35 int last_1, last_2;
goodcjw 0:71adeb0ac6a2 36
goodcjw 0:71adeb0ac6a2 37 int main() {
goodcjw 0:71adeb0ac6a2 38 state = s_0;
goodcjw 0:71adeb0ac6a2 39 currentEv = e_Start;
goodcjw 0:71adeb0ac6a2 40 trigger[0] = '\0';
goodcjw 0:71adeb0ac6a2 41 tr_len = 0;
goodcjw 0:71adeb0ac6a2 42 while (1) {
goodcjw 0:71adeb0ac6a2 43 handleEvent(currentEv);
goodcjw 0:71adeb0ac6a2 44 }
goodcjw 0:71adeb0ac6a2 45 }
goodcjw 0:71adeb0ac6a2 46
goodcjw 0:71adeb0ac6a2 47 int touchSense_1(void) {
goodcjw 0:71adeb0ac6a2 48 float sample;
goodcjw 0:71adeb0ac6a2 49 ground_1 = 0;
goodcjw 0:71adeb0ac6a2 50 charger_1.mode(PullUp);
goodcjw 0:71adeb0ac6a2 51 charger_1.mode(PullNone);
goodcjw 0:71adeb0ac6a2 52 sample=input_1.read();
goodcjw 0:71adeb0ac6a2 53 if (sample < 0.3) {
goodcjw 0:71adeb0ac6a2 54 return 1;
goodcjw 0:71adeb0ac6a2 55 } else {
goodcjw 0:71adeb0ac6a2 56 return 0;
goodcjw 0:71adeb0ac6a2 57 }
goodcjw 0:71adeb0ac6a2 58 }
goodcjw 0:71adeb0ac6a2 59
goodcjw 0:71adeb0ac6a2 60 int touchSense_2(void) {
goodcjw 0:71adeb0ac6a2 61 float sample;
goodcjw 0:71adeb0ac6a2 62 ground_2 = 0;
goodcjw 0:71adeb0ac6a2 63 charger_2.mode(PullUp);
goodcjw 0:71adeb0ac6a2 64 charger_2.mode(PullNone);
goodcjw 0:71adeb0ac6a2 65 sample=input_2.read();
goodcjw 0:71adeb0ac6a2 66 if (sample < 0.3) {
goodcjw 0:71adeb0ac6a2 67 return 1;
goodcjw 0:71adeb0ac6a2 68 } else {
goodcjw 0:71adeb0ac6a2 69 return 0;
goodcjw 0:71adeb0ac6a2 70 }
goodcjw 0:71adeb0ac6a2 71 }
goodcjw 0:71adeb0ac6a2 72
goodcjw 0:71adeb0ac6a2 73 void emitEvent(Event_t ev) {
goodcjw 0:71adeb0ac6a2 74 currentEv = ev;
goodcjw 0:71adeb0ac6a2 75 }
goodcjw 0:71adeb0ac6a2 76
goodcjw 0:71adeb0ac6a2 77 void handleEvent(Event_t ev) {
goodcjw 0:71adeb0ac6a2 78 switch (state) {
goodcjw 0:71adeb0ac6a2 79 case s_0:
goodcjw 0:71adeb0ac6a2 80 if (ev == e_Start) {
goodcjw 0:71adeb0ac6a2 81 state = s_HI;
goodcjw 0:71adeb0ac6a2 82 entry_HI();
goodcjw 0:71adeb0ac6a2 83 }
goodcjw 0:71adeb0ac6a2 84 break;
goodcjw 0:71adeb0ac6a2 85 case s_HI:
goodcjw 0:71adeb0ac6a2 86 if (ev == e_ValidInput) {
goodcjw 0:71adeb0ac6a2 87 state = s_WD;
goodcjw 0:71adeb0ac6a2 88 entry_WD();
goodcjw 0:71adeb0ac6a2 89 } else if (ev == e_InvalidInput) {
goodcjw 0:71adeb0ac6a2 90 state = s_HE;
goodcjw 0:71adeb0ac6a2 91 entry_HE();
goodcjw 0:71adeb0ac6a2 92 }
goodcjw 0:71adeb0ac6a2 93 break;
goodcjw 0:71adeb0ac6a2 94 case s_HE:
goodcjw 0:71adeb0ac6a2 95 state = s_0;
goodcjw 0:71adeb0ac6a2 96 break;
goodcjw 0:71adeb0ac6a2 97 case s_WD:
goodcjw 0:71adeb0ac6a2 98 if (ev == e_0 || ev == e_1) {
goodcjw 0:71adeb0ac6a2 99 entry_WD();
goodcjw 0:71adeb0ac6a2 100 } else if (ev == e_E) {
goodcjw 0:71adeb0ac6a2 101 state = s_WI;
goodcjw 0:71adeb0ac6a2 102 entry_WI();
goodcjw 0:71adeb0ac6a2 103 } else {
goodcjw 0:71adeb0ac6a2 104 state = s_HE;
goodcjw 0:71adeb0ac6a2 105 entry_HE();
goodcjw 0:71adeb0ac6a2 106 }
goodcjw 0:71adeb0ac6a2 107 break;
goodcjw 0:71adeb0ac6a2 108 case s_WI:
goodcjw 0:71adeb0ac6a2 109 if (ev == e_InvalidInput) {
goodcjw 0:71adeb0ac6a2 110 state = s_TE;
goodcjw 0:71adeb0ac6a2 111 entry_TE();
goodcjw 0:71adeb0ac6a2 112 } else if (ev == e_DetectMatch) {
goodcjw 0:71adeb0ac6a2 113 state = s_M;
goodcjw 0:71adeb0ac6a2 114 entry_M();
goodcjw 0:71adeb0ac6a2 115 }
goodcjw 0:71adeb0ac6a2 116 break;
goodcjw 0:71adeb0ac6a2 117 case s_TE:
goodcjw 0:71adeb0ac6a2 118 state = s_0;
goodcjw 0:71adeb0ac6a2 119 break;
goodcjw 0:71adeb0ac6a2 120 case s_M:
goodcjw 0:71adeb0ac6a2 121 state = s_0;
goodcjw 0:71adeb0ac6a2 122 break;
goodcjw 0:71adeb0ac6a2 123 default:
goodcjw 0:71adeb0ac6a2 124 state = s_0;
goodcjw 0:71adeb0ac6a2 125 }
goodcjw 0:71adeb0ac6a2 126 }
goodcjw 0:71adeb0ac6a2 127
goodcjw 0:71adeb0ac6a2 128 void entry_HI() {
goodcjw 0:71adeb0ac6a2 129 tr_len = 0;
goodcjw 0:71adeb0ac6a2 130 pc.printf("Please input the trigger string in the format of Sbbb...bbbE\n\r");
goodcjw 0:71adeb0ac6a2 131 if (pc.getc() == 'S') {
goodcjw 0:71adeb0ac6a2 132 emitEvent(e_ValidInput);
goodcjw 0:71adeb0ac6a2 133 } else {
goodcjw 0:71adeb0ac6a2 134 emitEvent(e_InvalidInput);
goodcjw 0:71adeb0ac6a2 135 }
goodcjw 0:71adeb0ac6a2 136 }
goodcjw 0:71adeb0ac6a2 137
goodcjw 0:71adeb0ac6a2 138 void entry_WD() {
goodcjw 0:71adeb0ac6a2 139 switch (pc.getc()) {
goodcjw 0:71adeb0ac6a2 140 case '0':
goodcjw 0:71adeb0ac6a2 141 trigger[tr_len++] = '0';
goodcjw 0:71adeb0ac6a2 142 pc.putc('0');
goodcjw 0:71adeb0ac6a2 143 emitEvent(e_0);
goodcjw 0:71adeb0ac6a2 144 break;
goodcjw 0:71adeb0ac6a2 145 case '1':
goodcjw 0:71adeb0ac6a2 146 trigger[tr_len++] = '1';
goodcjw 0:71adeb0ac6a2 147 pc.putc('1');
goodcjw 0:71adeb0ac6a2 148 emitEvent(e_1);
goodcjw 0:71adeb0ac6a2 149 break;
goodcjw 0:71adeb0ac6a2 150 case 'E':
goodcjw 0:71adeb0ac6a2 151 if (tr_len == 0) {
goodcjw 0:71adeb0ac6a2 152 emitEvent(e_InvalidInput);
goodcjw 0:71adeb0ac6a2 153 } else {
goodcjw 0:71adeb0ac6a2 154 emitEvent(e_E);
goodcjw 0:71adeb0ac6a2 155 pc.putc('\n');
goodcjw 0:71adeb0ac6a2 156 pc.putc('\r');
goodcjw 0:71adeb0ac6a2 157 trigger[tr_len] = '\0';
goodcjw 0:71adeb0ac6a2 158 }
goodcjw 0:71adeb0ac6a2 159 break;
goodcjw 0:71adeb0ac6a2 160 case ' ':
goodcjw 0:71adeb0ac6a2 161 pc.putc(' ');
goodcjw 0:71adeb0ac6a2 162 break;
goodcjw 0:71adeb0ac6a2 163 default:
goodcjw 0:71adeb0ac6a2 164 emitEvent(e_InvalidInput);
goodcjw 0:71adeb0ac6a2 165 }
goodcjw 0:71adeb0ac6a2 166 }
goodcjw 0:71adeb0ac6a2 167
goodcjw 0:71adeb0ac6a2 168 void entry_HE() {
goodcjw 0:71adeb0ac6a2 169 pc.printf("\n\rHOST ERROR\n\r");
goodcjw 0:71adeb0ac6a2 170 emitEvent(e_Start);
goodcjw 0:71adeb0ac6a2 171 }
goodcjw 0:71adeb0ac6a2 172
goodcjw 0:71adeb0ac6a2 173 void entry_WI() {
goodcjw 0:71adeb0ac6a2 174 buff_1 = NBUFF;
goodcjw 0:71adeb0ac6a2 175 buff_2 = NBUFF;
goodcjw 0:71adeb0ac6a2 176 last_1 = 0;
goodcjw 0:71adeb0ac6a2 177 last_2 = 0;
goodcjw 0:71adeb0ac6a2 178 tr_pos = 0;
goodcjw 0:71adeb0ac6a2 179 pc.printf("The trigger string is %s\n\r", trigger);
goodcjw 0:71adeb0ac6a2 180 pc.printf("Please start to touch the button\n\r");
goodcjw 0:71adeb0ac6a2 181 while (tr_pos < tr_len) {
goodcjw 0:71adeb0ac6a2 182 if (readTouchInput() != trigger[tr_pos]) {
goodcjw 0:71adeb0ac6a2 183 emitEvent(e_InvalidInput);
goodcjw 0:71adeb0ac6a2 184 return;
goodcjw 0:71adeb0ac6a2 185 }
goodcjw 0:71adeb0ac6a2 186 pc.putc(trigger[tr_pos++]);
goodcjw 0:71adeb0ac6a2 187 }
goodcjw 0:71adeb0ac6a2 188 pc.putc('\n');
goodcjw 0:71adeb0ac6a2 189 pc.putc('\r');
goodcjw 0:71adeb0ac6a2 190 emitEvent(e_DetectMatch);
goodcjw 0:71adeb0ac6a2 191 }
goodcjw 0:71adeb0ac6a2 192
goodcjw 0:71adeb0ac6a2 193 char readTouchInput() {
goodcjw 0:71adeb0ac6a2 194 while (1) {
goodcjw 0:71adeb0ac6a2 195 if (touchSense_1()) {
goodcjw 0:71adeb0ac6a2 196 myled_1 = 1;
goodcjw 0:71adeb0ac6a2 197 if (!last_1) {
goodcjw 0:71adeb0ac6a2 198 last_1 = 1;
goodcjw 0:71adeb0ac6a2 199 buff_1 = NBUFF;
goodcjw 0:71adeb0ac6a2 200 }
goodcjw 0:71adeb0ac6a2 201 } else {
goodcjw 0:71adeb0ac6a2 202 if (last_1) {
goodcjw 0:71adeb0ac6a2 203 last_1 = 0;
goodcjw 0:71adeb0ac6a2 204 } else {
goodcjw 0:71adeb0ac6a2 205 if (buff_1 == 0) {
goodcjw 0:71adeb0ac6a2 206 if (myled_1) {
goodcjw 0:71adeb0ac6a2 207 myled_1 = 0;
goodcjw 0:71adeb0ac6a2 208 return '0';
goodcjw 0:71adeb0ac6a2 209 }
goodcjw 0:71adeb0ac6a2 210 } else {
goodcjw 0:71adeb0ac6a2 211 buff_1--;
goodcjw 0:71adeb0ac6a2 212 }
goodcjw 0:71adeb0ac6a2 213 }
goodcjw 0:71adeb0ac6a2 214 }
goodcjw 0:71adeb0ac6a2 215 if (touchSense_2()) {
goodcjw 0:71adeb0ac6a2 216 myled_2 = 1;
goodcjw 0:71adeb0ac6a2 217 if (!last_2) {
goodcjw 0:71adeb0ac6a2 218 last_2 = 1;
goodcjw 0:71adeb0ac6a2 219 buff_2 = NBUFF;
goodcjw 0:71adeb0ac6a2 220 }
goodcjw 0:71adeb0ac6a2 221 } else {
goodcjw 0:71adeb0ac6a2 222 if (last_2) {
goodcjw 0:71adeb0ac6a2 223 last_2 = 0;
goodcjw 0:71adeb0ac6a2 224 } else {
goodcjw 0:71adeb0ac6a2 225 if (buff_2 == 0) {
goodcjw 0:71adeb0ac6a2 226 if (myled_2) {
goodcjw 0:71adeb0ac6a2 227 myled_2 = 0;
goodcjw 0:71adeb0ac6a2 228 return '1';
goodcjw 0:71adeb0ac6a2 229 }
goodcjw 0:71adeb0ac6a2 230 } else {
goodcjw 0:71adeb0ac6a2 231 buff_2--;
goodcjw 0:71adeb0ac6a2 232 }
goodcjw 0:71adeb0ac6a2 233 }
goodcjw 0:71adeb0ac6a2 234 }
goodcjw 0:71adeb0ac6a2 235 wait(0.005);
goodcjw 0:71adeb0ac6a2 236 }
goodcjw 0:71adeb0ac6a2 237 }
goodcjw 0:71adeb0ac6a2 238
goodcjw 0:71adeb0ac6a2 239 void entry_TE() {
goodcjw 0:71adeb0ac6a2 240 pc.printf("\n\rTOUCH ERROR\n\r");
goodcjw 0:71adeb0ac6a2 241 emitEvent(e_Start);
goodcjw 0:71adeb0ac6a2 242 }
goodcjw 0:71adeb0ac6a2 243
goodcjw 0:71adeb0ac6a2 244 void entry_M() {
goodcjw 0:71adeb0ac6a2 245 pc.printf("MATCH\n\r");
goodcjw 0:71adeb0ac6a2 246 emitEvent(e_Start);
goodcjw 0:71adeb0ac6a2 247 }