Rohit Sehgal / Mbed 2 deprecated ProtoThreads

Dependencies:   mbed

Committer:
edufascin
Date:
Fri Dec 03 06:36:38 2010 +0000
Revision:
0:d2daa340ad0e
EE 202 HW2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
edufascin 0:d2daa340ad0e 1 #include "mbed.h"
edufascin 0:d2daa340ad0e 2 #include "pt.h"
edufascin 0:d2daa340ad0e 3 #include "time.h"
edufascin 0:d2daa340ad0e 4
edufascin 0:d2daa340ad0e 5 DigitalOut myLed1(LED1);
edufascin 0:d2daa340ad0e 6 DigitalOut myLed2(LED2);
edufascin 0:d2daa340ad0e 7 DigitalOut myLed3(LED3);
edufascin 0:d2daa340ad0e 8 AnalogIn input1(p20);
edufascin 0:d2daa340ad0e 9 DigitalIn charger1(p19);
edufascin 0:d2daa340ad0e 10 DigitalOut ground1(p18);
edufascin 0:d2daa340ad0e 11 AnalogIn input2(p17);
edufascin 0:d2daa340ad0e 12 DigitalIn charger2(p16);
edufascin 0:d2daa340ad0e 13 DigitalOut ground2(p15);
edufascin 0:d2daa340ad0e 14 Serial pc(USBTX,USBRX);
edufascin 0:d2daa340ad0e 15
edufascin 0:d2daa340ad0e 16 //Global variables for the touchsense1 and touchsense2 functions that are running in the foreground process.
edufascin 0:d2daa340ad0e 17 bool isSensor1Pressed = false;
edufascin 0:d2daa340ad0e 18 bool isSensor2Pressed = false;
edufascin 0:d2daa340ad0e 19 int count = 0;
edufascin 0:d2daa340ad0e 20 char triggerString1[1];
edufascin 0:d2daa340ad0e 21 char triggerString2[1];
edufascin 0:d2daa340ad0e 22 char realTriggerString[20];
edufascin 0:d2daa340ad0e 23 char inputChar; char triggerString[20]; int k=0;
edufascin 0:d2daa340ad0e 24
edufascin 0:d2daa340ad0e 25 //Global variable to get the total no of bits in the trigger string.
edufascin 0:d2daa340ad0e 26 int countBits = 0;
edufascin 0:d2daa340ad0e 27 char triggerStringBits[20];
edufascin 0:d2daa340ad0e 28
edufascin 0:d2daa340ad0e 29 int globalTouchSenseCount=0;
edufascin 0:d2daa340ad0e 30 //Static variables used to transfer the control from one thread to the other.
edufascin 0:d2daa340ad0e 31 static int protoThread0 = 0;
edufascin 0:d2daa340ad0e 32 static int protoThread1 = 0;
edufascin 0:d2daa340ad0e 33 static int protoThread2 = 0;
edufascin 0:d2daa340ad0e 34
edufascin 0:d2daa340ad0e 35 //This thread is useful to monitor the Serial port and get the input from the user.
edufascin 0:d2daa340ad0e 36 static int Monitor_Serial_Port_Thread(struct pt *pt)
edufascin 0:d2daa340ad0e 37 {
edufascin 0:d2daa340ad0e 38 int counter=0,triggerStringlength;
edufascin 0:d2daa340ad0e 39 bool isStartEncountered = false; bool bitsEncountered = false;
edufascin 0:d2daa340ad0e 40 PT_BEGIN(pt);
edufascin 0:d2daa340ad0e 41 pc.printf("Enter the Trigger String: ");
edufascin 0:d2daa340ad0e 42 while(1)
edufascin 0:d2daa340ad0e 43 {
edufascin 0:d2daa340ad0e 44 pc.putc(inputChar = pc.getc());
edufascin 0:d2daa340ad0e 45 if (inputChar == 'e' || inputChar == 'E')
edufascin 0:d2daa340ad0e 46 {
edufascin 0:d2daa340ad0e 47 triggerString[k] = inputChar;
edufascin 0:d2daa340ad0e 48 k++;
edufascin 0:d2daa340ad0e 49 break;
edufascin 0:d2daa340ad0e 50 }
edufascin 0:d2daa340ad0e 51 else
edufascin 0:d2daa340ad0e 52 {
edufascin 0:d2daa340ad0e 53 triggerString[k] = inputChar;
edufascin 0:d2daa340ad0e 54 k++;
edufascin 0:d2daa340ad0e 55 }
edufascin 0:d2daa340ad0e 56 }
edufascin 0:d2daa340ad0e 57
edufascin 0:d2daa340ad0e 58 //All the entered characters from the user are strored in the array.
edufascin 0:d2daa340ad0e 59 triggerString[k] = '\0';
edufascin 0:d2daa340ad0e 60 //Getting the total length of the trigger string.
edufascin 0:d2daa340ad0e 61 while (triggerString[counter] != '\0')
edufascin 0:d2daa340ad0e 62 {
edufascin 0:d2daa340ad0e 63 counter++;
edufascin 0:d2daa340ad0e 64 }
edufascin 0:d2daa340ad0e 65 triggerStringlength = counter;
edufascin 0:d2daa340ad0e 66 //Checking for the validity of the input validation string.
edufascin 0:d2daa340ad0e 67 for (int i = 0 ;i<triggerStringlength; i++)
edufascin 0:d2daa340ad0e 68 {
edufascin 0:d2daa340ad0e 69 //If the input string does not start with required characters, then we continue.
edufascin 0:d2daa340ad0e 70 if (triggerString[i] != 'S' && triggerString[i] != 's' && triggerString[i] != '0' && triggerString[i] != '1' && triggerString[i] != 'E' && triggerString[i] != 'e' && triggerString[i] != ' ')
edufascin 0:d2daa340ad0e 71 {
edufascin 0:d2daa340ad0e 72 pc.printf("Invalid Trigger String");
edufascin 0:d2daa340ad0e 73 PT_RESTART(pt);
edufascin 0:d2daa340ad0e 74 } else
edufascin 0:d2daa340ad0e 75 {
edufascin 0:d2daa340ad0e 76 //If the input string contains spaces, simply continue.
edufascin 0:d2daa340ad0e 77 if (triggerString[i] == ' ')
edufascin 0:d2daa340ad0e 78 {
edufascin 0:d2daa340ad0e 79 continue;
edufascin 0:d2daa340ad0e 80 }
edufascin 0:d2daa340ad0e 81
edufascin 0:d2daa340ad0e 82 if (triggerString[i] == 'S' || triggerString[i] == 's')
edufascin 0:d2daa340ad0e 83 {
edufascin 0:d2daa340ad0e 84 isStartEncountered = true;
edufascin 0:d2daa340ad0e 85 continue;
edufascin 0:d2daa340ad0e 86 }
edufascin 0:d2daa340ad0e 87 }
edufascin 0:d2daa340ad0e 88 if (isStartEncountered && (triggerString[i]!= 'E' || triggerString[i] != 'e'))
edufascin 0:d2daa340ad0e 89 {
edufascin 0:d2daa340ad0e 90 if (triggerString[i] == ' ')
edufascin 0:d2daa340ad0e 91 {
edufascin 0:d2daa340ad0e 92 continue;
edufascin 0:d2daa340ad0e 93 }
edufascin 0:d2daa340ad0e 94 else
edufascin 0:d2daa340ad0e 95 {
edufascin 0:d2daa340ad0e 96 if (triggerString[i] == '0' || triggerString[i] == '1')
edufascin 0:d2daa340ad0e 97 {
edufascin 0:d2daa340ad0e 98 triggerStringBits[countBits] = triggerString[i];
edufascin 0:d2daa340ad0e 99 bitsEncountered = true;
edufascin 0:d2daa340ad0e 100 countBits++;
edufascin 0:d2daa340ad0e 101 }
edufascin 0:d2daa340ad0e 102 }
edufascin 0:d2daa340ad0e 103 }
edufascin 0:d2daa340ad0e 104 else
edufascin 0:d2daa340ad0e 105 {
edufascin 0:d2daa340ad0e 106 //If the user enters E character first without enterting the S character then the user has entered and invalid trigger string.
edufascin 0:d2daa340ad0e 107 if (isStartEncountered && !bitsEncountered && (triggerString[i] == 'E' || triggerString[i] == 'e'))
edufascin 0:d2daa340ad0e 108 {
edufascin 0:d2daa340ad0e 109 pc.printf("Please enter a valid Trigger String");
edufascin 0:d2daa340ad0e 110 //Restart the protothread if the string entered is not a valied trigger string.
edufascin 0:d2daa340ad0e 111 PT_RESTART(pt);
edufascin 0:d2daa340ad0e 112 }
edufascin 0:d2daa340ad0e 113 else
edufascin 0:d2daa340ad0e 114 {
edufascin 0:d2daa340ad0e 115 if (isStartEncountered && (triggerString[i] == 'E' || triggerString[i] == 'e'))
edufascin 0:d2daa340ad0e 116 {
edufascin 0:d2daa340ad0e 117 break;
edufascin 0:d2daa340ad0e 118 }
edufascin 0:d2daa340ad0e 119 }
edufascin 0:d2daa340ad0e 120 }
edufascin 0:d2daa340ad0e 121 }
edufascin 0:d2daa340ad0e 122 //Ending the triggerString Bit array.
edufascin 0:d2daa340ad0e 123 triggerStringBits[countBits] = '\0';
edufascin 0:d2daa340ad0e 124 //This variable is used to start the other sensor threads.
edufascin 0:d2daa340ad0e 125 protoThread0 = 1;
edufascin 0:d2daa340ad0e 126 PT_END(pt);
edufascin 0:d2daa340ad0e 127 }
edufascin 0:d2daa340ad0e 128 //This thread is used to monitor the To capacitor sensor.
edufascin 0:d2daa340ad0e 129 static int Touchsense1_Thread(struct pt *pt)
edufascin 0:d2daa340ad0e 130 {
edufascin 0:d2daa340ad0e 131 PT_BEGIN(pt);
edufascin 0:d2daa340ad0e 132 PT_WAIT_UNTIL(pt, protoThread0 == 1);
edufascin 0:d2daa340ad0e 133 float sample;
edufascin 0:d2daa340ad0e 134 ground1 = 0;
edufascin 0:d2daa340ad0e 135 charger1.mode(PullUp); //p19 used for charging the capacitor.
edufascin 0:d2daa340ad0e 136 charger1.mode(PullNone);
edufascin 0:d2daa340ad0e 137 sample = input1.read();
edufascin 0:d2daa340ad0e 138 if (sample < 0.3)
edufascin 0:d2daa340ad0e 139 {
edufascin 0:d2daa340ad0e 140 triggerString1[0] = '0';
edufascin 0:d2daa340ad0e 141 myLed1 = 1;
edufascin 0:d2daa340ad0e 142 wait(0.005);
edufascin 0:d2daa340ad0e 143 isSensor1Pressed = true;
edufascin 0:d2daa340ad0e 144 }
edufascin 0:d2daa340ad0e 145 else
edufascin 0:d2daa340ad0e 146 {
edufascin 0:d2daa340ad0e 147 if (isSensor1Pressed)
edufascin 0:d2daa340ad0e 148 {
edufascin 0:d2daa340ad0e 149 realTriggerString[count] = triggerString1[0];
edufascin 0:d2daa340ad0e 150 count++;
edufascin 0:d2daa340ad0e 151 if(count < strlen(triggerStringBits))
edufascin 0:d2daa340ad0e 152 {
edufascin 0:d2daa340ad0e 153 protoThread1 = 0;
edufascin 0:d2daa340ad0e 154 }
edufascin 0:d2daa340ad0e 155 else
edufascin 0:d2daa340ad0e 156 {
edufascin 0:d2daa340ad0e 157 protoThread1 = 1;
edufascin 0:d2daa340ad0e 158 }
edufascin 0:d2daa340ad0e 159 }
edufascin 0:d2daa340ad0e 160 myLed1 = 0;
edufascin 0:d2daa340ad0e 161 for (int i=0;i<strlen(triggerString1);i++)
edufascin 0:d2daa340ad0e 162 {
edufascin 0:d2daa340ad0e 163 triggerString1[i] = '\0';
edufascin 0:d2daa340ad0e 164 }
edufascin 0:d2daa340ad0e 165 isSensor1Pressed = false;
edufascin 0:d2daa340ad0e 166 }
edufascin 0:d2daa340ad0e 167 PT_END(pt);
edufascin 0:d2daa340ad0e 168 }
edufascin 0:d2daa340ad0e 169
edufascin 0:d2daa340ad0e 170
edufascin 0:d2daa340ad0e 171 //This thread is used to monitor the touch sensor T1.
edufascin 0:d2daa340ad0e 172
edufascin 0:d2daa340ad0e 173 static int Touchsense2_Thread(struct pt *pt)
edufascin 0:d2daa340ad0e 174 {
edufascin 0:d2daa340ad0e 175 PT_BEGIN(pt);
edufascin 0:d2daa340ad0e 176 PT_WAIT_UNTIL(pt, protoThread0 == 1);
edufascin 0:d2daa340ad0e 177 float sample;
edufascin 0:d2daa340ad0e 178 ground2 = 0;
edufascin 0:d2daa340ad0e 179 charger2.mode(PullUp);
edufascin 0:d2daa340ad0e 180 charger2.mode(PullNone);
edufascin 0:d2daa340ad0e 181 sample = input2.read();
edufascin 0:d2daa340ad0e 182 if (sample < 0.3)
edufascin 0:d2daa340ad0e 183 {
edufascin 0:d2daa340ad0e 184 triggerString2[0] = '1';
edufascin 0:d2daa340ad0e 185 myLed2 = 1;
edufascin 0:d2daa340ad0e 186 wait(0.005);
edufascin 0:d2daa340ad0e 187 isSensor2Pressed = true;
edufascin 0:d2daa340ad0e 188 }
edufascin 0:d2daa340ad0e 189 else
edufascin 0:d2daa340ad0e 190 {
edufascin 0:d2daa340ad0e 191 if (isSensor2Pressed)
edufascin 0:d2daa340ad0e 192 {
edufascin 0:d2daa340ad0e 193 realTriggerString[count] = triggerString2[0];
edufascin 0:d2daa340ad0e 194 count++;
edufascin 0:d2daa340ad0e 195 if(count < strlen(triggerStringBits))
edufascin 0:d2daa340ad0e 196 {
edufascin 0:d2daa340ad0e 197 protoThread2 = 0;
edufascin 0:d2daa340ad0e 198 }
edufascin 0:d2daa340ad0e 199 else
edufascin 0:d2daa340ad0e 200 {
edufascin 0:d2daa340ad0e 201 protoThread2 = 1;
edufascin 0:d2daa340ad0e 202 }
edufascin 0:d2daa340ad0e 203 }
edufascin 0:d2daa340ad0e 204 myLed2 = 0;
edufascin 0:d2daa340ad0e 205 for (int i=0;i<strlen(triggerString2);i++)
edufascin 0:d2daa340ad0e 206 {
edufascin 0:d2daa340ad0e 207 triggerString2[i] = '\0';
edufascin 0:d2daa340ad0e 208 }
edufascin 0:d2daa340ad0e 209 isSensor2Pressed = false;
edufascin 0:d2daa340ad0e 210 }
edufascin 0:d2daa340ad0e 211 PT_END(pt);
edufascin 0:d2daa340ad0e 212 }
edufascin 0:d2daa340ad0e 213
edufascin 0:d2daa340ad0e 214 static int Check_Trigger_String_Thread(struct pt *pt)
edufascin 0:d2daa340ad0e 215 {
edufascin 0:d2daa340ad0e 216 PT_BEGIN(pt);
edufascin 0:d2daa340ad0e 217 pc.printf("Value of proto thread: %d",protoThread1);
edufascin 0:d2daa340ad0e 218 PT_WAIT_UNTIL(pt, (protoThread1 == 1 || protoThread2 == 1));
edufascin 0:d2daa340ad0e 219 //Marking the end of the trigger string captured through the sensors from the users. This value needs to be matched to the trigger string entered from the user through pc.
edufascin 0:d2daa340ad0e 220 realTriggerString[count] = '\0';
edufascin 0:d2daa340ad0e 221 pc.printf("\n\nReal Trigger String Len: %d",strlen(realTriggerString));
edufascin 0:d2daa340ad0e 222 pc.printf("\n\nTrigger String Bits: %d",strlen(triggerStringBits));
edufascin 0:d2daa340ad0e 223 int matchCount = 0;
edufascin 0:d2daa340ad0e 224 //Only if the trigger string length equals the length of the string entered by the user, then only the validation for each character should take place.
edufascin 0:d2daa340ad0e 225 if (strlen(realTriggerString) == strlen(triggerStringBits)) {
edufascin 0:d2daa340ad0e 226 for (int i=0;i<strlen(realTriggerString);i++) {
edufascin 0:d2daa340ad0e 227 if (realTriggerString[i] == triggerStringBits[i]) {
edufascin 0:d2daa340ad0e 228 matchCount++;
edufascin 0:d2daa340ad0e 229 }
edufascin 0:d2daa340ad0e 230 //if (realTriggerString[i]== '0' || realTriggerString[i] == '1')
edufascin 0:d2daa340ad0e 231 // pc.printf("%c",realTriggerString[i]);
edufascin 0:d2daa340ad0e 232 }
edufascin 0:d2daa340ad0e 233 if (matchCount == strlen(realTriggerString)) {
edufascin 0:d2daa340ad0e 234 pc.printf("HOST MATCH\n");
edufascin 0:d2daa340ad0e 235 protoThread0 = 0;
edufascin 0:d2daa340ad0e 236 protoThread1 = 0;
edufascin 0:d2daa340ad0e 237 protoThread2 = 0;
edufascin 0:d2daa340ad0e 238 }
edufascin 0:d2daa340ad0e 239 }
edufascin 0:d2daa340ad0e 240 else
edufascin 0:d2daa340ad0e 241 {
edufascin 0:d2daa340ad0e 242 pc.printf("HOST ERROR or TOUCH ERROR\n");
edufascin 0:d2daa340ad0e 243 protoThread0 = 0;
edufascin 0:d2daa340ad0e 244 protoThread1 = 0;
edufascin 0:d2daa340ad0e 245 protoThread2 = 0;
edufascin 0:d2daa340ad0e 246 }
edufascin 0:d2daa340ad0e 247 PT_END(pt);
edufascin 0:d2daa340ad0e 248 }
edufascin 0:d2daa340ad0e 249
edufascin 0:d2daa340ad0e 250
edufascin 0:d2daa340ad0e 251 //Protothreads state variables.
edufascin 0:d2daa340ad0e 252 struct pt pt0, pt1, pt2,pt3;
edufascin 0:d2daa340ad0e 253
edufascin 0:d2daa340ad0e 254 int main()
edufascin 0:d2daa340ad0e 255 {
edufascin 0:d2daa340ad0e 256 //Initializing the threads.
edufascin 0:d2daa340ad0e 257 PT_INIT(&pt0);
edufascin 0:d2daa340ad0e 258 PT_INIT(&pt1);
edufascin 0:d2daa340ad0e 259 PT_INIT(&pt2);
edufascin 0:d2daa340ad0e 260 PT_INIT(&pt3);
edufascin 0:d2daa340ad0e 261
edufascin 0:d2daa340ad0e 262 //Thread to monitor the serial input.
edufascin 0:d2daa340ad0e 263 Monitor_Serial_Port_Thread(&pt0);
edufascin 0:d2daa340ad0e 264
edufascin 0:d2daa340ad0e 265 //Only after the trigger string is got from the user, the touch sensors need to be enabled.
edufascin 0:d2daa340ad0e 266 pc.printf("\n\nPlease input on sensor:");
edufascin 0:d2daa340ad0e 267 while(1)
edufascin 0:d2daa340ad0e 268 {
edufascin 0:d2daa340ad0e 269 Touchsense1_Thread(&pt1);
edufascin 0:d2daa340ad0e 270 Touchsense2_Thread(&pt2);
edufascin 0:d2daa340ad0e 271 //Check if the Input from the sensors matches the trigger string.
edufascin 0:d2daa340ad0e 272 Check_Trigger_String_Thread(&pt3);
edufascin 0:d2daa340ad0e 273 }
edufascin 0:d2daa340ad0e 274 }