mainTask.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902
  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 m_GroupSwitch=0;//表示是否曾经按过左边上下群组切换按键
  7. unsigned char m_GroupSwitchCnt=0;//按过的话,5秒内没按OK键则退出切换
  8. unsigned char g_usOptionCnt;
  9. unsigned char m_VoiceSwitch=0;//激活音量显示
  10. unsigned char m_VoiceSwitchCnt=0;//计时
  11. unsigned char g_LcdWarnLightOver;
  12. unsigned char g_uslockflag;
  13. unsigned char g_uslockCnt;
  14. unsigned char Ui_LockFlag; //用于 被锁界面可操作PTT
  15. unsigned char Ui_UnlockFlag;
  16. void KeyPress(void){
  17. char buf[30];
  18. if(sutUIstatus.Status==UIS_STANDBY && g_uslockflag==1)
  19. {
  20. if(g_ulKeyValue==KEY_PPT_MIC||g_ulKeyValue==KEY_PPT||g_ulKeyValue==KEY_PANEL_P2){
  21. }else{
  22. return;
  23. }
  24. }
  25. switch(g_ulKeyValue){
  26. case KEY_PPT_MIC:
  27. case KEY_PPT:
  28. g_ucKeyMode=1;
  29. sutPocStatus.PPTpress=1;
  30. if(g_ucTMMode==0){
  31. SpeakerEnable();
  32. if(newPara.KeySound!=0)SetBeep(500,10);//10
  33. ModemSendAt("AT+POC=0B0000\r\n");
  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_MENU:
  46. SlwTrace(INF,"[KEY_PANEL_MENU Press]",1);
  47. if(m_GroupSwitch){//
  48. m_GroupSwitch=0;
  49. snprintf(buf, sizeof(buf),"AT+POC=090000%s\r\n",sutPocStatus.switchGroupID);
  50. ModemSendAt(buf);
  51. ShowButton(1,107,"菜单");
  52. SlwTrace(INF, buf,0);
  53. }
  54. break;
  55. case KEY_PANEL_EXIT:
  56. SlwTrace(INF,"[KEY_PANEL_EXIT Press]",1);
  57. break;
  58. case KEY_PANEL_UP:
  59. SlwTrace(INF,"[KEY_PANEL_UP Press]",1);
  60. break;
  61. case KEY_PANEL_DOWN:
  62. SlwTrace(INF,"[KEY_PANEL_DOWN Press]",1);
  63. break;
  64. case KEY_EXIT_DOWN_GT:
  65. SlwTrace(INF,"[KEY_EXIT_DOWN_GT Press]",1);
  66. break;
  67. case KEY_P1_P3_UPDATE:
  68. SlwTrace(INF, "[KEY_P1_P3_UPDATE Press]",1);
  69. break;
  70. case KEY_OK_DOWN_GPS:
  71. SlwTrace(INF, "[KEY_OK_DOWN_GPS Press]",1);
  72. break;
  73. //
  74. case KEY_PANEL_P1:
  75. SlwTrace(INF, "[KEY_P1 Press]",1);
  76. break;
  77. case KEY_PANEL_P2:
  78. SlwTrace(INF, "[KEY_P2 Press]",1);
  79. if(++g_uslockCnt==2){
  80. if(g_uslockflag){
  81. g_uslockflag=0;
  82. Ui_UnlockFlag=1;
  83. }else g_uslockflag=1;
  84. if(g_uslockflag==1){
  85. if(sutUIstatus.Status!=UIS_STANDBY)UISetNextStatus(UIS_STANDBY);
  86. GuiShowBmp(72,110,"lock.bmp");
  87. }else{
  88. GuiClearRect(72,110,72+17,110+17);
  89. }
  90. }
  91. break;
  92. case KEY_OPTION:
  93. g_usOptionCnt++;
  94. if(g_usOptionCnt ==3){
  95. // ipSosStartNow();
  96. //在待机界面按一下'S'键,网络允许情况下发SOS消息
  97. if(sutGpsInfo.isGpsAuthOk==1 && sutUIstatus.Status==UIS_STANDBY && g_ucModemTaskEn==1){
  98. buBiaoSosSendNow=1;
  99. }
  100. }
  101. SlwTrace(INF, "[KEY_OPTION Press]",1);
  102. break;
  103. }
  104. }
  105. void KeyFree(void){
  106. char buf[30];
  107. if(sutUIstatus.Status==UIS_STANDBY && g_uslockflag==1)
  108. {
  109. if(g_ulKeyValue==KEY_PPT_MIC||g_ulKeyValue==KEY_PPT||g_ulKeyValue==KEY_PANEL_P2){
  110. }else{
  111. Ui_LockFlag=1;
  112. return;
  113. }
  114. }
  115. switch(g_ulKeyValue){
  116. case KEY_PPT_MIC:
  117. case KEY_PPT:
  118. SlwTrace(INF,"[KEY_PPT/KEY_PPT_MIC Release]",1);
  119. g_ucKeyPPTPress=0;
  120. sutPocStatus.PPTpress=0;
  121. if(g_ucTMMode!=0) break;
  122. ModemSendAt("AT+POC=0C0000\r\n");
  123. g_ucKeyMode=0;
  124. break;
  125. case KEY_INFO:
  126. SlwTrace(INF,"[KEY_UP Release]",1);
  127. g_ucKeyMode=0;
  128. UI_Stack.FastUiChange=1;
  129. UISetNextStatus(UIS_MENU_GROUP_SEL);
  130. break;
  131. case KEY_FUNC:
  132. SlwTrace(INF,"[KEY_DOWN Release]",1);
  133. UI_Stack.FastUiChange=1;
  134. UISetNextStatus(UIS_MENU_USER_SEL);
  135. g_ucKeyMode=0;
  136. break;
  137. case KEY_PANEL_MENU:
  138. SlwTrace(INF,"[KEY_PANEL_MENU Release]",1);
  139. break;
  140. case KEY_PANEL_EXIT:
  141. SlwTrace(INF,"[KEY_PANEL_EXIT Release]",1);
  142. break;
  143. case KEY_PANEL_UP:
  144. SlwTrace(INF,"[KEY_PANEL_UP Release]",1);
  145. break;
  146. case KEY_PANEL_DOWN:
  147. SlwTrace(INF,"[KEY_PANEL_DOWN Release]",1);
  148. break;
  149. case KEY_EXIT_DOWN_GT:
  150. SlwTrace(INF,"[KEY_EXIT_DOWN_GT Release]",1);
  151. g_ulKeyValue=0;
  152. break;
  153. case KEY_P1_P3_UPDATE:
  154. SlwTrace(INF, "[KEY_P1_P3_UPDATE Release]",1);
  155. break;
  156. case KEY_OK_DOWN_GPS:
  157. SlwTrace(INF, "[KEY_OK_DOWN_GPS Release]",1);
  158. g_ulKeyValue=0;
  159. break;
  160. case KEY_OPTION:
  161. SlwTrace(INF, "[KEY_OPTION Release]",1);
  162. g_usOptionCnt=0;
  163. break;
  164. case KEY_PANEL_P1:
  165. SlwTrace(INF, "[KEY_P1 Release]",1);
  166. UI_Stack.FastUiChange=1;
  167. UISetNextStatus(UIS_MENU_INFO);
  168. break;
  169. case KEY_PANEL_P2:
  170. g_uslockCnt=0;
  171. SlwTrace(INF, "[KEY_P2 Release]",1);
  172. break;
  173. case KEY_PANEL_P3:
  174. SlwTrace(INF, "[KEY_P3 Release]",1);
  175. if(newPara.QuickUserID!=0&&sutPocStatus.LocalUser.ID!=newPara.QuickUserID)
  176. {
  177. snprintf(buf, sizeof(buf),"AT+POC=0A0000%08x\r\n",newPara.QuickUserID);
  178. ModemSendAt(buf);
  179. UISetNextStatus(UIS_STANDBY);
  180. }
  181. break;
  182. case KEY_PANEL_P4:
  183. SlwTrace(INF, "[KEY_P4 Release]",1);
  184. if(newPara.QuickGroupID!=0&&sutPocStatus.LocalGroup.ID!=newPara.QuickGroupID)
  185. {
  186. snprintf(buf, sizeof(buf),"AT+POC=090000%08x\r\n",newPara.QuickGroupID);
  187. ModemSendAt(buf);
  188. SlwTrace(INF, buf,1);
  189. UISetNextStatus(UIS_STANDBY);
  190. }
  191. break;
  192. }
  193. if(KEY_ALL_IDLE != g_ulKeyValue) g_ucKeyMode=0;
  194. }
  195. static int keyNum=0;
  196. char isKeyPress(void){
  197. if(keyNum) return keyNum--;
  198. else return 0;
  199. }
  200. void KeyHandler(void){
  201. static char repress=0;//按键重复音
  202. signed char KeyFlag=0;
  203. if(0!=(KeyFlag=GetKey())){
  204. //按键处理
  205. if(1==KeyFlag){ //按键按下 //
  206. LCDBackLight(1);
  207. LcdOnTimeCt=0;
  208. repress++;
  209. if(g_ulKeyValue!=KEY_PPT&&(newPara.KeySound==1)){
  210. if(repress<2){
  211. SetBeep(1000,10);
  212. SpeakerEnable();
  213. uTimerCreate(UTIMER_BEEP,15);//20
  214. }
  215. }
  216. if(!LastKeyLight&&g_ulKeyValue!=KEY_PPT_MIC&&g_ulKeyValue!=KEY_PPT)return;
  217. keyNum++;
  218. KeyPress();
  219. }else{ //按键释放
  220. repress=0;
  221. if(!LastKeyLight&&g_ulKeyValue!=KEY_PPT_MIC&&g_ulKeyValue!=KEY_PPT)return;
  222. KeyFree();
  223. }
  224. }
  225. }
  226. static void PcMsgHandle(char *msg){
  227. short CmdListNum=0,i,j;
  228. const char *pCmd;
  229. char *pMsg,flag;
  230. char buf[150];
  231. char strIP[40];
  232. char strAccount[20+20];
  233. char strPassword[20+20];
  234. int len;
  235. unsigned short Port;
  236. unsigned long PSN;
  237. char needsave=0;
  238. char needsaveExterPara=0;
  239. const char *CmdList[]={
  240. "TM", //Trace Modem
  241. "TG", //Trace GPS
  242. "SMP", //Set Modem Parameter
  243. "RMP", //Read Modem Parameter
  244. "SGP", //Set GPS Parameter
  245. "RGP",
  246. "SACC", //Set access point
  247. "RACC", //Read access point
  248. "APN", //SET APN
  249. "RAPN", //Read APN
  250. "RREC", //Read record info
  251. "VER", //Read Version
  252. "BAT", //Battery voltage
  253. "RDOMAIN",
  254. "SDOMAIN",
  255. "RPID",
  256. "SPID",
  257. ""
  258. };
  259. typedef enum{
  260. GT_TM,
  261. GT_TG,
  262. GT_SMP,
  263. GT_RMP,
  264. GT_SGP,
  265. GT_RGP,
  266. GT_SACC,
  267. GT_RACC,
  268. GT_APN,
  269. GT_RAPN,
  270. GT_RREC,
  271. GT_VER,
  272. GT_BAT,
  273. GT_RDOMAIN,
  274. GT_SDOMAIN,
  275. GT_RPID,
  276. GT_SPID,
  277. }GT_CMD_DEF;
  278. while(*CmdList[CmdListNum++]);//计算命令列表个数
  279. CmdListNum--;
  280. //查找与命令列表相同的命令位置
  281. for(i=0;i<CmdListNum;i++){
  282. pCmd=CmdList[i];
  283. pMsg=&msg[3];
  284. flag=0;
  285. j=0;
  286. while(*pCmd){
  287. if(*pCmd!=*pMsg){
  288. flag=1;
  289. break;
  290. }
  291. pCmd++;
  292. pMsg++;
  293. j++;
  294. }
  295. if(!flag){
  296. break;
  297. }
  298. }
  299. if(i==CmdListNum)return;
  300. switch(i){
  301. case GT_TM:SlwTrace(INF,"GT+TM:OK",1);
  302. SetLedStatus(RedBlueSlowFlash);
  303. ComSelect(COM_SEL_MODEM);
  304. g_ucTMMode=1;
  305. break;
  306. case GT_TG:SlwTrace(INF,"GT+TG:OK",1);
  307. SetLedStatus(RedBlueSlowFlash);
  308. GPSRestart();
  309. ComSelect(COM_SEL_GPS);
  310. break;
  311. case GT_SMP://"SMP" GT+SMP=IP=地址或域名;Port=端口号;PSN=终端序列号
  312. len=GetParaFromStr(msg,"IP",buf);
  313. if(len<1 || len>=40){
  314. SlwTrace(INF,"GT+SMP:FAIL[IP Invalid]",1);
  315. break;
  316. }
  317. strcpy(strIP,buf);
  318. len=GetParaFromStr(msg,"Port",buf);
  319. if(len==0)Port=0;
  320. else if(len>5){
  321. SlwTrace(INF,"GT+SMP:FAIL[Port Invalid]",1);
  322. break;
  323. }else{
  324. Port=atoi(buf);
  325. }
  326. len=GetParaFromStr(msg,"PSN",buf);
  327. if(len<1 || len>10){
  328. SlwTrace(INF,"GT+SMP:FAIL[PSN Invalid]",1);
  329. break;
  330. }else{
  331. PSN=atol(buf);
  332. }
  333. //PSN
  334. if(sutProductPara.PSN != PSN){
  335. sutProductPara.PSN=PSN;
  336. needsave=1;
  337. }
  338. if(newPara.serList.defaultuse != SER_US){
  339. newPara.serList.defaultuse=SER_US;
  340. needsaveExterPara=1;
  341. }
  342. if(0!= strcmp(newPara.serList.ur.pip, strIP)){//与资源文件的不一样,则需要更新
  343. strcpy(newPara.serList.ur.pip, strIP);
  344. needsaveExterPara=1;
  345. }
  346. snprintf(buf, sizeof(buf),"GT+SMP:IP=%s;Port=%u;PSN=%lu",newPara.serList.ur.pip,Port,sutProductPara.PSN);
  347. SlwTrace(INF,buf,1);
  348. break;
  349. case GT_RMP://"RMP" GT+RMP<CR><LF> PSN=终端序列号;MEID=模块MEID号;CNUM=电信号;UIMID=电信UIMID;
  350. snprintf(buf, sizeof(buf),"GT+RMP:PSN=%lu;MEID=%s;CNUM=0000000000;UIMID=0000000000;IP=%s;",sutProductPara.PSN,DEV_HARDID,getPIPAddr());
  351. SlwTrace(INF,buf,1);
  352. break;
  353. case GT_SGP://"SGP" GT+SGP=IP=地址或域名;Port=端口号;
  354. len=GetParaFromStr(msg,"IP",buf);
  355. if(len<1 || len>=40){
  356. SlwTrace(INF,"GT+SGP:FAIL[IP Invalid]",1);
  357. break;
  358. }else strcpy(strIP,buf);
  359. len=GetParaFromStr(msg,"Port",buf);
  360. if(len==0)Port=0;
  361. else if(len>5){
  362. SlwTrace(INF,"GT+SGP:FAIL[Port Invalid]",1);
  363. break;
  364. }else{
  365. Port=atoi(buf);
  366. }
  367. if(newPara.serList.defaultuse != SER_US){
  368. newPara.serList.defaultuse = SER_US;
  369. needsaveExterPara=1;
  370. }
  371. if(0!=strcmp(newPara.serList.ur.gip, strIP) || Port != newPara.gpsPort){
  372. strcpy(newPara.serList.ur.gip,strIP);
  373. newPara.gpsPort=Port;
  374. needsaveExterPara=1;
  375. }
  376. //echo
  377. snprintf(buf, sizeof(buf),"GT+SGP:IP=%s;Port=%u;",newPara.serList.ur.gip,newPara.gpsPort);
  378. SlwTrace(INF,buf,1);
  379. break;
  380. case GT_RGP://RGP
  381. snprintf(buf, sizeof(buf),"GT+RGP:IP=%s;PORT=%d;",newPara.serList.ur.gip,newPara.gpsPort);
  382. SlwTrace(INF,buf,1);
  383. break;
  384. case GT_SACC://SACC
  385. len=GetParaFromStr(msg,"Accessp",buf);
  386. if(len<0 || len > (APN_SEGMENT_MAX_LEN-1))
  387. {
  388. SlwTrace(INF,"GT+SACC:FAIL[Accessp Invalid]",1);
  389. return;
  390. }
  391. if(len ==0) newPara.apnList.APN_Name[0]=0;
  392. else strcpy(newPara.apnList.APN_Name,buf);
  393. snprintf(buf, sizeof(buf),"GT+SACC:Accessp=%s;",newPara.apnList.APN_Name); //**********
  394. SlwTrace(INF,buf,1);
  395. needsaveExterPara=1;
  396. break;
  397. case GT_RACC://RACC
  398. snprintf(buf, sizeof(buf),"GT+RACC:Accessp=%s;",newPara.apnList.APN_Name);
  399. SlwTrace(INF,buf,1);
  400. break;
  401. case GT_APN://APN
  402. /*
  403. 设置格式:GT+APN=Account=用户名;Password=密码;<CR><LF>
  404. 成功返回:GT+APN:Account=用户名;Password=密码;<CR><LF>
  405. 失败返回:GT+APN:FAIL[失败原因]<CR><LF>
  406. */
  407. len=GetParaFromStr(msg,"Account",buf);
  408. if(len<1 || len > 30){
  409. SlwTrace(INF,"GT+APN:FAIL[Account Invalid]",1);
  410. return;
  411. }
  412. strcpy(strAccount,buf);
  413. len=GetParaFromStr(msg,"Password",buf);
  414. if(len<1 || len > 30){
  415. SlwTrace(INF,"GT+APN:FAIL[Password Invalid]",1);
  416. return;
  417. }
  418. strcpy(strPassword,buf);
  419. snprintf(buf, sizeof(buf),"GT+APN:Account=%s;Password=%s;",strAccount,strPassword);//******
  420. SlwTrace(INF,buf,1);//*********
  421. if(newSysiniIndex<0) break;
  422. if(0==strcmp(strAccount, newPara.apnList.apnList[3].account) &&
  423. 0==strcmp(strPassword, newPara.apnList.apnList[3].pass))
  424. break;
  425. strcpy(newPara.apnList.apnList[3].account, strAccount);
  426. strcpy(newPara.apnList.apnList[3].pass, strPassword);
  427. newPara.apnList.defaultuse=3;
  428. needsaveExterPara=1;
  429. break;
  430. case GT_RAPN://RAPN
  431. sprintf(buf,"GT+RAPN:Account=%s;Password=%s;",newPara.apnList.apnList[3].account,newPara.apnList.apnList[3].pass); //***********
  432. SlwTrace(INF,buf,1);
  433. break;
  434. case GT_RREC://RREC
  435. sFlash_Read(buf, RECORD_INFO_ADDRESS, 100);
  436. SlwTrace(INF, buf, 1);
  437. break;
  438. case GT_VER://"VER"
  439. snprintf(buf, sizeof(buf),"GT+VER:%s_V%d",sutProductPara.ProductName,sutProductPara.ProductVersion);
  440. SlwTrace(INF,buf,1);
  441. break;
  442. case GT_BAT://BAT
  443. snprintf(buf, sizeof(buf),"GT+BAT: %d V",g_iVbat);
  444. SlwTrace(INF,buf,1);
  445. break;
  446. case GT_RDOMAIN:
  447. snprintf(buf,sizeof(buf),"GT+RDOMAIN:%s;PSN=%lu;",newPara.serList.ipFenFa,sutProductPara.PSN);
  448. SlwTrace(INF,buf,1);
  449. break;
  450. case GT_SDOMAIN:
  451. len=GetParaFromStr(msg,"SDOMAIN",buf);//buf=www.baidu.com ,return len
  452. if(len>40){
  453. SlwTrace(INF,"MAINIP LEN ERR",1);
  454. return;
  455. }
  456. if(newPara.serList.defaultuse != SER_IP){
  457. newPara.serList.defaultuse=SER_IP;
  458. needsaveExterPara=1;
  459. }
  460. memset(newPara.serList.ipFenFa,0,sizeof(newPara.serList.ipFenFa));
  461. strcpy(newPara.serList.ipFenFa,buf);
  462. len=GetParaFromStr(msg,"PSN",buf);
  463. if(len<1 || len>10){
  464. SlwTrace(INF,"GT+SMP:FAIL[PSN Invalid]",1);
  465. break;
  466. }else{
  467. PSN=atol(buf);
  468. }
  469. //PSN
  470. if(sutProductPara.PSN != PSN){
  471. sutProductPara.PSN=PSN;
  472. needsave=1;
  473. }
  474. snprintf(buf,sizeof(buf),"GT+SDOMAIN=%s;PSN=%lu;",newPara.serList.ipFenFa,sutProductPara.PSN);
  475. //Save para to flash
  476. needsaveExterPara=1;
  477. SlwTrace(INF,buf,1);
  478. break;
  479. case GT_RPID:
  480. snprintf(buf, sizeof(buf),"GT+RPID:PSN=%lu;",sutProductPara.PSN);
  481. SlwTrace(INF,buf,1);
  482. break;
  483. case GT_SPID:
  484. len=GetParaFromStr(msg,"PSN",buf);
  485. if(len<1 || len>10){
  486. SlwTrace(INF,"GT+SPID:FAIL[PSN Invalid]",1);
  487. break;
  488. }else{
  489. PSN=atol(buf);
  490. }
  491. //PSN
  492. if(sutProductPara.PSN != PSN){
  493. sutProductPara.PSN=PSN;
  494. needsave=1;
  495. }
  496. snprintf(buf, sizeof(buf),"GT+SPID:PSN=%lu;",sutProductPara.PSN);
  497. SlwTrace(INF,buf,1);
  498. break;
  499. default:
  500. break;
  501. }
  502. if(needsave!=0) SaveProductParaToFlash();
  503. if(needsaveExterPara!=0) ModifyConfigureFile(0);
  504. }
  505. void CommHandler(void){
  506. if(g_usUart1RecvLen){
  507. PcMsgHandle((char *)RxBuffer1);
  508. g_usUart1RecvLen=0;
  509. rx1_ct=0;
  510. }
  511. }
  512. void ResetModem(void)
  513. {
  514. Uart2Init();
  515. sutPocStatus.modemRstFlag=1;
  516. }
  517. /*************************************************************************************
  518. *FingerDaemonfinger
  519. *守护进程
  520. *用于防止通讯模块死机,或者与通讯模块通讯的串口异常而重新启动模块或通讯驱动。
  521. *用于防止GPS模块异常而重启GPS
  522. *此函数需要确保每秒调用一次
  523. 入口参数
  524. sutPocStatus.FirstLogined
  525. sutPocStatus.PocLostCt
  526. sutPocStatus.ModemPowerOn
  527. sutPocStatus.ModemInactiveCt
  528. g_iCSQ
  529. **************************************************************************************/
  530. void FingerDaemonfinger(void)
  531. {
  532. static unsigned char sucPocLostTimeoutCount=0;//
  533. static unsigned char sucModemInactiveCount=0;
  534. unsigned short PocLostCtMax;
  535. IWDG_ReloadCounter();//喂狗
  536. //return;
  537. if(g_ucModemTaskEn==0)return;
  538. //如果曾经登陆过POC系统,然后离线,开始计数,直到再次登陆,如果一直不登陆超过一定时间,则重启模块和串口
  539. if(sutPocStatus.FirstLogined){
  540. if(sutPocStatus.Logined==0){
  541. PocLostCtMax=pocTimeOutTime*60;
  542. if(++sutPocStatus.PocLostCt>PocLostCtMax){
  543. sutPocStatus.PocLostCt=0;
  544. //长时间不登陆,重启模块及串口驱动部分
  545. SlwTrace(INF,"PocLostTimeout!Reset Modem!",1);
  546. ResetModem();
  547. }
  548. }else{
  549. sutPocStatus.PocLostCt=0;
  550. sucPocLostTimeoutCount=0;
  551. }
  552. }else{
  553. //一个小时未登录复位模块
  554. if(++sutPocStatus.PocLostCt>3600){
  555. sutPocStatus.PocLostCt=0;
  556. printf("Timeout Logintimeout----\r\n ");
  557. ResetModem();
  558. }
  559. }
  560. //如果模块已开机,长时间收不到串口消息,则重启模块及串口驱动部分
  561. if(sutPocStatus.ModemPowerOn==1){
  562. if(sutPocStatus.ModemInactiveCt==0){//ModemInactiveCt必须在接收到Modem串口消息后才清零
  563. sucModemInactiveCount=0;
  564. }
  565. if(++sutPocStatus.ModemInactiveCt>40){//等待时间15秒 4G模块重启后至少要15秒才能启动
  566. sutPocStatus.ModemInactiveCt=1;
  567. //长时间收不到串口消息,重启模块及串口驱动
  568. SlwTrace(INF,"ModemRecvTimeout!Reset Modem!",1);
  569. ResetModem();
  570. }
  571. }
  572. //GPS守护
  573. if(sutGpsInfo.isGpsWork>0){
  574. if(++sutGpsInfo.GpsInactiveCt>20){ //10
  575. sutGpsInfo.GpsInactiveCt=0;
  576. SlwTrace(INF,"GPS Reload----\r\n!",1);
  577. //复位GPS
  578. GPSRestart();
  579. Uart3Init();
  580. }
  581. }
  582. }
  583. void PowerCtrlInit(void)
  584. {
  585. GPIO_InitTypeDef GPIO_InitStructure;
  586. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  587. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  588. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  589. GPIO_InitStructure.GPIO_Pin = PWR_EN_PIN;
  590. GPIO_Init(PWR_EN_PORT, &GPIO_InitStructure);
  591. PWR_EN_LOW; //HIGH
  592. }
  593. unsigned char g_ucEnterGTNow=0;
  594. void EnterGTMode(void)
  595. {
  596. unsigned char time=12;
  597. g_ucEnterGTNow=1;
  598. g_ucModemTaskEn=0;
  599. SpeakerEnable();
  600. SetBeep(1000,time);
  601. uTimerHardDly(time);
  602. SpeakerEnable();
  603. SetBeep(500,time);
  604. uTimerHardDly(time);
  605. SpeakerEnable();
  606. SetBeep(1000,time);
  607. uTimerHardDly(time);
  608. Uart1RxEnable(1);
  609. LedProcess(1);
  610. SetLedStatus(RedBlueFastFlash);
  611. SlwTrace(INF,"[EnterTxMode]",1);
  612. }
  613. void cmdShutDown(char type)
  614. {
  615. short cntDown;
  616. char ttype;
  617. ttype=type;
  618. SlwTrace(INF, "Try to PwrOff",1);
  619. ModemSendAt("AT$QCPWRDN\r\n");
  620. switch(ttype)
  621. {
  622. case 0:ShowMessageBox("正在关机");break;
  623. case 1:ShowMessageBox("低压关机");break;
  624. default:return;
  625. }
  626. for(cntDown=6;cntDown>=0;cntDown--)
  627. {
  628. IWDG_ReloadCounter();
  629. uTimerHardDly(100);
  630. }
  631. }
  632. char GetUniStringByID(char *HardIDString)
  633. {//输出15个字节的字符串
  634. unsigned char id[12];
  635. unsigned char string[16];
  636. long long temp;
  637. short i;
  638. unsigned char seed;
  639. if(HardIDString == '\0') return 0;
  640. GetSTM32ID(id);
  641. printf("STM32 ID==");
  642. for(i=0;i<12;i++)printf("%02x",id[i]);
  643. printf("\r\n");
  644. for(i=5;i>=0;i--){
  645. temp <<=8;
  646. temp |= id[i];
  647. }
  648. temp &= 0xffffffffffff;
  649. printf("temp=%015llu\r\n",temp);
  650. snprintf(string,sizeof(string),"%015llu",temp);
  651. for(i=0;i<15;i++) HardIDString[i]=string[i];
  652. HardIDString[15]='\0';
  653. //snprintf(HardIDString,16,"%015llu",temp);
  654. return 1;
  655. }
  656. void PowerOffProtetion(void)
  657. {
  658. if(modemPwrOffNow==0) return;
  659. PWR_EN_HIGH;
  660. LCDBackLight(1);
  661. GPS_PWREN_LOW;
  662. //cmdShutDown(0);
  663. GuiShowBmp(0,0,"BYEBYE.bmp");
  664. GPIO_ResetBits(SPK_BOOST_PROT,SPK_BOOST_PIN);//默认拉高
  665. SpeakerDisable();
  666. uTimerHardDly(150);
  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. }
  770. void SoSDetected(void)
  771. {
  772. static char tCnt=0;
  773. static unsigned int TickCnt=0;
  774. static unsigned char cnt15=0;
  775. if(sutPocStatus.SOS_Flag==1)
  776. {
  777. if(cnt15++>15)cnt15=0;
  778. else return;
  779. if(++tCnt <=2)
  780. {
  781. SpeakerEnable();
  782. SetBeep(800,10);
  783. }
  784. else {
  785. sutPocStatus.SOS_Flag=0;
  786. tCnt=0;
  787. TickCnt=0;
  788. }
  789. }
  790. }