mainTask.c 23 KB

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