mainTask.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863
  1. #include "includes.h"
  2. unsigned char pocTimeOutTime=30;//默认30分钟
  3. unsigned char g_ucEnterGroupFlag=0;
  4. unsigned char g_ucTMMode=0;
  5. unsigned char modemPwrOffNow=0;
  6. unsigned char g_usOptionCnt;
  7. unsigned char m_VoiceSwitch=0;//激活音量显示
  8. unsigned char m_VoiceSwitchCnt=0;//计时
  9. unsigned char m_VoiceStep;//步骤
  10. unsigned char g_uslockCnt;
  11. unsigned char g_uslockflag;
  12. unsigned char Ui_LockFlag; //用于 被锁界面可操作PTT
  13. unsigned char m_keyreturncnt;
  14. unsigned char PowerUiFlag=0;//
  15. void KeyPress(void){
  16. char buf[30];
  17. if(sutUIstatus.Status==UIS_STANDBY && g_uslockflag==1)
  18. {
  19. if((g_ulKeyValue==KEY_INFO)||(g_ulKeyValue==KEY_PANEL_MENU)||(g_ulKeyValue==KEY_PANEL_UP)||(g_ulKeyValue==KEY_FUNC))
  20. {
  21. //Ui_LockFlag=1;
  22. return;
  23. }
  24. }
  25. switch(g_ulKeyValue){
  26. case KEY_PPT_MIC:
  27. case KEY_PPT:
  28. g_ucKeyMode=1;
  29. if(g_ucTMMode==0){
  30. if(hgs_poc_type==POC_BND)ModemSendAt("AT+POC=ptt,1\r\n");
  31. else {
  32. ModemSendAt("AT+POC=0B0000\r\n");
  33. }
  34. }
  35. SlwTrace(INF,"[KEY_PPT/KEY_PPT_MIC Press]",1);
  36. break;
  37. case KEY_INFO:
  38. g_ucKeyMode=0;
  39. SlwTrace(INF,"[KEY_UP Press]",1);
  40. break;
  41. case KEY_FUNC:
  42. g_ucKeyMode=0;
  43. SlwTrace(INF,"[KEY_DOWN Press]",1);
  44. break;
  45. case KEY_PANEL_OK:
  46. SlwTrace(INF,"[KEY_OK Press]",1);
  47. break;
  48. case KEY_PANEL_MENU:
  49. SlwTrace(INF,"[KEY_PANEL_MENU Press]",1);
  50. break;
  51. case KEY_PANEL_EXIT:
  52. SlwTrace(INF,"[KEY_PANEL_EXIT Press]",1);
  53. break;
  54. case KEY_PANEL_UP:
  55. SlwTrace(INF,"[KEY_PANEL_UP Press]",1);
  56. break;
  57. case KEY_PANEL_DOWN:
  58. SlwTrace(INF,"[KEY_PANEL_DOWN Press]",1);
  59. if(++g_uslockCnt==2){
  60. if(g_uslockflag){
  61. g_uslockflag=0;
  62. }else g_uslockflag=1;
  63. if(g_uslockflag==1){
  64. if(sutUIstatus.Status!=UIS_STANDBY)UISetNextStatus(UIS_STANDBY);
  65. GuiShowBmp(116,0,"lock.bmp");
  66. }else{
  67. GuiClearRect(116,0,116+14,14);
  68. }
  69. }
  70. break;
  71. case KEY_EXIT_DOWN_GT:
  72. SlwTrace(INF,"[KEY_EXIT_DOWN_GT Press]",1);
  73. break;
  74. case KEY_P1_P3_UPDATE:
  75. SlwTrace(INF, "[KEY_P1_P3_UPDATE Press]",1);
  76. break;
  77. case KEY_UP_DOWN_IP:
  78. SlwTrace(INF, "[KEY_UP_DOWN_IP Press]",1);
  79. break;
  80. case KEY_OPTION:
  81. g_usOptionCnt++;
  82. // if(g_usOptionCnt ==3){
  83. // // ipSosStartNow();
  84. // //在待机界面按一下'S'键,网络允许情况下发SOS消息
  85. // if(sutGpsInfo.isGpsAuthOk==1 && sutUIstatus.Status==UIS_STANDBY && g_ucModemTaskEn==1){
  86. // buBiaoSosSendNow=1;
  87. // }
  88. // }
  89. //UISetNextStatus(UIS_STANDBY);
  90. if(sutUIstatus.Status==UIS_STANDBY){
  91. LCDBackLight(0);
  92. LcdOnTimeCt=newPara.lcdParaList[newPara.lcdParaDefaultIndex];
  93. }
  94. SlwTrace(INF, "[KEY_OPTION Press]",1);
  95. break;
  96. }
  97. }
  98. void KeyFree(void){
  99. if(sutUIstatus.Status==UIS_STANDBY && g_uslockflag==1)
  100. {
  101. if((g_ulKeyValue==KEY_INFO)||(g_ulKeyValue==KEY_PANEL_MENU)||(g_ulKeyValue==KEY_PANEL_UP)||(g_ulKeyValue==KEY_FUNC))
  102. {
  103. Ui_LockFlag=1;
  104. return;
  105. }
  106. }
  107. switch(g_ulKeyValue){
  108. case KEY_PPT_MIC:
  109. case KEY_PPT:
  110. SlwTrace(INF,"[KEY_PPT/KEY_PPT_MIC Release]",1);
  111. g_ucKeyPPTPress=0;
  112. PttKeyFlag=0;
  113. //sutPocStatus.PPTpress=0;
  114. if(g_ucTMMode!=0) break;
  115. if(hgs_poc_type==POC_BND)ModemSendAt("AT+POC=ptt,0\r\n");
  116. else {
  117. //if(uTimerExpired(&HeadsetQudou))
  118. ModemSendAt("AT+POC=0C0000\r\n");
  119. }
  120. g_ucKeyMode=0;
  121. break;
  122. case KEY_INFO:
  123. SlwTrace(INF,"[KEY_UP Release]",1);
  124. g_ucKeyMode=0;
  125. break;
  126. case KEY_FUNC:
  127. SlwTrace(INF,"[KEY_DOWN Release]",1);
  128. g_ucKeyMode=0;
  129. break;
  130. case KEY_PANEL_OK:
  131. SlwTrace(INF,"[KEY_OK Release]",1);
  132. break;
  133. case KEY_PANEL_MENU:
  134. SlwTrace(INF,"[KEY_PANEL_MENU Release]",1);
  135. break;
  136. case KEY_PANEL_EXIT:
  137. SlwTrace(INF,"[KEY_PANEL_EXIT Release]",1);
  138. g_uslockCnt=0;
  139. break;
  140. case KEY_PANEL_UP:
  141. SlwTrace(INF,"[KEY_PANEL_UP Release]",1);
  142. if(sutUIstatus.Status==UIS_STANDBY&&PowerUiFlag!=1)UISetNextStatus(UIS_SET_VOICELV);
  143. PowerUiFlag=0;
  144. break;
  145. case KEY_PANEL_DOWN:
  146. SlwTrace(INF,"[KEY_PANEL_DOWN Release]",1);
  147. if(sutUIstatus.Status==UIS_STANDBY&&g_uslockCnt<2&&PowerUiFlag!=1&&g_uslockflag!=1)UISetNextStatus(UIS_SET_VOICELV);
  148. PowerUiFlag=0;
  149. g_uslockCnt=0;
  150. break;
  151. case KEY_EXIT_DOWN_GT:
  152. SlwTrace(INF,"[KEY_EXIT_DOWN_GT Release]",1);
  153. g_ulKeyValue=0;
  154. break;
  155. case KEY_P1_P3_UPDATE:
  156. SlwTrace(INF, "[KEY_P1_P3_UPDATE Release]",1);
  157. break;
  158. case KEY_UP_DOWN_IP:
  159. SlwTrace(INF, "[KEY_UP_DOWN_IP Release]",1);
  160. g_ulKeyValue=0;
  161. break;
  162. case KEY_OPTION:
  163. SlwTrace(INF, "[KEY_OPTION Release]",1);
  164. //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);
  165. g_usOptionCnt=0;
  166. break;
  167. }
  168. if(KEY_IDLE != g_ulKeyValue) g_ucKeyMode=0;
  169. }
  170. static int keyNum=0;
  171. char isKeyPress(void){
  172. if(keyNum) return keyNum--;
  173. else return 0;
  174. }
  175. void KeyProces(signed char KeyFlag,char type)
  176. {
  177. static char repress=0;//按键重复音
  178. if(1==KeyFlag){ //按键按下 //
  179. LCDBackLight(1);
  180. LcdOnTimeCt=0;
  181. repress++;
  182. if(g_ulKeyValue!=KEY_PPT&&(newPara.KeySound==1)){
  183. if(repress<2){
  184. if(TTSPlayTick<uSysTickGet()){
  185. //ModemSendAt("AT+TONE\r\n");
  186. SetBeep(1000,10);
  187. SpeakerEnable();
  188. uTimerCreate(UTIMER_BEEP,15);//20
  189. }
  190. }
  191. }
  192. if(!LastKeyLight&&g_ulKeyValue!=KEY_PPT_MIC&&g_ulKeyValue!=KEY_PPT)return;//熄屏操作
  193. keyNum++;
  194. KeyPress();
  195. m_keyreturncnt=10;
  196. }else if(KeyFlag==-1){ //按键释放
  197. repress=0;
  198. if(PttKeyFlag==1&&type){
  199. ModemSendAt("AT+POC=0C0000\r\n");//由于存在按键值和ADC两种键值,会相互修改,导致有时候无法触发PTT松开
  200. PttKeyFlag=0;
  201. }
  202. if(!LastKeyLight&&g_ulKeyValue!=KEY_PPT_MIC&&g_ulKeyValue!=KEY_PPT)return;
  203. KeyFree();
  204. m_keyreturncnt=10;
  205. }
  206. }
  207. void KeyHandler(void){
  208. signed char KeyFlag1=0;
  209. signed char KeyFlag2=0;
  210. KeyFlag1=GetKey();
  211. KeyFlag2=GetKeyVBAT();
  212. KeyProces(KeyFlag1,1);
  213. KeyProces(KeyFlag2,0);//电压键值
  214. }
  215. static void PcMsgHandle(char *msg){
  216. short CmdListNum=0,i,j;
  217. const char *pCmd;
  218. char *pMsg,flag;
  219. char buf[150];
  220. char strIP[40];
  221. char strAccount[20+20];
  222. char strPassword[20+20];
  223. int len;
  224. unsigned short Port;
  225. unsigned long PSN;
  226. char needsave=0;
  227. char needsaveExterPara=0;
  228. static char exaud=0;
  229. const char *CmdList[]={
  230. "TM", //Trace Modem
  231. "TG", //Trace GPS
  232. "SMP", //Set Modem Parameter
  233. "RMP", //Read Modem Parameter
  234. "SGP", //Set GPS Parameter
  235. "RGP",
  236. "SACC", //Set access point
  237. "RACC", //Read access point
  238. "APN", //SET APN
  239. "RAPN", //Read APN
  240. "RREC", //Read record info
  241. "VER", //Read Version
  242. "BAT", //Battery voltage
  243. "UPDATE",
  244. "EXAUD",
  245. "RDOMAIN",
  246. "SDOMAIN",
  247. "RPID",
  248. "SPID",
  249. ""
  250. };
  251. typedef enum{
  252. GT_TM,
  253. GT_TG,
  254. GT_SMP,
  255. GT_RMP,
  256. GT_SGP,
  257. GT_RGP,
  258. GT_SACC,
  259. GT_RACC,
  260. GT_APN,
  261. GT_RAPN,
  262. GT_RREC,
  263. GT_VER,
  264. GT_BAT,
  265. GT_UPDATE,
  266. GT_EXAUD,
  267. GT_RDOMAIN,
  268. GT_SDOMAIN,
  269. GT_RPID,
  270. GT_SPID,
  271. }GT_CMD_DEF;
  272. while(*CmdList[CmdListNum++]);//计算命令列表个数
  273. CmdListNum--;
  274. //查找与命令列表相同的命令位置
  275. for(i=0;i<CmdListNum;i++){
  276. pCmd=CmdList[i];
  277. pMsg=&msg[3];
  278. flag=0;
  279. j=0;
  280. while(*pCmd){
  281. if(*pCmd!=*pMsg){
  282. flag=1;
  283. break;
  284. }
  285. pCmd++;
  286. pMsg++;
  287. j++;
  288. }
  289. if(!flag){
  290. break;
  291. }
  292. }
  293. if(i==CmdListNum)return;
  294. switch(i){
  295. case GT_TM:SlwTrace(INF,"GT+TM:OK",1);
  296. SetLedStatus(RedBlueSlowFlash);
  297. ComSelect(COM_SEL_MODEM);
  298. g_ucTMMode=1;
  299. break;
  300. case GT_TG:SlwTrace(INF,"GT+TG:OK",1);
  301. SetLedStatus(RedBlueSlowFlash);
  302. GPSRestart();
  303. ComSelect(COM_SEL_GPS);
  304. break;
  305. case GT_SMP://"SMP" GT+SMP=IP=地址或域名;Port=端口号;PSN=终端序列号
  306. len=GetParaFromStr(msg,"IP",buf);
  307. if(len<1 || len>=40){
  308. SlwTrace(INF,"GT+SMP:FAIL[IP Invalid]",1);
  309. break;
  310. }
  311. strcpy(strIP,buf);
  312. len=GetParaFromStr(msg,"Port",buf);
  313. if(len==0)Port=0;
  314. else if(len>5){
  315. SlwTrace(INF,"GT+SMP:FAIL[Port Invalid]",1);
  316. break;
  317. }else{
  318. Port=atoi(buf);
  319. }
  320. len=GetParaFromStr(msg,"PSN",buf);
  321. if(len<1 || len>10){
  322. SlwTrace(INF,"GT+SMP:FAIL[PSN Invalid]",1);
  323. break;
  324. }else{
  325. PSN=atol(buf);
  326. }
  327. //PSN
  328. if(sutProductPara.PSN != PSN){
  329. sutProductPara.PSN=PSN;
  330. needsave=1;
  331. }
  332. if(newPara.serList.defaultuse != SER_US){
  333. newPara.serList.defaultuse=SER_US;
  334. needsaveExterPara=1;
  335. }
  336. if(0!= strcmp(newPara.serList.ur.pip, strIP)){//与资源文件的不一样,则需要更新
  337. strcpy(newPara.serList.ur.pip, strIP);
  338. needsaveExterPara=1;
  339. }
  340. snprintf(buf, sizeof(buf),"GT+SMP:IP=%s;Port=%u;PSN=%lu;",newPara.serList.ur.pip,Port,sutProductPara.PSN);
  341. SlwTrace(INF,buf,1);
  342. break;
  343. case GT_RMP://"RMP" GT+RMP<CR><LF> PSN=终端序列号;MEID=模块MEID号;CNUM=电信号;UIMID=电信UIMID;
  344. snprintf(buf, sizeof(buf),"GT+RMP:PSN=%lu;MEID=%s;CNUM=0000000000;UIMID=0000000000;IP=%s;",sutProductPara.PSN,DEV_HARDID,getPIPAddr());
  345. SlwTrace(INF,buf,1);
  346. break;
  347. case GT_SGP://"SGP" GT+SGP=IP=地址或域名;Port=端口号;
  348. len=GetParaFromStr(msg,"IP",buf);
  349. if(len<1 || len>=40){
  350. SlwTrace(INF,"GT+SGP:FAIL[IP Invalid]",1);
  351. break;
  352. }else strcpy(strIP,buf);
  353. len=GetParaFromStr(msg,"Port",buf);
  354. if(len==0)Port=0;
  355. else if(len>5){
  356. SlwTrace(INF,"GT+SGP:FAIL[Port Invalid]",1);
  357. break;
  358. }else{
  359. Port=atoi(buf);
  360. }
  361. if(newPara.serList.defaultuse != SER_US){
  362. newPara.serList.defaultuse = SER_US;
  363. needsaveExterPara=1;
  364. }
  365. if(0!=strcmp(newPara.serList.ur.gip, strIP) || Port != newPara.gpsPort){
  366. strcpy(newPara.serList.ur.gip,strIP);
  367. newPara.gpsPort=Port;
  368. needsaveExterPara=1;
  369. }
  370. //echo
  371. snprintf(buf, sizeof(buf),"GT+SGP:IP=%s;Port=%u;",newPara.serList.ur.gip,newPara.gpsPort);
  372. SlwTrace(INF,buf,1);
  373. break;
  374. case GT_RGP://RGP
  375. snprintf(buf, sizeof(buf),"GT+RGP:IP=%s;PORT=%d;",newPara.serList.ur.gip,newPara.gpsPort);
  376. SlwTrace(INF,buf,1);
  377. break;
  378. case GT_SACC://SACC
  379. len=GetParaFromStr(msg,"Accessp",buf);
  380. if(len<0 || len > (APN_SEGMENT_MAX_LEN-1))
  381. {
  382. SlwTrace(INF,"GT+SACC:FAIL[Accessp Invalid]",1);
  383. return;
  384. }
  385. if(len ==0) newPara.apnList.APN_Name[0]=0;
  386. else strcpy(newPara.apnList.APN_Name,buf);
  387. snprintf(buf, sizeof(buf),"GT+SACC:Accessp=%s;",newPara.apnList.APN_Name); //**********
  388. SlwTrace(INF,buf,1);
  389. needsaveExterPara=1;
  390. break;
  391. case GT_RACC://RACC
  392. snprintf(buf, sizeof(buf),"GT+RACC:Accessp=%s;",newPara.apnList.APN_Name);
  393. SlwTrace(INF,buf,1);
  394. break;
  395. case GT_APN://APN
  396. /*
  397. 设置格式:GT+APN=Account=用户名;Password=密码;<CR><LF>
  398. 成功返回:GT+APN:Account=用户名;Password=密码;<CR><LF>
  399. 失败返回:GT+APN:FAIL[失败原因]<CR><LF>
  400. */
  401. len=GetParaFromStr(msg,"Account",buf);
  402. if(len<1 || len > 30){
  403. SlwTrace(INF,"GT+APN:FAIL[Account Invalid]",1);
  404. return;
  405. }
  406. strcpy(strAccount,buf);
  407. len=GetParaFromStr(msg,"Password",buf);
  408. if(len<1 || len > 30){
  409. SlwTrace(INF,"GT+APN:FAIL[Password Invalid]",1);
  410. return;
  411. }
  412. strcpy(strPassword,buf);
  413. snprintf(buf, sizeof(buf),"GT+APN:Account=%s;Password=%s;",strAccount,strPassword);//******
  414. SlwTrace(INF,buf,1);//*********
  415. if(newSysiniIndex<0) break;
  416. if(0==strcmp(strAccount, newPara.apnList.apnList[3].account) &&
  417. 0==strcmp(strPassword, newPara.apnList.apnList[3].pass))
  418. break;
  419. strcpy(newPara.apnList.apnList[3].account, strAccount);
  420. strcpy(newPara.apnList.apnList[3].pass, strPassword);
  421. newPara.apnList.defaultuse=3;
  422. needsaveExterPara=1;
  423. break;
  424. case GT_RAPN://RAPN
  425. sprintf(buf,"GT+RAPN:Account=%s;Password=%s;",newPara.apnList.apnList[3].account,newPara.apnList.apnList[3].pass); //***********
  426. SlwTrace(INF,buf,1);
  427. break;
  428. case GT_RREC://RREC
  429. sFlash_Read(buf, RECORD_INFO_ADDRESS, 100);
  430. SlwTrace(INF, buf, 1);
  431. break;
  432. case GT_VER://"VER"
  433. snprintf(buf, sizeof(buf),"GT+VER:%s_V%d",sutProductPara.ProductName,sutProductPara.ProductVersion);
  434. SlwTrace(INF,buf,1);
  435. break;
  436. case GT_BAT://BAT
  437. snprintf(buf, sizeof(buf),"GT+BAT: %d V",g_iVbat);
  438. SlwTrace(INF,buf,1);
  439. case GT_UPDATE:
  440. SlwTrace(INF,"goto ModemUpdate",1);
  441. USBORTTL_LOW;//切换至USB口
  442. MODEM_UPDATE_HIGH;
  443. sutPocStatus.modemRstFlag=1; //复位模块
  444. break;
  445. case GT_EXAUD:
  446. if(exaud==0){
  447. exaud=1;
  448. SpeakerEnable();
  449. SlwTrace(INF,"enable spk",1);
  450. }else {
  451. SpeakerDisable();
  452. exaud=0;
  453. SlwTrace(INF,"disenable spk",1);
  454. }
  455. break;
  456. case GT_RDOMAIN:
  457. snprintf(buf,sizeof(buf),"GT+RDOMAIN:%s;PSN=%lu;",newPara.serList.ipFenFa,sutProductPara.PSN);
  458. SlwTrace(INF,buf,1);
  459. break;
  460. case GT_SDOMAIN:
  461. len=GetParaFromStr(msg,"SDOMAIN",buf);//buf=www.baidu.com ,return len
  462. if(len>40){
  463. SlwTrace(INF,"MAINIP LEN ERR",1);
  464. return;
  465. }
  466. if(newPara.serList.defaultuse != SER_IP){
  467. newPara.serList.defaultuse=SER_IP;
  468. needsaveExterPara=1;
  469. }
  470. memset(newPara.serList.ipFenFa,0,sizeof(newPara.serList.ipFenFa));
  471. strcpy(newPara.serList.ipFenFa,buf);
  472. len=GetParaFromStr(msg,"PSN",buf);
  473. if(len<1 || len>10){
  474. SlwTrace(INF,"GT+SMP:FAIL[PSN Invalid]",1);
  475. break;
  476. }else{
  477. PSN=atol(buf);
  478. }
  479. //PSN
  480. if(sutProductPara.PSN != PSN){
  481. sutProductPara.PSN=PSN;
  482. needsave=1;
  483. }
  484. snprintf(buf,sizeof(buf),"GT+SDOMAIN=%s;PSN=%lu;",newPara.serList.ipFenFa,sutProductPara.PSN);
  485. //Save para to flash
  486. needsaveExterPara=1;
  487. SlwTrace(INF,buf,1);
  488. break;
  489. case GT_RPID:
  490. snprintf(buf, sizeof(buf),"GT+RPID:PSN=%lu;",sutProductPara.PSN);
  491. SlwTrace(INF,buf,1);
  492. break;
  493. case GT_SPID:
  494. len=GetParaFromStr(msg,"PSN",buf);
  495. if(len<1 || len>10){
  496. SlwTrace(INF,"GT+SPID:FAIL[PSN Invalid]",1);
  497. break;
  498. }else{
  499. PSN=atol(buf);
  500. }
  501. //PSN
  502. if(sutProductPara.PSN != PSN){
  503. sutProductPara.PSN=PSN;
  504. needsave=1;
  505. }
  506. snprintf(buf, sizeof(buf),"GT+SPID:PSN=%lu;",sutProductPara.PSN);
  507. SlwTrace(INF,buf,1);
  508. break;
  509. default:
  510. break;
  511. }
  512. if(needsave!=0) SaveProductParaToFlash();
  513. if(needsaveExterPara!=0) ModifyConfigureFile(0);
  514. }
  515. void CommHandler(void){
  516. if(g_usUart1RecvLen){
  517. PcMsgHandle((char *)RxBuffer1);
  518. g_usUart1RecvLen=0;
  519. rx1_ct=0;
  520. }
  521. }
  522. void ResetModem(void)
  523. {
  524. Uart2Init();
  525. sutPocStatus.modemRstFlag=1;
  526. }
  527. /*************************************************************************************
  528. *FingerDaemonfinger
  529. *守护进程
  530. *用于防止通讯模块死机,或者与通讯模块通讯的串口异常而重新启动模块或通讯驱动。
  531. *用于防止GPS模块异常而重启GPS
  532. *此函数需要确保每秒调用一次
  533. 入口参数
  534. sutPocStatus.FirstLogined
  535. sutPocStatus.PocLostCt
  536. sutPocStatus.ModemPowerOn
  537. sutPocStatus.ModemInactiveCt
  538. g_iCSQ
  539. **************************************************************************************/
  540. void FingerDaemonfinger(void)
  541. {
  542. static unsigned char sucPocLostTimeoutCount=0;//
  543. //static unsigned char sucModemInactiveCount=0;
  544. unsigned short PocLostCtMax;
  545. IWDG_ReloadCounter();//喂狗
  546. if(g_ucEnterGTNow)return;//GT+TM 返回
  547. if(g_ucModemTaskEn==0||USBSeletCt>0)return;
  548. //如果曾经登陆过POC系统,然后离线,开始计数,直到再次登陆,如果一直不登陆超过一定时间,则重启模块和串口
  549. if(sutPocStatus.FirstLogined){
  550. if(sutPocStatus.Logined==0){
  551. PocLostCtMax=pocTimeOutTime*60;
  552. if(++sutPocStatus.PocLostCt>PocLostCtMax){
  553. sutPocStatus.PocLostCt=0;
  554. //长时间不登陆,重启模块及串口驱动部分
  555. SlwTrace(INF,"PocLostTimeout!Reset Modem!",1);
  556. ResetModem();
  557. }
  558. }else{
  559. sutPocStatus.PocLostCt=0;
  560. sucPocLostTimeoutCount=0;
  561. }
  562. }else{
  563. //一个小时未登录复位模块
  564. if(++sutPocStatus.PocLostCt>3600){
  565. sutPocStatus.PocLostCt=0;
  566. printf("Timeout Logintimeout----\r\n ");
  567. ResetModem();
  568. }
  569. }
  570. //如果模块已开机,长时间收不到串口消息,则重启模块及串口驱动部分
  571. if(sutPocStatus.ModemPowerOn==1){
  572. // if(sutPocStatus.ModemInactiveCt==0){//ModemInactiveCt必须在接收到Modem串口消息后才清零
  573. // //sucModemInactiveCount=0;
  574. // }
  575. if(++sutPocStatus.ModemInactiveCt>40){//等待时间
  576. sutPocStatus.ModemInactiveCt=1;
  577. //长时间收不到串口消息,重启模块及串口驱动
  578. SlwTrace(INF,"ModemRecvTimeout!Reset Modem!",1);
  579. ResetModem();
  580. }
  581. }
  582. //GPS守护
  583. if(sutGpsInfo.isGpsWork>0){
  584. if(++sutGpsInfo.GpsInactiveCt>10){
  585. sutGpsInfo.GpsInactiveCt=0;
  586. //复位GPS
  587. GPSRestart();
  588. Uart3Init();
  589. }
  590. }
  591. }
  592. void PowerCtrlInit(void)
  593. {
  594. GPIO_InitTypeDef GPIO_InitStructure;
  595. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  596. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  597. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  598. GPIO_InitStructure.GPIO_Pin = PWR_EN_PIN;
  599. GPIO_Init(PWR_EN_PORT, &GPIO_InitStructure);
  600. PWR_EN_LOW; //HIGH
  601. }
  602. unsigned char g_ucEnterGTNow=0;
  603. void EnterGTMode(void)
  604. {
  605. unsigned char time=12;
  606. g_ucModemTaskEn=0;
  607. g_ucEnterGTNow=1;
  608. SpeakerEnable();
  609. SetBeepByNoOS(1000,10);
  610. SetBeepByNoOS(500,10);
  611. SetBeepByNoOS(1000,10);
  612. Uart1RxEnable(1);
  613. LedProcess(1);
  614. SetLedStatus(RedBlueFastFlash);
  615. SlwTrace(INF,"[EnterTxMode]",1);
  616. }
  617. void cmdShutDown(char type)
  618. {
  619. short cntDown;
  620. LCDBackLight(1);
  621. LcdOnTimeCt=0;
  622. SlwTrace(INF, "Try to PwrOff",1);
  623. ModemSendAt("AT$QCPWRDN\r\n");
  624. switch(type)
  625. {
  626. case 0:ShowMessageBox("正在关机");break;
  627. case 1:ShowMessageBox("低压关机");break;
  628. default:return;
  629. }
  630. for(cntDown=6;cntDown>=0;cntDown--)
  631. {
  632. IWDG_ReloadCounter();
  633. uTimerHardDly(100);
  634. }
  635. }
  636. char GetUniStringByID(char *HardIDString)
  637. {//输出15个字节的字符串
  638. unsigned char id[12];
  639. unsigned char string[16];
  640. long long temp;
  641. short i;
  642. unsigned char seed;
  643. if(HardIDString == '\0') return 0;
  644. GetSTM32ID(id);
  645. printf("STM32 ID==");
  646. for(i=0;i<12;i++)printf("%02x",id[i]);
  647. printf("\r\n");
  648. for(i=5;i>=0;i--){
  649. temp <<=8;
  650. temp |= id[i];
  651. }
  652. temp &= 0xffffffffffff;
  653. printf("temp=%015llu\r\n",temp);
  654. snprintf(string,sizeof(string),"%015llu",temp);
  655. for(i=0;i<15;i++) HardIDString[i]=string[i];
  656. HardIDString[15]='\0';
  657. //snprintf(HardIDString,16,"%015llu",temp);
  658. return 1;
  659. }
  660. void PowerOffProtetion(void)
  661. {
  662. if(modemPwrOffNow==0) return;
  663. // PWR_EN_HIGH;
  664. // LCDBackLight(1);
  665. // GPS_PWREN_LOW;
  666. // cmdShutDown(0);
  667. // PWR_EN_LOW;
  668. // while(1);
  669. }
  670. //长按 EXIT和下箭头3秒,只进入一次
  671. void GTMode_Detected(void)
  672. {
  673. static char GT_Flag=0;
  674. if(GT_Flag == 2) return;
  675. if(g_ulKeyValue == KEY_EXIT_DOWN_GT)
  676. {
  677. if(GT_Flag == 0)
  678. {
  679. g_ucUKC=0;
  680. GT_Flag ++;
  681. }else
  682. {
  683. if(g_ucUKC>=3){
  684. EnterGTMode();
  685. GT_Flag++;
  686. }
  687. }
  688. }else
  689. {
  690. if(GT_Flag == 1)
  691. GT_Flag = 0;
  692. }
  693. }
  694. /*****************************************************************************************
  695. *函数名:GetCheckCodeByPsnMEID
  696. *功能:根据PSN号和MEID码,生成伪随机码
  697. *入口:PSN--PSN码,无符号长整形,必须是大于150000000的数值,有可能是9位数也可能是10位数
  698. pMEID--MEID字串,长度14位或15位,第16字节必须为0。
  699. *出口:pCheckCode:--长度为6的字符串,第7字节为结束符0x00,因此必须留够7字节的空间!
  700. 返回:1--成功 0--因参数非法而失败
  701. ******************************************************************************************/
  702. const unsigned char sucRandTable[256]={
  703. 0x68,0x59,0x63,0x64,0xc8,0xcc,0xaa,0xa7,0xa2,0xab,0xa5,0x6e,0x6a,0x56,0x8a,0x57,
  704. 0xf4,0xbb,0xfe,0xfa,0x26,0x21,0x2d,0x29,0x0d,0x09,0x3e,0x3a,0x37,0x32,0x0a,0x07,
  705. 0xf7,0xf2,0xfb,0xf5,0xff,0xf6,0x1c,0x18,0x13,0x14,0xf1,0xfd,0xf9,0x0c,0x9f,0x08,
  706. 0x9a,0x97,0x92,0x9b,0x95,0x9f,0x12,0x1b,0x15,0x2c,0x28,0x23,0xf9,0x2a,0x27,0x22,
  707. 0x24,0x2e,0x67,0x25,0x2f,0x98,0xfc,0x75,0xf8,0xf3,0x3c,0x38,0x33,0x34,0x03,0x04,
  708. 0x05,0x0f,0x06,0x01,0x7a,0x77,0x72,0x62,0x6b,0x83,0x84,0x8e,0xc4,0xcb,0x87,0x82,
  709. 0x35,0x3f,0x36,0x4f,0x3d,0x39,0x9c,0x98,0x93,0x94,0x42,0x4f,0x46,0x41,0x81,0x8d,
  710. 0x4d,0x49,0x71,0x7d,0x79,0x96,0x91,0x9d,0x99,0xc3,0xc4,0x1d,0xce,0xca,0x7f,0x76,
  711. 0x7c,0x78,0x73,0x74,0x7e,0x7b,0x75,0x1e,0x1a,0x17,0x1f,0x16,0x11,0x1d,0x47,0x19,
  712. 0x5d,0xc7,0xc2,0xcb,0xc5,0xcf,0xd1,0xdd,0xd9,0x4c,0x48,0xc6,0xc1,0xcd,0x61,0xc9,
  713. 0xd7,0x8c,0xfd,0x88,0xa1,0xad,0xa9,0xb1,0xbd,0xb9,0x8b,0x85,0x8f,0x4b,0x45,0x86,
  714. 0xdc,0xd8,0xd3,0xd4,0xde,0xd2,0xdb,0xd5,0xdf,0xd6,0x43,0x44,0x4e,0x4a,0xe7,0x47,
  715. 0xac,0xa8,0xa3,0xa4,0xae,0xba,0x0d,0xb7,0xb2,0xaf,0xa6,0xe4,0xee,0xea,0xe7,0xe2,
  716. 0xe1,0xed,0x0f,0xe9,0x66,0x61,0x6d,0x69,0xbb,0xb5,0xbf,0xb6,0xec,0xe8,0x0b,0xe3,
  717. 0x52,0x5c,0x65,0x6f,0x58,0x53,0x54,0x0c,0x5e,0x5b,0x55,0x5f,0x31,0x2f,0x9a,0x0b,
  718. 0x0b,0x5a,0x2b,0x9e,0x02,0x89,0x59,0x3b,0x0e,0x51,0x6c,0xeb,0xda,0xe6,0x31,0xf6
  719. };
  720. int GetCheckCodeByPsnMEID(char *pCheckCode,unsigned long PSN,char *pMEID)
  721. {
  722. char aucPSN[12];
  723. char aucMEID[16];
  724. unsigned char key[10];
  725. unsigned char temp1,temp2;
  726. int MeidLen,PsnLen;
  727. int i,j;
  728. //PSN合法性检测
  729. if(PSN<150100000)return 0;
  730. //MEID合法性检测
  731. MeidLen=strlen(pMEID);
  732. //if(MeidLen!=14 && MeidLen!=15)return 0; //MEID号长度必须为14或15
  733. if(MeidLen!=14 && MeidLen!=15){
  734. snprintf(aucPSN, sizeof(aucMEID),"%015lu",pMEID); //不够15位前面补零
  735. }
  736. //PSN转字符串,不够10位的前面补'0'
  737. snprintf(aucPSN, sizeof(aucPSN),"%010lu",PSN);
  738. PsnLen=strlen(aucPSN);
  739. //取MEID的最后10个字符
  740. j=0;
  741. for(i=(MeidLen-10);i<MeidLen;i++){
  742. aucMEID[j]=pMEID[i];
  743. j++;
  744. }
  745. //所有字节进行相互异或运算,使每个字节的变化对整体结果都敏感
  746. temp1=0;
  747. temp2=0;
  748. for(i=0;i<10;i++){
  749. temp1^=(unsigned char)aucPSN[i];
  750. temp2^=(unsigned char)aucMEID[i];
  751. }
  752. temp1^=temp2;
  753. temp2=sucRandTable[temp1];
  754. //循环查表异或运算,生成key
  755. for(i=0;i<10;i++){
  756. temp1=aucPSN[i]^temp2;
  757. key[i]=aucMEID[i]^temp1;
  758. temp2=sucRandTable[temp1];
  759. }
  760. //取最后6个key,分别除10取余后再转Ascii,作为结果,结果为6个数字串,如"123456"
  761. j=0;
  762. for(i=4;i<10;i++){
  763. pCheckCode[j]=key[i]%10;
  764. pCheckCode[j]+=0x30;
  765. j++;
  766. }
  767. pCheckCode[6]=0; //结束符,方便调试打印和语音播报。
  768. return 1;
  769. }