Homework2_3Multithreads_YuwenSun

Dependencies:   mbed

main.cpp

Committer:
sun831011
Date:
2010-11-30
Revision:
0:edab293d7652

File content as of revision 0:edab293d7652:

#include "mbed.h"
#include "lc.h"
#include "pt-sem.h"
#include "pt.h"

#define numsamples 1
int touchSense1(void);  //function for the button 1

DigitalOut myled1(LED1);
AnalogIn input1(p20);
DigitalIn charger1(p19);
DigitalOut ground1(p18);
Serial pc(USBTX, USBRX); // tx, rx

int touchSense2(void);  //function for the button 2

DigitalOut myled2(LED4);
AnalogIn input2(p15);
DigitalIn charger2(p16);
DigitalOut ground2(p17);
  
char incode[10];
char strcode[10];
char matcode[10];
char temp;
int codelen = 1;
int matlen;
int i=0;
int j=0;
int flag1 = 0;
int flag2 = 0;
int failflag = 0;

int protothread1_flag, protothread2_flag;
static struct pt pt1, pt2;


static int protothread1(struct pt *pt){

    PT_BEGIN(pt);

    while(1) {

        PT_WAIT_UNTIL(pt, protothread2_flag != 0);

        if (pc.readable()){
            protothread2_flag = 0;
            protothread1_flag = 1;
        }

       if (touchSense1()) { 
           wait (0.005);    //wait 5ms for checking press
            if (touchSense1()){
                myled1 = 1;
                if (flag1 == 0){
                    flag1 =1;   //flag1 for symbol press
                    pc.printf("1");
                    matcode[matlen] = '1'; //record for compare
                    matlen ++;
                }
            }
         
       } else {
            wait(0.005);  //wait 5ms confirm release
            if (touchSense1()==0){
                myled1 = 0;
                flag1 = 0; //clear flag
            }
        }
    
        if (touchSense2()) { //samiliar as above 1
            wait (0.005);
            if (touchSense2()){
                myled2 = 1;
                if (flag2 == 0){
                    flag2 =1;
                    pc.printf("0");
                    matcode[matlen] = '0';
                    matlen ++;
                }
            }
         
        } else {
            wait(0.005);
            if (touchSense2()==0){
                myled2 = 0;
                flag2 = 0;
            }
        }
    
        if (flag1 == 1 && flag2 == 1){ //detect press both button
            pc.printf("\nError, please don't touch both!!");
            //break;
        }
    
        if (matlen >= codelen){ //check input length match the set up
            for (i=0;i<codelen;i++){
                if (matcode[i] != strcode[i])
                    failflag = 1; //flag for symbol not match
            }
        
            if (failflag == 0){
                pc.printf("\n Congratulations! Code is matched!!\n");
                matlen = 0;
            
            }
        
            else{
                pc.printf("\nSorry, the code is wrong, please input again!!\n");
                failflag = 0;
                matlen = 0;
            }
        
       }
   }


PT_END(pt);
}



static int protothread2(struct pt *pt) {

    PT_BEGIN(pt);
    while(1) {

        protothread2_flag = 1;
        PT_WAIT_UNTIL(pt, protothread1_flag != 0);

        i=0;
        j=0;
        pc.printf("\nPlease inpunt the code:\n");
        while ((temp = pc.getc())!= 'E') {    //getchar
            pc.printf("%c",temp);
            incode[i] = temp;    //put the original char in incode      
            i++;
        }    
  
        incode[i] = 'E'; //put "E" last as the end symbol
        pc.printf("%c",temp);
        pc.printf("\nThanks for the string, your input is\n");
  
        for (i=0;i<10;i++){   //extract 0/1 from incode to strcode
            if (incode[i] == 'E')
                break;
            else{
                if (incode[i] == '0' || incode[i] == '1'){
                    strcode[j] = incode[i];
                    j++;
                }
            }
        
        }
  
        codelen = j;
  
        for (j=0;j<codelen;j++)   //display the configuration
            pc.printf("%c",strcode[j]);
        pc.printf("\n");
  
        matlen = 0;  
  
        pc.printf("\nPlease input the code:");

        protothread1_flag = 0;

    }
PT_END(pt);
}


int main()
{
  for (i=0;i<10;i++){   //initial the char array
    incode[i] = 'a';    
    strcode[i] = 'a';
  }
    
  PT_INIT(&pt1);
  PT_INIT(&pt2);

  while(1) {
  protothread1(&pt1);
  protothread2(&pt2);
  }
}

int touchSense1(void) //function for touch sensor
{
    float sample;
    ground1 = 0;
    charger1.mode(PullUp);
    charger1.mode(PullNone);
    sample=input1.read();
    if (sample < 0.3) {
        return 1;
    } else {
        return 0;
    }
}
int touchSense2(void)
{
    float sample;
    ground2 = 0;
    charger2.mode(PullUp);
    charger2.mode(PullNone);
    sample=input2.read();
    if (sample < 0.3) {
        return 1;
    } else {
        return 0;
    }
}