yuwen sun
/
TouchSensorMT_2
Homework2_3Multithreads_YuwenSun
main.cpp@0:edab293d7652, 2010-11-30 (annotated)
- Committer:
- sun831011
- Date:
- Tue Nov 30 22:19:29 2010 +0000
- Revision:
- 0:edab293d7652
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sun831011 | 0:edab293d7652 | 1 | #include "mbed.h" |
sun831011 | 0:edab293d7652 | 2 | #include "lc.h" |
sun831011 | 0:edab293d7652 | 3 | #include "pt-sem.h" |
sun831011 | 0:edab293d7652 | 4 | #include "pt.h" |
sun831011 | 0:edab293d7652 | 5 | |
sun831011 | 0:edab293d7652 | 6 | #define numsamples 1 |
sun831011 | 0:edab293d7652 | 7 | int touchSense1(void); //function for the button 1 |
sun831011 | 0:edab293d7652 | 8 | |
sun831011 | 0:edab293d7652 | 9 | DigitalOut myled1(LED1); |
sun831011 | 0:edab293d7652 | 10 | AnalogIn input1(p20); |
sun831011 | 0:edab293d7652 | 11 | DigitalIn charger1(p19); |
sun831011 | 0:edab293d7652 | 12 | DigitalOut ground1(p18); |
sun831011 | 0:edab293d7652 | 13 | Serial pc(USBTX, USBRX); // tx, rx |
sun831011 | 0:edab293d7652 | 14 | |
sun831011 | 0:edab293d7652 | 15 | int touchSense2(void); //function for the button 2 |
sun831011 | 0:edab293d7652 | 16 | |
sun831011 | 0:edab293d7652 | 17 | DigitalOut myled2(LED4); |
sun831011 | 0:edab293d7652 | 18 | AnalogIn input2(p15); |
sun831011 | 0:edab293d7652 | 19 | DigitalIn charger2(p16); |
sun831011 | 0:edab293d7652 | 20 | DigitalOut ground2(p17); |
sun831011 | 0:edab293d7652 | 21 | |
sun831011 | 0:edab293d7652 | 22 | char incode[10]; |
sun831011 | 0:edab293d7652 | 23 | char strcode[10]; |
sun831011 | 0:edab293d7652 | 24 | char matcode[10]; |
sun831011 | 0:edab293d7652 | 25 | char temp; |
sun831011 | 0:edab293d7652 | 26 | int codelen = 1; |
sun831011 | 0:edab293d7652 | 27 | int matlen; |
sun831011 | 0:edab293d7652 | 28 | int i=0; |
sun831011 | 0:edab293d7652 | 29 | int j=0; |
sun831011 | 0:edab293d7652 | 30 | int flag1 = 0; |
sun831011 | 0:edab293d7652 | 31 | int flag2 = 0; |
sun831011 | 0:edab293d7652 | 32 | int failflag = 0; |
sun831011 | 0:edab293d7652 | 33 | |
sun831011 | 0:edab293d7652 | 34 | int protothread1_flag, protothread2_flag; |
sun831011 | 0:edab293d7652 | 35 | static struct pt pt1, pt2; |
sun831011 | 0:edab293d7652 | 36 | |
sun831011 | 0:edab293d7652 | 37 | |
sun831011 | 0:edab293d7652 | 38 | static int protothread1(struct pt *pt){ |
sun831011 | 0:edab293d7652 | 39 | |
sun831011 | 0:edab293d7652 | 40 | PT_BEGIN(pt); |
sun831011 | 0:edab293d7652 | 41 | |
sun831011 | 0:edab293d7652 | 42 | while(1) { |
sun831011 | 0:edab293d7652 | 43 | |
sun831011 | 0:edab293d7652 | 44 | PT_WAIT_UNTIL(pt, protothread2_flag != 0); |
sun831011 | 0:edab293d7652 | 45 | |
sun831011 | 0:edab293d7652 | 46 | if (pc.readable()){ |
sun831011 | 0:edab293d7652 | 47 | protothread2_flag = 0; |
sun831011 | 0:edab293d7652 | 48 | protothread1_flag = 1; |
sun831011 | 0:edab293d7652 | 49 | } |
sun831011 | 0:edab293d7652 | 50 | |
sun831011 | 0:edab293d7652 | 51 | if (touchSense1()) { |
sun831011 | 0:edab293d7652 | 52 | wait (0.005); //wait 5ms for checking press |
sun831011 | 0:edab293d7652 | 53 | if (touchSense1()){ |
sun831011 | 0:edab293d7652 | 54 | myled1 = 1; |
sun831011 | 0:edab293d7652 | 55 | if (flag1 == 0){ |
sun831011 | 0:edab293d7652 | 56 | flag1 =1; //flag1 for symbol press |
sun831011 | 0:edab293d7652 | 57 | pc.printf("1"); |
sun831011 | 0:edab293d7652 | 58 | matcode[matlen] = '1'; //record for compare |
sun831011 | 0:edab293d7652 | 59 | matlen ++; |
sun831011 | 0:edab293d7652 | 60 | } |
sun831011 | 0:edab293d7652 | 61 | } |
sun831011 | 0:edab293d7652 | 62 | |
sun831011 | 0:edab293d7652 | 63 | } else { |
sun831011 | 0:edab293d7652 | 64 | wait(0.005); //wait 5ms confirm release |
sun831011 | 0:edab293d7652 | 65 | if (touchSense1()==0){ |
sun831011 | 0:edab293d7652 | 66 | myled1 = 0; |
sun831011 | 0:edab293d7652 | 67 | flag1 = 0; //clear flag |
sun831011 | 0:edab293d7652 | 68 | } |
sun831011 | 0:edab293d7652 | 69 | } |
sun831011 | 0:edab293d7652 | 70 | |
sun831011 | 0:edab293d7652 | 71 | if (touchSense2()) { //samiliar as above 1 |
sun831011 | 0:edab293d7652 | 72 | wait (0.005); |
sun831011 | 0:edab293d7652 | 73 | if (touchSense2()){ |
sun831011 | 0:edab293d7652 | 74 | myled2 = 1; |
sun831011 | 0:edab293d7652 | 75 | if (flag2 == 0){ |
sun831011 | 0:edab293d7652 | 76 | flag2 =1; |
sun831011 | 0:edab293d7652 | 77 | pc.printf("0"); |
sun831011 | 0:edab293d7652 | 78 | matcode[matlen] = '0'; |
sun831011 | 0:edab293d7652 | 79 | matlen ++; |
sun831011 | 0:edab293d7652 | 80 | } |
sun831011 | 0:edab293d7652 | 81 | } |
sun831011 | 0:edab293d7652 | 82 | |
sun831011 | 0:edab293d7652 | 83 | } else { |
sun831011 | 0:edab293d7652 | 84 | wait(0.005); |
sun831011 | 0:edab293d7652 | 85 | if (touchSense2()==0){ |
sun831011 | 0:edab293d7652 | 86 | myled2 = 0; |
sun831011 | 0:edab293d7652 | 87 | flag2 = 0; |
sun831011 | 0:edab293d7652 | 88 | } |
sun831011 | 0:edab293d7652 | 89 | } |
sun831011 | 0:edab293d7652 | 90 | |
sun831011 | 0:edab293d7652 | 91 | if (flag1 == 1 && flag2 == 1){ //detect press both button |
sun831011 | 0:edab293d7652 | 92 | pc.printf("\nError, please don't touch both!!"); |
sun831011 | 0:edab293d7652 | 93 | //break; |
sun831011 | 0:edab293d7652 | 94 | } |
sun831011 | 0:edab293d7652 | 95 | |
sun831011 | 0:edab293d7652 | 96 | if (matlen >= codelen){ //check input length match the set up |
sun831011 | 0:edab293d7652 | 97 | for (i=0;i<codelen;i++){ |
sun831011 | 0:edab293d7652 | 98 | if (matcode[i] != strcode[i]) |
sun831011 | 0:edab293d7652 | 99 | failflag = 1; //flag for symbol not match |
sun831011 | 0:edab293d7652 | 100 | } |
sun831011 | 0:edab293d7652 | 101 | |
sun831011 | 0:edab293d7652 | 102 | if (failflag == 0){ |
sun831011 | 0:edab293d7652 | 103 | pc.printf("\n Congratulations! Code is matched!!\n"); |
sun831011 | 0:edab293d7652 | 104 | matlen = 0; |
sun831011 | 0:edab293d7652 | 105 | |
sun831011 | 0:edab293d7652 | 106 | } |
sun831011 | 0:edab293d7652 | 107 | |
sun831011 | 0:edab293d7652 | 108 | else{ |
sun831011 | 0:edab293d7652 | 109 | pc.printf("\nSorry, the code is wrong, please input again!!\n"); |
sun831011 | 0:edab293d7652 | 110 | failflag = 0; |
sun831011 | 0:edab293d7652 | 111 | matlen = 0; |
sun831011 | 0:edab293d7652 | 112 | } |
sun831011 | 0:edab293d7652 | 113 | |
sun831011 | 0:edab293d7652 | 114 | } |
sun831011 | 0:edab293d7652 | 115 | } |
sun831011 | 0:edab293d7652 | 116 | |
sun831011 | 0:edab293d7652 | 117 | |
sun831011 | 0:edab293d7652 | 118 | PT_END(pt); |
sun831011 | 0:edab293d7652 | 119 | } |
sun831011 | 0:edab293d7652 | 120 | |
sun831011 | 0:edab293d7652 | 121 | |
sun831011 | 0:edab293d7652 | 122 | |
sun831011 | 0:edab293d7652 | 123 | static int protothread2(struct pt *pt) { |
sun831011 | 0:edab293d7652 | 124 | |
sun831011 | 0:edab293d7652 | 125 | PT_BEGIN(pt); |
sun831011 | 0:edab293d7652 | 126 | while(1) { |
sun831011 | 0:edab293d7652 | 127 | |
sun831011 | 0:edab293d7652 | 128 | protothread2_flag = 1; |
sun831011 | 0:edab293d7652 | 129 | PT_WAIT_UNTIL(pt, protothread1_flag != 0); |
sun831011 | 0:edab293d7652 | 130 | |
sun831011 | 0:edab293d7652 | 131 | i=0; |
sun831011 | 0:edab293d7652 | 132 | j=0; |
sun831011 | 0:edab293d7652 | 133 | pc.printf("\nPlease inpunt the code:\n"); |
sun831011 | 0:edab293d7652 | 134 | while ((temp = pc.getc())!= 'E') { //getchar |
sun831011 | 0:edab293d7652 | 135 | pc.printf("%c",temp); |
sun831011 | 0:edab293d7652 | 136 | incode[i] = temp; //put the original char in incode |
sun831011 | 0:edab293d7652 | 137 | i++; |
sun831011 | 0:edab293d7652 | 138 | } |
sun831011 | 0:edab293d7652 | 139 | |
sun831011 | 0:edab293d7652 | 140 | incode[i] = 'E'; //put "E" last as the end symbol |
sun831011 | 0:edab293d7652 | 141 | pc.printf("%c",temp); |
sun831011 | 0:edab293d7652 | 142 | pc.printf("\nThanks for the string, your input is\n"); |
sun831011 | 0:edab293d7652 | 143 | |
sun831011 | 0:edab293d7652 | 144 | for (i=0;i<10;i++){ //extract 0/1 from incode to strcode |
sun831011 | 0:edab293d7652 | 145 | if (incode[i] == 'E') |
sun831011 | 0:edab293d7652 | 146 | break; |
sun831011 | 0:edab293d7652 | 147 | else{ |
sun831011 | 0:edab293d7652 | 148 | if (incode[i] == '0' || incode[i] == '1'){ |
sun831011 | 0:edab293d7652 | 149 | strcode[j] = incode[i]; |
sun831011 | 0:edab293d7652 | 150 | j++; |
sun831011 | 0:edab293d7652 | 151 | } |
sun831011 | 0:edab293d7652 | 152 | } |
sun831011 | 0:edab293d7652 | 153 | |
sun831011 | 0:edab293d7652 | 154 | } |
sun831011 | 0:edab293d7652 | 155 | |
sun831011 | 0:edab293d7652 | 156 | codelen = j; |
sun831011 | 0:edab293d7652 | 157 | |
sun831011 | 0:edab293d7652 | 158 | for (j=0;j<codelen;j++) //display the configuration |
sun831011 | 0:edab293d7652 | 159 | pc.printf("%c",strcode[j]); |
sun831011 | 0:edab293d7652 | 160 | pc.printf("\n"); |
sun831011 | 0:edab293d7652 | 161 | |
sun831011 | 0:edab293d7652 | 162 | matlen = 0; |
sun831011 | 0:edab293d7652 | 163 | |
sun831011 | 0:edab293d7652 | 164 | pc.printf("\nPlease input the code:"); |
sun831011 | 0:edab293d7652 | 165 | |
sun831011 | 0:edab293d7652 | 166 | protothread1_flag = 0; |
sun831011 | 0:edab293d7652 | 167 | |
sun831011 | 0:edab293d7652 | 168 | } |
sun831011 | 0:edab293d7652 | 169 | PT_END(pt); |
sun831011 | 0:edab293d7652 | 170 | } |
sun831011 | 0:edab293d7652 | 171 | |
sun831011 | 0:edab293d7652 | 172 | |
sun831011 | 0:edab293d7652 | 173 | int main() |
sun831011 | 0:edab293d7652 | 174 | { |
sun831011 | 0:edab293d7652 | 175 | for (i=0;i<10;i++){ //initial the char array |
sun831011 | 0:edab293d7652 | 176 | incode[i] = 'a'; |
sun831011 | 0:edab293d7652 | 177 | strcode[i] = 'a'; |
sun831011 | 0:edab293d7652 | 178 | } |
sun831011 | 0:edab293d7652 | 179 | |
sun831011 | 0:edab293d7652 | 180 | PT_INIT(&pt1); |
sun831011 | 0:edab293d7652 | 181 | PT_INIT(&pt2); |
sun831011 | 0:edab293d7652 | 182 | |
sun831011 | 0:edab293d7652 | 183 | while(1) { |
sun831011 | 0:edab293d7652 | 184 | protothread1(&pt1); |
sun831011 | 0:edab293d7652 | 185 | protothread2(&pt2); |
sun831011 | 0:edab293d7652 | 186 | } |
sun831011 | 0:edab293d7652 | 187 | } |
sun831011 | 0:edab293d7652 | 188 | |
sun831011 | 0:edab293d7652 | 189 | int touchSense1(void) //function for touch sensor |
sun831011 | 0:edab293d7652 | 190 | { |
sun831011 | 0:edab293d7652 | 191 | float sample; |
sun831011 | 0:edab293d7652 | 192 | ground1 = 0; |
sun831011 | 0:edab293d7652 | 193 | charger1.mode(PullUp); |
sun831011 | 0:edab293d7652 | 194 | charger1.mode(PullNone); |
sun831011 | 0:edab293d7652 | 195 | sample=input1.read(); |
sun831011 | 0:edab293d7652 | 196 | if (sample < 0.3) { |
sun831011 | 0:edab293d7652 | 197 | return 1; |
sun831011 | 0:edab293d7652 | 198 | } else { |
sun831011 | 0:edab293d7652 | 199 | return 0; |
sun831011 | 0:edab293d7652 | 200 | } |
sun831011 | 0:edab293d7652 | 201 | } |
sun831011 | 0:edab293d7652 | 202 | int touchSense2(void) |
sun831011 | 0:edab293d7652 | 203 | { |
sun831011 | 0:edab293d7652 | 204 | float sample; |
sun831011 | 0:edab293d7652 | 205 | ground2 = 0; |
sun831011 | 0:edab293d7652 | 206 | charger2.mode(PullUp); |
sun831011 | 0:edab293d7652 | 207 | charger2.mode(PullNone); |
sun831011 | 0:edab293d7652 | 208 | sample=input2.read(); |
sun831011 | 0:edab293d7652 | 209 | if (sample < 0.3) { |
sun831011 | 0:edab293d7652 | 210 | return 1; |
sun831011 | 0:edab293d7652 | 211 | } else { |
sun831011 | 0:edab293d7652 | 212 | return 0; |
sun831011 | 0:edab293d7652 | 213 | } |
sun831011 | 0:edab293d7652 | 214 | } |