Steven He / Mbed 2 deprecated StringMatchingFB

Dependencies:   mbed

Committer:
StevenHe
Date:
Wed Dec 01 04:38:25 2010 +0000
Revision:
0:27d3272b2be2

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
StevenHe 0:27d3272b2be2 1 #include "mbed.h"
StevenHe 0:27d3272b2be2 2
StevenHe 0:27d3272b2be2 3 #define numsamples 1
StevenHe 0:27d3272b2be2 4 #define sizeofpattern 30
StevenHe 0:27d3272b2be2 5 #define S_idle 0
StevenHe 0:27d3272b2be2 6 #define S_HostInput 1
StevenHe 0:27d3272b2be2 7 #define S_UserInput 2
StevenHe 0:27d3272b2be2 8 #define S_HostError 3
StevenHe 0:27d3272b2be2 9 #define S_UserError 4
StevenHe 0:27d3272b2be2 10 #define S_Match 5
StevenHe 0:27d3272b2be2 11
StevenHe 0:27d3272b2be2 12 // function declartion
StevenHe 0:27d3272b2be2 13 int touchSense(int Num_Charger);
StevenHe 0:27d3272b2be2 14 void displayString(int* String);
StevenHe 0:27d3272b2be2 15 void displayMessage(int NumMes);
StevenHe 0:27d3272b2be2 16
StevenHe 0:27d3272b2be2 17 // I/O declarations
StevenHe 0:27d3272b2be2 18 DigitalOut myled(LED1);
StevenHe 0:27d3272b2be2 19 AnalogIn input1(p20), input0(p17);
StevenHe 0:27d3272b2be2 20 DigitalIn charger1(p19), charger0(p16);
StevenHe 0:27d3272b2be2 21 DigitalOut ground(p18);
StevenHe 0:27d3272b2be2 22 Serial pc(USBTX, USBRX); // tx, rx
StevenHe 0:27d3272b2be2 23
StevenHe 0:27d3272b2be2 24
StevenHe 0:27d3272b2be2 25 // variable definitions
StevenHe 0:27d3272b2be2 26 int hostString[sizeofpattern];
StevenHe 0:27d3272b2be2 27 int currentState = S_idle;
StevenHe 0:27d3272b2be2 28 int nextState = S_idle;
StevenHe 0:27d3272b2be2 29 int token;
StevenHe 0:27d3272b2be2 30
StevenHe 0:27d3272b2be2 31 // interrrupt handler
StevenHe 0:27d3272b2be2 32 void ReadHost() {
StevenHe 0:27d3272b2be2 33 if (pc.readable()){
StevenHe 0:27d3272b2be2 34 token = pc.getc(); // getc returns int representation of letters and digits
StevenHe 0:27d3272b2be2 35 pc.putc(token);
StevenHe 0:27d3272b2be2 36 }
StevenHe 0:27d3272b2be2 37 }
StevenHe 0:27d3272b2be2 38
StevenHe 0:27d3272b2be2 39
StevenHe 0:27d3272b2be2 40 int main() {
StevenHe 0:27d3272b2be2 41 int i=0, j=0;
StevenHe 0:27d3272b2be2 42
StevenHe 0:27d3272b2be2 43
StevenHe 0:27d3272b2be2 44 pc.attach(&ReadHost); // retrives the input letter or digit when a serial pc generates an interrupt
StevenHe 0:27d3272b2be2 45 while (1) {
StevenHe 0:27d3272b2be2 46 token = 'n'; // n = no input
StevenHe 0:27d3272b2be2 47
StevenHe 0:27d3272b2be2 48 // accept input token from touch sensors
StevenHe 0:27d3272b2be2 49 if (touchSense(0)) {
StevenHe 0:27d3272b2be2 50 myled = 1;
StevenHe 0:27d3272b2be2 51 token = '0';
StevenHe 0:27d3272b2be2 52 pc.putc('0');
StevenHe 0:27d3272b2be2 53 } else if (touchSense(1)) {
StevenHe 0:27d3272b2be2 54 myled =1;
StevenHe 0:27d3272b2be2 55 token = '1';
StevenHe 0:27d3272b2be2 56 pc.putc('1');
StevenHe 0:27d3272b2be2 57 } else myled = 0;
StevenHe 0:27d3272b2be2 58
StevenHe 0:27d3272b2be2 59
StevenHe 0:27d3272b2be2 60 // debug output
StevenHe 0:27d3272b2be2 61 if (token=='m') {
StevenHe 0:27d3272b2be2 62 printf("current token is %d \n", token);
StevenHe 0:27d3272b2be2 63 printf("current j and jth element are %d %d \n", j, hostString[j]);
StevenHe 0:27d3272b2be2 64 printf("The string received from host is");
StevenHe 0:27d3272b2be2 65 displayString(hostString);
StevenHe 0:27d3272b2be2 66 printf("current state and next state are %d %d \n", currentState, nextState);
StevenHe 0:27d3272b2be2 67 }
StevenHe 0:27d3272b2be2 68
StevenHe 0:27d3272b2be2 69
StevenHe 0:27d3272b2be2 70 if (token == 'n' ) continue; // if no input, skip this cycle
StevenHe 0:27d3272b2be2 71
StevenHe 0:27d3272b2be2 72
StevenHe 0:27d3272b2be2 73 // deciding what next state is and generates output
StevenHe 0:27d3272b2be2 74 if (currentState == S_idle) {
StevenHe 0:27d3272b2be2 75 if (token == 'S' ) nextState = S_HostInput;
StevenHe 0:27d3272b2be2 76 else {
StevenHe 0:27d3272b2be2 77 nextState = currentState;
StevenHe 0:27d3272b2be2 78 displayMessage(1);
StevenHe 0:27d3272b2be2 79 }
StevenHe 0:27d3272b2be2 80 }
StevenHe 0:27d3272b2be2 81
StevenHe 0:27d3272b2be2 82
StevenHe 0:27d3272b2be2 83 else if (currentState == S_HostInput) {
StevenHe 0:27d3272b2be2 84 if ((token == '0' || token == '1') && i < sizeofpattern) {
StevenHe 0:27d3272b2be2 85 hostString[i] = token;
StevenHe 0:27d3272b2be2 86 i++;
StevenHe 0:27d3272b2be2 87 nextState = currentState; // remain in the same state
StevenHe 0:27d3272b2be2 88 }
StevenHe 0:27d3272b2be2 89 //
StevenHe 0:27d3272b2be2 90 else if (token == 'm') nextState = currentState;
StevenHe 0:27d3272b2be2 91 //
StevenHe 0:27d3272b2be2 92 else if (token == 'E') nextState = S_UserInput;
StevenHe 0:27d3272b2be2 93 else { // S_HostError
StevenHe 0:27d3272b2be2 94 displayMessage(1);
StevenHe 0:27d3272b2be2 95 nextState = S_idle;
StevenHe 0:27d3272b2be2 96 i = 0;
StevenHe 0:27d3272b2be2 97 }
StevenHe 0:27d3272b2be2 98 }
StevenHe 0:27d3272b2be2 99
StevenHe 0:27d3272b2be2 100 else if (currentState == S_UserInput) {
StevenHe 0:27d3272b2be2 101
StevenHe 0:27d3272b2be2 102 if (hostString[j] == token) {
StevenHe 0:27d3272b2be2 103 nextState = currentState;
StevenHe 0:27d3272b2be2 104 j++;
StevenHe 0:27d3272b2be2 105 if (j==i) {
StevenHe 0:27d3272b2be2 106 displayMessage(3); // S_Match
StevenHe 0:27d3272b2be2 107 nextState = S_idle;
StevenHe 0:27d3272b2be2 108 j =0;
StevenHe 0:27d3272b2be2 109 i=0;
StevenHe 0:27d3272b2be2 110 }
StevenHe 0:27d3272b2be2 111 }
StevenHe 0:27d3272b2be2 112
StevenHe 0:27d3272b2be2 113 //
StevenHe 0:27d3272b2be2 114 else if (token == 'm') nextState = currentState;
StevenHe 0:27d3272b2be2 115 //
StevenHe 0:27d3272b2be2 116 else { // S_UserError
StevenHe 0:27d3272b2be2 117 displayMessage(0);
StevenHe 0:27d3272b2be2 118 nextState = S_UserInput;
StevenHe 0:27d3272b2be2 119 j = 0;
StevenHe 0:27d3272b2be2 120 }
StevenHe 0:27d3272b2be2 121 }
StevenHe 0:27d3272b2be2 122
StevenHe 0:27d3272b2be2 123
StevenHe 0:27d3272b2be2 124 /* else if (currentState == S_Match) {
StevenHe 0:27d3272b2be2 125 displayMessage(3);
StevenHe 0:27d3272b2be2 126 nextState = S_idle;
StevenHe 0:27d3272b2be2 127 j =0;
StevenHe 0:27d3272b2be2 128 i=0;
StevenHe 0:27d3272b2be2 129 }
StevenHe 0:27d3272b2be2 130
StevenHe 0:27d3272b2be2 131
StevenHe 0:27d3272b2be2 132 else if (currentState == S_HostError) {
StevenHe 0:27d3272b2be2 133 displayMessage(1);
StevenHe 0:27d3272b2be2 134 nextState = S_idle;
StevenHe 0:27d3272b2be2 135 i = 0;
StevenHe 0:27d3272b2be2 136 }
StevenHe 0:27d3272b2be2 137
StevenHe 0:27d3272b2be2 138
StevenHe 0:27d3272b2be2 139 else if (currentState == S_UserError) {
StevenHe 0:27d3272b2be2 140 displayMessage(0);
StevenHe 0:27d3272b2be2 141 nextState = S_UserInput;
StevenHe 0:27d3272b2be2 142 j = 0;
StevenHe 0:27d3272b2be2 143 } */
StevenHe 0:27d3272b2be2 144
StevenHe 0:27d3272b2be2 145
StevenHe 0:27d3272b2be2 146
StevenHe 0:27d3272b2be2 147
StevenHe 0:27d3272b2be2 148
StevenHe 0:27d3272b2be2 149 // state transition
StevenHe 0:27d3272b2be2 150 currentState = nextState;
StevenHe 0:27d3272b2be2 151
StevenHe 0:27d3272b2be2 152 }// end of while
StevenHe 0:27d3272b2be2 153
StevenHe 0:27d3272b2be2 154 } // end of main
StevenHe 0:27d3272b2be2 155
StevenHe 0:27d3272b2be2 156
StevenHe 0:27d3272b2be2 157 int touchSense(int Num_Charger) {
StevenHe 0:27d3272b2be2 158 float sample1, sample2;
StevenHe 0:27d3272b2be2 159 ground = 0;
StevenHe 0:27d3272b2be2 160 if (Num_Charger ==1) {
StevenHe 0:27d3272b2be2 161 charger1.mode(PullUp);
StevenHe 0:27d3272b2be2 162 charger1.mode(PullNone);
StevenHe 0:27d3272b2be2 163 sample1=input1.read(); // take two samples to ignore temp jump
StevenHe 0:27d3272b2be2 164 wait(0.2);
StevenHe 0:27d3272b2be2 165 sample2=input1.read();
StevenHe 0:27d3272b2be2 166 } else {
StevenHe 0:27d3272b2be2 167 charger0.mode(PullUp);
StevenHe 0:27d3272b2be2 168 charger0.mode(PullNone);
StevenHe 0:27d3272b2be2 169 sample1=input0.read(); // take two samples to ignore temp jump
StevenHe 0:27d3272b2be2 170 wait(0.2);
StevenHe 0:27d3272b2be2 171 sample2=input0.read();
StevenHe 0:27d3272b2be2 172 }
StevenHe 0:27d3272b2be2 173
StevenHe 0:27d3272b2be2 174 if (sample1 < 0.3 && sample2 < 0.3) {
StevenHe 0:27d3272b2be2 175 return 1;
StevenHe 0:27d3272b2be2 176 } else {
StevenHe 0:27d3272b2be2 177 return 0;
StevenHe 0:27d3272b2be2 178 }
StevenHe 0:27d3272b2be2 179 }
StevenHe 0:27d3272b2be2 180
StevenHe 0:27d3272b2be2 181 // debugging output
StevenHe 0:27d3272b2be2 182 void displayString(int* String) {
StevenHe 0:27d3272b2be2 183 for (int j=0; j<sizeofpattern; j++)
StevenHe 0:27d3272b2be2 184 pc.putc(String[j]);
StevenHe 0:27d3272b2be2 185
StevenHe 0:27d3272b2be2 186 pc.putc('\n');
StevenHe 0:27d3272b2be2 187
StevenHe 0:27d3272b2be2 188 }
StevenHe 0:27d3272b2be2 189
StevenHe 0:27d3272b2be2 190 void displayMessage(int NumMes) {
StevenHe 0:27d3272b2be2 191 if (NumMes == 1)
StevenHe 0:27d3272b2be2 192 printf("HOST ERROR : Host must send string in the form of Sxxxx...E X=0 or 1 \n");
StevenHe 0:27d3272b2be2 193 else if (NumMes == 0) printf("TOUCH ERROR: Please enter the string that matched host string exactly through touchsensor\n");
StevenHe 0:27d3272b2be2 194 else printf("MATCH: Host will send another string\n");
StevenHe 0:27d3272b2be2 195
StevenHe 0:27d3272b2be2 196 }