Steven He / Mbed 2 deprecated StringMatchingProtothread

Dependencies:   mbed

Committer:
StevenHe
Date:
Wed Dec 01 04:39:00 2010 +0000
Revision:
0:544b5f6ad832

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
StevenHe 0:544b5f6ad832 1 #include "mbed.h"
StevenHe 0:544b5f6ad832 2 #include "pt.h"
StevenHe 0:544b5f6ad832 3
StevenHe 0:544b5f6ad832 4 #define numsamples 1
StevenHe 0:544b5f6ad832 5 #define sizeofpattern 30 // max size of string length
StevenHe 0:544b5f6ad832 6
StevenHe 0:544b5f6ad832 7
StevenHe 0:544b5f6ad832 8 // function declartion
StevenHe 0:544b5f6ad832 9 int touchSense(int Num_Charger);
StevenHe 0:544b5f6ad832 10 void displayString(int* String);
StevenHe 0:544b5f6ad832 11 void displayMessage(int NumMes);
StevenHe 0:544b5f6ad832 12
StevenHe 0:544b5f6ad832 13 // I/O declarations
StevenHe 0:544b5f6ad832 14 DigitalOut myled(LED1);
StevenHe 0:544b5f6ad832 15 AnalogIn input1(p20), input0(p17);
StevenHe 0:544b5f6ad832 16 DigitalIn charger1(p19), charger0(p16);
StevenHe 0:544b5f6ad832 17 DigitalOut ground(p18);
StevenHe 0:544b5f6ad832 18 Serial pc(USBTX, USBRX); // tx, rx
StevenHe 0:544b5f6ad832 19
StevenHe 0:544b5f6ad832 20
StevenHe 0:544b5f6ad832 21 // variable definitions
StevenHe 0:544b5f6ad832 22 int hostString[sizeofpattern];
StevenHe 0:544b5f6ad832 23 //int currentState = S_idle;
StevenHe 0:544b5f6ad832 24 //int nextState = S_idle;
StevenHe 0:544b5f6ad832 25
StevenHe 0:544b5f6ad832 26 int i, j, token;
StevenHe 0:544b5f6ad832 27 int NewTokenFlag, StateFlag; // NewTokenFlag is 1 when a token is received, otherwise 0
StevenHe 0:544b5f6ad832 28 // StateFlag is 1 when a state transition decision is made, it is sets to 2 when the system should be reset
StevenHe 0:544b5f6ad832 29
StevenHe 0:544b5f6ad832 30 // threads declarations
StevenHe 0:544b5f6ad832 31 static struct pt pt_1, pt_2;
StevenHe 0:544b5f6ad832 32
StevenHe 0:544b5f6ad832 33
StevenHe 0:544b5f6ad832 34 // FSM_transition executes FSM transition
StevenHe 0:544b5f6ad832 35 static int FSM_transition(struct pt *pt) {
StevenHe 0:544b5f6ad832 36
StevenHe 0:544b5f6ad832 37 PT_BEGIN(pt);
StevenHe 0:544b5f6ad832 38
StevenHe 0:544b5f6ad832 39 StateFlag = 1; // let IO_handler run first
StevenHe 0:544b5f6ad832 40
StevenHe 0:544b5f6ad832 41 while (1) {
StevenHe 0:544b5f6ad832 42 PT_WAIT_UNTIL(pt, (NewTokenFlag==1));
StevenHe 0:544b5f6ad832 43 if (token == 'S') {
StevenHe 0:544b5f6ad832 44 NewTokenFlag = 0;
StevenHe 0:544b5f6ad832 45 break;
StevenHe 0:544b5f6ad832 46 } else { // handle the case when the input is not S
StevenHe 0:544b5f6ad832 47 displayMessage(1);
StevenHe 0:544b5f6ad832 48 NewTokenFlag = 0;
StevenHe 0:544b5f6ad832 49 StateFlag = 1;
StevenHe 0:544b5f6ad832 50 }
StevenHe 0:544b5f6ad832 51 }
StevenHe 0:544b5f6ad832 52
StevenHe 0:544b5f6ad832 53 //
StevenHe 0:544b5f6ad832 54 //printf("S_HostInput \n");
StevenHe 0:544b5f6ad832 55 //
StevenHe 0:544b5f6ad832 56
StevenHe 0:544b5f6ad832 57 // currentState = S_HostInput
StevenHe 0:544b5f6ad832 58 i = 0;
StevenHe 0:544b5f6ad832 59 while (1) {
StevenHe 0:544b5f6ad832 60 StateFlag = 1;
StevenHe 0:544b5f6ad832 61 PT_WAIT_UNTIL(pt, NewTokenFlag);
StevenHe 0:544b5f6ad832 62 NewTokenFlag = 0;
StevenHe 0:544b5f6ad832 63 if (token=='E') break;
StevenHe 0:544b5f6ad832 64 else if ((token=='0'||token=='1')&& i<sizeofpattern) {
StevenHe 0:544b5f6ad832 65 hostString[i] = token;
StevenHe 0:544b5f6ad832 66 i++;
StevenHe 0:544b5f6ad832 67 }
StevenHe 0:544b5f6ad832 68
StevenHe 0:544b5f6ad832 69 else {
StevenHe 0:544b5f6ad832 70 displayMessage(1); // currentState = S_HostError
StevenHe 0:544b5f6ad832 71 i = 0;
StevenHe 0:544b5f6ad832 72 StateFlag =2; // indicate the system should be reset
StevenHe 0:544b5f6ad832 73 break;
StevenHe 0:544b5f6ad832 74 }
StevenHe 0:544b5f6ad832 75 }
StevenHe 0:544b5f6ad832 76
StevenHe 0:544b5f6ad832 77 if (StateFlag!=2) { // skip S_UserInput if the sysetem should be reset
StevenHe 0:544b5f6ad832 78 // currentState = S_UserInput
StevenHe 0:544b5f6ad832 79 //
StevenHe 0:544b5f6ad832 80 //printf("S_UserInput ------- \n");
StevenHe 0:544b5f6ad832 81 //
StevenHe 0:544b5f6ad832 82 j =0;
StevenHe 0:544b5f6ad832 83 while (1) {
StevenHe 0:544b5f6ad832 84 StateFlag = 1;
StevenHe 0:544b5f6ad832 85 PT_WAIT_UNTIL(pt, NewTokenFlag);
StevenHe 0:544b5f6ad832 86 NewTokenFlag = 0;
StevenHe 0:544b5f6ad832 87
StevenHe 0:544b5f6ad832 88 if (hostString[j]==token) {
StevenHe 0:544b5f6ad832 89 j++;
StevenHe 0:544b5f6ad832 90 if (j==i) {
StevenHe 0:544b5f6ad832 91 displayMessage(2); // currentState = S_Match
StevenHe 0:544b5f6ad832 92 break;
StevenHe 0:544b5f6ad832 93 }
StevenHe 0:544b5f6ad832 94 } else {
StevenHe 0:544b5f6ad832 95 displayMessage(0); // currentState = S_UserError
StevenHe 0:544b5f6ad832 96 j = 0;
StevenHe 0:544b5f6ad832 97 continue; // returns S_UserInput
StevenHe 0:544b5f6ad832 98 }
StevenHe 0:544b5f6ad832 99
StevenHe 0:544b5f6ad832 100 StateFlag = 2; // indicates the system should be reset
StevenHe 0:544b5f6ad832 101 } // end of while
StevenHe 0:544b5f6ad832 102 } // end of skip
StevenHe 0:544b5f6ad832 103
StevenHe 0:544b5f6ad832 104 PT_END(pt);
StevenHe 0:544b5f6ad832 105 }
StevenHe 0:544b5f6ad832 106
StevenHe 0:544b5f6ad832 107
StevenHe 0:544b5f6ad832 108 // IO_handler polls the I/O ports
StevenHe 0:544b5f6ad832 109 static int IO_Handler(struct pt *pt) {
StevenHe 0:544b5f6ad832 110 PT_BEGIN(pt);
StevenHe 0:544b5f6ad832 111 while (1) {
StevenHe 0:544b5f6ad832 112 if (StateFlag == 2) break; // reacts when the system is rest
StevenHe 0:544b5f6ad832 113
StevenHe 0:544b5f6ad832 114 PT_WAIT_UNTIL(pt, StateFlag==1);
StevenHe 0:544b5f6ad832 115 //
StevenHe 0:544b5f6ad832 116 //printf("CP 2 ------- \n");
StevenHe 0:544b5f6ad832 117 //
StevenHe 0:544b5f6ad832 118 if (pc.readable()) {
StevenHe 0:544b5f6ad832 119 token = pc.getc();
StevenHe 0:544b5f6ad832 120 pc.putc(token);
StevenHe 0:544b5f6ad832 121 NewTokenFlag = 1;
StevenHe 0:544b5f6ad832 122 StateFlag = 0;
StevenHe 0:544b5f6ad832 123 } else if (touchSense(0)) {
StevenHe 0:544b5f6ad832 124 myled=1;
StevenHe 0:544b5f6ad832 125 token = '0';
StevenHe 0:544b5f6ad832 126 pc.putc('0');
StevenHe 0:544b5f6ad832 127 NewTokenFlag = 1;
StevenHe 0:544b5f6ad832 128 StateFlag = 0;
StevenHe 0:544b5f6ad832 129 } else if (touchSense(1)) {
StevenHe 0:544b5f6ad832 130 myled=1;
StevenHe 0:544b5f6ad832 131 token = '1';
StevenHe 0:544b5f6ad832 132 pc.putc('1');
StevenHe 0:544b5f6ad832 133 NewTokenFlag = 1;
StevenHe 0:544b5f6ad832 134 StateFlag = 0;
StevenHe 0:544b5f6ad832 135 } else myled =0;
StevenHe 0:544b5f6ad832 136 wait(0.1);
StevenHe 0:544b5f6ad832 137 //
StevenHe 0:544b5f6ad832 138 //printf("CP 3 ------- \n");
StevenHe 0:544b5f6ad832 139 //
StevenHe 0:544b5f6ad832 140 }
StevenHe 0:544b5f6ad832 141
StevenHe 0:544b5f6ad832 142 PT_END(pt);
StevenHe 0:544b5f6ad832 143 }
StevenHe 0:544b5f6ad832 144
StevenHe 0:544b5f6ad832 145
StevenHe 0:544b5f6ad832 146
StevenHe 0:544b5f6ad832 147 int main() {
StevenHe 0:544b5f6ad832 148 PT_INIT(&pt_1);
StevenHe 0:544b5f6ad832 149 PT_INIT(&pt_2);
StevenHe 0:544b5f6ad832 150 StateFlag =0;
StevenHe 0:544b5f6ad832 151 NewTokenFlag =0;
StevenHe 0:544b5f6ad832 152
StevenHe 0:544b5f6ad832 153 while (1) {
StevenHe 0:544b5f6ad832 154
StevenHe 0:544b5f6ad832 155 FSM_transition(&pt_1);
StevenHe 0:544b5f6ad832 156 IO_Handler(&pt_2);
StevenHe 0:544b5f6ad832 157 }
StevenHe 0:544b5f6ad832 158 return 0;
StevenHe 0:544b5f6ad832 159 } // end of main
StevenHe 0:544b5f6ad832 160
StevenHe 0:544b5f6ad832 161
StevenHe 0:544b5f6ad832 162 int touchSense(int Num_Charger) {
StevenHe 0:544b5f6ad832 163 float sample1, sample2;
StevenHe 0:544b5f6ad832 164 ground = 0;
StevenHe 0:544b5f6ad832 165 if (Num_Charger ==1) {
StevenHe 0:544b5f6ad832 166 charger1.mode(PullUp);
StevenHe 0:544b5f6ad832 167 charger1.mode(PullNone);
StevenHe 0:544b5f6ad832 168 sample1=input1.read(); // take two samples to avoid the random jump on voltage on touch sensor
StevenHe 0:544b5f6ad832 169 wait(0.1);
StevenHe 0:544b5f6ad832 170 sample2=input1.read();
StevenHe 0:544b5f6ad832 171 } else {
StevenHe 0:544b5f6ad832 172 charger0.mode(PullUp);
StevenHe 0:544b5f6ad832 173 charger0.mode(PullNone);
StevenHe 0:544b5f6ad832 174 sample1=input0.read(); // take two samples to ignore temp jump
StevenHe 0:544b5f6ad832 175 wait(0.1);
StevenHe 0:544b5f6ad832 176 sample2=input0.read();
StevenHe 0:544b5f6ad832 177 }
StevenHe 0:544b5f6ad832 178
StevenHe 0:544b5f6ad832 179 if (sample1 < 0.3 && sample2 < 0.3) {
StevenHe 0:544b5f6ad832 180 return 1;
StevenHe 0:544b5f6ad832 181 } else {
StevenHe 0:544b5f6ad832 182 return 0;
StevenHe 0:544b5f6ad832 183 }
StevenHe 0:544b5f6ad832 184 }
StevenHe 0:544b5f6ad832 185
StevenHe 0:544b5f6ad832 186
StevenHe 0:544b5f6ad832 187
StevenHe 0:544b5f6ad832 188 void displayString(int* String) {
StevenHe 0:544b5f6ad832 189 for (int j=0; j<sizeofpattern; j++)
StevenHe 0:544b5f6ad832 190 pc.putc(String[j]);
StevenHe 0:544b5f6ad832 191
StevenHe 0:544b5f6ad832 192 pc.putc('\n');
StevenHe 0:544b5f6ad832 193
StevenHe 0:544b5f6ad832 194 }
StevenHe 0:544b5f6ad832 195
StevenHe 0:544b5f6ad832 196 void displayMessage(int NumMes) {
StevenHe 0:544b5f6ad832 197 if (NumMes == 1)
StevenHe 0:544b5f6ad832 198 printf("HOST ERROR : Host must send string in the form of Sxxxx...E X=0 or 1 \n");
StevenHe 0:544b5f6ad832 199 else if (NumMes == 0) printf("TOUCH ERROR: Please enter the string that matched host string exactly through touchsensor\n");
StevenHe 0:544b5f6ad832 200 else printf("MATCH: Host will send another string\n");
StevenHe 0:544b5f6ad832 201
StevenHe 0:544b5f6ad832 202 }
StevenHe 0:544b5f6ad832 203