test
Dependencies: mbed-STM32F103C8T6 mbed-rtos mbed-dev
main.cpp
- Committer:
- bbw
- Date:
- 2020-05-06
- Revision:
- 11:9dc8bbb8dda3
- Parent:
- 10:ef9fa7e34eff
File content as of revision 11:9dc8bbb8dda3:
#include "mbed.h"
#include "stm32f103c8t6.h"
#include <string>
#include "stdio.h"
#include "stdlib.h"
#include "rtos.h"
#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*/
DigitalOut MOTOA1(PB_4);
DigitalOut MOTOB1(PB_5);
DigitalOut MOTOA2(PB_8);
DigitalOut MOTOB2(PB_9);
AnalogIn SensorCurrent(PA_0);
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;
#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
Timer timer_m;
int flag = 0;
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;
}
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);
}
}
}
void led0_thread(void const *argument) {
int err;
char rxBuf[32];
char wifi_rxBuf[32];
char i;
int position;
char dat[2];
while (1) {
wifi_uart.printf("get_down\r");
timer.reset();
b.clear();
while(timer.read_ms()<5000){
if(wifi_uart.readable()){
char ch = wifi_uart.getc();
if(ch!=0x0d){
b += ch;
}else{
debug_uart.printf("get string: %s \r\n", b.c_str());
#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);
wifi_uart.printf("result 2 7 0\r\n");
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;
}
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");
}
}
#endif
break;
}
}
}
while(wifi_uart.readable()){wifi_uart.getc();}
wait_ms(400);
}
}
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();
}
}
}
}
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() {
system_init();
led1 = 1;
flag = 0;
wait(3);
InterruptIn Hall1(PA_14);
Hall1.fall(callback(sensor_capture_cb)); // Attach ISR to handle button press event
debug_uart.printf("************************************************\r\n");
debug_uart.printf("***************hall sensor init*****************\r\n");
//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");
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);
//wifi_uart.printf("get_down\r");
//debug_uart.printf("************************************************\r\n");
//debug_uart.printf("********************%%%%%***********************\r\n");
}
}