123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863 |
- #include "includes.h"
- unsigned char pocTimeOutTime=30;//默认30分钟
- unsigned char g_ucEnterGroupFlag=0;
- unsigned char g_ucTMMode=0;
- unsigned char modemPwrOffNow=0;
- unsigned char g_usOptionCnt;
- unsigned char m_VoiceSwitch=0;//激活音量显示
- unsigned char m_VoiceSwitchCnt=0;//计时
- unsigned char m_VoiceStep;//步骤
- unsigned char g_uslockCnt;
- unsigned char g_uslockflag;
- unsigned char Ui_LockFlag; //用于 被锁界面可操作PTT
- unsigned char m_keyreturncnt;
- unsigned char PowerUiFlag=0;//
- void KeyPress(void){
- char buf[30];
- if(sutUIstatus.Status==UIS_STANDBY && g_uslockflag==1)
- {
- if((g_ulKeyValue==KEY_INFO)||(g_ulKeyValue==KEY_PANEL_MENU)||(g_ulKeyValue==KEY_PANEL_UP)||(g_ulKeyValue==KEY_FUNC))
- {
- //Ui_LockFlag=1;
- return;
- }
- }
-
- switch(g_ulKeyValue){
- case KEY_PPT_MIC:
- case KEY_PPT:
- g_ucKeyMode=1;
- if(g_ucTMMode==0){
-
- if(hgs_poc_type==POC_BND)ModemSendAt("AT+POC=ptt,1\r\n");
- else {
- ModemSendAt("AT+POC=0B0000\r\n");
- }
- }
- SlwTrace(INF,"[KEY_PPT/KEY_PPT_MIC Press]",1);
- break;
- case KEY_INFO:
- g_ucKeyMode=0;
- SlwTrace(INF,"[KEY_UP Press]",1);
- break;
- case KEY_FUNC:
- g_ucKeyMode=0;
- SlwTrace(INF,"[KEY_DOWN Press]",1);
- break;
- case KEY_PANEL_OK:
- SlwTrace(INF,"[KEY_OK Press]",1);
- break;
- case KEY_PANEL_MENU:
- SlwTrace(INF,"[KEY_PANEL_MENU Press]",1);
- break;
-
- case KEY_PANEL_EXIT:
- SlwTrace(INF,"[KEY_PANEL_EXIT Press]",1);
- break;
- case KEY_PANEL_UP:
- SlwTrace(INF,"[KEY_PANEL_UP Press]",1);
- break;
- case KEY_PANEL_DOWN:
- SlwTrace(INF,"[KEY_PANEL_DOWN Press]",1);
- if(++g_uslockCnt==2){
- if(g_uslockflag){
- g_uslockflag=0;
- }else g_uslockflag=1;
- if(g_uslockflag==1){
- if(sutUIstatus.Status!=UIS_STANDBY)UISetNextStatus(UIS_STANDBY);
- GuiShowBmp(116,0,"lock.bmp");
- }else{
- GuiClearRect(116,0,116+14,14);
- }
- }
- break;
- case KEY_EXIT_DOWN_GT:
- 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_UP_DOWN_IP:
- SlwTrace(INF, "[KEY_UP_DOWN_IP Press]",1);
- break;
- case KEY_OPTION:
- g_usOptionCnt++;
- // if(g_usOptionCnt ==3){
- // // ipSosStartNow();
- // //在待机界面按一下'S'键,网络允许情况下发SOS消息
- // if(sutGpsInfo.isGpsAuthOk==1 && sutUIstatus.Status==UIS_STANDBY && g_ucModemTaskEn==1){
- // buBiaoSosSendNow=1;
- // }
- // }
- //UISetNextStatus(UIS_STANDBY);
- if(sutUIstatus.Status==UIS_STANDBY){
- LCDBackLight(0);
- LcdOnTimeCt=newPara.lcdParaList[newPara.lcdParaDefaultIndex];
- }
- SlwTrace(INF, "[KEY_OPTION Press]",1);
- break;
- }
- }
- void KeyFree(void){
-
- if(sutUIstatus.Status==UIS_STANDBY && g_uslockflag==1)
- {
- if((g_ulKeyValue==KEY_INFO)||(g_ulKeyValue==KEY_PANEL_MENU)||(g_ulKeyValue==KEY_PANEL_UP)||(g_ulKeyValue==KEY_FUNC))
- {
- Ui_LockFlag=1;
- return;
- }
- }
-
- switch(g_ulKeyValue){
- case KEY_PPT_MIC:
- case KEY_PPT:
- SlwTrace(INF,"[KEY_PPT/KEY_PPT_MIC Release]",1);
- g_ucKeyPPTPress=0;
- PttKeyFlag=0;
- //sutPocStatus.PPTpress=0;
- if(g_ucTMMode!=0) break;
- if(hgs_poc_type==POC_BND)ModemSendAt("AT+POC=ptt,0\r\n");
- else {
- //if(uTimerExpired(&HeadsetQudou))
- ModemSendAt("AT+POC=0C0000\r\n");
- }
- g_ucKeyMode=0;
- break;
-
- case KEY_INFO:
- SlwTrace(INF,"[KEY_UP Release]",1);
-
- g_ucKeyMode=0;
- break;
- case KEY_FUNC:
- SlwTrace(INF,"[KEY_DOWN Release]",1);
- g_ucKeyMode=0;
- break;
- case KEY_PANEL_OK:
- SlwTrace(INF,"[KEY_OK Release]",1);
- break;
- case KEY_PANEL_MENU:
- SlwTrace(INF,"[KEY_PANEL_MENU Release]",1);
- break;
- case KEY_PANEL_EXIT:
- SlwTrace(INF,"[KEY_PANEL_EXIT Release]",1);
- g_uslockCnt=0;
- break;
-
- case KEY_PANEL_UP:
- SlwTrace(INF,"[KEY_PANEL_UP Release]",1);
- if(sutUIstatus.Status==UIS_STANDBY&&PowerUiFlag!=1)UISetNextStatus(UIS_SET_VOICELV);
- PowerUiFlag=0;
- break;
-
- case KEY_PANEL_DOWN:
- SlwTrace(INF,"[KEY_PANEL_DOWN Release]",1);
- if(sutUIstatus.Status==UIS_STANDBY&&g_uslockCnt<2&&PowerUiFlag!=1&&g_uslockflag!=1)UISetNextStatus(UIS_SET_VOICELV);
- PowerUiFlag=0;
- g_uslockCnt=0;
- break;
-
- case KEY_EXIT_DOWN_GT:
- SlwTrace(INF,"[KEY_EXIT_DOWN_GT Release]",1);
- g_ulKeyValue=0;
- break;
-
- case KEY_P1_P3_UPDATE:
- SlwTrace(INF, "[KEY_P1_P3_UPDATE Release]",1);
- break;
-
- case KEY_UP_DOWN_IP:
- SlwTrace(INF, "[KEY_UP_DOWN_IP Release]",1);
- g_ulKeyValue=0;
- break;
- case KEY_OPTION:
- SlwTrace(INF, "[KEY_OPTION Release]",1);
-
- //if(sutUIstatus.Status!=UIS_POWEROFF_WAIT&&sutUIstatus.Status != UIS_APN_DETAIL&&sutUIstatus.Status != UIS_MESSAGE_OPTION &&sutUIstatus.Status != UIS_STANDBY&&sutUIstatus.Status!=UIS_SET_APN&&sutUIstatus.Status!=UIS_MAIL_BOX)UISetNextStatus(UIS_STANDBY);
- g_usOptionCnt=0;
- break;
- }
-
- if(KEY_IDLE != g_ulKeyValue) g_ucKeyMode=0;
- }
- static int keyNum=0;
- char isKeyPress(void){
- if(keyNum) return keyNum--;
- else return 0;
- }
- void KeyProces(signed char KeyFlag,char type)
- {
- static char repress=0;//按键重复音
- if(1==KeyFlag){ //按键按下 //
- LCDBackLight(1);
- LcdOnTimeCt=0;
- repress++;
-
- if(g_ulKeyValue!=KEY_PPT&&(newPara.KeySound==1)){
- if(repress<2){
- if(TTSPlayTick<uSysTickGet()){
- //ModemSendAt("AT+TONE\r\n");
- SetBeep(1000,10);
- SpeakerEnable();
- uTimerCreate(UTIMER_BEEP,15);//20
- }
- }
- }
- if(!LastKeyLight&&g_ulKeyValue!=KEY_PPT_MIC&&g_ulKeyValue!=KEY_PPT)return;//熄屏操作
- keyNum++;
- KeyPress();
- m_keyreturncnt=10;
- }else if(KeyFlag==-1){ //按键释放
- repress=0;
- if(PttKeyFlag==1&&type){
- ModemSendAt("AT+POC=0C0000\r\n");//由于存在按键值和ADC两种键值,会相互修改,导致有时候无法触发PTT松开
- PttKeyFlag=0;
- }
- if(!LastKeyLight&&g_ulKeyValue!=KEY_PPT_MIC&&g_ulKeyValue!=KEY_PPT)return;
- KeyFree();
- m_keyreturncnt=10;
- }
-
- }
- void KeyHandler(void){
- signed char KeyFlag1=0;
- signed char KeyFlag2=0;
-
- KeyFlag1=GetKey();
- KeyFlag2=GetKeyVBAT();
- KeyProces(KeyFlag1,1);
- KeyProces(KeyFlag2,0);//电压键值
- }
- static void PcMsgHandle(char *msg){
- short CmdListNum=0,i,j;
- const char *pCmd;
- char *pMsg,flag;
- char buf[150];
- char strIP[40];
- char strAccount[20+20];
- char strPassword[20+20];
- int len;
- unsigned short Port;
- unsigned long PSN;
- char needsave=0;
- char needsaveExterPara=0;
-
- static char exaud=0;
-
- const char *CmdList[]={
- "TM", //Trace Modem
- "TG", //Trace GPS
- "SMP", //Set Modem Parameter
- "RMP", //Read Modem Parameter
- "SGP", //Set GPS Parameter
- "RGP",
- "SACC", //Set access point
- "RACC", //Read access point
- "APN", //SET APN
- "RAPN", //Read APN
- "RREC", //Read record info
- "VER", //Read Version
- "BAT", //Battery voltage
- "UPDATE",
- "EXAUD",
- "RDOMAIN",
- "SDOMAIN",
- "RPID",
- "SPID",
- ""
- };
- typedef enum{
- GT_TM,
- GT_TG,
- GT_SMP,
- GT_RMP,
- GT_SGP,
- GT_RGP,
- GT_SACC,
- GT_RACC,
- GT_APN,
- GT_RAPN,
- GT_RREC,
- GT_VER,
- GT_BAT,
- GT_UPDATE,
- GT_EXAUD,
- GT_RDOMAIN,
- GT_SDOMAIN,
- GT_RPID,
- GT_SPID,
- }GT_CMD_DEF;
-
- while(*CmdList[CmdListNum++]);//计算命令列表个数
- CmdListNum--;
- //查找与命令列表相同的命令位置
- for(i=0;i<CmdListNum;i++){
- pCmd=CmdList[i];
- pMsg=&msg[3];
- flag=0;
- j=0;
- while(*pCmd){
- if(*pCmd!=*pMsg){
- flag=1;
- break;
- }
- pCmd++;
- pMsg++;
- j++;
- }
- if(!flag){
- break;
- }
- }
- if(i==CmdListNum)return;
- switch(i){
- case GT_TM:SlwTrace(INF,"GT+TM:OK",1);
- SetLedStatus(RedBlueSlowFlash);
- ComSelect(COM_SEL_MODEM);
- g_ucTMMode=1;
- break;
-
- case GT_TG:SlwTrace(INF,"GT+TG:OK",1);
- SetLedStatus(RedBlueSlowFlash);
- GPSRestart();
- ComSelect(COM_SEL_GPS);
- break;
-
- case GT_SMP://"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 GT_RMP://"RMP" GT+RMP<CR><LF> 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 GT_SGP://"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 GT_RGP://RGP
- snprintf(buf, sizeof(buf),"GT+RGP:IP=%s;PORT=%d;",newPara.serList.ur.gip,newPara.gpsPort);
- SlwTrace(INF,buf,1);
- break;
-
- case GT_SACC://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 GT_RACC://RACC
- snprintf(buf, sizeof(buf),"GT+RACC:Accessp=%s;",newPara.apnList.APN_Name);
- SlwTrace(INF,buf,1);
- break;
-
- case GT_APN://APN
- /*
- 设置格式:GT+APN=Account=用户名;Password=密码;<CR><LF>
- 成功返回:GT+APN:Account=用户名;Password=密码;<CR><LF>
- 失败返回:GT+APN:FAIL[失败原因]<CR><LF>
- */
- 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);
-
- newPara.apnList.defaultuse=3;
- needsaveExterPara=1;
- break;
-
- case GT_RAPN://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 GT_RREC://RREC
- sFlash_Read(buf, RECORD_INFO_ADDRESS, 100);
- SlwTrace(INF, buf, 1);
- break;
- case GT_VER://"VER"
- snprintf(buf, sizeof(buf),"GT+VER:%s_V%d",sutProductPara.ProductName,sutProductPara.ProductVersion);
- SlwTrace(INF,buf,1);
- break;
- case GT_BAT://BAT
- snprintf(buf, sizeof(buf),"GT+BAT: %d V",g_iVbat);
- SlwTrace(INF,buf,1);
- case GT_UPDATE:
- SlwTrace(INF,"goto ModemUpdate",1);
- USBORTTL_LOW;//切换至USB口
- MODEM_UPDATE_HIGH;
- sutPocStatus.modemRstFlag=1; //复位模块
- break;
-
- case GT_EXAUD:
- if(exaud==0){
- exaud=1;
- SpeakerEnable();
- SlwTrace(INF,"enable spk",1);
- }else {
- SpeakerDisable();
- exaud=0;
- SlwTrace(INF,"disenable spk",1);
- }
- break;
-
- case GT_RDOMAIN:
- snprintf(buf,sizeof(buf),"GT+RDOMAIN:%s;PSN=%lu;",newPara.serList.ipFenFa,sutProductPara.PSN);
- SlwTrace(INF,buf,1);
- break;
-
- case GT_SDOMAIN:
-
- len=GetParaFromStr(msg,"SDOMAIN",buf);//buf=www.baidu.com ,return len
- if(len>40){
- SlwTrace(INF,"MAINIP LEN ERR",1);
- return;
- }
- if(newPara.serList.defaultuse != SER_IP){
- newPara.serList.defaultuse=SER_IP;
- needsaveExterPara=1;
- }
- memset(newPara.serList.ipFenFa,0,sizeof(newPara.serList.ipFenFa));
- strcpy(newPara.serList.ipFenFa,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;
- }
- snprintf(buf,sizeof(buf),"GT+SDOMAIN=%s;PSN=%lu;",newPara.serList.ipFenFa,sutProductPara.PSN);
- //Save para to flash
- needsaveExterPara=1;
- SlwTrace(INF,buf,1);
- break;
-
- case GT_RPID:
- snprintf(buf, sizeof(buf),"GT+RPID:PSN=%lu;",sutProductPara.PSN);
- SlwTrace(INF,buf,1);
- break;
- case GT_SPID:
-
- len=GetParaFromStr(msg,"PSN",buf);
- if(len<1 || len>10){
- SlwTrace(INF,"GT+SPID:FAIL[PSN Invalid]",1);
- break;
- }else{
- PSN=atol(buf);
- }
- //PSN
- if(sutProductPara.PSN != PSN){
- sutProductPara.PSN=PSN;
- needsave=1;
- }
- snprintf(buf, sizeof(buf),"GT+SPID:PSN=%lu;",sutProductPara.PSN);
- SlwTrace(INF,buf,1);
- break;
- default:
- break;
- }
- if(needsave!=0) SaveProductParaToFlash();
- if(needsaveExterPara!=0) ModifyConfigureFile(0);
-
- }
- void CommHandler(void){
- if(g_usUart1RecvLen){
- PcMsgHandle((char *)RxBuffer1);
- g_usUart1RecvLen=0;
- rx1_ct=0;
- }
- }
- void ResetModem(void)
- {
- Uart2Init();
-
- sutPocStatus.modemRstFlag=1;
- }
- /*************************************************************************************
- *FingerDaemonfinger
- *守护进程
- *用于防止通讯模块死机,或者与通讯模块通讯的串口异常而重新启动模块或通讯驱动。
- *用于防止GPS模块异常而重启GPS
- *此函数需要确保每秒调用一次
- 入口参数
- sutPocStatus.FirstLogined
- sutPocStatus.PocLostCt
- sutPocStatus.ModemPowerOn
- sutPocStatus.ModemInactiveCt
- g_iCSQ
- **************************************************************************************/
- void FingerDaemonfinger(void)
- {
- static unsigned char sucPocLostTimeoutCount=0;//
- //static unsigned char sucModemInactiveCount=0;
- unsigned short PocLostCtMax;
-
- IWDG_ReloadCounter();//喂狗
- if(g_ucEnterGTNow)return;//GT+TM 返回
-
- if(g_ucModemTaskEn==0||USBSeletCt>0)return;
- //如果曾经登陆过POC系统,然后离线,开始计数,直到再次登陆,如果一直不登陆超过一定时间,则重启模块和串口
- if(sutPocStatus.FirstLogined){
- if(sutPocStatus.Logined==0){
-
- PocLostCtMax=pocTimeOutTime*60;
-
- if(++sutPocStatus.PocLostCt>PocLostCtMax){
- sutPocStatus.PocLostCt=0;
- //长时间不登陆,重启模块及串口驱动部分
- SlwTrace(INF,"PocLostTimeout!Reset Modem!",1);
- ResetModem();
- }
- }else{
- sutPocStatus.PocLostCt=0;
- sucPocLostTimeoutCount=0;
- }
- }else{
- //一个小时未登录复位模块
- if(++sutPocStatus.PocLostCt>3600){
- sutPocStatus.PocLostCt=0;
- printf("Timeout Logintimeout----\r\n ");
- ResetModem();
- }
- }
- //如果模块已开机,长时间收不到串口消息,则重启模块及串口驱动部分
- if(sutPocStatus.ModemPowerOn==1){
- // if(sutPocStatus.ModemInactiveCt==0){//ModemInactiveCt必须在接收到Modem串口消息后才清零
- // //sucModemInactiveCount=0;
- // }
- if(++sutPocStatus.ModemInactiveCt>40){//等待时间
- sutPocStatus.ModemInactiveCt=1;
- //长时间收不到串口消息,重启模块及串口驱动
- SlwTrace(INF,"ModemRecvTimeout!Reset Modem!",1);
- ResetModem();
- }
- }
- //GPS守护
- if(sutGpsInfo.isGpsWork>0){
- if(++sutGpsInfo.GpsInactiveCt>10){
- sutGpsInfo.GpsInactiveCt=0;
- //复位GPS
- GPSRestart();
- Uart3Init();
- }
- }
- }
- 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; //HIGH
- }
- unsigned char g_ucEnterGTNow=0;
- void EnterGTMode(void)
- {
- unsigned char time=12;
- g_ucModemTaskEn=0;
- g_ucEnterGTNow=1;
- SpeakerEnable();
- SetBeepByNoOS(1000,10);
- SetBeepByNoOS(500,10);
- SetBeepByNoOS(1000,10);
- Uart1RxEnable(1);
- LedProcess(1);
- SetLedStatus(RedBlueFastFlash);
- SlwTrace(INF,"[EnterTxMode]",1);
- }
- void cmdShutDown(char type)
- {
- short cntDown;
- LCDBackLight(1);
- LcdOnTimeCt=0;
- SlwTrace(INF, "Try to PwrOff",1);
- ModemSendAt("AT$QCPWRDN\r\n");
- switch(type)
- {
- case 0:ShowMessageBox("正在关机");break;
- case 1:ShowMessageBox("低压关机");break;
- default:return;
- }
-
- for(cntDown=6;cntDown>=0;cntDown--)
- {
- IWDG_ReloadCounter();
- uTimerHardDly(100);
- }
- }
- char GetUniStringByID(char *HardIDString)
- {//输出15个字节的字符串
- unsigned char id[12];
- unsigned char string[16];
-
- long long temp;
- short i;
- unsigned char seed;
- if(HardIDString == '\0') return 0;
- GetSTM32ID(id);
- printf("STM32 ID==");
- for(i=0;i<12;i++)printf("%02x",id[i]);
- printf("\r\n");
- for(i=5;i>=0;i--){
- temp <<=8;
- temp |= id[i];
- }
- temp &= 0xffffffffffff;
- printf("temp=%015llu\r\n",temp);
- snprintf(string,sizeof(string),"%015llu",temp);
- for(i=0;i<15;i++) HardIDString[i]=string[i];
- HardIDString[15]='\0';
- //snprintf(HardIDString,16,"%015llu",temp);
- return 1;
- }
- void PowerOffProtetion(void)
- {
- if(modemPwrOffNow==0) return;
- // PWR_EN_HIGH;
- // LCDBackLight(1);
- // GPS_PWREN_LOW;
- // cmdShutDown(0);
- // PWR_EN_LOW;
- // while(1);
- }
- //长按 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;
- }
- }
- /*****************************************************************************************
- *函数名: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);i<MeidLen;i++){
- aucMEID[j]=pMEID[i];
- j++;
- }
- //所有字节进行相互异或运算,使每个字节的变化对整体结果都敏感
- temp1=0;
- temp2=0;
- for(i=0;i<10;i++){
- temp1^=(unsigned char)aucPSN[i];
- temp2^=(unsigned char)aucMEID[i];
- }
- temp1^=temp2;
- temp2=sucRandTable[temp1];
- //循环查表异或运算,生成key
- for(i=0;i<10;i++){
- temp1=aucPSN[i]^temp2;
- key[i]=aucMEID[i]^temp1;
- temp2=sucRandTable[temp1];
- }
- //取最后6个key,分别除10取余后再转Ascii,作为结果,结果为6个数字串,如"123456"
- j=0;
- for(i=4;i<10;i++){
- pCheckCode[j]=key[i]%10;
- pCheckCode[j]+=0x30;
- j++;
- }
- pCheckCode[6]=0; //结束符,方便调试打印和语音播报。
- return 1;
- }
|