/******************************************************************************** * File Name: MainTask.c * Function Describe:The main task for the system * Relate Module: * Explain: Hardware version is HS121 * Writer: ShiLiangWen * Date: 2015.7.8 *******************************************************************************/ #define THIS_FILE_ID 8 //--------------------------------------------------------------------------------- #include "includes.h" #include "stm32f10x_it.h" //OS ID OS_TID idMainTask=0; U64 stkMainTask[MAIN_TASK_STK_SIZE]; unsigned char modemInitReady=0;//0模块没开始初始化 1模块初始化成功 2模块初始化失败 unsigned char modemPwrOffNow=0; unsigned char g_ucBackLightCnt; int g_iVbat=0; unsigned int g_LCDTemp = 0; unsigned char g_ucGtMode=0; unsigned char g_usOptionCnt; char sysStartTTS[START_TTS_LENGTH]; //SUT_MSG_QUEUE ModemMsgQueue; //char ModemMsgBuffer[512]; void FingerDaemonfinger(void); unsigned char g_ucUpdataVer=0; unsigned char g_ucKeyDownPressFlag=0; unsigned char g_ucGroupSelect=0; unsigned char g_ucUserSelect=0; unsigned char g_ucGroup_User_Select=0; unsigned char g_ucFun1KeyPressCt=0;//Fun1Key持续按下计数器,松开后清零 unsigned char g_ucFun2KeyPressCt=0;//Fun2Key持续按下计数器,松开后清零 int g_iFun1KeyEncodeCt=0; //Fun1Key按下时旋转Encode次数计数器,正数为顺时针,负数为逆时针,松开后清零 int g_iFun2KeyEncodeCt=0; //Fun2Key按下时旋转Encode次数计数器,正数为顺时针,负数为逆时针,松开后清零 unsigned int g_uikey_up_stat =0; //快捷键,用于进入GT模式 按下KEY_UP再按下OK unsigned char g_ucEnterGroupFlag=0; unsigned char pocTimeOutTime=30;//默认30分钟 //====================================== void ReportVbatCsqGps(void); void EncodeKeyProcess(void); void iap_jump_app_s(void); int GetCheckCodeByPsnMEID(char *pCheckCode,unsigned long PSN,char *pMEID); void ReportCheckCode(void); char menu_key[6]="502800";//如果资源文件没有定义密码,则默认密码为此 //----- #ifdef USE_RUNNING_MAKE void RunningMake(unsigned short FileID,unsigned long line) { g_usFileID=FileID; g_ulFileLine=line; } #endif unsigned short g_usFileID=0; unsigned long g_ulFileLine=0; // unsigned char m_GroupSelect=0;//用于使用左边上下键去选择群组时使用 wjl unsigned char m_GroupSwitch=0;//表示是否曾经按过左边上下群组切换按键 unsigned char m_GroupSwitchCnt=0;//按过的话,5秒内没按OK键则退出切换 /*********************************************** 强制复位 ************************************************/ void SystemReset(void) { //IWDG_Configuration(); while(1); } void PowerCtrlInit(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = PWR_EN_PIN; GPIO_Init(PWR_EN_PORT, &GPIO_InitStructure); PWR_EN_LOW; } /************************************************************************* 拷贝数据,并判断与原数据是否相同 相同返回0 不同返回1 **************************************************************************/ unsigned char CopyData(unsigned char *pDst,unsigned char *pSrc,unsigned char len) { unsigned char i; unsigned char flag=0; for(i=0;iIDR; if((k&ONOFF_CK_PIN)==ONOFF_CK_PIN){ if(sucCt<5)sucCt++; else return 1; }else{ sucCt=0; } return 0; } void GPIO_Config_ALL_AIN(void); /********************************************************************** *系统关机 ***********************************************************************/ void SysShutDown(void) { GPIO_InitTypeDef GPIO_InitStructure; unsigned long k; int len; GPS_PWREN_LOW; MODEM_LED1_HIGH; MODEM_LED2_HIGH; ModemSendAT("AT+ZPWROFF\r\n"); SlwTrace(INF,"Set modem OnOff down!",1); ModemSendAT("AT+ZPWROFF\r\n"); //os_dly_wait(50); SlwTrace(INF,"Set system power off!",1); //SlwTraceWaitCompleted(); MODEM_LED1_LOW; MODEM_LED2_LOW; //------- k=ONOFF_CK_PORT->IDR; if((k&ONOFF_CK_PIN)==0){ SlwTrace(INF,"Reset system!",1); //SlwTraceWaitCompleted(); SystemReset(); }else{ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = PWR_EN_PIN; GPIO_Init(PWR_EN_PORT, &GPIO_InitStructure); while(1); } } //从source查找长度为targetLen目标的target,找到后返回目标段后一字节的索引,没找到返回-1,source结束为sourceEndIndicator //witchOne: 找第几个目标 short FindTargetIndex(char *source, char sourceEndIndicator, char *target, unsigned char targetLen,unsigned char witchOne) { unsigned short targetIndex; unsigned char targetNum; targetIndex=0; targetNum=0; while(*source != sourceEndIndicator) { if(0==memcmp(source, target, targetLen)) {//找到了 targetNum++; if(targetNum == witchOne) return (targetIndex+targetLen); } source++; targetIndex++; } return -1; } unsigned char AscToHex(unsigned char aHex) { if((aHex>=0)&&(aHex<=9)) aHex += 0x30; else if((aHex>=10)&&(aHex<=15))//A-F //aHex += 0x37; aHex += 0x57; else aHex = 0xff; return aHex; } void AscStrToHexStr(char *AscStr, char *HexStr) { char *pAscStr=AscStr; unsigned char d,h,l; while(0!=(d=(unsigned char)*pAscStr++)){ l=d&0x0f; h=d>>4; *HexStr++=AscToHex(h); *HexStr++=AscToHex(l); } *HexStr=0; } unsigned char apnUpdateFlag=0; void PcMsgHandle(char *msg) { const char *CmdList[]={ "TM", //Trace Modem "TG", //Trace GPS "DM", //Download Modem "FOTA", //Fota Modem "STP", //Set Test Parameter "SMP", //Set Modem Parameter "SGP", //Set GPS Parameter "RMP", //Read Modem Parameter "PST", //PST Mode for modem "VER", //Read Version "BAT", //Battery voltage "APN", //SET APN "RAPN", //Read APN "BEEP", //Beep test "RGP", "RMIP", //Read Manager/Load IP "SMIP", //Set Manager/Load IP "RCIP", //Read ConfigIP "SCIP", //Set ConfigIP "SACC", //Set access point "RACC", //Read access point "RREC", //Read record info "RFIP", //read fota IP "SFIP", //set fota ip "RDOMAIN", //read main ip "SDOMAIN",//set main ip "RPOCDOMAIN", //read POCdomain "SPOCDOMAIN",//set POCdomain "" //必须以空字串为结束 }; int h,m,s; unsigned short Port; unsigned short Select; unsigned long PSN; char buf[150]; //char buf1[300]; char strIP[40]; char strAccount[20+20]; char strPassword[20+20]; unsigned short PID;//省域ID 16byte unsigned short CID; //市域ID16byte char Mfactur[10]; //制造商 char TMod[42]; //终端型号 不足补0x00 char TID[28]; //终端ID 不足补0x00 本来7个字节 为了跟星安一致 取4个字节8 unsigned char PColor; //车牌颜色 未上牌取值为0 char Plate[16]; // 车牌8 char SIM[12]; int i,j,len; char flag; const char *pCmd; char *pMsg; int CmdListNum=0; char needsave=0; char needsaveExterPara=0; RunMake(THIS_FILE_ID); while(*CmdList[CmdListNum++]);//计算命令列表个数 CmdListNum--; RunMake(THIS_FILE_ID); //查找与命令列表相同的命令位置 for(i=0;i=40){ SlwTrace(INF,"GT+STP:FAIL[IP Invalid]",1); break; }else strcpy(strIP,buf); len=GetParaFromStr(msg,"Port",buf); if(len==0)Port=0; else if(len>5){ SlwTrace(INF,"GT+STP:FAIL[Port Invalid]",1); break; }else{ Port=atoi(buf); } len=GetParaFromStr(msg,"Account",buf); if(len<1 || len>=20){ SlwTrace(INF,"GT+STP:FAIL[Account Invalid]",1); break; }else strcpy(strAccount,buf); len=GetParaFromStr(msg,"Password",buf); if(len<1 || len>=20){ SlwTrace(INF,"GT+STP:FAIL[Password Invalid]",1); break; }else strcpy(strPassword,buf); //send to modem // snprintf(buf, sizeof(buf),"id=%s;ip=%s;pwd=%s;",strAccount,strIP,strPassword); // AscStrToHexStr(buf,buf1); // ModemSendAT("AT+POC=120000"); // ModemSendAT(buf1); // ModemSendAT("\r\n"); //send to pc snprintf(buf, sizeof(buf),"GT+STP:IP=%s;Port=%u;Account=%s;Password=%s",strIP,Port,strAccount,strPassword); SlwTrace(INF,buf,1); break; case 5://"SMP" GT+SMP=IP=地址或域名;Port=端口号;PSN=终端序列号 len=GetParaFromStr(msg,"IP",buf); if(len<1 || len>=40){ SlwTrace(INF,"GT+SMP:FAIL[IP Invalid]",1); break; } strcpy(strIP,buf); len=GetParaFromStr(msg,"Port",buf); if(len==0)Port=0; else if(len>5){ SlwTrace(INF,"GT+SMP:FAIL[Port Invalid]",1); break; }else{ Port=atoi(buf); } len=GetParaFromStr(msg,"PSN",buf); if(len<1 || len>10){ SlwTrace(INF,"GT+SMP:FAIL[PSN Invalid]",1); break; }else{ PSN=atol(buf); } //PSN if(sutProductPara.PSN != PSN){ sutProductPara.PSN=PSN; needsave=1; } if(newPara.serList.defaultuse != SER_US){ newPara.serList.defaultuse=SER_US; needsaveExterPara=1; } if(0!= strcmp(newPara.serList.ur.pip, strIP)){//与资源文件的不一样,则需要更新 strcpy(newPara.serList.ur.pip, strIP); needsaveExterPara=1; } snprintf(buf, sizeof(buf),"GT+SMP:IP=%s;Port=%u;PSN=%lu",newPara.serList.ur.pip,Port,sutProductPara.PSN); SlwTrace(INF,buf,1); break; case 6://"SGP" GT+SGP=IP=地址或域名;Port=端口号; len=GetParaFromStr(msg,"IP",buf); if(len<1 || len>=40){ SlwTrace(INF,"GT+SGP:FAIL[IP Invalid]",1); break; }else strcpy(strIP,buf); len=GetParaFromStr(msg,"Port",buf); if(len==0)Port=0; else if(len>5){ SlwTrace(INF,"GT+SGP:FAIL[Port Invalid]",1); break; }else{ Port=atoi(buf); } if(newPara.serList.defaultuse != SER_US){ newPara.serList.defaultuse = SER_US; needsaveExterPara=1; } if(0!=strcmp(newPara.serList.ur.gip, strIP) || Port != newPara.gpsPort){ strcpy(newPara.serList.ur.gip,strIP); newPara.gpsPort=Port; needsaveExterPara=1; } //echo snprintf(buf, sizeof(buf),"GT+SGP:IP=%s;Port=%u;",newPara.serList.ur.gip,newPara.gpsPort); SlwTrace(INF,buf,1); break; case 7://"RMP" GT+RMP PSN=终端序列号;MEID=模块MEID号;CNUM=电信号;UIMID=电信UIMID; snprintf(buf, sizeof(buf),"GT+RMP:PSN=%lu;MEID=%s;CNUM=0000000000;UIMID=0000000000;IP=%s;",sutProductPara.PSN,DEV_HARDID,getPIPAddr()); SlwTrace(INF,buf,1); break; case 8://"PST" SetLedStatus(RedBlueSlowFlash); //g_ucNetTaskDisable=0xff; SlwTrace(INF,"GT+PST:OK",1); //SlwTraceWaitCompleted(); os_dly_wait(1); ComSelect(COM_SEL_MODEM); ModemSetDtrLow(); MODEM_PWRKEY_LOW; MODEM_RESET_HIGH; os_dly_wait(5); MODEM_RESET_LOW; while(1){ IWDG_ReloadCounter();//喂狗 if(OnOffCheck()){ PWR_EN_LOW; } } break; case 9://"VER" snprintf(buf, sizeof(buf),"GT+VER:%s_V%d",sutProductPara.ProductName,sutProductPara.ProductVersion); SlwTrace(INF,buf,1); break; case 10://BAT snprintf(buf, sizeof(buf),"GT+BAT: %d V",g_iVbat); SlwTrace(INF,buf,1); // SlwTrace(INF, msg,1); // cntMeiTiao=atoi(&msg[7]); // SpeakerEnable(); // //SetBeepByNoOS(878, 100); // SetBeep(878, 3000); break; case 11://APN /* 设置格式:GT+APN=Account=用户名;Password=密码; 成功返回:GT+APN:Account=用户名;Password=密码; 失败返回:GT+APN:FAIL[失败原因] */ len=GetParaFromStr(msg,"Account",buf); if(len<1 || len > 30){ SlwTrace(INF,"GT+APN:FAIL[Account Invalid]",1); return; } strcpy(strAccount,buf); len=GetParaFromStr(msg,"Password",buf); if(len<1 || len > 30){ SlwTrace(INF,"GT+APN:FAIL[Password Invalid]",1); return; } strcpy(strPassword,buf); snprintf(buf, sizeof(buf),"GT+APN:Account=%s;Password=%s;",strAccount,strPassword);//****** SlwTrace(INF,buf,1);//********* if(newSysiniIndex<0) break; if(0==strcmp(strAccount, newPara.apnList.apnList[3].account) && 0==strcmp(strPassword, newPara.apnList.apnList[3].pass)) break; strcpy(newPara.apnList.apnList[3].account, strAccount); strcpy(newPara.apnList.apnList[3].pass, strPassword); needsaveExterPara=1; break; case 12://RAPN sprintf(buf,"GT+RAPN:Account=%s;Password=%s;",newPara.apnList.apnList[3].account,newPara.apnList.apnList[3].pass); //*********** SlwTrace(INF,buf,1); break; case 13://BEEP len=GetParaFromStr(msg,"F",buf); if(len)i=atoi(buf); else i=878; len=GetParaFromStr(msg,"T",buf); if(len)Port=atoi(buf); else Port=8;//80 SpeakerEnable(); SetBeep(i,Port); snprintf(buf, sizeof(buf),"BEEP=%dHz,%dms",i,Port*10); SlwTrace(INF,buf,1); break; case 14://RGP snprintf(buf, sizeof(buf),"GT+RGP:IP=%s;PORT=%d;",newPara.serList.ur.gip,newPara.gpsPort); SlwTrace(INF,buf,1); break; case 15://RMIP // snprintf(buf, sizeof(buf),"GT+RMIP:IP=%d.%d.%d.%d;PORT=%d;",sutProductPara.ManagerIP[0],sutProductPara.ManagerIP[1],sutProductPara.ManagerIP[2],sutProductPara.ManagerIP[3],sutProductPara.ManagerPort); // SlwTrace(INF,buf,1); break; case 16://SMIP // len=GetParaFromStr(msg,"IP",buf); // if(len<1 || len>=40){ // SlwTrace(INF,"GT+SMIP:FAIL[IP Invalid]",1); // break; // }else strcpy(strIP,buf); // // len=GetParaFromStr(msg,"Port",buf); // if(len==0)Port=0; // else if(len>5){ // SlwTrace(INF,"GT+SMIP:FAIL[Port Invalid]",1); // break; // }else Port=atoi(buf); // GetStringIP2Bytes(sutProductPara.ManagerIP, strIP); // sutProductPara.ManagerPort=Port; // //Save para to flash // SaveProductParaToFlash(); // //echo // snprintf(buf, sizeof(buf),"GT+SMIP:IP=%d.%d.%d.%d;Port=%u;",sutProductPara.ManagerIP[0], // sutProductPara.ManagerIP[1], // sutProductPara.ManagerIP[2], // sutProductPara.ManagerIP[3], // sutProductPara.ManagerPort); // SlwTrace(INF,buf,1); break; case 17://RCIP // snprintf(buf, sizeof(buf),"GT+RCIP:IP=%d.%d.%d.%d;PORT=%d;",sutProductPara.ConfigSerIP[0], // sutProductPara.ConfigSerIP[1], // sutProductPara.ConfigSerIP[2], // sutProductPara.ConfigSerIP[3], // sutProductPara.ConfigSerPort); // SlwTrace(INF,buf,1); break; case 18://SCIP // len=GetParaFromStr(msg,"IP",buf); // if(len<1 || len>=40){ // SlwTrace(INF,"GT+SCIP:FAIL[IP Invalid]",1); // break; // }else strcpy(strIP,buf); // // len=GetParaFromStr(msg,"Port",buf); // if(len==0)Port=0; // else if(len>5){ // SlwTrace(INF,"GT+SCIP:FAIL[Port Invalid]",1); // break; // }else Port=atoi(buf); // GetStringIP2Bytes(sutProductPara.ConfigSerIP, strIP); // sutProductPara.ConfigSerPort=Port; // //Save para to flash // SaveProductParaToFlash(); // //echo // snprintf(buf, sizeof(buf),"GT+SCIP:IP=%d.%d.%d.%d;Port=%u;",sutProductPara.ConfigSerIP[0], // sutProductPara.ConfigSerIP[1], // sutProductPara.ConfigSerIP[2], // sutProductPara.ConfigSerIP[3], // sutProductPara.ConfigSerPort); // SlwTrace(INF,buf,1); break; case 19://SACC len=GetParaFromStr(msg,"Accessp",buf); if(len<0 || len > (APN_SEGMENT_MAX_LEN-1)) { SlwTrace(INF,"GT+SACC:FAIL[Accessp Invalid]",1); return; } if(len ==0) newPara.apnList.APN_Name[0]=0; else strcpy(newPara.apnList.APN_Name,buf); snprintf(buf, sizeof(buf),"GT+SACC:Accessp=%s;",newPara.apnList.APN_Name); //********** SlwTrace(INF,buf,1); needsaveExterPara=1; break; case 20://RACC snprintf(buf, sizeof(buf),"GT+RACC:Accessp=%s;",newPara.apnList.APN_Name); SlwTrace(INF,buf,1); break; case 21://RREC sFlash_Read(buf, RECORD_INFO_ADDRESS, 100); SlwTrace(INF, buf, 1); break; case 22://RFIP // snprintf(buf, sizeof(buf),"GT+RFIP:IP=%d.%d.%d.%d;PORT=%d;",sutProductPara.MFotaIP[0], // sutProductPara.MFotaIP[1], // sutProductPara.MFotaIP[2], // sutProductPara.MFotaIP[3], // sutProductPara.MFotaPort); // SlwTrace(INF,buf,1); // break; // case 23://SCIP // len=GetParaFromStr(msg,"IP",buf); // if(len<1 || len>=40){ // SlwTrace(INF,"GT+SFIP:FAIL[IP Invalid]",1); // break; // }else strcpy(strIP,buf); // // len=GetParaFromStr(msg,"Port",buf); // if(len==0)Port=0; // else if(len>5){ // SlwTrace(INF,"GT+SFIP:FAIL[Port Invalid]",1); // break; // }else Port=atoi(buf); // GetStringIP2Bytes(sutProductPara.MFotaIP, strIP); // sutProductPara.MFotaPort=Port; // //Save para to flash // SaveProductParaToFlash(); // //echo // snprintf(buf, sizeof(buf),"GT+SFIP:IP=%d.%d.%d.%d;Port=%u;",sutProductPara.MFotaIP[0], // sutProductPara.MFotaIP[1], // sutProductPara.MFotaIP[2], // sutProductPara.MFotaIP[3], // sutProductPara.MFotaPort); // SlwTrace(INF,buf,1); break; case 24://RDOMAIN // snprintf(buf,sizeof(buf),"GT+RDOMAIN:%s;",sutProductPara.domain); // SlwTrace(INF,buf,1); break; case 25://SDOMAIN // len=GetParaFromStr(msg,"SDOMAIN",buf);//buf=www.baidu.com ,return len // if(len>40){ // SlwTrace(INF,"MAINIP LEN ERR",1); // return; // } // memset(sutProductPara.domain,0,sizeof(sutProductPara.domain)); // strcpy(sutProductPara.domain,buf); // snprintf(buf,sizeof(buf),"GT+SDOMAIN=%s",sutProductPara.domain); // //Save para to flash // SaveProductParaToFlash(); // SlwTrace(INF,buf,1); break; case 26://RPOCDOMAIN // snprintf(buf,sizeof(buf),"GT+RPOCDOMAIN:%s;",sutProductPara.fota_pocdomain); // SlwTrace(INF,buf,1); break; case 27://SPOCDOMAIN // len=GetParaFromStr(msg,"SPOCDOMAIN",buf);//buf=www.baidu.com ,return len // if(len>40){ // SlwTrace(INF,"FOTAPOCMAIN LEN ERR",1); // return; // } // memset(sutProductPara.domain,0,sizeof(sutProductPara.fota_pocdomain)); // strcpy(sutProductPara.fota_pocdomain,buf); // snprintf(buf,sizeof(buf),"GT+SPOCDOMAIN=%s",sutProductPara.fota_pocdomain); // SlwTrace(INF,buf,1); break; } if(needsave!=0) SaveProductParaToFlash(); if(needsaveExterPara!=0) ModifyConfigureFile(0); RunMake(THIS_FILE_ID); } /********************************************* ************************************************/ void TSMakeSendStrData(void){ int i; static int Temp1[7]; static int Table1[20]={0}; //static int Table[20]={0}; static int Temp[8]; unsigned char SendBuf[100]; unsigned short PacketLen,data1,data2,data3,data4; char buf1[300]; // char str1[4]; // int strData[4]; // sprintf(str1,"%x",sutProductPara.proID); //发现Regist.proID 和egist.CityID输出的是他的BCD码 //for (i=0;i<6;i+=2) { // Hexstr[i]='0'|(Bcdstr[i/2]>>4); // Hexstr[i+1]='0'|(Bcdstr[i/2]&0x0F); // } // BcdToHex(xx,xx); // Regist.proID =((sutProductPara.proID>>8)&0xff); // Regist.proID =(sutProductPara.proID&0xff); // Regist.proID=(sutProductPara.proID/16*10)+(sutProductPara.proID%16);//BCD转16进制 Regist.proID=newPara.authPara.registerPara.proID;//16进制转BCD // Regist.proID='0'|(sutProductPara.proID>>4);// // Regist.proID='0'|(sutProductPara.proID&0x0F); // sprintf(buf1,"proID=%d;\r\n",Regist.proID); // SlwTrace(INF,buf1); data1=newPara.authPara.registerPara.CityID/100; data3=(data1/10*16)+(data1%10); data2=newPara.authPara.registerPara.CityID%100; data4=(data2/10*16)+(data2%10); Regist.CityID = ((data4>>24)&0xffff); Regist.CityID = ((data4>>16)&0xffff); Regist.CityID = ((data3>>8)&0xffff); Regist.CityID = (data3&0xffff); for(i = 0; i < 5; i++){ Regist.Manufacturers[i] = newPara.authPara.registerPara.Manufacturers[i]; } for(i = 0; i < 20; i++){ //sscanf(sutProductPara.TerMod+2*i,"%2x",&Table1[i]); Regist.TerMod[i]= newPara.authPara.registerPara.TerMod[i]; } // for(i=0;i<14;i+=2) // { // Regist.TerID[i/2]=(sutProductPara.TerID[i]<<4)|(sutProductPara.TerID[i+1]&0x0F); // } for(i = 0; i < 7; i++){ //sscanf(sutProductPara.TerID+2*i,"%2x",&Temp1[i]); Regist.TerID[i]= newPara.authPara.registerPara.TerID[i]; } // sprintf(buf1,"TerID=%s;\r\n",sutProductPara.TerID); // SlwTrace(INF,buf1); Regist.PlateColor=newPara.authPara.registerPara.PlateColor;// for(i = 0; i < 8; i++){//16 //sscanf(sutProductPara.Plate+2*i,"%2x",&Temp[i]); Regist.Plate[i] = newPara.authPara.registerPara.Plate[i]; } PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_TERMINAL_REGISTRATION,(unsigned char *)&Regist,sizeof(REGISTRATION)); MC8332ModemSendTcpData(0,SendBuf,PacketLen); } void SwitchGroupCtrl(void) { if(m_GroupSwitch) { if(++m_GroupSwitchCnt >=5) { //MeSpeak(ENCODE_GBK, "CDCBB3F6", 0); if(sutUIstatus.Status == UIS_STANDBY) ShowButton(1,107,"菜单"); m_GroupSwitch=0; SlwTrace(INF, "QuitGroupSel",1); } } } void SwitchGroupPre(void) { //让菜单变成:确定 ShowButton(1,107,"确定"); m_GroupSwitch=1; m_GroupSwitchCnt=0; } volatile unsigned int pttPressFreeCt; /*********************************************************************** *按键按下事件 ************************************************************************/ void KeyPress(void) { char buf[30]; static unsigned char sucReportFlag=0; if(g_ucGtMode==0){//在GT模式下不能与串口同时发送AT指令会冲突,导致重启 UI_Key(); } switch(g_ulKeyValue){ //------------------------------------------------------------------- case KEY_PPT_MIC: case KEY_PPT://=====================KEY_PPT Press==================== g_ucKeyMode=1;//单次模式 SlwTrace(INF,"[KEY_PPT/KEY_PPT_MIC Press]",1); //sutPocStatus.PPTpress=1; if((g_ucGtMode==0)&&(g_ucCallPhonePro==0)) { pttPressFreeCt=os_time_get()+20; // ModemSendAT(POC_CMD_PPT_START);// //SlwTrace(INF, "Speak",1); } break; //------------------------------------------------------------------- case KEY_INFO://=====================KEY_UP Press================== g_ucKeyMode=1;//单次模式 SlwTrace(INF,"[KEY_UP Press]",1); if(newPara.QuickGroup==1&&(g_ucGtMode==0)&&(g_ucCallPhonePro==0)&&(sutUIstatus.Status == UIS_STANDBY)){ if(sutPocStatus.Logined==0){ // snprintf(buf, sizeof(buf), "BDF8C8EB2C%s",Groupname); MeSpeak(ENCODE_GBK, "CEB4B5C7C2BC",0); }else if(newPara.QuickGroupId[1]==0){ MeSpeak(ENCODE_GBK, "C8BAD7E9CEB4C9E8D6C3",0); }else { g_ucEnterGroupFlag=1; snprintf(buf, sizeof(buf),"AT+POC=090000%08x\r\n",newPara.QuickGroupId[1]); ModemSendAT(buf); } }else if((g_ucGtMode==0)&&(g_ucCallPhonePro==0)&&(sutUIstatus.Status == UIS_STANDBY)&&(sutPocStatus.Logined)) { ModemSendAT(POC_CMD_UP); SwitchGroupPre(); } break; case KEY_FUNC://=====================KEY_DOWN Press================= g_ucKeyMode=1;//单次模式 SlwTrace(INF,"[KEY_DOWN Press]",1); if(newPara.QuickGroup==1&&(g_ucGtMode==0)&&(g_ucCallPhonePro==0)&&(sutUIstatus.Status == UIS_STANDBY)){ if(sutPocStatus.Logined==0){ // snprintf(buf, sizeof(buf), "BDF8C8EB2C%s",Groupname); MeSpeak(ENCODE_GBK, "CEB4B5C7C2BC",0); }else if(newPara.QuickGroupId[2]==0){ MeSpeak(ENCODE_GBK, "C8BAD7E9CEB4C9E8D6C3",0); }else { g_ucEnterGroupFlag=1; snprintf(buf, sizeof(buf),"AT+POC=090000%08x\r\n",newPara.QuickGroupId[2]); ModemSendAT(buf); } }else if((g_ucGtMode==0)&&(g_ucCallPhonePro==0)&&(sutUIstatus.Status == UIS_STANDBY)&&(sutPocStatus.Logined)) { ModemSendAT(POC_CMD_DOWN); SwitchGroupPre(); } break; case KEY_PANEL_OK://=====================KEY_PANEL_OK Press================= if(newPara.QuickGroup==1&&(g_ucGtMode==0)&&(g_ucCallPhonePro==0)&&(sutUIstatus.Status == UIS_STANDBY)){ if(sutPocStatus.Logined==0){ // snprintf(buf, sizeof(buf), "BDF8C8EB2C%s",Groupname); MeSpeak(ENCODE_GBK, "CEB4B5C7C2BC",0); }else if(newPara.QuickGroupId[0]==0){ MeSpeak(ENCODE_GBK, "C8BAD7E9CEB4C9E8D6C3",0); }else { g_ucEnterGroupFlag=1; snprintf(buf, sizeof(buf),"AT+POC=090000%08x\r\n",newPara.QuickGroupId[0]); ModemSendAT(buf); } }else if(sutUIstatus.Status == UIS_STANDBY && m_GroupSwitch==0) UISetNextStatus(UIS_MENU_GROUP_SEL); break; case KEY_PANEL_MENU://=====================KEY_PANEL_MENU Press================= if(m_GroupSwitch) {// m_GroupSwitch=0; snprintf(buf, sizeof(buf),"AT+POC=090000%s\r\n",sutPocStatus.switchGroupID); ModemSendAT(buf); ShowButton(1,107,"菜单"); SlwTrace(INF, buf,0); } SlwTrace(INF,"[KEY_PANEL_MENU Press]",1); break; case KEY_PANEL_EXIT://=====================KEY_PANEL_EXIT Press================= SlwTrace(INF,"[KEY_PANEL_EXIT Press]",1); break; case KEY_PANEL_UP://=====================KEY_PANEL_UP Press================= SlwTrace(INF,"[KEY_PANEL_UP Press]",1); break; case KEY_PANEL_DOWN://=====================KEY_PANEL_DOWN Press================= SlwTrace(INF,"[KEY_PANEL_DOWN Press]",1); break; case KEY_EXIT_DOWN_GT://=====================KEY_UP_OK_GT Press================= // EnterGTMode(); SlwTrace(INF,"[KEY_EXIT_DOWN_GT Press]",1); break; case KEY_P1_P3_UPDATE: SlwTrace(INF, "[KEY_P1_P3_UPDATE Press]",1); break; case KEY_OK_DOWN_GPS: SlwTrace(INF, "[KEY_OK_DOWN_GPS Press]",1); break; case KEY_OPTION: g_usOptionCnt++; //在待机界面按一下'S'键,网络允许情况下发SOS消息 if(sutGpsInfo.isGpsAuthOk==1 && sutUIstatus.Status==UIS_STANDBY && g_ucModemTaskEn==1) { if(g_usOptionCnt ==3) TS_SendSOSMessage(); } SlwTrace(INF, "[KEY_OPTION Press]",1); break; } } //长按 EXIT和下箭头3秒,只进入一次 void GTMode_Detected(void) { static char GT_Flag=0; if(GT_Flag == 2) return; if(g_ulKeyValue == KEY_EXIT_DOWN_GT) { if(GT_Flag == 0) { g_ucUKC=0; GT_Flag ++; }else { if(g_ucUKC>3){ EnterGTMode(); GT_Flag++; } } }else { if(GT_Flag == 1) GT_Flag = 0; } } void UpdataPocVersion(void) { SpeakerEnable(); ModemSendAT("AT+POC=10000018\r\n"); SlwTrace(INF,"Update POC Version!",1); } void EnterGTMode(void) { unsigned char time=12; ColonyFeature(0); g_ucModemTaskEn=0; SpeakerEnable(); SetBeep(1000,time); os_dly_wait(time); SpeakerEnable(); SetBeep(500,time); os_dly_wait(time); SpeakerEnable(); SetBeep(1000,time); g_ucUART1RxMode=1; Uart1RxEnable(1); LedProcess(1); SetLedStatus(RedBlueFastFlash); SlwTrace(INF,"[EnterTxMode]",1); } void openModem() { MODEM_RESET_HIGH; os_dly_wait(100); MODEM_RESET_LOW; MODEM_PWRKEY_HIGH; os_dly_wait(100); MODEM_PWRKEY_LOW; } void closeModem() { MODEM_RESET_HIGH; MODEM_PWRKEY_HIGH; } /*********************************************************************** *按键释放事件 ************************************************************************/ void KeyFree(void) { int i; char CheckCode[10]; char buf[30]; int flag; SUT_MODEM_AT_MSG *pMsg; unsigned int temp; char pressFlag; //------------------------------------------------------------------- if(KEY_PPT==g_ulKeyValue || KEY_PPT_MIC == g_ulKeyValue) {//===============KEY_PPT Free============= SlwTrace(INF,"[KEY_PPT/KEY_PPT_MIC Free]",1); g_ucKeyPPTPress=0; //sutPocStatus.PPTpress=0; if((g_ucGtMode==0)&&((g_ucCallPhonePro==0))) { //#error "这里好了,发杨测试看看,等VPDN测试完一次发" //os_dly_wait(25); if(os_time_get() > pttPressFreeCt) {//按放间隔足够长了,只延时20即可 //temp=20;//防止释放太快,导致对方有可能听不到最后一个字 }else{ //按放间隔太短,补足30 temp=pttPressFreeCt-os_time_get(); os_dly_wait(temp); } ModemSendAT(POC_CMD_PPT_STOP);//结束讲话 放开PPT键 g_ucKeyMode=0; } }else if(KEY_INFO==g_ulKeyValue) {//=========KEY_UP Free============== SlwTrace(INF,"[KEY_UP Free]",1); g_ucKeyMode=0; g_uikey_up_stat=1; }else if(KEY_FUNC==g_ulKeyValue) {//=========KEY_DOWN Free============ g_ucKeyMode=0; SlwTrace(INF,"[KEY_DOWN Free]",1); } else if(KEY_PANEL_OK==g_ulKeyValue) {//=========KEY_PANEL_OK Free============== SlwTrace(INF,"[KEY_PANEL_OK Free]",1); return; } else if(KEY_PANEL_MENU==g_ulKeyValue) {//=========KEY_PANEL_MENU Free============== SlwTrace(INF,"[KEY_PANEL_MENU Free]",1); return; } else if(KEY_PANEL_EXIT==g_ulKeyValue) {//=========KEY_PANEL_EXIT Free============== g_uikey_up_stat=0; SlwTrace(INF,"[KEY_PANEL_EXIT Free]",1); return; } else if(KEY_PANEL_UP==g_ulKeyValue) {//=========KEY_PANEL_UP Free============ //closeModem(); } else if(KEY_PANEL_DOWN==g_ulKeyValue) {//=========KEY_PANEL_DOWN Free============ //openModem(); } else if(KEY_EXIT_DOWN_GT==g_ulKeyValue) {//=====================KEY_EXIT_DOWN_GT Press================= g_ulKeyValue=0; SlwTrace(INF,"[KEY_EXIT_DOWN_GT Free]",1); }else if(KEY_OPTION == g_ulKeyValue) { g_usOptionCnt=0; SlwTrace(INF,"[KEY_OPTION Free]",1); } } #if(USE_CONFIG_FUN==1) void ConfigModeDetect(void) {//检测进入配置服务器功能 //GT模式下 //长按OPTION键 char buf[20]; unsigned char timeout=150; if(0 != g_ucModemTaskEn) return; if(sutConfig.g_ubConfigFlag==0) { if(sutConfig.g_usOptionCnt ==5) { sutConfig.g_ubConfigFlag=1; sutConfig.g_usOptionCnt=0; CloseGPSSocket(); SlwTrace(INF, "ConfigModeActive",1); GuiShowBmp(30,34,"logo.bmp"); GuiClearRect(0,55, LCD_WIDTH-1, 100); GuiShowStr(8, 65, "正在访问配置服务器",1); sutConfig.g_ucTcpRetryNum=CONFIG_TCP_RETRY_CNT; sutConfig.g_ucConfigStatus=0x01;//上报列表 sutConfig.g_ubConfigFinished=0;// tcpControl=2; } } } #endif //void apnUpdateFun(void) //{ // int len; // char buf1[400]; // char *pMsg; // if(apnUpdateFlag!=1) return; // apnUpdateFlag=0; // len=HgsApnLen; // if(HgsApnLen > sizeof(buf1)) len=sizeof(buf1); // len=ReadFileData(ApnFileIndex,0,len,(u8*)buf1); // if(len==0) return; // pMsg=strstr(buf1,"APN4="); // if(0==pMsg) return; // sprintf(pMsg+5, "%s,%s;\r\n",showApnTable[6],showApnTable[7]); // ModifyFileData(ApnFileIndex, 0, strlen(buf1), (unsigned char *)buf1); //} void cmdShutDown(char type) { static short cntDown; static char ttype; char buf[30]; ttype=type; SlwTrace(INF, "Try to PwrOff",1); ModemSendAT("AT$QCPWRDN\r\n"); switch(ttype) { case 0:ShowMessageBox("正在关机");break; case 1:ShowMessageBox("低压关机");break; default:return; } for(cntDown=6;cntDown>=0;cntDown--) { IWDG_ReloadCounter(); os_dly_wait(100); } } void PowerOffProtetion(void) { if(modemPwrOffNow==0) return; LCDTimeOut(0); GPS_PWREN_LOW; cmdShutDown(0); PWR_EN_LOW; while(1); } unsigned int bootMapCnt=0; unsigned char bootFlag=0; /******************************************************************* *MainTask *主任务 ********************************************************************/ __task void MainTask(void) { int BeepFlag=0; int KeyFlag,GTKeystat=0; int RealTime; int FileIndex,SMSIndex; char *msg; INT8U err; unsigned char ucCheckVbatCt=0; static unsigned int sucCt=0; static unsigned char sucFunReportFlag=0; unsigned short g_usModemProtectEn; int Vbat; RunMake(THIS_FILE_ID); //Obtain own system task identification number. */ idMainTask = os_tsk_self(); memset((unsigned char *)&sutPocStatus,0,sizeof(SUT_POC_STATUS)); //开机提示音 SpeakerEnable(); os_dly_wait(10); SetBeepByNoOS(1000,100); SpeakerDisable(); //Read Product param from flash ReadProductParaFromFlash(); GpsTimeUpdate(); printf("\r\n%s_V%d.%d.%d Start...\r\n",sutProductPara.ProductName,sutProductPara.ProductVersion,CUSTOMER_CODE,INTER_VER); //printf("FOTA TEST----------------\r\n"); printf("PSN:%lu\r\n",sutProductPara.PSN); g_ucUpdataVer=0; SlwTrace(INF,"Main Task Start!",1); LcdOnTimeCt = 0; //电话本 //SetPhoneNumFile("HGS.Tell"); //短信 SetMessageConfi(); //SetCodePara(); LedInit(); SlwTrace(INF,"Led Init...",1); g_iFun2KeyEncodeCt=0; bootMapCnt=os_time_get()+2000;//开机界面持续20秒 //create PocTask idModemUartTask=os_tsk_create_user(ModemUartTask,3,&stkModemUartTask,sizeof(stkModemUartTask)); idModemTask=os_tsk_create_user(ModemTask,3,&stkModemTask,sizeof(stkModemTask)); //idTTSTask=os_tsk_create_user(TTSTask, 3, &stkTTSTask,sizeof(stkTTSTask)); RunMake(THIS_FILE_ID); UI_Init(); while(1) { if(bootFlag==0) { if((os_time_get() > bootMapCnt) || sutPocStatus.FirstLogined) bootFlag=1; } PowerOffProtetion(); if(bootFlag==1) UI_Loop(); os_dly_wait(1); IncomingSMS(); LocalTTSHandle(); //处理PC发送过来的消息 RunMake(THIS_FILE_ID); if(g_usUart1RecvLen){ PcMsgHandle((char *)RxBuffer1); g_usUart1RecvLen=0; DMA1_Channel5->CNDTR = UART1_RX_BUFFER_SIZE;//重设DMA传输数据长度 DMA_Cmd(DMA1_Channel5,ENABLE);//打开DMA } RunMake(THIS_FILE_ID); //apnUpdateFun(); //键盘处理 if(0!=(KeyFlag=GetKey())){ //按键处理 if(1==KeyFlag){ //按键按下 KeyPress(); //if(g_ulKeyValue != KEY_PPT && // g_ulKeyValue != KEY_PPT_MIC) //{ LCDTimeOut(0); LcdOnTimeCt=0; //} }else{ //按键释放 KeyFree(); } } RunMake(THIS_FILE_ID); //LED处理 LedProcess(0); #if(USE_CONFIG_FUN==1) ConfigModeDetect(); #endif GTMode_Detected(); powerSaveHandle(); //---以下控制每秒执行一次--- if(os_time_get() < sucCt) continue; sucCt = os_time_get()+100; RunMake(THIS_FILE_ID); KeyCount();//键盘按下、释放计数控制 RunMake(THIS_FILE_ID); //信号 //测量电池电压 Vbat=GetVbat(); if(Vbat>0)g_iVbat=Vbat; //判断电池电压是否过低关机 if(ucCheckVbatCt<3)ucCheckVbatCt++; else { ucCheckVbatCt=0; CheckVbat(g_iVbat); } //MODEM防护 FingerDaemonfinger(); //3.21关闭 SwitchGroupCtrl(); if(newPara.lcdParaList[newPara.lcdParaDefaultIndex]>0){ if(++LcdOnTimeCt>=newPara.lcdParaList[newPara.lcdParaDefaultIndex]){ LcdOnTimeCt=0; if(sutPocStatus.FirstLogined==1)//没登陆过(刚开机),LCD一直亮着 LCDTimeOut(1); } } } } void ADCInit(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;//先内部上拉模式给IO充能 GPIO_Init(GPIOA,&GPIO_InitStructure); DelayMs(100); GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AIN; GPIO_Init(GPIOA,&GPIO_InitStructure); //默认速度为两兆 DelayMs(200);//让电平恢复正常 //配置ADC的运行: ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式 ADC_InitStructure.ADC_ScanConvMode =DISABLE; //连续多通道模式 ADC_InitStructure.ADC_ContinuousConvMode =DISABLE;//ENABLE; //连续转换 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换不受外界决定 ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right; //右对齐 ADC_InitStructure.ADC_NbrOfChannel =1; //扫描通道数 ADC_Init(ADC1,&ADC_InitStructure); ADC_RegularChannelConfig(ADC1,ADC_Channel_0, 1,ADC_SampleTime_1Cycles5); //通道X,采样时间为1.5周期,1代表规则通道第1个这个1是啥意思我不太清楚只有是1的时候我的ADC才正常。 ADC_Cmd (ADC1,ENABLE); //使能或者失能指定的ADC ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能或者失能指定的ADC的软件转换启动功能 } void GPIO_Config_ALL_AIN(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOD and GPIOE clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE); /* Disable the Serial Wire Jtag Debug Port SWJ-DP */ GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); /* PA */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); /* PB */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOB, &GPIO_InitStructure); /* PC */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOC, &GPIO_InitStructure); /* PD */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOD, &GPIO_InitStructure); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD , DISABLE); } /*********************************************************************** *获取电池电压 返回值: -1为无效 ; 正数表示电池电压放大100倍,如 382表示3.82V ***********************************************************************/ int GetVbat(void) { char buf[30]; static int Ct=0; static int siVbat[10]={0,0,0,0,0,0,0,0,0,0}; int iVbat[10]; int max[5]; int sum; int i,j,k; int adc; int Vbat; #if 1 ADC_SoftwareStartConvCmd(ADC1,ENABLE); while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); adc=ADC_GetConversionValue(ADC1); if(adc<100 && adc>4095) { printf("VDAC OVER"); return -1; } #else //采集ADC if(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)!=RESET){//检查制定ADC标志位置1与否 ADC_FLAG_EOC 转换结束标志位 if(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)!=RESET){ ADC_SoftwareStartConvCmd(ADC1,ENABLE); adc=ADC_GetConversionValue(ADC1); if(adc<100 && adc>4095) { //printf("ERR1"); return -1; } }else { printf("ERR2"); return -1; } #endif //循环存储 siVbat[Ct]=adc; if(++Ct>9)Ct=0; //printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\r\n",siVbat[0],siVbat[1],siVbat[2],siVbat[3],siVbat[4],siVbat[5],siVbat[6],siVbat[7],siVbat[8],siVbat[9]); //滤波处理,排列取3个最大值,3个最大中去掉第一大,其余求平均 //拷贝 for(i=0;i<10;i++){ iVbat[i]=siVbat[i]; } for(i=0;i<4;i++){ max[i]=0; for(j=0;j<10;j++){ if(iVbat[j]>max[i]){ max[i]=iVbat[j]; k=j; } } iVbat[k]=0; } // printf("%d,%d,%d\r\n",max[0],max[1],max[2]); sum=max[1]+max[2]; if(max[2]<200) { //printf("ERR3"); return -1; } Vbat=sum*308/4096; return Vbat; } void Sys_Standby(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外设时钟 PWR_WakeUpPinCmd(ENABLE); //使能唤醒管脚功能,PA0 PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI); } /******************************************************* *CheckVbat *检查电池电压,控制低压报警, *低压关机已由硬件监测 ******************************************************/ void CheckVbat(int Vbat) { static unsigned char sucCt=0;//提示“请充电”计数器 if(Vbat30){ sucCt=0; //MeSpeak(ENCODE_GBK, "C7EBB3E4B5E7",0);//请充电 } }else sucCt=0; } void GetXinHao(int CSQ,char *XinHao) { if(CSQ>31 || CSQ<1){ strcpy(XinHao,"2C00E065517FDC7EE14FF753");//无网络信号 }else if(CSQ>25){ //信号较强 "E14FF753838F3A5F" strcpy(XinHao,"E14FF753838F3A5F"); }else if(CSQ>17){ //信号适中 "E14FF75302902D4E" strcpy(XinHao,"E14FF75302902D4E"); }else if(CSQ>10){ //信号偏低 "E14FF7534F504E4F" strcpy(XinHao,"E14FF7534F504E4F"); }else{ //信号很弱 "E14FF753885F315F" strcpy(XinHao,"E14FF753885F315F"); } } void GetVbatPercent(int Vbat,char *Percent) { //10 20 30 40 50 60 70 80 90 100 const char *ccPercent[]={ "31003000", "32003000", "33003000", "34003000", "35003000", "36003000", "37003000", "38003000", "39003000", "310030003000"}; //播报电量百分比 10,20,30, 40, 50, 60, 70, 80, 90,100 const int siVbat[] ={335,343,350,360,370,377,384,392,400,500}; int i; for(i=0;i<10;i++){ if(Vbat9)i=9; strcpy(Percent,ccPercent[i]); } /**************************************************************** *语音播报 电量、信号、GPS *****************************************************************/ void ReportVbatCsqGps(void) { unsigned char GpsFlag; //电量百分之N,信号强,GPS已登陆已定位 char buf[30]; SpeakerEnable(); ModemSendAT("AT+ZTTS=1,"); ModemSendAT("\"3575CF917E7606524B4E");//电量百分之 GetVbatPercent(g_iVbat,buf); ModemSendAT(buf); //10~100 GetXinHao(g_iCSQ,buf); // 信号 ModemSendAT(buf); if(!sutGpsInfo.isGpsWork){ ModemSendAT("E065470050005300");//,无GPS GpsFlag=0x00; ModemSendAT("\"\r\n"); }else{ if(sutGpsInfo.isServerLogin){ ModemSendAT("470050005300F25D7B764696"); //,GPS已登陆 GpsFlag=0x20; }else{ ModemSendAT("4700500053002A677B764696"); //,GPS未登陆 GpsFlag=0x10; } if(sutGpsInfo.isGpsValid){ ModemSendAT("F25D9A5B4D4F"); //已定位 GpsFlag |= 0x01; }else{ ModemSendAT("2A679A5B4D4F"); //未定位 } ModemSendAT("\"\r\n"); } snprintf(buf,30,"Vbat=%d,CSQ=%d,GPS=%02x",g_iVbat,g_iCSQ,GpsFlag); SlwTrace(INF,buf,1); } /*************************************************************************** 将数字转Unicode编码 pUnicode空间最长 5*4+1=21字节 ****************************************************************************/ void NumToUnicode(unsigned short Num,char *pUnicode) { char temp[6]; int i,j,len; snprintf(temp, sizeof(temp),"%u",Num);//0~65535 len=strlen(temp); j=0; for(i=0;i0x20 && ';'!=*p && ValueLen<=80){ *Value=*p; p++; Value++; ValueLen++; } *Value=0; return ValueLen; } void IWDG_Configuration(unsigned int value) { // WWDG 时钟使能 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET)RCC_ClearFlag(); //写入0x5555,用于允许狗狗寄存器写入功能 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //狗狗时钟分频,40K/256=156HZ(6.4ms) IWDG_SetPrescaler(IWDG_Prescaler_256); //喂狗时间 //IWDG_SetReload(200);1.28s/6.4MS=200 .注意不能大于0xfff IWDG_SetReload(value);//3.2s/6.4MS=500 .注意不能大于0xfff //喂狗 IWDG_ReloadCounter(); //使能狗狗 IWDG_Enable(); } /* 此处修改:删去ModemSendAT("2C00");另外pocTask.cReplaceStrWithN(&msg[9]、msg[17]);强制将字符串后面的\n\r去掉 */ void ReportUserGroupName(void) { #if POC_USER_NAME_LEN>POC_GROUP_NAME_LEN char buf[POC_USER_NAME_LEN*4]; #else char buf[POC_GROUP_NAME_LEN*4]; #endif SpeakerEnable(); ModemSendAT("AT+ZTTS=1,\""); AnsiToStrUnicode((uint8_t *)buf,sizeof(buf),sutPocStatus.LocalUser.name); //函数功能未实现,需要修改 ModemSendAT(buf); AnsiToStrUnicode((uint8_t *)buf,sizeof(buf),sutPocStatus.LocalUser.name); ModemSendAT(buf); ModemSendAT("\"\r"); } void SetPowerEn(unsigned char en) { GPIO_InitTypeDef GPIO_InitStructure; if(en!=0){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = PWR_EN_PIN; GPIO_Init(PWR_EN_PORT, &GPIO_InitStructure); PWR_EN_HIGH; }else{ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = PWR_EN_PIN; GPIO_Init(PWR_EN_PORT, &GPIO_InitStructure); PWR_EN_LOW; } } /***************************************************************************************** *函数名:GetCheckCodeByPsnMEID *功能:根据PSN号和MEID码,生成伪随机码 *入口:PSN--PSN码,无符号长整形,必须是大于150000000的数值,有可能是9位数也可能是10位数 pMEID--MEID字串,长度14位或15位,第16字节必须为0。 *出口:pCheckCode:--长度为6的字符串,第7字节为结束符0x00,因此必须留够7字节的空间! 返回:1--成功 0--因参数非法而失败 ******************************************************************************************/ const unsigned char sucRandTable[256]={ 0x68,0x59,0x63,0x64,0xc8,0xcc,0xaa,0xa7,0xa2,0xab,0xa5,0x6e,0x6a,0x56,0x8a,0x57, 0xf4,0xbb,0xfe,0xfa,0x26,0x21,0x2d,0x29,0x0d,0x09,0x3e,0x3a,0x37,0x32,0x0a,0x07, 0xf7,0xf2,0xfb,0xf5,0xff,0xf6,0x1c,0x18,0x13,0x14,0xf1,0xfd,0xf9,0x0c,0x9f,0x08, 0x9a,0x97,0x92,0x9b,0x95,0x9f,0x12,0x1b,0x15,0x2c,0x28,0x23,0xf9,0x2a,0x27,0x22, 0x24,0x2e,0x67,0x25,0x2f,0x98,0xfc,0x75,0xf8,0xf3,0x3c,0x38,0x33,0x34,0x03,0x04, 0x05,0x0f,0x06,0x01,0x7a,0x77,0x72,0x62,0x6b,0x83,0x84,0x8e,0xc4,0xcb,0x87,0x82, 0x35,0x3f,0x36,0x4f,0x3d,0x39,0x9c,0x98,0x93,0x94,0x42,0x4f,0x46,0x41,0x81,0x8d, 0x4d,0x49,0x71,0x7d,0x79,0x96,0x91,0x9d,0x99,0xc3,0xc4,0x1d,0xce,0xca,0x7f,0x76, 0x7c,0x78,0x73,0x74,0x7e,0x7b,0x75,0x1e,0x1a,0x17,0x1f,0x16,0x11,0x1d,0x47,0x19, 0x5d,0xc7,0xc2,0xcb,0xc5,0xcf,0xd1,0xdd,0xd9,0x4c,0x48,0xc6,0xc1,0xcd,0x61,0xc9, 0xd7,0x8c,0xfd,0x88,0xa1,0xad,0xa9,0xb1,0xbd,0xb9,0x8b,0x85,0x8f,0x4b,0x45,0x86, 0xdc,0xd8,0xd3,0xd4,0xde,0xd2,0xdb,0xd5,0xdf,0xd6,0x43,0x44,0x4e,0x4a,0xe7,0x47, 0xac,0xa8,0xa3,0xa4,0xae,0xba,0x0d,0xb7,0xb2,0xaf,0xa6,0xe4,0xee,0xea,0xe7,0xe2, 0xe1,0xed,0x0f,0xe9,0x66,0x61,0x6d,0x69,0xbb,0xb5,0xbf,0xb6,0xec,0xe8,0x0b,0xe3, 0x52,0x5c,0x65,0x6f,0x58,0x53,0x54,0x0c,0x5e,0x5b,0x55,0x5f,0x31,0x2f,0x9a,0x0b, 0x0b,0x5a,0x2b,0x9e,0x02,0x89,0x59,0x3b,0x0e,0x51,0x6c,0xeb,0xda,0xe6,0x31,0xf6 }; int GetCheckCodeByPsnMEID(char *pCheckCode,unsigned long PSN,char *pMEID) { char aucPSN[12]; char aucMEID[16]; unsigned char key[10]; unsigned char temp1,temp2; int MeidLen,PsnLen; int i,j; //PSN合法性检测 if(PSN<150100000)return 0; //MEID合法性检测 MeidLen=strlen(pMEID); //if(MeidLen!=14 && MeidLen!=15)return 0; //MEID号长度必须为14或15 if(MeidLen!=14 && MeidLen!=15){ snprintf(aucPSN, sizeof(aucMEID),"%015lu",pMEID); //不够15位前面补零 } //PSN转字符串,不够10位的前面补'0' snprintf(aucPSN, sizeof(aucPSN),"%010lu",PSN); PsnLen=strlen(aucPSN); //取MEID的最后10个字符 j=0; for(i=(MeidLen-10);iPocLostCtMax){ sutPocStatus.PocLostCt=0; //长时间不登陆,重启模块及串口驱动部分 SlwTrace(INF,"PocLostTimeout!Reset Modem!",1); ResetModem(); } }else{ sutPocStatus.PocLostCt=0; sucPocLostTimeoutCount=0; } }else{ //一个小时未登录复位模块 if(++sutPocStatus.PocLostCt>3600){ sutPocStatus.PocLostCt=0; ResetModem(); } } //如果模块已开机,长时间收不到串口消息,则重启模块及串口驱动部分 if(sutPocStatus.ModemPowerOn==1){ if(sutPocStatus.ModemInactiveCt==0){//ModemInactiveCt必须在接收到Modem串口消息后才清零 sucModemInactiveCount=0; } if(++sutPocStatus.ModemInactiveCt>40){//等待时间15秒 4G模块重启后至少要15秒才能启动 sutPocStatus.ModemInactiveCt=1; //长时间收不到串口消息,重启模块及串口驱动 SlwTrace(INF,"ModemRecvTimeout!Reset Modem!",1); ResetModem(); } } //GPS守护 if(sutGpsInfo.isGpsWork>0){ if(++sutGpsInfo.GpsInactiveCt>10){ sutGpsInfo.GpsInactiveCt=0; //复位GPS GPSInit(); Uart3Init(); TSGpsDataInit(); } } } /************************************** *延时(带喂狗) t 系统滴答为单位 ***************************************/ void OsDelayTime(unsigned short t) { int i; for(i=0;i0xff 0xff 0xff 0xff unsigned char GetStringIP2Bytes(unsigned char *IPBytes,char *IPString) { unsigned char len,i,segment,j; char *p; char temp[3]; len = strlen(IPString); if(len<7 || len >15) return 1; segment=0; j=0; p=IPString; for(i=0;i '9') return 3; } if(segment < 5) IPBytes[segment++] = atoi(p); return 0; } void MakeStrEndByNewLine(char *str) {//一定要以'\r'结尾 unsigned short i; for(i=0;i 0x31,0x32 void StrAsciiToHex(char *src, unsigned char *des) { unsigned char temp[2],i; if(strlen(src)%2) return; while(0!=*src) { for(i=0;i<2;i++) { temp[i] = *src++; if(temp[i] >= '0' && temp[i] <= '9') temp[i] -= 0x30; else if(temp[i] >= 'A' && temp[i] <= 'F') temp[i] -= 0x37; else temp[i] -= 0x57; } temp[0] <<= 4; temp[0] &= 0xf0; *des++=temp[0]|temp[1]; } *des=0; } void PrintBufferData(unsigned char *data, unsigned short length) { unsigned short i; printf("Data[%d]:\r\n",length); for(i=0;i