Jiwen Cai / Mbed 2 deprecated HW2-2
Committer:
goodcjw
Date:
Tue Nov 30 23:52:45 2010 +0000
Revision:
0:0036725a5dc3

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
goodcjw 0:0036725a5dc3 1 #include "mbed.h"
goodcjw 0:0036725a5dc3 2
goodcjw 0:0036725a5dc3 3 const int TRIGGER_LEN = 128;
goodcjw 0:0036725a5dc3 4 const int NBUFF = 10;
goodcjw 0:0036725a5dc3 5
goodcjw 0:0036725a5dc3 6 typedef enum {s_Init, s_Input} PC_State;
goodcjw 0:0036725a5dc3 7
goodcjw 0:0036725a5dc3 8 DigitalOut myled_1(LED1);
goodcjw 0:0036725a5dc3 9 DigitalOut myled_2(LED2);
goodcjw 0:0036725a5dc3 10 AnalogIn input_1(p17);
goodcjw 0:0036725a5dc3 11 AnalogIn input_2(p20);
goodcjw 0:0036725a5dc3 12 DigitalIn charger_1(p16);
goodcjw 0:0036725a5dc3 13 DigitalIn charger_2(p19);
goodcjw 0:0036725a5dc3 14 DigitalOut ground_1(p15);
goodcjw 0:0036725a5dc3 15 DigitalOut ground_2(p18);
goodcjw 0:0036725a5dc3 16 Serial pc(USBTX, USBRX); // tx, rx
goodcjw 0:0036725a5dc3 17
goodcjw 0:0036725a5dc3 18 int buff_1, buff_2;
goodcjw 0:0036725a5dc3 19 int last_1, last_2;
goodcjw 0:0036725a5dc3 20 char key;
goodcjw 0:0036725a5dc3 21
goodcjw 0:0036725a5dc3 22 // PC_State pc_State = s_Init;
goodcjw 0:0036725a5dc3 23 char tmptr[TRIGGER_LEN];
goodcjw 0:0036725a5dc3 24 char trigger[TRIGGER_LEN];
goodcjw 0:0036725a5dc3 25 char detectW[TRIGGER_LEN];
goodcjw 0:0036725a5dc3 26 size_t tmp_len, tr_len;
goodcjw 0:0036725a5dc3 27 size_t window_sz, match_len;
goodcjw 0:0036725a5dc3 28
goodcjw 0:0036725a5dc3 29 bool pcinput; // then true, PC is reading input from the host. Otherwise, wait user press the 'S' button.
goodcjw 0:0036725a5dc3 30 void getSerialInput();
goodcjw 0:0036725a5dc3 31 int touchSense_1(void);
goodcjw 0:0036725a5dc3 32 int touchSense_2(void);
goodcjw 0:0036725a5dc3 33 int buttonTouched();
goodcjw 0:0036725a5dc3 34 char readTouchInput();
goodcjw 0:0036725a5dc3 35 int isIdentity(char* cp1, char* cp2, size_t len);
goodcjw 0:0036725a5dc3 36 void windowShift(char* wpt, size_t len);
goodcjw 0:0036725a5dc3 37 void printDetectWindow(char* wpt, size_t len);
goodcjw 0:0036725a5dc3 38
goodcjw 0:0036725a5dc3 39 int main() {
goodcjw 0:0036725a5dc3 40 tmp_len = 0;
goodcjw 0:0036725a5dc3 41 tr_len = 0;
goodcjw 0:0036725a5dc3 42 pcinput = 0;
goodcjw 0:0036725a5dc3 43 match_len = 0;
goodcjw 0:0036725a5dc3 44 window_sz = 0;
goodcjw 0:0036725a5dc3 45 memset(tmptr, 0, TRIGGER_LEN);
goodcjw 0:0036725a5dc3 46 memset(trigger, 0, TRIGGER_LEN);
goodcjw 0:0036725a5dc3 47 memset(detectW, 0, TRIGGER_LEN);
goodcjw 0:0036725a5dc3 48 pc.attach(&getSerialInput);
goodcjw 0:0036725a5dc3 49 pc.printf("Please input the trigger string in the format of Sbbb...bbbE\n\r");
goodcjw 0:0036725a5dc3 50 while(buttonTouched()) {
goodcjw 0:0036725a5dc3 51 if (tr_len) {
goodcjw 0:0036725a5dc3 52 if (window_sz == tr_len) {
goodcjw 0:0036725a5dc3 53 windowShift(detectW, tr_len);
goodcjw 0:0036725a5dc3 54 detectW[tr_len - 1] = key;
goodcjw 0:0036725a5dc3 55 printDetectWindow(detectW, window_sz);
goodcjw 0:0036725a5dc3 56 if (isIdentity(detectW, trigger, tr_len)) {
goodcjw 0:0036725a5dc3 57 pc.printf("MATCH\n\r");
goodcjw 0:0036725a5dc3 58 }
goodcjw 0:0036725a5dc3 59 } else {
goodcjw 0:0036725a5dc3 60 detectW[window_sz++] = key;
goodcjw 0:0036725a5dc3 61 printDetectWindow(detectW, window_sz);
goodcjw 0:0036725a5dc3 62 if (window_sz == tr_len) {
goodcjw 0:0036725a5dc3 63 if (isIdentity(detectW, trigger, tr_len)) {
goodcjw 0:0036725a5dc3 64 pc.printf("MATCH\n\r");
goodcjw 0:0036725a5dc3 65 }
goodcjw 0:0036725a5dc3 66 }
goodcjw 0:0036725a5dc3 67 }
goodcjw 0:0036725a5dc3 68 }
goodcjw 0:0036725a5dc3 69 }
goodcjw 0:0036725a5dc3 70 }
goodcjw 0:0036725a5dc3 71
goodcjw 0:0036725a5dc3 72 void getSerialInput() {
goodcjw 0:0036725a5dc3 73 char tmp_char = pc.getc();
goodcjw 0:0036725a5dc3 74 if (tmp_char == 'S') {
goodcjw 0:0036725a5dc3 75 tmp_len = 0;
goodcjw 0:0036725a5dc3 76 tr_len = 0; // If user starts to input a new trigger string
goodcjw 0:0036725a5dc3 77 // automatically disable the old one. At this period,
goodcjw 0:0036725a5dc3 78 // no touch input would be reponsed.
goodcjw 0:0036725a5dc3 79 window_sz = 0;
goodcjw 0:0036725a5dc3 80 memset(tmptr, 0, TRIGGER_LEN);
goodcjw 0:0036725a5dc3 81 pcinput = 1;
goodcjw 0:0036725a5dc3 82 pc.putc(tmp_char);
goodcjw 0:0036725a5dc3 83 } else if (tmp_char == '0' || tmp_char == '1') {
goodcjw 0:0036725a5dc3 84 if (pcinput && tmp_len != TRIGGER_LEN - 1) {
goodcjw 0:0036725a5dc3 85 tmptr[tmp_len++] = tmp_char;
goodcjw 0:0036725a5dc3 86 pc.putc(tmp_char);
goodcjw 0:0036725a5dc3 87 } else {
goodcjw 0:0036725a5dc3 88 // It is not time for input now.
goodcjw 0:0036725a5dc3 89 pc.printf("HOST ERROR\n\r");
goodcjw 0:0036725a5dc3 90 }
goodcjw 0:0036725a5dc3 91 } else if (tmp_char == 'E') {
goodcjw 0:0036725a5dc3 92 if (tmp_len == 0) {
goodcjw 0:0036725a5dc3 93 pc.printf("HOST ERROR\n\r");
goodcjw 0:0036725a5dc3 94 } else {
goodcjw 0:0036725a5dc3 95 pcinput = 0;
goodcjw 0:0036725a5dc3 96 match_len = 0;
goodcjw 0:0036725a5dc3 97 tmptr[tmp_len] = '\0';
goodcjw 0:0036725a5dc3 98 memcpy(trigger, tmptr, TRIGGER_LEN);
goodcjw 0:0036725a5dc3 99 tr_len = tmp_len;
goodcjw 0:0036725a5dc3 100 pc.putc(tmp_char);
goodcjw 0:0036725a5dc3 101 pc.printf("\n\rThe trigger string is %s\n\r", trigger);
goodcjw 0:0036725a5dc3 102 pc.printf("Please start to touch the button\n\r");
goodcjw 0:0036725a5dc3 103 pc.printf("Or you can the trigger string in the format of Sbbb...bbbE\n\r");
goodcjw 0:0036725a5dc3 104 }
goodcjw 0:0036725a5dc3 105 } else if (tmp_char == ' ') {
goodcjw 0:0036725a5dc3 106 // Simply ignore the whitespace
goodcjw 0:0036725a5dc3 107 } else {
goodcjw 0:0036725a5dc3 108 // Invalid input
goodcjw 0:0036725a5dc3 109 if (pcinput) {
goodcjw 0:0036725a5dc3 110 pc.printf("\n\rHOST ERROR\n\rS");
goodcjw 0:0036725a5dc3 111 for (int i = 0; i < tmp_len; i++) {
goodcjw 0:0036725a5dc3 112 pc.putc(tmptr[i]);
goodcjw 0:0036725a5dc3 113 }
goodcjw 0:0036725a5dc3 114 } else {
goodcjw 0:0036725a5dc3 115 pc.printf("HOST ERROR\n\r");
goodcjw 0:0036725a5dc3 116 }
goodcjw 0:0036725a5dc3 117 }
goodcjw 0:0036725a5dc3 118 }
goodcjw 0:0036725a5dc3 119
goodcjw 0:0036725a5dc3 120
goodcjw 0:0036725a5dc3 121 int buttonTouched() {
goodcjw 0:0036725a5dc3 122 key = readTouchInput();
goodcjw 0:0036725a5dc3 123 return 1;
goodcjw 0:0036725a5dc3 124 }
goodcjw 0:0036725a5dc3 125
goodcjw 0:0036725a5dc3 126 int touchSense_1(void) {
goodcjw 0:0036725a5dc3 127 float sample;
goodcjw 0:0036725a5dc3 128 ground_1 = 0;
goodcjw 0:0036725a5dc3 129 charger_1.mode(PullUp);
goodcjw 0:0036725a5dc3 130 charger_1.mode(PullNone);
goodcjw 0:0036725a5dc3 131 sample=input_1.read();
goodcjw 0:0036725a5dc3 132 if (sample < 0.3) {
goodcjw 0:0036725a5dc3 133 return 1;
goodcjw 0:0036725a5dc3 134 } else {
goodcjw 0:0036725a5dc3 135 return 0;
goodcjw 0:0036725a5dc3 136 }
goodcjw 0:0036725a5dc3 137 }
goodcjw 0:0036725a5dc3 138
goodcjw 0:0036725a5dc3 139 int touchSense_2(void) {
goodcjw 0:0036725a5dc3 140 float sample;
goodcjw 0:0036725a5dc3 141 ground_2 = 0;
goodcjw 0:0036725a5dc3 142 charger_2.mode(PullUp);
goodcjw 0:0036725a5dc3 143 charger_2.mode(PullNone);
goodcjw 0:0036725a5dc3 144 sample=input_2.read();
goodcjw 0:0036725a5dc3 145 if (sample < 0.3) {
goodcjw 0:0036725a5dc3 146 return 1;
goodcjw 0:0036725a5dc3 147 } else {
goodcjw 0:0036725a5dc3 148 return 0;
goodcjw 0:0036725a5dc3 149 }
goodcjw 0:0036725a5dc3 150 }
goodcjw 0:0036725a5dc3 151
goodcjw 0:0036725a5dc3 152 /*
goodcjw 0:0036725a5dc3 153 * In this implementation, "multicouch" is naturely not supported.
goodcjw 0:0036725a5dc3 154 * When two button is touch at the same time, '0' will be always returned
goodcjw 0:0036725a5dc3 155 * instead of '1'.
goodcjw 0:0036725a5dc3 156 */
goodcjw 0:0036725a5dc3 157 char readTouchInput() {
goodcjw 0:0036725a5dc3 158 while (1) {
goodcjw 0:0036725a5dc3 159 if (touchSense_1()) {
goodcjw 0:0036725a5dc3 160 myled_1 = 1;
goodcjw 0:0036725a5dc3 161 if (!last_1) {
goodcjw 0:0036725a5dc3 162 last_1 = 1;
goodcjw 0:0036725a5dc3 163 buff_1 = NBUFF;
goodcjw 0:0036725a5dc3 164 }
goodcjw 0:0036725a5dc3 165 } else {
goodcjw 0:0036725a5dc3 166 if (last_1) {
goodcjw 0:0036725a5dc3 167 last_1 = 0;
goodcjw 0:0036725a5dc3 168 } else {
goodcjw 0:0036725a5dc3 169 if (buff_1 == 0) {
goodcjw 0:0036725a5dc3 170 if (myled_1) {
goodcjw 0:0036725a5dc3 171 myled_1 = 0;
goodcjw 0:0036725a5dc3 172 return '0';
goodcjw 0:0036725a5dc3 173 }
goodcjw 0:0036725a5dc3 174 } else {
goodcjw 0:0036725a5dc3 175 buff_1--;
goodcjw 0:0036725a5dc3 176 }
goodcjw 0:0036725a5dc3 177 }
goodcjw 0:0036725a5dc3 178 }
goodcjw 0:0036725a5dc3 179 if (touchSense_2()) {
goodcjw 0:0036725a5dc3 180 myled_2 = 1;
goodcjw 0:0036725a5dc3 181 if (!last_2) {
goodcjw 0:0036725a5dc3 182 last_2 = 1;
goodcjw 0:0036725a5dc3 183 buff_2 = NBUFF;
goodcjw 0:0036725a5dc3 184 }
goodcjw 0:0036725a5dc3 185 } else {
goodcjw 0:0036725a5dc3 186 if (last_2) {
goodcjw 0:0036725a5dc3 187 last_2 = 0;
goodcjw 0:0036725a5dc3 188 } else {
goodcjw 0:0036725a5dc3 189 if (buff_2 == 0) {
goodcjw 0:0036725a5dc3 190 if (myled_2) {
goodcjw 0:0036725a5dc3 191 myled_2 = 0;
goodcjw 0:0036725a5dc3 192 return '1';
goodcjw 0:0036725a5dc3 193 }
goodcjw 0:0036725a5dc3 194 } else {
goodcjw 0:0036725a5dc3 195 buff_2--;
goodcjw 0:0036725a5dc3 196 }
goodcjw 0:0036725a5dc3 197 }
goodcjw 0:0036725a5dc3 198 }
goodcjw 0:0036725a5dc3 199 wait(0.005);
goodcjw 0:0036725a5dc3 200 }
goodcjw 0:0036725a5dc3 201 }
goodcjw 0:0036725a5dc3 202
goodcjw 0:0036725a5dc3 203 int isIdentity(char* cp1, char* cp2, size_t len) {
goodcjw 0:0036725a5dc3 204 for (int i = 0; i != len; i++) {
goodcjw 0:0036725a5dc3 205 if (cp1[i] != cp2[i]) {
goodcjw 0:0036725a5dc3 206 return 0;
goodcjw 0:0036725a5dc3 207 }
goodcjw 0:0036725a5dc3 208 }
goodcjw 0:0036725a5dc3 209 return 1;
goodcjw 0:0036725a5dc3 210 }
goodcjw 0:0036725a5dc3 211
goodcjw 0:0036725a5dc3 212 void windowShift(char* wpt, size_t len) {
goodcjw 0:0036725a5dc3 213 for (int i = 0; i != len - 1; i++) {
goodcjw 0:0036725a5dc3 214 wpt[i] = wpt[i + 1];
goodcjw 0:0036725a5dc3 215 }
goodcjw 0:0036725a5dc3 216 }
goodcjw 0:0036725a5dc3 217
goodcjw 0:0036725a5dc3 218 void printDetectWindow(char* wpt, size_t len) {
goodcjw 0:0036725a5dc3 219 pc.printf("Current detection window: ");
goodcjw 0:0036725a5dc3 220 for (int i = 0; i != len; i++) {
goodcjw 0:0036725a5dc3 221 pc.putc(wpt[i]);
goodcjw 0:0036725a5dc3 222 }
goodcjw 0:0036725a5dc3 223 pc.printf("\n\r");
goodcjw 0:0036725a5dc3 224 }