Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:d2daa340ad0e, 2010-12-03 (annotated)
- Committer:
- edufascin
- Date:
- Fri Dec 03 06:36:38 2010 +0000
- Revision:
- 0:d2daa340ad0e
EE 202 HW2
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |