test

Dependencies:   mbed-STM32F103C8T6 mbed-rtos mbed-dev

Revision:
11:9dc8bbb8dda3
Parent:
10:ef9fa7e34eff
diff -r ef9fa7e34eff -r 9dc8bbb8dda3 main.cpp
--- a/main.cpp	Tue May 05 11:15:56 2020 +0000
+++ b/main.cpp	Wed May 06 10:03:17 2020 +0000
@@ -5,123 +5,162 @@
 #include "stdlib.h"
 #include "rtos.h"
 
-DigitalOut led1(PC_13);
+#define MAX_LENGTH_STEPS 55
+#define MIN_LENGTH_STEPS 10
+#define MOVING_UP 1
+#define MOVING_DOWN 2
+#define MOVING_FORWARD 1
+#define MOVING_BACKWARD 2
+#define STOP 0
+#define DEBOUNCE 4   /*4*20ms*/
 
-RawSerial debug_uart(PB_10, PB_11, 115200);
-RawSerial wifi_uart(PA_2, PA_3, 115200);
+DigitalOut MOTOA1(PB_4);
+DigitalOut MOTOB1(PB_5);
 
-Timer timer;
+DigitalOut MOTOA2(PB_8);
+DigitalOut MOTOB2(PB_9);
+
+AnalogIn SensorCurrent(PA_0);
 
-char      rxBuf[32];
-char      wifi_rxBuf[32];  //receive msg from xiaomi cloud
-short     g_isCloud = 0;   //flag for connected xiaomi cloud
+void motor1_move(uint8_t dir);
+void motor2_move(uint8_t dir);
+
+uint8_t sensor_cnt,cal_cnt, cur_cnt, tar_cnt, pre_sensor_cnt;
+float sense_value;
+uint8_t ov_flag, init_flag;
+uint8_t open_flag,close_flag;
 
-//char      set_property[] = {"down set_properties "}
-//char      get_property[] = {"down get_properties "}
-int       i = 0;
-//---------------------------------------------------
+#if 1 /*WIFI related*/
+DigitalOut led1(PC_13);
+Serial debug_uart(PB_10, PB_11, 115200);
+Serial wifi_uart(PA_2, PA_3, 115200);
+Timer timer;  /*used by led0_thread*/
+string a(""); /*reserved*/
+string b(""); /*used by led0_thread*/
+char  g_isCloud = 0;   //flag for connected xiaomi cloud
+#endif
 
-string a("");
-string b("");
-
+Timer timer_m;
 int flag = 0;
 
-#if 0
-void led1_thread(void const *argument) {
-    
-    while (true) 
-    {
-        wifi_uart.printf("get_down\r\n");       
-        while(1){
-            if(wifi_uart.readable())
-            {
-                char ch2 = wifi_uart.getc();
-                //f((ch2=='\n')||(ch2=='\r'))
-                if(ch2=='\r')
-                {                   
-                    debug_uart.printf("got string from wifi uart: '%s' \r\n", b.c_str());
-                    if(!strncmp(b.c_str(),"down none",9))
-                    {
-                        //debug_uart.printf("--- none\r\n");
-                    }
-                    if(!(strncmp(b.c_str(),"down set_properties",19)))  
-                    {
-                        debug_uart.printf("--- set_properties\r\n");
-                        wifi_uart.printf("result 2 7 0\r\n");
-                    }       
-                    if(!(strncmp(b.c_str(),"down get_properties",19)))  
-                    {
-                        debug_uart.printf("--- get_properties\r\n");
-                        //wifi_uart.printf("result 2 7 0\r\n");
-                    }               
-                    if(!strncmp(b.c_str(),"down MIIO_net_change",20))
-                    {
-                        if((!strncmp(b.c_str()+21, "offline", 7)))
-                        {
-                            debug_uart.printf("offline\r\n");
-                        }
-                        if((!strncmp(b.c_str()+21, "local", 5)))
-                        {
-                            debug_uart.printf("local\r\n");
-                        }
-                        if((!strncmp(b.c_str()+21, "cloud", 5)))
-                        {
-                            debug_uart.printf("cloud\r\n");
-                        }
-                    }   
-                    b.clear();  
-                    break;                  
-                }else{
-                    b += ch2;
-                }               
-            }   
-        }   
-        //wait_ms(400);
+void Power_thread(void const *argument){/*detect current*/
+  char i = 0;
+  while(true){
+    Thread::wait(200); /*unit millisec*/
+    sense_value = SensorCurrent.read();
+        //debug_uart.printf("dfdfdfdfddfdf\r\n");
+    if(sense_value>0.5){
+      debug_uart.printf("Power_thread: sense_value = %0.4f > 0.5 \r\n", sense_value);
+      i++;
+      if(i>1){
+        ov_flag = 1;  
+      }
+    }else{
+        i = 0;
+    }    
+  }
+}
+
+char CheckStopper(int ch){
+    DigitalIn Stopper1(PA_13);
+    DigitalIn Stopper2(PA_15);
+    timer_m.reset();    
+    char i = 0;
+    while(ch == MOVING_UP){
+        if(!Stopper1){i++;};
+        if(i>DEBOUNCE){break;}
+        if(timer_m.read_ms()>5000){return 1;}
+        wait_ms(20);
     }
+    while(ch == MOVING_DOWN){
+        if(!Stopper2){i++;};
+        if(i>DEBOUNCE){break;}
+        if(timer_m.read_ms()>5000){return 1;}
+        wait_ms(20);
+    }
+    return 0;
 }
 
-#endif
-
-#if 0
-void led0_thread(void const *argument) {
-    while (1) {
-        if(debug_uart.readable()){
-            char ch1 = debug_uart.getc();
-            if(ch1=='\n'){                   
-                debug_uart.printf("sent string to wifi uart: '%s' \r\n", a.c_str());
-                wifi_uart.printf("%s\r\n",a.c_str());
-                a.clear();              
-            }else{
-                a += ch1;
-            }            
-        }
-        if(wifi_uart.readable())
-        {
-            char ch2 = wifi_uart.getc();
-            if((ch2=='\n')||(ch2=='\r')){                   
-                debug_uart.printf("got string from wifi uart: '%s' \r\n", b.c_str());
-                b.clear();              
-            }else{
-                b += ch2;
-            }               
-        }
-        //wait(0.5);
-    }
+void Motor_thread(void const *argument){
+  while(true){
+    Thread::wait(200); /*unit millisec*/
+        if(!init_flag){
+      wait(1);
+      debug_uart.printf("Motor_thread: motor2 move up\r\n");   
+      motor2_move(MOVING_UP);
+            if(CheckStopper(MOVING_UP)){
+                debug_uart.printf("Motor_thread: motor2 timeout, stop motor2 and finish the calibration\r\n");
+                init_flag = 1;
+                motor2_move(STOP);
+                continue;
+            }
+            motor2_move(STOP); 
+            wait(1);
+            debug_uart.printf("Motor_thread: motor1 move forward\r\n"); 
+            sensor_cnt = 0;         
+      motor1_move(MOVING_FORWARD);
+      while(1){   
+                if(ov_flag){
+                    motor1_move(STOP);
+                    cal_cnt = sensor_cnt;
+                    ov_flag = 0;
+                    break;
+                }
+      }     
+      wait(1);
+            debug_uart.printf("Motor_thread: motor2 move down\r\n");  
+      motor2_move(MOVING_DOWN);
+            if(CheckStopper(MOVING_DOWN)){
+                debug_uart.printf("Motor_thread: motor2 timeout, stop motor2 and finish the calibration\r\n");
+                init_flag = 1;
+                motor2_move(STOP);
+                continue;
+            }
+      motor2_move(STOP);
+            wait(1);
+            debug_uart.printf("Motor_thread: motor1 move backward\r\n");  
+            sensor_cnt = 0;
+      motor1_move(MOVING_BACKWARD);
+      while(1){   
+                if(ov_flag){
+                    motor1_move(STOP);
+                    ov_flag = 0;
+                    debug_uart.printf("Motor_thread: cal_cnt = %d, 1/2(cal_cnt+sensor_cnt)\r\n", (cal_cnt+sensor_cnt)/2); 
+                    break;
+                }
+                if(sensor_cnt>=cal_cnt){
+                    motor1_move(STOP);
+                    debug_uart.printf("Motor_thread: cal_cnt = %d\r\n", cal_cnt);  
+                    break;
+                }
+      }
+            cur_cnt = 0;            
+      wait(1);
+      debug_uart.printf("Motor_thread: motor2 move to center\r\n"); 
+      motor2_move(MOVING_UP);
+      wait(1.6);
+      motor2_move(STOP);
+            init_flag = 1;
+            debug_uart.printf("Motor_thread: auto-curtain length was calibrated sucessfully\r\n");          
+    }else{
+            debug_uart.printf("Motor_thread: auto-curtain is waiting for command\r\n"); 
+            wait(3);            
+        }    
+  }
 }
-#endif
 
 void led0_thread(void const *argument) {
     int err;
     char rxBuf[32];
     char wifi_rxBuf[32];
     char i; 
-        int position;
-        char dat[2];
-    
+    int position;
+    char dat[2];
+
     while (1) {
         wifi_uart.printf("get_down\r");
-                timer.reset();  
-                b.clear();
+        timer.reset();  
+        b.clear();
         while(timer.read_ms()<5000){
             if(wifi_uart.readable()){
                 char ch = wifi_uart.getc();
@@ -129,89 +168,176 @@
                     b += ch;
                 }else{
                     debug_uart.printf("get string: %s \r\n", b.c_str());
-                                        #if 1
-                                        if(!strncmp(b.c_str(),"down none",9))
+                    #if 1
+                    if(!strncmp(b.c_str(),"down none",9))
                     {
                         //debug_uart.printf("--- none\r\n");
                     }
                     if(!(strncmp(b.c_str(),"down set_properties",19)))  
                     {
-                        debug_uart.printf("--- set_properties\r\n");
-                                                b.erase(0,b.length()-3);
-                                                position = atoi(b.c_str());
-                                                debug_uart.printf("position = %d\r\n",position);
+                        //debug_uart.printf("--- set_properties\r\n");
+                        b.erase(0,b.length()-3);
+                        position = atoi(b.c_str());
+                        debug_uart.printf("position = %d\r\n",position);
                         wifi_uart.printf("result 2 7 0\r\n");
-                                                b.clear();
-                                                continue;
+                        b.clear();
+                        continue;
                     }       
                     if(!(strncmp(b.c_str(),"down get_properties",19)))  
                     {
-                        debug_uart.printf("--- get_properties\r\n");
-                                                wifi_uart.printf("result 2 4 0 10 2 6 0 %d 2 7 30\r\n", position);
-                                                b.clear();
-                                                continue;
+                        //debug_uart.printf("--- get_properties\r\n");
+                        wifi_uart.printf("result 2 4 0 10 2 6 0 %d 2 7 30\r\n", position);
+                        b.clear();
+                        continue;
                     }               
                     if(!strncmp(b.c_str(),"down MIIO_net_change",20))
                     {
                         if((!strncmp(b.c_str()+21, "offline", 7)))
                         {
-                            debug_uart.printf("offline\r\n");
+                            //debug_uart.printf("offline\r\n");
                         }
                         if((!strncmp(b.c_str()+21, "local", 5)))
                         {
-                            debug_uart.printf("local\r\n");
+                            //debug_uart.printf("local\r\n");
                         }
                         if((!strncmp(b.c_str()+21, "cloud", 5)))
                         {
-                            debug_uart.printf("cloud\r\n");
+                            //debug_uart.printf("cloud\r\n");
                         }
                     }
-                                        #endif                                      
+                    #endif                                      
                     break;
                 }
             }
         }
-                while(wifi_uart.readable()){wifi_uart.getc();}  
+        while(wifi_uart.readable()){wifi_uart.getc();}  
         wait_ms(400);
     }
 }
 
-void wifi_debug(void const *argument){
-  while(1){
-    if(wifi_uart.readable()){
-      debug_uart.putc(wifi_uart.getc());
+void serialprocess(void const *argument){
+    while(1){
+        if(debug_uart.readable()){
+            char ch = debug_uart.getc();
+            if(ch!=0x0d){
+                a += ch;
+            }else{
+                debug_uart.printf("get command from uart: '%s'\r\n", a.c_str());
+                if(!strncmp(a.c_str(),"stp1",4)){
+                    debug_uart.printf("stepper1 ready\r\n");
+                }
+                if(!strncmp(a.c_str(),"stp2",4)){
+                    debug_uart.printf("stepper2 ready\r\n");
+                }
+                if(!strncmp(a.c_str(),"ovflag",6)){
+                    debug_uart.printf("ovflag = 1\r\n");
+                }
+                a.clear(); 
+            }
+        }
     }
-    if(debug_uart.readable()){
-      wifi_uart.putc(debug_uart.getc());
+}
+
+void serialIRQ(void){
+    debug_uart.putc(debug_uart.getc());
+}
+
+void sensor_capture_cb(void){
+  sensor_cnt++;
+  if(open_flag){
+        if(cur_cnt<tar_cnt){
+            cur_cnt++;  
+        }    
+  }
+  if(close_flag){
+    if(cur_cnt>0){
+      cur_cnt--;  
     }
   }
 }
 
+void motor1_move(uint8_t dir){/*main motor*/
+  if(dir==1){/*forward*/
+    MOTOA1 = 0;
+    MOTOB1 = 1;
+  }else if(dir==2){/*backward*/
+    MOTOA1 = 1;
+    MOTOB1 = 0;
+  }else{ /*stop*/
+    MOTOA1 = 0;
+    MOTOB1 = 0;
+  }
+}
+
+void motor2_move(uint8_t dir){/*assistant motor*/
+  if(dir==1){/*up*/
+    MOTOA2 = 0;
+    MOTOB2 = 1;
+  }else if(dir==2){/*down*/
+    MOTOA2 = 1;
+    MOTOB2 = 0;
+  }else{ /*stop*/
+    MOTOA2 = 0;
+    MOTOB2 = 0;
+  }
+}
+
+
+void system_init(){
+  MOTOA1 = 0;
+  MOTOB1 = 0;
+  MOTOA2 = 0;
+  MOTOB2 = 0;
+  init_flag = 0; 
+  cur_cnt = 0;
+  cal_cnt = 0; 
+  sense_value = 0;
+    debug_uart.printf("\r\n");
+  debug_uart.printf("************************************************\r\n");
+  debug_uart.printf("******************LAIWU TECH********************\r\n");  
+  debug_uart.printf("************************************************\r\n");
+  debug_uart.printf("****system init done, wait 3 seconds to start***\r\n");
+  wait(3);
+}
+
 int main() {
 
-    debug_uart.printf("hello world\r\n");
+        system_init();
+
     led1 = 1; 
-        flag = 0;
+    flag = 0;
+        
+    wait(3);
+        
+        InterruptIn Hall1(PA_14);
+        Hall1.fall(callback(sensor_capture_cb)); // Attach ISR to handle button press event
         
-        wait(3);
+        debug_uart.printf("************************************************\r\n");
+        debug_uart.printf("***************hall sensor init*****************\r\n");
+
 
-    Thread thread1(led0_thread, NULL, osPriorityHigh, DEFAULT_STACK_SIZE); /*check the real-time current*/
-    
+    //Thread thread2(Power_thread, NULL, osPriorityNormal, DEFAULT_STACK_SIZE); /*check the real-time current*/
+        debug_uart.printf("**********************2*************************\r\n");
+        //Thread thread3(Motor_thread, NULL, osPriorityNormal, DEFAULT_STACK_SIZE); /*check the real-time current*/     
+        debug_uart.printf("**********************3*************************\r\n");
+        Thread thread1(led0_thread, NULL, osPriorityNormal, DEFAULT_STACK_SIZE); /*check the wifi connection*/
+        debug_uart.printf("**********************1*************************\r\n");
         
-    timer.start(); 
+        debug_uart.printf("**************three threads init****************\r\n");
+        
+    timer.start();      
+        timer_m.start();
+        
+        debug_uart.printf("************************************************\r\n");
+        debug_uart.printf("****************two timer init*****************\r\n");
+        
+        debug_uart.attach(&serialIRQ, Serial::RxIrq);
 
     while(1)
     {
-            wait(1);
-#if 0           
-            if(flag){
-                debug_uart.printf("get string: '%s'\r\n", b.c_str());
-                b.clear();
-                while(wifi_uart.readable()){wifi_uart.getc();}      
-                flag = 0;
-                debug_uart.printf("sent get_down to module\r\n");
-                wifi_uart.printf("get_down\r\n");               
-            }
-#endif          
+       wait(1);
+             //wifi_uart.printf("get_down\r");
+      //debug_uart.printf("************************************************\r\n");
+            //debug_uart.printf("********************%%%%%***********************\r\n");
     }
 }
\ No newline at end of file