Homework2_3Multithreads_YuwenSun

Dependencies:   mbed

Committer:
sun831011
Date:
Tue Nov 30 22:19:29 2010 +0000
Revision:
0:edab293d7652

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }