/******************************************************************************** * File Name: ModemTask.c * Function Describe: 完成串口与Modem的通讯 * Explain: * Writer: ShiLiangWen * Date: 2015-8-2 *******************************************************************************/ #define THIS_FILE_ID 8 /*******************************************************************************/ #include "includes.h" OS_TID idModemTask=0; U64 stkModemTask[MODEM_TASK_STK_SIZE]; OS_TID idModemUartTask=0; U64 stkModemUartTask[MODEM_UART_TASK_STK_SIZE]; OS_SEM ModemUartSem; char g_ucModemTaskEn; unsigned char g_ucModemTaskSleep=0; //char ModemMsgQueueDataBuffer[MODEM_MSG_DATA_BUF_LEN]; SUT_MSG_QUEUE ModemMsgQueue; /******************************************************************* *ModemUartTask ********************************************************************/ __task void ModemUartTask(void) { os_sem_init (&ModemUartSem, 0); while(1){ os_sem_wait (&ModemUartSem, 0xffff); FEED_EXTWATCHDOG(); IWDG_ReloadCounter(); //tsk_lock (); //sutModemStatus.UartInactiveCt=0; Uart2RecvProcess(); //tsk_unlock (); } } /******************************************************************* *ModemTask ********************************************************************/ __task void ModemTask(void) { //unsigned long ASN; //char temp[22]; static char flag=0; char i=0; char sum=0; static unsigned int sucCt=0; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; WifiStatue=WIFIINVALID; //sutProductPara.ConnectType=1; //0---有线 1---无线 while(1){ //无线未接才使用有线 os_dly_wait(100); if(sutProductPara.ConnectType==1) break; } RunMake(THIS_FILE_ID); SlwTrace(DEBUG,"ModemTask Start...\r\n"); memset(&sut_sys_status,0,sizeof(sut_sys_status));//初始化状态 //1、模块初始化 if(ModemInit()) {//成功 }else {//模块初始化失败,进入GT模式,为了升级模块 SlwTrace(INF,"[01]Failed\r\nEnter GT Mode!\r\n"); //EnterGTMode(); while(1) { MODEM_LED4_HIGH; os_dly_wait(100); FEED_EXTWATCHDOG(); IWDG_ReloadCounter(); MODEM_LED4_LOW; } } //Uart2Init(); //2、设置成STA模式 ModemSetModel(); //3、设置单链接或者多链接 0--单链接 1--多链接 ModemSetSingleLink(); WIFIRECONNECT: //设置为自动获取IP ModemSetDHCP(); //4、wifi密码输入连接 Wifi_Pwd_Input(); //5、连接服务器 if(WifiStatue==PWDOK) Server_Connect(); // Uart2Init(); // ComSelect(COM_SEL_MODEM); //sut_sys_status.Logined=1; ////////////////////测试用 HeartTimeOut=20; while(1){ os_dly_wait(1); // FEED_EXTWATCHDOG(); // IWDG_ReloadCounter(); /********************************************************/ if(1==g_ucModemTaskEn ||g_ucUARTSel==COM_SEL_MODEM ) { pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)); if(pMsg->MsgLen > 0) { SlwTrace(INF,(char *)pMsg->MsgData); //AtHandle(pMsg->MsgData); continue; }else if(pMsg->MsgLen < 0) { SlwTrace(INF, "QueueF1"); continue; } else os_dly_wait(1); continue; } //Modem Uart消息处理,等待1个系统tick, 大约等待10ms if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(g_ucUARTSel==COM_SEL_MODEM) { os_dly_wait(100); FEED_EXTWATCHDOG(); IWDG_ReloadCounter(); continue; } if(pMsg->MsgData[0]=='+' && pMsg->MsgData[1] == 'I' && pMsg->MsgData[2]=='P') { //sutPocStatus.ModemInactiveCt=0; //SlwTrace(INF,(char *)pMsg->MsgData); TcpProcess((char *)pMsg->MsgData,0); }else if(((0==ModemStrCmp((char *)pMsg->MsgData,"ERROR"))||(0==ModemStrCmp((char *)pMsg->MsgData,"SEND FAIL")) ) && WifiStatue==CONNECTOK){ sut_sys_status.Resend=1; SlwTrace(DEBUG,"/************重发**********/\r\n"); os_dly_wait(30);//间隔 Recv }else if((0==ModemStrCmp((char *)pMsg->MsgData,"Recv"))&&WifiStatue==CONNECTOK){ SlwTrace(DEBUG,"/*********接收成功**************/\r\n"); sut_sys_status.Resend=0; }else if((0==ModemStrCmp((char *)pMsg->MsgData,"CLOSED"))&&WifiStatue==CONNECTOK){ //服务器主动断开 SlwTrace(DEBUG,"/*************断线重连***********/\r\n"); WifiStatue=WIFIINVALID; }else if((0==ModemStrCmp((char *)pMsg->MsgData,"link is not valid"))&&WifiStatue==CONNECTOK){ //服务器主动断开 SlwTrace(DEBUG,"/*************断线重连***********/\r\n"); WifiStatue=WIFIINVALID; } else{ //不是则丢掉数据 continue; } //收到服务器数据 continue; }else os_dly_wait(1); Tcptick(); //////////////处理心跳 登录 if( sut_sys_status.OnceFlag==1 && sut_sys_status.Logined==1) { /**********************接收完一次,发现数据改变立即上行******************************/ //判断是否区别立即上传 if(memcmp(&sut_device_read,&Device_Up.Devices,sizeof(sut_device_read))) { memcpy(&Device_Up.Devices,&sut_device_read,sizeof(sut_device_read)); SlwTrace(DEBUG,"chang====================================\r\n"); TSStatueSendPosition(TS_LOCATION_INFORMATION_REPORTING); //上行 } sut_sys_status.OnceFlag=0; }else if(sut_sys_status.Resend==1) { memcpy(&Device_Up.Devices,&sut_device_read,sizeof(sut_device_read)); SlwTrace(DEBUG,"重传====================================\r\n"); TSStatueSendPosition(TS_LOCATION_INFORMATION_REPORTING); //上行 } if( WifiStatue==WIFIINVALID)goto WIFIRECONNECT; if(os_time_get() < sucCt) continue; sucCt=os_time_get()+1000; for(i=0;i