/*---------------------------------------------------------------------------- 头文件 *---------------------------------------------------------------------------*/ #include "RTE_Components.h" #include CMSIS_device_header //#include "cmsis_os2.h" #include "bsp.h" /********************************************************************************************************** 函数声明 ********************************************************************************************************** */ void USERTaskCreate (void); void USER_Task_LinkStatus(void *argument); //WIFI连接状态 void USER_Task_WIFI(void *argument);//ESP8266 void USER_Task_MSG(void *argument);//消息处理 void USERTaskStart(void *argument);//开启任务 void USERTask_Process1(void *argument);//间隔测量执行过程 void USERTask_Resume(void *argument);//任务启动 void User_Task_Test(void *argument);//任务启动 uint8_t IsAppointmentRight(void); /* ********************************************************************************************************** 变量声明 ********************************************************************************************************** */ ITStatus Wake_way=RESET;//设备启动的方式 1 待机唤醒,0按钮开机 u8 Enable_SDI_RS232=0; //0使能SDI 1使能串口232(esp8266改串口232) u8 LinkStatus=0; //WIFI连接状态:2连接,其他为未连接 u8 Creat_WIFI=0; u8 Creat_BC25=0; TASKRUNS TASKRUNSS; //任务运行标志 u32 wut_rtc_s=0;//开启间隔测量的RTC时间 TASKFISHED TASKFISHEDS; u8 WKUP_PIN_Status=0;//按键状态 1,摁下,0未摁下 u8 Check_WKUP_key=0; u32 time__sta_bc25=0;//BC25任务启动时间 u32 time__sta_pro1=0;//流程1任务启动时间 char rtc_data[15]={0},rtc_time[15]={0},CLOSE_ALARM = 0; extern char name[],hhmmsss[],yymmddd[]; char NOWtime[15]; uint32_t appointment_y,appointment_s,NOW_y,NOW_s; /* **************************************************************************************************** 任务的属性设置 ****************************************************************************************************** */ const osThreadAttr_t ThreadLinkStatus_Attr = { .name = "LinkStatus", .attr_bits = osThreadDetached, .priority = osPriorityHigh2, .stack_size = 512, }; const osThreadAttr_t ThreadStart_Attr = { .name = "ThreadStart", .attr_bits = osThreadDetached, .priority = osPriorityHigh2, .stack_size = 512, }; const osThreadAttr_t ThreadWIFI_Attr = { .name = "ThreadWIFI", .attr_bits = osThreadDetached, .priority = osPriorityHigh2, .stack_size = 1024, }; const osThreadAttr_t ThreadMSG_Attr = { .name = "ThreadMSG", .attr_bits = osThreadDetached, .priority = osPriorityNormal, .stack_size = 1024, }; const osThreadAttr_t ThreadTest_Attr = { .name = "ThreadTest", .attr_bits = osThreadDetached, .priority = osPriorityHigh2, .stack_size = 2048, }; static const osEventFlagsAttr_t EventFlagAttr_PROCESS = { .name = "PROCESS_Events", }; static const osEventFlagsAttr_t EventFlagAttr_Start = { .name = "Start_Events", }; static const osEventFlagsAttr_t EventFlagAttr_Fished = { .name = "Fished_Events", }; const osThreadAttr_t ThreadUSERTask_Resume_Attr = { .name = "ThreadUSERTask_Resume", .attr_bits = osThreadDetached, .priority = osPriorityHigh2, .stack_size = 1024, }; const osThreadAttr_t ThreadPROCESS1_Attr = { .name = "ThreadPROCESS1", .attr_bits = osThreadDetached, .priority = osPriorityHigh2, .stack_size = 2048, }; const osThreadAttr_t ThreadBC25_Attr = { .name = "ThreadBC25", .attr_bits = osThreadDetached, .priority = osPriorityHigh2, .stack_size = 2048, }; static const osMutexAttr_t WIFI_Mutex_Attr = { .name = "WIFI_Multiplex", }; static const osMutexAttr_t SDI_Mutex_Attr = { .name = "SDI_Multiplex", }; static const osMutexAttr_t TF_Mutex_Attr = { .name = "TF_Multiplex", //.attr_bits = osMutexRobust, }; static const osSemaphoreAttr_t Proces1_Semaphore_Attr = { .name = "Proces1_Sem", }; static const osSemaphoreAttr_t BC25_Semaphore_Attr = { .name = "BC25_Sem", }; /* ********************************************************************************************* 任务句柄 *********************************************************************************************** */ osThreadId_t ThreadIdSMSG = NULL; osThreadId_t ThreadIdTaskLinkStatus = NULL; osThreadId_t ThreadIdTaskBC25 = NULL; osThreadId_t ThreadIdWIFI = NULL; osThreadId_t ThreadIdStart = NULL; osThreadId_t ThreadIdProcsee1 = NULL; osThreadId_t ThreadIdUSERTask_Resume = NULL; osThreadId_t ThreadIdTest = NULL; osSemaphoreId_t Process1ID_Semaphore; // semaphore id osSemaphoreId_t BC25ID_Semaphore; // semaphore id osEventFlagsId_t EventFlagID_PROCESS=NULL; //过程标志 osEventFlagsId_t EventFlagID_Start=NULL;//启动标志 osEventFlagsId_t EventFlagID_Fished=NULL;//结束标志 osMutexId_t WIFI_MutexID=NULL; osMutexId_t SDI_MutexID=NULL; osMutexId_t TFcard_MutexID=NULL; /**************************************************** *函数名:main() *功 能:主函数 *输 入:无 *输 出:无 */ int main (void) { SCB->VTOR = FLASH_BASE | 0x10000; /* Vector Table Relocation in Internal FLASH. */ // System Initialization SystemCoreClockUpdate(); // ... bsp_init(); osKernelInitialize(); // Initialize CMSIS-RTOS EventFlagID_PROCESS = osEventFlagsNew(&EventFlagAttr_PROCESS); EventFlagID_Start = osEventFlagsNew(&EventFlagAttr_Start); EventFlagID_Fished = osEventFlagsNew(&EventFlagAttr_Fished); Process1ID_Semaphore = osSemaphoreNew(1, 1, &Proces1_Semaphore_Attr ); BC25ID_Semaphore = osSemaphoreNew(1, 1, &BC25_Semaphore_Attr ); /* 创建启动任务 */ ThreadIdStart = osThreadNew(USERTaskStart, NULL, &ThreadStart_Attr); osKernelStart(); // Start thread execution for (;;) { } } uint8_t IsAppointmentRight(void) { GetRTC(hhmmsss,yymmddd); NOWtime[0] = '2'; NOWtime[1] = '0'; memcpy(&NOWtime[2],yymmddd,6); NOW_y = atoi(NOWtime); memset(NOWtime,0,15); memcpy(NOWtime,hhmmsss,6); NOW_s = atoi(NOWtime); memset(NOWtime,0,15); memcpy(NOWtime,Init_Data_Equipment.appointment_time,8); appointment_y = atoi(NOWtime); memset(NOWtime,0,15); memcpy(NOWtime,&Init_Data_Equipment.appointment_time[8],6); appointment_s = atoi(NOWtime); if(NOW_y > appointment_y) { return 0; } else if(NOW_y < appointment_y) { return 1; } else { if(NOW_s > appointment_s) { return 0; } else { return 1; } } } /**************************************************** *函数名:USER_Task_BC25() *功 能:NB模块向服务器发送数据 *输 入:无 *输 出:无 */ void USER_Task_BC25(void *argument) { u8 i=0; u32 BC25_SIZE=0; osStatus_t BC25_Thread_status; while(1) { osSemaphoreAcquire(BC25ID_Semaphore, osWaitForever); time__sta_bc25=osKernelGetTickCount ();//获取启动时间 TASKRUNSS.BC25_RUN=1; BC25_Status.socket=0; //u5_printf("BC25_Start\r\n"); for(i=0;i<5;i++) { BC25_Init(); if(BC25_Status.netstatus==1) { i=6; BC25_CloseSocket();//关闭上一次连接 BC25_CreateSokcet(Init_Data_Equipment.Bc25_Ip,Init_Data_Equipment.Bc25_Port);//创建连接 } if(BC25_Status.cpin==0)//如果没装卡的话,尽快结束远传任务 { i=6; } i++; } USART2_ReceiveBuff_Clear(); printf("AT+CGPADDR?\r\n"); //delay_ms(500); //u5_printf("IP:%s\r\n",(const char*)USART2_RX_BUF); osEventFlagsSet(EventFlagID_PROCESS,EVENT_TFread_BIT_5); if(osEventFlagsGet(EventFlagID_PROCESS)&EVENT_TFstore_BIT_6) { osDelay(3000); } if(BC25_Status.netstatus==1) { i=0; BC25_SIZE=0; while((BC25_SIZE<=30)&(i<50)) { i++; delay_ms(5); BC25_SIZE=txt_size_read("BC25"); } if(BC25_SIZE>30) { //u5_printf("BC25_txt_size:%ld\r\n",BC25_SIZE); FATFS_Read_TF("BC25",0,BC25_SIZE);//读取TF记录数据,通过BC25发送 i=0; while(i<10) { osDelay(1000); if(strstr((char*)USART2_RX_BUF,"par")!=NULL) { USART2_Recieve_Ide(); USART2_ReceiveBuff_Clear(); } i++; } } //u5_printf("BC25.txt send finish\r\n"); } osEventFlagsClear(EventFlagID_PROCESS,EVENT_TFread_BIT_5); BC25_POWEROFF(); TASKRUNSS.BC25_RUN=0; //u5_printf("Terminate TaskBC25\r\n"); i=0; osSemaphoreRelease(BC25ID_Semaphore); BC25_Thread_status=osThreadTerminate(ThreadIdTaskBC25); //u5_printf("Terminate TaskBC25............... fail\r\n"); while((BC25_Thread_status!=osOK)&(i<10)) { //u5_printf("BC25_Thread_status:%d\r\n",BC25_Thread_status); BC25_Thread_status=osThreadTerminate(ThreadIdTaskBC25); i++; } //BC25_Thread_status=osThreadTerminate(ThreadIdTaskBC25); osDelay(500); } } /**************************************************** *函数名:USER_Task_LinkStatus() *功 能:WIFI作为服务端,向客户端发送心跳包保持连接,同时判断是否有客户端连接 *输 入:无 *输 出:无 */ void USER_Task_LinkStatus(void *argument) { u8 i=0; // osDelay(20000);//延迟等待建立WIFI //osEventFlagsWait(EventFlagID_PROCESS,EVENT_WIFIcreat_BIT_9,osFlagsWaitAll,200000 ); while(1) { uint8_t Temp_LinkStatus=0; LinkStatus=2; for(i=0;i<4;i++) { osMutexAcquire(WIFI_MutexID,osWaitForever); Temp_LinkStatus=ESP8266_Get_LinkStatus(); if(Temp_LinkStatus==2) { i=0; ESP8266_SendString(DISABLE,"Heartbeat,*",11,0);//发送心跳包,保持连接 } osMutexRelease(WIFI_MutexID); osDelay(60000); //osDelay(30000); } //LinkStatus=0; if(LinkStatus!=2) { osEventFlagsSet(EventFlagID_PROCESS,EVENT_LinkStatus_BIT_3); osEventFlagsClear(EventFlagID_PROCESS,EVENT_WIFIcreat_BIT_9); osThreadTerminate(ThreadIdTaskLinkStatus); osThreadTerminate(ThreadIdWIFI); } osDelay(5); } } /**************************************************** *函数名:USER_Task_WIFI() *功 能:创建WIFI服务端,查询客户端发送的指令 *输 入:无 *输 出:无 */ void USER_Task_WIFI(void *argument) { while(1) { if(!(osEventFlagsGet(EventFlagID_PROCESS)&EVENT_WIFIcreat_BIT_9)) { ESP8266_AP_TCPServer_Config(Init_Data_Equipment.ESP8266_AP_SSIDs, Init_Data_Equipment.ESP8266_AP_PWDs, Init_Data_Equipment.ESP8266_AP_Ports); // Creat_WIFI=1; PWR_CTRL5V_H; //开启5V 9V电源 //PWR_CTRL3V3_H; osEventFlagsSet(EventFlagID_PROCESS,EVENT_WIFIcreat_BIT_9); __nop(); } osMutexAcquire(WIFI_MutexID,osWaitForever); USART4_Recieve_Ide(); osMutexRelease(WIFI_MutexID); osDelay(20); } } /**************************************************** *函数名:USERTask_Process1() *功 能:数据采集流程 *输 入:无 *输 出:无 */ void USERTask_Process1(void *argument) { u8 i=0; //char Process1_Buf[300]={'\0'}; osStatus_t PRO1_Thread_status; while(1) { osSemaphoreAcquire(Process1ID_Semaphore, osWaitForever); time__sta_pro1=osKernelGetTickCount ();//获取流程启动时间 TASKRUNSS.PROS1_RUN=1; GetRTC(rtc_time,rtc_data); sprintf(name,"%s_%s.txt",rtc_data,Init_Data_Equipment.Measure_Interval); if(IS_FIRST_SAVE) { memcpy(rtc_data,&Init_Data_Equipment.appointment_time[2],6); memcpy(rtc_time,&Init_Data_Equipment.appointment_time[8],6); IS_FIRST_SAVE = 0; } L76X_POWER_ON(); //开启定位电源 ADC15_POWERON(); //开启ADC电源 delay_ms(10); //不可去掉,去掉低电压时会重启 PWR_CTRL5V_H; //开启5V 9V电源 sdi12_process(); ADC15_Process(); L76C_Process(); Common_Data_Pack();//数据打包,数据更新 if(osEventFlagsGet(EventFlagID_PROCESS)&EVENT_TFread_BIT_5)//BC25在远传 { osEventFlagsSet(EventFlagID_PROCESS,EVENT_TFstore_BIT_6); //u5_printf("stroe wait\r\n"); osEventFlagsWait(EventFlagID_PROCESS,EVENT_TFread2_BIT_7,osFlagsWaitAll,10000 ); //u5_printf("TF data entry1\r\n"); Data_Write_TF(); //u5_printf("stroe finish\r\n"); osEventFlagsClear(EventFlagID_PROCESS,EVENT_TFstore_BIT_6); osEventFlagsSet(EventFlagID_PROCESS,EVENT_TFstore2_BIT_8); } else { //u5_printf("TF data entry2\r\n"); osEventFlagsSet(EventFlagID_PROCESS,EVENT_TFstore_BIT_6); Data_Write_TF(); osEventFlagsClear(EventFlagID_PROCESS,EVENT_TFstore_BIT_6); //u5_printf("TF data quit2\r\n"); } // if(LinkStatus == 2)//如果有WIFI连接,测量数据发送到上位机 // { // sprintf(Process1_Buf,"%s%s%s,*","Pub,",data_common1.Pack_len,data_common1.Pack_data); // osMutexAcquire(WIFI_MutexID,osWaitForever); // ESP8266_SendString(DISABLE,Process1_Buf,strlen(Process1_Buf),0); // osMutexRelease(WIFI_MutexID); // } //u5_printf("Terminate Procsee1\r\n"); // L76X_POWER_OFF(); // ADC15_POWEROFF(); // PWR_CTRL5V_L; osSemaphoreRelease(Process1ID_Semaphore); TASKRUNSS.PROS1_RUN=0; osThreadTerminate(ThreadIdProcsee1); //u5_printf("Terminate Procsee1 fail\r\n"); PRO1_Thread_status=osThreadTerminate(ThreadIdProcsee1); while((PRO1_Thread_status!=osOK)&(i<10)) { //u5_printf("PRO1_Thread_status:%d\r\n",PRO1_Thread_status); PRO1_Thread_status=osThreadTerminate(ThreadIdProcsee1); i++; } osDelay(1000); } } /**************************************************** *函数名:USERTask_Resume() *功 能:任务唤醒 *输 入:全局变量 MYITStatus1 * 全局变量 WKUP_PIN_Status *输 出:无 */ void USERTask_Resume(void *argument) { u32 measurt_idv_set; osThreadState_t Thread_Stasus; while(1) { if(MYITStatus1.AlarmA_ITStatus == 1) { //u5_printf("TASKRUNSS.BC25_RUN:%d\r\n",TASKRUNSS.BC25_RUN); Thread_Stasus=osThreadGetState(ThreadIdTaskBC25); //u5_printf("Thread_Stasus_bc25:%d\r\n",Thread_Stasus); if((Thread_Stasus==osThreadError )||(TASKRUNSS.BC25_RUN!=1)) { //u5_printf("USER_Task_BC25 creat\r\n"); ThreadIdTaskBC25 = osThreadNew(USER_Task_BC25, NULL, &ThreadBC25_Attr); } //u5_printf("config AlarmA\r\n"); MYITStatus1.AlarmA_ITStatus=0; RTC_AlarmAConfig(get_pubidv()); } if(MYITStatus1.AlarmB_ITStatus == 1) { Thread_Stasus=osThreadGetState(ThreadIdProcsee1); //u5_printf("PROSS1_Thread_Stasus:%d\r\n",Thread_Stasus); if(Thread_Stasus==osThreadError ) { //u5_printf("USERTask_Process1 creat\r\n"); ThreadIdProcsee1 = osThreadNew(USERTask_Process1, NULL, &ThreadPROCESS1_Attr); } MYITStatus1.AlarmB_ITStatus=0; Measure_Ap_E(); //Write_Equipment_Par(Init_Data_Equipment); //关机再开机后为正常测量模式 CLOSE_ALARM = 1; } if(MYITStatus1.WUT_ITStatus == 1) { //u5_printf("USERTask_Process1 start\r\n"); Thread_Stasus=osThreadGetState(ThreadIdProcsee1); //u5_printf("PROSS1_Thread_Stasus:%d\r\n",Thread_Stasus); if((Thread_Stasus==osThreadError )||(TASKRUNSS.PROS1_RUN!=1)) { //u5_printf("USERTask_Process1 creat\r\n"); // Thread_Stasus=osThreadGetState(ThreadIdTaskBC25); // if(Thread_Stasus == 1) // { // osDelay(1000); // } ThreadIdProcsee1 = osThreadNew(USERTask_Process1, NULL, &ThreadPROCESS1_Attr); } MYITStatus1.WUT_ITStatus=0; if(measurt_idv_set<1) { measurt_idv_set=1; } RtcWakeUpConfig(get_meaidv() - 1); // if(CLOSE_ALARM) // { // CLOSE_ALARM = 0; // RtcWakeUpConfig(get_meaidv() - 4); // } // else // { // RtcWakeUpConfig(get_meaidv() - 2); // } wut_rtc_s=RTC_GetSeconds()+measurt_idv_set*60; if(wut_rtc_s>86400)wut_rtc_s-=86400; } if(1)//按键中断MYITStatus1.WKUP1_ITStatus == 1 { //if(WKUP_PIN_Status==4)//摁下10S以上,恢复出厂设置 if(key_time==200)//摁下10S以上,恢复出厂设置 { MYITStatus1.WKUP1_ITStatus =0; //u5_printf("WKUP_PIN_10S\r\n"); Write_Factory_Par(); } if((key_time>=30)|(Check_WKUP_key))//摁下3S以上,启动WIFI { Thread_Stasus=osThreadGetState(ThreadIdTaskLinkStatus); if(Thread_Stasus==osThreadError ) { //u5_printf("Create Wifi Task\r\n"); ThreadIdWIFI = osThreadNew(USER_Task_WIFI, NULL, &ThreadWIFI_Attr); ThreadIdTaskLinkStatus = osThreadNew(USER_Task_LinkStatus, NULL, &ThreadLinkStatus_Attr); } MYITStatus1.WKUP1_ITStatus =0; Check_WKUP_key=0; //u5_printf("WKUP_PIN_3S\r\n"); } } if(MYITStatus1.WKUP_POWBUTTON == 1)//电源上电 { MYITStatus1.WKUP_POWBUTTON=0; if((Init_Data_Equipment.measure_mode[0]=='1') && (IsAppointmentRight()))//模式为1,预约测量,只设置预约测量时间 { Measure_Ap_S(); TASKRUNSS.POW_RUN=0;//只设置了预约时间 }else { Thread_Stasus=osThreadGetState(ThreadIdProcsee1); if(Thread_Stasus==osThreadError ) { ThreadIdProcsee1 = osThreadNew(USERTask_Process1, NULL, &ThreadPROCESS1_Attr); } RtcWakeUpConfig(get_meaidv() - 1); RTC_AlarmAConfig(get_pubidv()); } } if(MYITStatus1.WKUP_MEA_WIFI == 1)//WIFI启动测量 { Thread_Stasus=osThreadGetState(ThreadIdProcsee1); if(Thread_Stasus==osThreadError ) { ThreadIdProcsee1 = osThreadNew(USERTask_Process1, NULL, &ThreadPROCESS1_Attr); } MYITStatus1.WKUP_MEA_WIFI=0; } if(MYITStatus1.WKUP_Test_WIFI == 1)//WIFI启动测试 { Thread_Stasus=osThreadGetState(ThreadIdTest); if((Thread_Stasus==osThreadError )||(!(osEventFlagsGet(EventFlagID_PROCESS)&EVENT_Test_BIT_10))) { ThreadIdTest=osThreadNew(User_Task_Test,NULL,&ThreadTest_Attr); } MYITStatus1.WKUP_Test_WIFI=0; } osDelay(10); } } /**************************************************** *函数名:USER_Task_MSG() *功 能:任务结束判断,进入低功耗模式 *输 入:无 *输 出:无 */ void USER_Task_MSG(void *argument) { osDelay(500);//等待其他任务启动 while(1) { if(osThreadGetState(ThreadIdTaskBC25)==osThreadError) { TASKFISHEDS.BC25_FIS=1; } else TASKFISHEDS.BC25_FIS=0; if(osThreadGetState(ThreadIdProcsee1)==osThreadError) { TASKFISHEDS.PROS1_FIS=1; } else { TASKFISHEDS.PROS1_FIS=0; } if(osThreadGetState(ThreadIdTaskLinkStatus)==osThreadError) { TASKFISHEDS.WIFILink_FIS=1; } else { TASKFISHEDS.WIFILink_FIS=0; } //u5_printf("%d,%d,%d\r\n",TASKFISHEDS.PROS1_FIS,TASKFISHEDS.BC25_FIS,TASKFISHEDS.WIFILink_FIS); if(TASKFISHEDS.BC25_FIS & TASKFISHEDS.PROS1_FIS & TASKFISHEDS.WIFILink_FIS & (!MYITStatus1.WUT_ITStatus)& (!MYITStatus1.AlarmA_ITStatus& !WKUP_KD ) ) { if((Init_Data_Equipment.measure_mode[0]==0x31) && (IsAppointmentRight()))//测量模式为1,预约测量 { RTC_WakeUpCmd(DISABLE);//屏蔽时间唤醒数据采集 RTC_AlarmCmd(RTC_Alarm_A, DISABLE);//屏蔽远传 } //u5_printf("Procsee1_status:%d\r\n",osThreadGetState(ThreadIdProcsee1)); //u5_printf("BC25_status:%d\r\n",osThreadGetState(ThreadIdTaskBC25)); EXTI_ClearITPendingBit(EXTI_Line13); RTC_ClearITPendingBit(RTC_IT_WUT); EXTI_ClearITPendingBit(EXTI_Line20); RTC_ClearITPendingBit(RTC_IT_ALRB); RTC_ClearITPendingBit(RTC_IT_ALRA); EXTI_ClearITPendingBit(EXTI_Line17); PWR_EnterSTANDBYMode(); } osDelay(50); } } void User_Task_Test(void *argument) { char Test_Buf[400]; int len; char rtc_data_test[15]={0},rtc_time_test[15]={0}; u32 tf_total,tf_free; while(1) { osEventFlagsSet(EventFlagID_PROCESS,EVENT_Test_BIT_10); //u5_printf("User_Task_Test_start\r\n"); //PWR_CTRL3V3_H; //开启3.3V总电源 osDelay(1000); TASKRUNSS.Test_RUN=1; GetRTC(rtc_time_test,rtc_data_test); /************************数据流程开始******************************/ if(!TASKRUNSS.PROS1_RUN) { osSemaphoreAcquire(Process1ID_Semaphore, osWaitForever); GetRTC(rtc_time,rtc_data); L76X_POWER_ON(); //开启定位电源 ADC15_POWERON(); //开启ADC电源 PWR_CTRL5V_H; //开启5V 9V电源 sdi12_process(); ADC15_Process(); L76C_Process(); } else { osSemaphoreAcquire(Process1ID_Semaphore, osWaitForever); //保存测试的数据 } sprintf(rtc_data,"%s",rtc_data_test); sprintf(rtc_time,"%s",rtc_time_test); Common_Data_Pack();//数据打包,数据更新 /************************数据流程结束*****************************/ /*************************远传流程开始*****************************/ if(!TASKRUNSS.BC25_RUN) { osSemaphoreAcquire(BC25ID_Semaphore, osWaitForever); BC25_Init(); } else { //osSemaphoreAcquire(BC25ID_Semaphore, osWaitForever); } /*************************保存测试数据*****************************/ //保存测试数据 Pub,长度,设备号,时间,电压,传感器数据,IOT_Cpin,IOT_Csq,IOT_Net,Tf_Tol,Tf_Free if(osEventFlagsGet(EventFlagID_PROCESS)&EVENT_TFread_BIT_5)//BC25在远传 { osEventFlagsSet(EventFlagID_PROCESS,EVENT_TFstore_BIT_6); //u5_printf("test stroe wait\r\n"); osEventFlagsWait(EventFlagID_PROCESS,EVENT_TFread2_BIT_7,osFlagsWaitAll,10000 ); //u5_printf("test TF data entry1\r\n"); exf_getfree("0", &tf_total, &tf_free); len = strlen(data_common1.Pack_data); sprintf(data_common1.Pack_data+len,",%d,%d,%d,%ld,%ld",BC25_Status.cpin,BC25_Status.CSQ,BC25_Status.netstatus,tf_total,tf_free); Write_Test(); //u5_printf("test stroe finish\r\n"); osEventFlagsClear(EventFlagID_PROCESS,EVENT_TFstore_BIT_6); osEventFlagsSet(EventFlagID_PROCESS,EVENT_TFstore2_BIT_8); } else { osEventFlagsSet(EventFlagID_PROCESS,EVENT_TFstore_BIT_6); exf_getfree("0", &tf_total, &tf_free); len = strlen(data_common1.Pack_data); sprintf(data_common1.Pack_data+len,",%d,%d,%d,%ld,%ld",BC25_Status.cpin,BC25_Status.CSQ,BC25_Status.netstatus,tf_total,tf_free); Write_Test(); osEventFlagsClear(EventFlagID_PROCESS,EVENT_TFstore_BIT_6); } sprintf(Test_Buf,"%s%d,%s,*","Pub,",strlen(data_common1.Pack_data)+2,data_common1.Pack_data); //u5_printf("test_buf %s\r\n",Test_Buf); osMutexAcquire(WIFI_MutexID,osWaitForever); ESP8266_SendString(DISABLE,Test_Buf,strlen(Test_Buf),0); osMutexRelease(WIFI_MutexID); //释放 osSemaphoreRelease(BC25ID_Semaphore); osSemaphoreRelease(Process1ID_Semaphore); TASKRUNSS.Test_RUN=0; osEventFlagsClear(EventFlagID_PROCESS,EVENT_Test_BIT_10); osThreadTerminate(ThreadIdTest); /*************************远传流程结束*****************************/ } } /**************************************************** *函数名:USERTaskCreate() *功 能:任务创建 *输 入:无 *输 出:无 */ void USERTaskCreate(void) { EEPROM_ReadBytes(110,(u8*)Init_Data_Equipment.Pub_Mode,1); WIFI_MutexID = osMutexNew(&WIFI_Mutex_Attr ); SDI_MutexID = osMutexNew(&SDI_Mutex_Attr ); TFcard_MutexID = osMutexNew(&TF_Mutex_Attr ); ThreadIdUSERTask_Resume = osThreadNew(USERTask_Resume, NULL, &ThreadUSERTask_Resume_Attr); ThreadIdSMSG = osThreadNew(USER_Task_MSG, NULL, &ThreadMSG_Attr); //低功耗 } /*********************************************************************************************************/ /* ********************************************************************************************************* * 函 数 名: AppTaskStart() * 功能说明: 启动任务,防止任务跑飞 * 输 入 :采集启动时间time__sta_pro1 * 远传启动时间time__sta_bc25 * 输 出 :无 ********************************************************************************************************* */ void USERTaskStart(void *argument) { u32 mea_idv_idl1,pub_idv_idl1; uint8_t i=0; /* 创建任务 */ USERTaskCreate(); while(1) { mea_idv_idl1=osKernelGetTickCount()-time__sta_pro1; pub_idv_idl1=osKernelGetTickCount()-time__sta_bc25; i++; if(i>=10) { //u5_printf("mea_idv_idl1:%d\r\npub_idv_idl1:%d\r\n",mea_idv_idl1,pub_idv_idl1); i=0; } if(LinkStatus == 2) { mea_idv_idl1=0; pub_idv_idl1=0; } if((mea_idv_idl1>(get_meaidv()*1000+200000))&(LinkStatus != 2))//没有WIFI连接+超时 { NVIC_SystemReset(); } if((pub_idv_idl1>(get_pubidv()*1000+7200000))&(LinkStatus != 2))//没有WIFI连接+超时 { NVIC_SystemReset();//超过运行时长就复位 } osDelay(1000); } } /***************************** END OF FILE *********************************/