XIAOHUI TAO / Mbed 2 deprecated hw2_protothread
Revision:
0:ee91220d7bea
diff -r 000000000000 -r ee91220d7bea main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Nov 30 23:53:06 2010 +0000
@@ -0,0 +1,185 @@
+/**
+ * This is hw2_3 that shows the implementation of 
+ * protothreads. The program consists of three protothreads that wait
+ * for each other to toggle a variable.
+ */
+
+/* We must always include pt.h in our protothreads code. */
+#include "pt.h"
+#include "mbed.h"
+#include "pre_work.h"
+
+/* Three flags that the three protothread functions use. */
+static int protothread1_flag, protothread2_flag,  protothread3_flag;
+
+    int count=0;
+    int pre_cir_pro=0;   // in case of initial trigger fault
+    int judge=1;
+    int shown=0;
+/**
+ * The first protothread function. It achieves the pc input part.
+ *
+ * The protothread function is driven by the main loop further down in
+ * the code.
+ */
+static int
+protothread1(struct pt *pt)
+{
+  PT_BEGIN(pt);
+  /* We loop forever here. */
+  while(1) {
+    /* Wait until the other protothread has set its flag. */
+    PT_WAIT_UNTIL(pt, protothread2_flag != 0 || pc.readable());//wait until pc inputs
+    //  printf("Protothread 1 running\n");
+    /* We then reset the other protothread's flag, and set our own
+       flag so that the other protothread can run. */
+    protothread2_flag = 0;
+    protothread1_flag = 1;
+    char temp;
+    if (pc.readable()) {
+    temp=pc.getc();
+        if (temp=='E'&& length!=0){pc.printf("Input ends");}
+        else if (temp=='E'&& length==0){pc.printf("Error. No 'S' before 'E'");}
+        else if (temp=='S'){pc.printf("It is a new start.");length=0;count=0;}
+        else if (temp=='1'){
+        str[length]='1';length++;}
+        else if (temp=='0'){
+        str[length]='0';length++;}
+        else if (temp==' '){}
+        else senderror2();
+        if (length>40) {pc.printf("The allocated space is too small.");}
+        for (int i=0;i<length; i++)
+        { pc.putc(str[i]);}
+        pc.printf("\n");
+    
+    }
+     //   PT_WAIT_UNTIL(pt, pc.readable());  
+     //   pc.printf("I am here. Start inputing.");
+     //   pc.getc();
+     //   length=gtchar();
+    /* And we loop. */
+     protothread3_flag=1;
+  }
+
+  /* All protothread functions must end with PT_END() which takes a
+     pointer to a struct pt. */
+  PT_END(pt);
+}
+
+/**
+ * The second protothread function. This is almost the same as the
+ * first one. This part helps with the sensor input.
+ */
+static int
+protothread2(struct pt *pt)
+{
+  PT_BEGIN(pt);
+  while(1) {
+    /* Let the other protothread run. */
+    protothread2_flag = 1;
+    /* Wait until the other protothread has set its flag. */
+    PT_WAIT_UNTIL(pt, protothread1_flag != 0);  //This part always usually has not trigger info
+    //   printf("Protothread 2 running\n");  
+    /* We then reset the other protothread's flag. */
+    protothread1_flag = 0;
+    if (touchSense1()&& !touchSense2()) {   //T0 happens
+         myled1 = 1;
+         myled2=0;
+         pc.putc('a');
+         shown=0;
+         while(1) {if (!test1()){break;} if  (touchSense2()&& touchSense1()) {break;}}
+          //  if (str[count]=='0') {judge=0;}
+          //  judge=1;
+          //  pc.putc(str[count]);
+         if (count>=length){
+            for (int i=1;i<count;i++)
+             { str2[i-1]=str2[i];
+               pc.putc(str2[i-1]);
+              }
+             str2[count-1]='1';
+             pc.putc(str2[count-1]);}
+            else { str2[count]='1';count++;}
+          //process_char();
+        } else if (touchSense2()&& !touchSense1()) {  //T1 happens
+           if (pre_cir_pro>30){
+            myled1 = 0;
+            myled2=1;
+            pc.putc('b');
+            shown=0;
+            while(1) {if (!test2()){break;} if  (touchSense2()&& touchSense1()) {break;} }
+            // if (str[count]=='1') {judge=0;}
+            // judge=0;
+            // pc.putc(str[count]);
+            if (count>=length){
+              for (int i=1;i<count;i++)
+              { str2[i-1]=str2[i];
+               pc.putc(str2[i-1]);
+              }
+             str2[count-1]='0';
+             pc.putc(str2[count-1]);}
+            else { str2[count]='0';count++;}
+            }
+        } else if  (touchSense2()&& touchSense1()) {  //Touch error
+            myled1 = 1;
+            myled2=1;
+            senderror();
+        } else {   //anything else
+            myled1=0;
+            myled2=0;
+        }
+        pre_cir_pro++;
+    /* And we loop. */
+    protothread3_flag=1;
+  }
+  PT_END(pt);
+}
+
+static int
+protothread3(struct pt *pt)
+{
+  /* A protothread function must begin with PT_BEGIN() which takes a
+     pointer to a struct pt. Match judging and output */
+  PT_BEGIN(pt);
+  /* We loop forever here. */
+  while(1) {
+     PT_WAIT_UNTIL(pt,count>=length &&count!=0 && protothread3_flag==1 );
+  //   pc.printf("here");
+        for (int i=0;i<length;i++)
+          { if (str[i]!=str2[i]) {judge=0;} }
+          if (judge==1 && shown==0) {pc.printf("\nMATCH");shown=1;}
+          judge=1;  
+          protothread3_flag=0;
+     //   PT_WAIT_UNTIL(pt, pc.readable()); 
+     //   pc.printf("I am here. Start inputing.");
+     //   pc.getc();
+     //   length=gtchar();
+    /* And we loop. */
+  }
+
+  /* All protothread functions must end with PT_END() which takes a
+     pointer to a struct pt. */
+  PT_END(pt);
+}
+
+
+/**
+ * Finally, we have the main loop. Here is where the protothreads are
+ * initialized and scheduled. Almost nothing in it.
+ */
+static struct pt pt1,pt2,pt3;
+int
+main(void)
+{
+  /* Initialize the protothread state variables with PT_INIT(). */
+   PT_INIT(&pt1);
+   PT_INIT(&pt2);
+   PT_INIT(&pt3);
+  /*
+   * Then we schedule the three protothreads by repeatedly calling their
+   * protothread functions and passing a pointer to the protothread
+   * state variables as arguments.
+   */while(1){ protothread2(&pt2);
+    protothread1(&pt1);
+    protothread3(&pt3);
+   }
+}