MainTask.c 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837
  1. /********************************************************************************
  2. * File Name: MainTask.c
  3. * Function Describe:The main task for the system
  4. * Relate Module:
  5. * Explain: Hardware version is HS121
  6. * Writer: ShiLiangWen
  7. * Date: 2015.7.8
  8. *******************************************************************************/
  9. #define THIS_FILE_ID 8
  10. //---------------------------------------------------------------------------------
  11. #include "includes.h"
  12. #include "stm32f10x_it.h"
  13. //OS ID
  14. OS_TID idMainTask=0;
  15. U64 stkMainTask[MAIN_TASK_STK_SIZE];
  16. int g_iVbat=0;
  17. unsigned int g_LCDTemp = 0;
  18. unsigned char g_ucGtMode=0;
  19. //SUT_MSG_QUEUE ModemMsgQueue;
  20. //char ModemMsgBuffer[512];
  21. void FingerDaemonfinger(void);
  22. unsigned char g_ucUpdataVer=0;
  23. unsigned char g_ucKeyDownPressFlag=0;
  24. unsigned char g_ucGroupSelect=0;
  25. unsigned char g_ucUserSelect=0;
  26. unsigned char g_ucGroup_User_Select=0;
  27. unsigned char g_ucFun1KeyPressCt=0;//Fun1Key持续按下计数器,松开后清零
  28. unsigned char g_ucFun2KeyPressCt=0;//Fun2Key持续按下计数器,松开后清零
  29. int g_iFun1KeyEncodeCt=0; //Fun1Key按下时旋转Encode次数计数器,正数为顺时针,负数为逆时针,松开后清零
  30. int g_iFun2KeyEncodeCt=0; //Fun2Key按下时旋转Encode次数计数器,正数为顺时针,负数为逆时针,松开后清零
  31. unsigned int g_uikey_ok_stat =0; //
  32. unsigned int g_uikey_up_stat =0; //快捷键,用于进入GT模式 按下KEY_UP再按下OK
  33. unsigned char g_ucEnterGroupFlag=0;
  34. //======================================
  35. void ReportVbatCsqGps(void);
  36. void EncodeKeyProcess(void);
  37. void iap_jump_app_s(void);
  38. int GetCheckCodeByPsnMEID(char *pCheckCode,unsigned long PSN,char *pMEID);
  39. void ReportCheckCode(void);
  40. //-----
  41. #ifdef USE_RUNNING_MAKE
  42. void RunningMake(unsigned short FileID,unsigned long line)
  43. {
  44. g_usFileID=FileID;
  45. g_ulFileLine=line;
  46. }
  47. #endif
  48. unsigned short g_usFileID=0;
  49. unsigned long g_ulFileLine=0;
  50. // unsigned char m_GroupSelect=0;//用于使用左边上下键去选择群组时使用 wjl
  51. unsigned char m_GroupSwitch=0;//表示是否曾经按过左边上下群组切换按键
  52. unsigned char m_GroupSwitchCnt=0;//按过的话,5秒内没按OK键则退出切换
  53. /***********************************************
  54. 强制复位
  55. ************************************************/
  56. void SystemReset(void)
  57. {
  58. //IWDG_Configuration();
  59. while(1);
  60. }
  61. void PowerCtrlInit(void)
  62. {
  63. GPIO_InitTypeDef GPIO_InitStructure;
  64. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  65. // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Mode_Out_PP;
  66. // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  67. // GPIO_InitStructure.GPIO_Pin = PWR_EN_PIN;
  68. // GPIO_Init(PWR_EN_PORT, &GPIO_InitStructure);
  69. //PWR_EN_HIGH;
  70. //PWR_EN_LOW;
  71. SetPowerEn(0);
  72. //ONOFF_CK_PIN
  73. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
  74. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  75. GPIO_InitStructure.GPIO_Pin = ONOFF_CK_PIN;
  76. GPIO_Init(ONOFF_CK_PORT, &GPIO_InitStructure);
  77. }
  78. /*************************************************************************
  79. 拷贝数据,并判断与原数据是否相同
  80. 相同返回0
  81. 不同返回1
  82. **************************************************************************/
  83. unsigned char CopyData(unsigned char *pDst,unsigned char *pSrc,unsigned char len)
  84. {
  85. unsigned char i;
  86. unsigned char flag=0;
  87. for(i=0;i<len;i++){
  88. if(*pDst!=*pSrc){
  89. flag=1;
  90. *pDst=*pSrc;
  91. }
  92. pDst++;
  93. pSrc++;
  94. }
  95. return flag;
  96. }
  97. /********************************************************************
  98. *开关机键检测
  99. *********************************************************************/
  100. int OnOffCheck(void)
  101. {
  102. static unsigned char sucCt=0;
  103. unsigned long k;
  104. k=ONOFF_CK_PORT->IDR;
  105. if((k&ONOFF_CK_PIN)==ONOFF_CK_PIN){
  106. if(sucCt<5)sucCt++;
  107. else return 1;
  108. }else{
  109. sucCt=0;
  110. }
  111. return 0;
  112. }
  113. void GPIO_Config_ALL_AIN(void);
  114. /**********************************************************************
  115. *系统关机
  116. ***********************************************************************/
  117. void SysShutDown(void)
  118. {
  119. GPIO_InitTypeDef GPIO_InitStructure;
  120. unsigned long k;
  121. int len;
  122. GPS_PWREN_LOW;
  123. MODEM_LED1_HIGH;
  124. MODEM_LED2_HIGH;
  125. ModemSendAT("AT+ZPWROFF\r\n");
  126. SlwTrace(INF,"Set modem OnOff down!",1);
  127. ModemSendAT("AT+ZPWROFF\r\n");
  128. //os_dly_wait(50);
  129. SlwTrace(INF,"Set system power off!",1);
  130. //SlwTraceWaitCompleted();
  131. MODEM_LED1_LOW;
  132. MODEM_LED2_LOW;
  133. //-------
  134. k=ONOFF_CK_PORT->IDR;
  135. if((k&ONOFF_CK_PIN)==0){
  136. SlwTrace(INF,"Reset system!",1);
  137. //SlwTraceWaitCompleted();
  138. SystemReset();
  139. }else{
  140. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
  141. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  142. GPIO_InitStructure.GPIO_Pin = PWR_EN_PIN;
  143. GPIO_Init(PWR_EN_PORT, &GPIO_InitStructure);
  144. while(1);
  145. }
  146. }
  147. //从source查找长度为targetLen目标的target,找到后返回目标段后一字节的索引,没找到返回-1,source结束为sourceEndIndicator
  148. //witchOne: 找第几个目标
  149. short FindTargetIndex(char *source, char sourceEndIndicator, char *target, unsigned char targetLen,unsigned char witchOne)
  150. {
  151. unsigned short targetIndex;
  152. unsigned char targetNum;
  153. targetIndex=0;
  154. targetNum=0;
  155. while(*source != sourceEndIndicator)
  156. {
  157. if(0==memcmp(source, target, targetLen))
  158. {//找到了
  159. targetNum++;
  160. if(targetNum == witchOne)
  161. return (targetIndex+targetLen);
  162. }
  163. source++;
  164. targetIndex++;
  165. }
  166. return -1;
  167. }
  168. unsigned char AscToHex(unsigned char aHex)
  169. {
  170. if((aHex>=0)&&(aHex<=9))
  171. aHex += 0x30;
  172. else if((aHex>=10)&&(aHex<=15))//A-F
  173. //aHex += 0x37;
  174. aHex += 0x57;
  175. else aHex = 0xff;
  176. return aHex;
  177. }
  178. void AscStrToHexStr(char *AscStr, char *HexStr)
  179. {
  180. char *pAscStr=AscStr;
  181. unsigned char d,h,l;
  182. while(0!=(d=(unsigned char)*pAscStr++)){
  183. l=d&0x0f;
  184. h=d>>4;
  185. *HexStr++=AscToHex(h);
  186. *HexStr++=AscToHex(l);
  187. }
  188. *HexStr=0;
  189. }
  190. void PcMsgHandle(char *msg)
  191. {
  192. const char *CmdList[]={
  193. "TM", //Trace Modem
  194. "TG", //Trace GPS
  195. "DM", //Download Modem
  196. "FOTA", //Fota Modem
  197. "STP", //Set Test Parameter
  198. "SMP", //Set Modem Parameter
  199. "SGP", //Set GPS Parameter
  200. "RMP", //Read Modem Parameter
  201. "PST", //PST Mode for modem
  202. "VER", //Read Version
  203. "BAT", //Battery voltage
  204. "APN", //SET APN
  205. "RAPN", //Read APN
  206. "BEEP", //Beep test
  207. // "POC",
  208. // "TIME",
  209. // "SELECT",
  210. // "SREG", //部标注册
  211. // "STMOD",
  212. // "STID",
  213. // "RREG",
  214. // "RTMOD",
  215. // "RTID",
  216. // "SPlate",
  217. // "RPlate",
  218. // "SCOLOR",
  219. // "RCOLOR",
  220. // "SIM",
  221. "RGP",
  222. "RMIP", //Read Manager/Load IP
  223. "SMIP", //Set Manager/Load IP
  224. "RCIP", //Read ConfigIP
  225. "SCIP", //Set ConfigIP
  226. "SACC", //Set access point
  227. "RACC", //Read access point
  228. "RREC", //Read record info
  229. "CPYSCR:",
  230. "" //必须以空字串为结束
  231. };
  232. int h,m,s;
  233. unsigned short Port;
  234. unsigned short Select;
  235. unsigned long PSN;
  236. char buf[150];
  237. char buf1[300];
  238. char strIP[40];
  239. char strAccount[20+20];
  240. char strPassword[20+20];
  241. unsigned short PID;//省域ID 16byte
  242. unsigned short CID; //市域ID16byte
  243. char Mfactur[10]; //制造商
  244. char TMod[42]; //终端型号 不足补0x00
  245. char TID[28]; //终端ID 不足补0x00 本来7个字节 为了跟星安一致 取4个字节8
  246. unsigned char PColor; //车牌颜色 未上牌取值为0
  247. char Plate[16]; // 车牌8
  248. char SIM[12];
  249. int i,j,len;
  250. char flag;
  251. const char *pCmd;
  252. char *pMsg;
  253. int CmdListNum=0;
  254. RunMake(THIS_FILE_ID);
  255. while(*CmdList[CmdListNum++]);//计算命令列表个数
  256. CmdListNum--;
  257. RunMake(THIS_FILE_ID);
  258. //查找与命令列表相同的命令位置
  259. for(i=0;i<CmdListNum;i++){
  260. pCmd=CmdList[i];
  261. pMsg=&msg[3];
  262. flag=0;
  263. j=0;
  264. while(*pCmd){
  265. if(*pCmd!=*pMsg){
  266. flag=1;
  267. break;
  268. }
  269. pCmd++;
  270. pMsg++;
  271. j++;
  272. }
  273. if(!flag){
  274. break;
  275. }
  276. }
  277. RunMake(THIS_FILE_ID);
  278. if(i==CmdListNum)return;
  279. //处理命令
  280. switch(i)
  281. {
  282. case 0://"TM"
  283. //idNetTask
  284. SetLedStatus(RedBlueSlowFlash);
  285. // g_ucNetTaskDisable=0xff;
  286. SlwTrace(INF,"GT+TM:OK",1);
  287. //SlwTraceWaitCompleted();
  288. ComSelect(COM_SEL_MODEM);
  289. g_ucGtMode=1;
  290. // MODEM_LED1_HIGH;
  291. // MODEM_LED2_LOW;
  292. // while(1){
  293. // IWDG_ReloadCounter();//喂狗
  294. // if(OnOffCheck()){
  295. // PWR_EN_LOW;
  296. // }
  297. // //OSTimeDlyHMSM(0, 0, 0, 1);
  298. // }
  299. break;
  300. case 1://"TG"
  301. SetLedStatus(RedBlueSlowFlash);
  302. SlwTrace(INF,"GT+TG:OK",1);
  303. //SlwTraceWaitCompleted();
  304. GPSInit();
  305. ComSelect(COM_SEL_GPS);
  306. break;
  307. case 2://"DM"
  308. SetLedStatus(RedBlueSlowFlash);
  309. //g_ucNetTaskDisable=0xff;
  310. SlwTrace(INF,"GT+DM:OK",1);
  311. //SlwTraceWaitCompleted();
  312. //OSTimeDlyHMSM(0, 0, 1, 0);
  313. ComSelect(COM_SEL_MODEM);
  314. MODEM_LED1_LOW;
  315. MODEM_LED2_HIGH;
  316. GPS_PWREN_LOW;
  317. ModemSetDtrLow();
  318. ModemSetRingLow();
  319. MODEM_PWRKEY_HIGH;
  320. MODEM_RESET_HIGH;
  321. //OSTimeDlyHMSM(0, 0, 1, 0);
  322. MODEM_RESET_LOW;
  323. while(1){
  324. IWDG_ReloadCounter();//喂狗
  325. if(OnOffCheck()){
  326. PWR_EN_LOW;
  327. }
  328. }
  329. break;
  330. case 3://"FOTA"
  331. SetLedStatus(RedBlueSlowFlash);
  332. if(msg[8]=='M' && msg[9]=='C' && msg[10]=='U' ){//GT+FOTA=MCU
  333. //g_ucNetTaskDisable=0xff;
  334. SlwTrace(INF,"GT+FOTA:MCU",1);
  335. //SlwTraceWaitCompleted();
  336. sutProductPara.IapFlag=0x55;
  337. SaveProductParaToFlash("COM-FOTA");
  338. while(1);
  339. }else if(msg[8]=='M' && msg[9]=='O' && msg[10]=='D' && msg[11]=='E' && msg[12]=='M' ){//GT+FOTA=MODEM 对讲版本
  340. //g_ucNetTaskDisable=0xff;
  341. SlwTrace(INF,"GT+FOTA:MODEM",1);
  342. //SlwTraceWaitCompleted();
  343. //OSTimeDlyHMSM(0, 0, 0, 100);
  344. ModemSendAT("at+poc=10000018\r\n");
  345. while(1){
  346. IWDG_ReloadCounter();//喂狗
  347. if(OnOffCheck()){
  348. PWR_EN_LOW;
  349. }
  350. }
  351. }
  352. break;
  353. case 4://"STP" GT+STP=IP=地址或域名;Port=端口号; Account=账号;Password=密码;
  354. //g_ucNetTaskDisable=0xff;
  355. //OSTimeDlyHMSM(0, 0, 0, 100);
  356. len=GetParaFromStr(msg,"IP",buf);
  357. if(len<1 || len>=40){
  358. SlwTrace(INF,"GT+STP:FAIL[IP Invalid]",1);
  359. break;
  360. }else strcpy(strIP,buf);
  361. len=GetParaFromStr(msg,"Port",buf);
  362. if(len==0)Port=0;
  363. else if(len>5){
  364. SlwTrace(INF,"GT+STP:FAIL[Port Invalid]",1);
  365. break;
  366. }else{
  367. Port=atoi(buf);
  368. }
  369. len=GetParaFromStr(msg,"Account",buf);
  370. if(len<1 || len>=20){
  371. SlwTrace(INF,"GT+STP:FAIL[Account Invalid]",1);
  372. break;
  373. }else strcpy(strAccount,buf);
  374. len=GetParaFromStr(msg,"Password",buf);
  375. if(len<1 || len>=20){
  376. SlwTrace(INF,"GT+STP:FAIL[Password Invalid]",1);
  377. break;
  378. }else strcpy(strPassword,buf);
  379. //send to modem
  380. sprintf(buf,"id=%s;ip=%s;pwd=%s;",strAccount,strIP,strPassword);
  381. AscStrToHexStr(buf,buf1);
  382. ModemSendAT("AT+POC=120000");
  383. ModemSendAT(buf1);
  384. ModemSendAT("\r\n");
  385. //send to pc
  386. sprintf(buf,"GT+STP:IP=%s;Port=%u;Account=%s;Password=%s",strIP,Port,strAccount,strPassword);
  387. SlwTrace(INF,buf,1);
  388. break;
  389. case 5://"SMP" GT+SMP=IP=地址或域名;Port=端口号;PSN=终端序列号
  390. len=GetParaFromStr(msg,"IP",buf);
  391. if(len<1 || len>=40){
  392. SlwTrace(INF,"GT+SMP:FAIL[IP Invalid]",1);
  393. break;
  394. }
  395. strcpy(strIP,buf);
  396. len=GetParaFromStr(msg,"Port",buf);
  397. if(len==0)Port=0;
  398. else if(len>5){
  399. SlwTrace(INF,"GT+SMP:FAIL[Port Invalid]",1);
  400. break;
  401. }else{
  402. Port=atoi(buf);
  403. }
  404. len=GetParaFromStr(msg,"PSN",buf);
  405. if(len<1 || len>10){
  406. SlwTrace(INF,"GT+SMP:FAIL[PSN Invalid]",1);
  407. break;
  408. }else{
  409. PSN=atol(buf);
  410. }
  411. //PSN
  412. sutProductPara.PSN=PSN;
  413. strcpy(sutProductPara.PIP,strIP);
  414. sutProductPara.PocPort=Port;
  415. //send to modem
  416. if(strlen(sutProductPara.MEID)<14){
  417. SlwTrace(INF,"GT+SMP:FAIL[MEID Invalid]",1);
  418. break;
  419. }
  420. sprintf(buf,"id=%lu;ip=%s;pwd=%s;",sutProductPara.PSN,strIP,sutProductPara.MEID);
  421. AscStrToHexStr(buf,buf1);
  422. ModemSendAT("AT+POC=010000");
  423. ModemSendAT(buf1);
  424. ModemSendAT("\r\n");
  425. //save para
  426. SaveProductParaToFlash("COM-SMP");
  427. sprintf(buf,"GT+SMP:IP=%s;Port=%u;PSN=%lu",sutProductPara.PIP,sutProductPara.PocPort,sutProductPara.PSN);
  428. SlwTrace(INF,buf,1);
  429. break;
  430. case 6://"SGP" GT+SGP=IP=地址或域名;Port=端口号;
  431. len=GetParaFromStr(msg,"IP",buf);
  432. if(len<1 || len>=40){
  433. SlwTrace(INF,"GT+SGP:FAIL[IP Invalid]",1);
  434. break;
  435. }else strcpy(strIP,buf);
  436. len=GetParaFromStr(msg,"Port",buf);
  437. if(len==0)Port=0;
  438. else if(len>5){
  439. SlwTrace(INF,"GT+SGP:FAIL[Port Invalid]",1);
  440. break;
  441. }else{
  442. Port=atoi(buf);
  443. }
  444. strcpy(sutProductPara.GIP,strIP);
  445. sutProductPara.GpsPort=Port;
  446. //Save para to flash
  447. SaveProductParaToFlash("COM-SGP");
  448. //echo
  449. sprintf(buf,"GT+SGP:IP=%s;Port=%u;",sutProductPara.GIP,sutProductPara.GpsPort);
  450. SlwTrace(INF,buf,1);
  451. break;
  452. case 7://"RMP" GT+RMP<CR><LF> PSN=终端序列号;MEID=模块MEID号;CNUM=电信号;UIMID=电信UIMID;
  453. sprintf(buf,"GT+RMP:PSN=%lu;MEID=%s;CNUM=0000000000;UIMID=0000000000;IP=%s",sutProductPara.PSN,sutProductPara.MEID,sutProductPara.PIP);
  454. SlwTrace(INF,buf,1);
  455. break;
  456. case 8://"PST"
  457. SetLedStatus(RedBlueSlowFlash);
  458. //g_ucNetTaskDisable=0xff;
  459. SlwTrace(INF,"GT+PST:OK",1);
  460. //SlwTraceWaitCompleted();
  461. os_dly_wait(1);
  462. ComSelect(COM_SEL_MODEM);
  463. ModemSetDtrLow();
  464. MODEM_PWRKEY_LOW;
  465. MODEM_RESET_HIGH;
  466. os_dly_wait(5);
  467. MODEM_RESET_LOW;
  468. while(1){
  469. IWDG_ReloadCounter();//喂狗
  470. if(OnOffCheck()){
  471. PWR_EN_LOW;
  472. }
  473. }
  474. break;
  475. case 9://"VER"
  476. sprintf(buf,"GT+VER:%s_V%d",sutProductPara.ProductName,sutProductPara.ProductVersion);
  477. SlwTrace(INF,buf,1);
  478. break;
  479. case 10://BAT
  480. sprintf(buf,"GT+BAT: %d V",g_iVbat);
  481. SlwTrace(INF,buf,1);
  482. break;
  483. case 11://APN
  484. /*
  485. 设置格式:GT+APN=Account=用户名;Password=密码;<CR><LF>
  486. 成功返回:GT+APN:Account=用户名;Password=密码;<CR><LF>
  487. 失败返回:GT+APN:FAIL[失败原因]<CR><LF>
  488. */
  489. len=GetParaFromStr(msg,"Account",buf);
  490. if(len<1 || len > 30){
  491. SlwTrace(INF,"GT+APN:FAIL[Account Invalid]",1);
  492. return;
  493. }
  494. strcpy(strAccount,buf);
  495. len=GetParaFromStr(msg,"Password",buf);
  496. if(len<1 || len > 30){
  497. SlwTrace(INF,"GT+APN:FAIL[Password Invalid]",1);
  498. return;
  499. }
  500. strcpy(sutProductPara.APNName,strAccount);
  501. strcpy(sutProductPara.APNPass,buf);
  502. SaveProductParaToFlash("COM-APN");
  503. sprintf(buf1,"GT+APN:Account=%s;Password=%s;",sutProductPara.APNName,sutProductPara.APNPass);
  504. SlwTrace(INF,buf1,1);
  505. //写入Modem
  506. ModemSendAT("AT+ZPIDPWD=");
  507. ModemSendAT(sutProductPara.APNName);
  508. ModemSendAT(",");
  509. ModemSendAT(sutProductPara.APNPass);
  510. ModemSendAT("\r\n");
  511. break;
  512. case 12://RAPN
  513. sprintf(buf1,"GT+RAPN:Account=%s;Password=%s;",sutProductPara.APNName,sutProductPara.APNPass);
  514. SlwTrace(INF,buf1,1);
  515. break;
  516. case 13://BEEP
  517. len=GetParaFromStr(msg,"F",buf);
  518. if(len)i=atoi(buf);
  519. else i=878;
  520. len=GetParaFromStr(msg,"T",buf);
  521. if(len)Port=atoi(buf);
  522. else Port=8;//80
  523. SpeakerEnable();
  524. SetBeep(i,Port);
  525. sprintf(buf,"BEEP=%dHz,%dms",i,Port*10);
  526. SlwTrace(INF,buf,1);
  527. break;
  528. case 14://RGP
  529. sprintf(buf,"GT+RGP:IP=%s;PORT=%d;",sutProductPara.GIP,sutProductPara.GpsPort);
  530. SlwTrace(INF,buf,1);
  531. break;
  532. case 15://RMIP
  533. sprintf(buf,"GT+RMIP:IP=%d.%d.%d.%d;PORT=%d;",sutProductPara.ManagerIP[0],sutProductPara.ManagerIP[1],sutProductPara.ManagerIP[2],sutProductPara.ManagerIP[3],sutProductPara.ManagerPort);
  534. SlwTrace(INF,buf,1);
  535. break;
  536. case 16://SMIP
  537. len=GetParaFromStr(msg,"IP",buf);
  538. if(len<1 || len>=40){
  539. SlwTrace(INF,"GT+SMIP:FAIL[IP Invalid]",1);
  540. break;
  541. }else strcpy(strIP,buf);
  542. len=GetParaFromStr(msg,"Port",buf);
  543. if(len==0)Port=0;
  544. else if(len>5){
  545. SlwTrace(INF,"GT+SMIP:FAIL[Port Invalid]",1);
  546. break;
  547. }else Port=atoi(buf);
  548. GetStringIP2Bytes(sutProductPara.ManagerIP, strIP);
  549. sutProductPara.ManagerPort=Port;
  550. //Save para to flash
  551. SaveProductParaToFlash("COM-SMIP");
  552. //echo
  553. sprintf(buf,"GT+SMIP:IP=%d.%d.%d.%d;Port=%u;",sutProductPara.ManagerIP[0],
  554. sutProductPara.ManagerIP[1],
  555. sutProductPara.ManagerIP[2],
  556. sutProductPara.ManagerIP[3],
  557. sutProductPara.ManagerPort);
  558. SlwTrace(INF,buf,1);
  559. break;
  560. case 17://RCIP
  561. sprintf(buf,"GT+RCIP:IP=%d.%d.%d.%d;PORT=%d;",sutProductPara.ConfigSerIP[0],
  562. sutProductPara.ConfigSerIP[1],
  563. sutProductPara.ConfigSerIP[2],
  564. sutProductPara.ConfigSerIP[3],
  565. sutProductPara.ConfigSerPort);
  566. SlwTrace(INF,buf,1);
  567. break;
  568. case 18://SCIP
  569. len=GetParaFromStr(msg,"IP",buf);
  570. if(len<1 || len>=40){
  571. SlwTrace(INF,"GT+SCIP:FAIL[IP Invalid]",1);
  572. break;
  573. }else strcpy(strIP,buf);
  574. len=GetParaFromStr(msg,"Port",buf);
  575. if(len==0)Port=0;
  576. else if(len>5){
  577. SlwTrace(INF,"GT+SCIP:FAIL[Port Invalid]",1);
  578. break;
  579. }else Port=atoi(buf);
  580. GetStringIP2Bytes(sutProductPara.ConfigSerIP, strIP);
  581. sutProductPara.ConfigSerPort=Port;
  582. //Save para to flash
  583. SaveProductParaToFlash("COM-SCIP");
  584. //echo
  585. sprintf(buf,"GT+SCIP:IP=%d.%d.%d.%d;Port=%u;",sutProductPara.ConfigSerIP[0],
  586. sutProductPara.ConfigSerIP[1],
  587. sutProductPara.ConfigSerIP[2],
  588. sutProductPara.ConfigSerIP[3],
  589. sutProductPara.ConfigSerPort);
  590. SlwTrace(INF,buf,1);
  591. break;
  592. case 19://SACC
  593. len=GetParaFromStr(msg,"Accessp",buf);
  594. if(len<0 || len > APN_LEN)
  595. {
  596. SlwTrace(INF,"GT+SACC:FAIL[Accessp Invalid]",1);
  597. return;
  598. }
  599. if(len ==0) sutProductPara.APNApn[0]=0;
  600. else strcpy(sutProductPara.APNApn,buf);
  601. SaveProductParaToFlash("COM-SACC");
  602. sprintf(buf1,"GT+SACC:Accessp=%s;",sutProductPara.APNApn);
  603. SlwTrace(INF,buf1,1);
  604. break;
  605. case 20://RACC
  606. sprintf(buf,"GT+RACC:Accessp=%s;",sutProductPara.APNApn);
  607. SlwTrace(INF,buf,1);
  608. break;
  609. case 21://RREC
  610. sFlash_Read(buf1, RECORD_INFO_ADDRESS, 100);
  611. SlwTrace(INF, buf1, 1);
  612. break;
  613. case 22:
  614. CopyScreen();
  615. break;
  616. }
  617. RunMake(THIS_FILE_ID);
  618. }
  619. /*********************************************
  620. ************************************************/
  621. void TSMakeSendStrData(void){
  622. int i;
  623. static int Temp1[7];
  624. static int Table1[20]={0};
  625. //static int Table[20]={0};
  626. static int Temp[8];
  627. unsigned char SendBuf[100];
  628. unsigned short PacketLen,data1,data2,data3,data4;
  629. char buf1[300];
  630. // char str1[4];
  631. // int strData[4];
  632. // sprintf(str1,"%x",sutProductPara.proID);
  633. //发现Regist.proID 和egist.CityID输出的是他的BCD码
  634. //for (i=0;i<6;i+=2) {
  635. // Hexstr[i]='0'|(Bcdstr[i/2]>>4);
  636. // Hexstr[i+1]='0'|(Bcdstr[i/2]&0x0F);
  637. // }
  638. // BcdToHex(xx,xx);
  639. // Regist.proID =((sutProductPara.proID>>8)&0xff);
  640. // Regist.proID =(sutProductPara.proID&0xff);
  641. // Regist.proID=(sutProductPara.proID/16*10)+(sutProductPara.proID%16);//BCD转16进制
  642. Regist.proID=(sutProductPara.proID/10*16)+(sutProductPara.proID%10);//16进制转BCD
  643. // Regist.proID='0'|(sutProductPara.proID>>4);//
  644. // Regist.proID='0'|(sutProductPara.proID&0x0F);
  645. // sprintf(buf1,"proID=%d;\r\n",Regist.proID);
  646. // SlwTrace(INF,buf1);
  647. data1=sutProductPara.CityID/100;
  648. data3=(data1/10*16)+(data1%10);
  649. data2=sutProductPara.CityID%100;
  650. data4=(data2/10*16)+(data2%10);
  651. Regist.CityID = ((data4>>24)&0xffff);
  652. Regist.CityID = ((data4>>16)&0xffff);
  653. Regist.CityID = ((data3>>8)&0xffff);
  654. Regist.CityID = (data3&0xffff);
  655. for(i = 0; i < 5; i++){
  656. Regist.Manufacturers[i] = sutProductPara.Manufacturers[i];
  657. }
  658. for(i = 0; i < 20; i++){
  659. sscanf(sutProductPara.TerMod+2*i,"%2x",&Table1[i]);
  660. Regist.TerMod[i]= Table1[i];
  661. }
  662. // for(i=0;i<14;i+=2)
  663. // {
  664. // Regist.TerID[i/2]=(sutProductPara.TerID[i]<<4)|(sutProductPara.TerID[i+1]&0x0F);
  665. // }
  666. for(i = 0; i < 7; i++){
  667. sscanf(sutProductPara.TerID+2*i,"%2x",&Temp1[i]);
  668. Regist.TerID[i]= Temp1[i];
  669. }
  670. // sprintf(buf1,"TerID=%s;\r\n",sutProductPara.TerID);
  671. // SlwTrace(INF,buf1);
  672. Regist.PlateColor=sutProductPara.PlateColor;//
  673. for(i = 0; i < 8; i++){//16
  674. sscanf(sutProductPara.Plate+2*i,"%2x",&Temp[i]);
  675. Regist.Plate[i] = Temp[i];
  676. }
  677. PacketLen=TSGpsPacket(SendBuf,sutProductPara.PSN,TS_TERMINAL_REGISTRATION,(unsigned char *)&Regist,sizeof(REGISTRATION));
  678. MC8332ModemSendTcpData(0,SendBuf,PacketLen);
  679. }
  680. void SwitchGroupCtrl(void)
  681. {
  682. if(m_GroupSwitch)
  683. {
  684. if(++m_GroupSwitchCnt >=15)
  685. {
  686. MeSpeak(ENCODE_GBK, "CDCBB3F6", 0);
  687. m_GroupSwitch=0;
  688. }
  689. }
  690. }
  691. void SwitchGroupPre(void)
  692. {
  693. m_GroupSwitch=1;
  694. m_GroupSwitchCnt=0;
  695. }
  696. /***********************************************************************
  697. *按键按下事件
  698. ************************************************************************/
  699. void KeyPress(void)
  700. {
  701. char buf[30];
  702. static unsigned char sucReportFlag=0;
  703. if(g_ucGtMode==0){//在GT模式下不能与串口同时发送AT指令会冲突,导致重启
  704. UI_Key();
  705. }
  706. switch(g_ulKeyValue){
  707. //-------------------------------------------------------------------
  708. case KEY_PPT_MIC:
  709. case KEY_PPT://=====================KEY_PPT Press====================
  710. g_ucKeyMode=1;//单次模式
  711. SlwTrace(INF,"[KEY_PPT/KEY_PPT_MIC Press]",1);
  712. sutPocStatus.PPTpress=1;
  713. if((g_ucGtMode==0)&&(g_ucCallPhonePro==0))
  714. {
  715. ModemSendAT(POC_CMD_PPT_START);//
  716. SlwTrace(INF, "Speak",1);
  717. }
  718. break;
  719. //-------------------------------------------------------------------
  720. case KEY_INFO://=====================KEY_UP Press==================
  721. g_ucKeyMode=1;//单次模式
  722. SlwTrace(INF,"[KEY_UP Press]",1);
  723. if((g_ucGtMode==0)&&(g_ucCallPhonePro==0))
  724. {
  725. ModemSendAT(POC_CMD_UP);
  726. SwitchGroupPre();
  727. }
  728. break;
  729. case KEY_FUNC://=====================KEY_DOWN Press=================
  730. g_ucKeyMode=1;//单次模式
  731. SlwTrace(INF,"[KEY_DOWN Press]",1);
  732. if((g_ucGtMode==0)&&(g_ucCallPhonePro==0))
  733. {
  734. ModemSendAT(POC_CMD_DOWN);
  735. SwitchGroupPre();
  736. }
  737. break;
  738. case KEY_PANEL_OK://=====================KEY_PANEL_OK Press=================
  739. g_uikey_ok_stat = 1;
  740. SlwTrace(INF,"[KEY_PANEL_OK Press]",1);
  741. if(m_GroupSwitch)
  742. {//
  743. m_GroupSwitch=0;
  744. sprintf(buf,"AT+POC=090000%s\r\n",sutPocStatus.switchGroupID);
  745. ModemSendAT(buf);
  746. SlwTrace(INF, buf,0);
  747. }
  748. break;
  749. case KEY_PANEL_MENU://=====================KEY_PANEL_MENU Press=================
  750. SlwTrace(INF,"[KEY_PANEL_MENU Press]",1);
  751. break;
  752. case KEY_PANEL_EXIT://=====================KEY_PANEL_EXIT Press=================
  753. SlwTrace(INF,"[KEY_PANEL_EXIT Press]",1);
  754. break;
  755. case KEY_PANEL_UP://=====================KEY_PANEL_UP Press=================
  756. SlwTrace(INF,"[KEY_PANEL_UP Press]",1);
  757. break;
  758. case KEY_PANEL_DOWN://=====================KEY_PANEL_DOWN Press=================
  759. SlwTrace(INF,"[KEY_PANEL_DOWN Press]",1);
  760. break;
  761. case KEY_EXIT_DOWN_GT://=====================KEY_UP_OK_GT Press=================
  762. // EnterGTMode();
  763. SlwTrace(INF,"[KEY_EXIT_DOWN_GT Press]",1);
  764. break;
  765. case KEY_P1_P3_UPDATE:
  766. SlwTrace(INF, "[KEY_P1_P3_UPDATE Press]",1);
  767. break;
  768. case KEY_OK_DOWN_GPS:
  769. SlwTrace(INF, "[KEY_OK_DOWN_GPS Press]",1);
  770. break;
  771. case KEY_OPTION:
  772. sutConfig.g_usConfigCnt++;
  773. SlwTrace(INF, "[KEY_OPTION Press]",1);
  774. break;
  775. }
  776. }
  777. //长按 EXIT和下箭头3秒,只进入一次
  778. void GTMode_Detected(void)
  779. {
  780. static char GT_Flag=0;
  781. if(GT_Flag == 2) return;
  782. if(g_ulKeyValue == KEY_EXIT_DOWN_GT)
  783. {
  784. if(GT_Flag == 0)
  785. {
  786. g_ucUKC=0;
  787. GT_Flag ++;
  788. }else
  789. {
  790. if(g_ucUKC>3){
  791. EnterGTMode();
  792. GT_Flag++;
  793. }
  794. }
  795. }else
  796. {
  797. if(GT_Flag == 1)
  798. GT_Flag = 0;
  799. }
  800. }
  801. void UpdataAppVersion(void)
  802. {
  803. //正旋1格后松开,升级应用版本
  804. SpeakerEnable();
  805. ModemSendAT("AT+ZTTS=1,\"C6510759F466B065945E287548722C67F78B73513A678D51005F3A67\"\r"); //准备更新应用版本,请关机再开机
  806. SlwTrace(INF,"Update APP Version!",1);
  807. SetLedStatus(RedFastFlash);
  808. sutProductPara.IapFlag=0x55;
  809. SaveProductParaToFlash("MAIN-UP");
  810. while(1){
  811. IWDG_ReloadCounter();//喂狗
  812. os_dly_wait(1);
  813. if(OnOffCheck()){
  814. PWR_EN_LOW;
  815. }
  816. }
  817. }
  818. void UpdataPocVersion(void)
  819. {
  820. SpeakerEnable();
  821. ModemSendAT("AT+POC=10000018\r\n");
  822. SlwTrace(INF,"Update POC Version!",1);
  823. }
  824. void EnterGTMode(void)
  825. {
  826. g_ucModemTaskEn=0;
  827. SpeakerEnable();
  828. SetBeep(1176,10);
  829. os_dly_wait(20);
  830. SpeakerEnable();
  831. SetBeep(878,10);
  832. os_dly_wait(20);
  833. SpeakerEnable();
  834. SetBeep(1176,10);
  835. g_ucUART1RxMode=1;
  836. Uart1RxEnable(1);
  837. LedProcess(1);
  838. SetLedStatus(RedBlueFastFlash);
  839. SlwTrace(INF,"[EnterTxMode]",1);
  840. }
  841. /***********************************************************************
  842. *按键释放事件
  843. ************************************************************************/
  844. void KeyFree(void)
  845. {
  846. int i;
  847. char CheckCode[10];
  848. char buf[30];
  849. int flag;
  850. SUT_MODEM_AT_MSG *pMsg;
  851. //-------------------------------------------------------------------
  852. if(KEY_PPT==g_ulKeyValue || KEY_PPT_MIC == g_ulKeyValue)
  853. {//===============KEY_PPT Free=============
  854. SlwTrace(INF,"[KEY_PPT/KEY_PPT_MIC Free]",1);
  855. g_ucKeyPPTPress=0;
  856. sutPocStatus.PPTpress=0;
  857. if((g_ucGtMode==0)&&((g_ucCallPhonePro==0)))
  858. {
  859. ModemSendAT(POC_CMD_PPT_STOP);//结束讲话 放开PPT键
  860. // if(m_GroupSelect==0)
  861. // else m_GroupSelect=0;
  862. g_ucKeyMode=0;
  863. }
  864. }else if(KEY_INFO==g_ulKeyValue)
  865. {//=========KEY_UP Free==============
  866. SlwTrace(INF,"[KEY_UP Free]",1);
  867. g_ucKeyMode=0;
  868. g_uikey_up_stat=1;
  869. }else if(KEY_FUNC==g_ulKeyValue)
  870. {//=========KEY_DOWN Free============
  871. g_ucKeyMode=0;
  872. SlwTrace(INF,"[KEY_DOWN Free]",1);
  873. }
  874. else if(KEY_PANEL_OK==g_ulKeyValue)
  875. {//=========KEY_PANEL_OK Free==============
  876. SlwTrace(INF,"[KEY_PANEL_OK Free]",1);
  877. return;
  878. }
  879. else if(KEY_PANEL_MENU==g_ulKeyValue)
  880. {//=========KEY_PANEL_MENU Free==============
  881. SlwTrace(INF,"[KEY_PANEL_MENU Free]",1);
  882. return;
  883. }
  884. else if(KEY_PANEL_EXIT==g_ulKeyValue)
  885. {//=========KEY_PANEL_EXIT Free==============
  886. g_uikey_up_stat=0;
  887. SlwTrace(INF,"[KEY_PANEL_EXIT Free]",1);
  888. return;
  889. }
  890. else if(KEY_PANEL_UP==g_ulKeyValue)
  891. {//=========KEY_PANEL_UP Free============
  892. }
  893. else if(KEY_PANEL_DOWN==g_ulKeyValue)
  894. {//=========KEY_PANEL_DOWN Free============
  895. }
  896. else if(KEY_EXIT_DOWN_GT==g_ulKeyValue)
  897. {//=====================KEY_EXIT_DOWN_GT Press=================
  898. SlwTrace(INF,"[KEY_EXIT_DOWN_GT Free]",1);
  899. }else if(KEY_OPTION == g_ulKeyValue)
  900. {
  901. sutConfig.g_usConfigCnt=0;
  902. SlwTrace(INF,"[KEY_OPTION Free]",1);
  903. }
  904. }
  905. #if(USE_CONFIG_FUN==1)
  906. void ConfigModeDetect(void)
  907. {//检测进入配置服务器功能
  908. //GT模式下
  909. //长按OPTION键
  910. char buf[20];
  911. unsigned char timeout=150;
  912. if(0 != g_ucModemTaskEn) return;
  913. if(sutConfig.g_ubConfigFlag==0)
  914. {
  915. if(sutConfig.g_usConfigCnt ==5)
  916. {
  917. sutConfig.g_ubConfigFlag=1;
  918. sutConfig.g_usConfigCnt=0;
  919. sprintf(buf, "AT+TCPCLOSE=%d\r\n", GPS_DATA_SOCKET);
  920. ModemSendAT(buf);
  921. SlwTrace(INF, "ConfigModeActive",1);
  922. GuiShowBmp(30,34,"logo.bmp");
  923. GuiClearRect(0,55, LCD_WIDTH-1, 100);
  924. GuiShowStr(8, 65, "正在访问配置服务器",1);
  925. sutConfig.g_ucTcpRetryNum=CONFIG_TCP_RETRY_CNT;
  926. sutConfig.g_ucConfigStatus=0x01;//上报列表
  927. sutConfig.g_ubConfigFinished=0;//
  928. tcpControl=2;
  929. }
  930. }
  931. }
  932. #endif
  933. /*******************************************************************
  934. *MainTask
  935. *主任务
  936. ********************************************************************/
  937. __task void MainTask(void)
  938. {
  939. int BeepFlag=0;
  940. int KeyFlag,GTKeystat=0;
  941. int RealTime;
  942. int FileIndex,SMSIndex;
  943. char *msg;
  944. INT8U err;
  945. unsigned char ucCheckVbatCt=0;
  946. static unsigned char sucCt=0;
  947. static unsigned char sucFunReportFlag=0;
  948. unsigned short g_usModemProtectEn;
  949. int Vbat;
  950. char buf[30];
  951. char Buf[20];
  952. RunMake(THIS_FILE_ID);
  953. //Obtain own system task identification number. */
  954. idMainTask = os_tsk_self();
  955. memset((unsigned char *)&sutPocStatus,0,sizeof(SUT_POC_STATUS));
  956. //开机提示音
  957. SpeakerEnable();
  958. os_dly_wait(10);
  959. SetBeepByNoOS(888,100);
  960. SpeakerDisable();
  961. //Read Product param from flash
  962. ReadProductParaFromFlash();
  963. APNFileInit();
  964. printf("\r\n%s_V%d Start...\r\n",sutProductPara.ProductName,sutProductPara.ProductVersion);
  965. printf("PSN:%lu\r\n",sutProductPara.PSN);
  966. g_ucUpdataVer=0;
  967. SlwTrace(INF,"Main Task Start!",1);
  968. //LCD设置参数初始化
  969. FileIndex=GetFileIndex("LcdParam.ini");
  970. ReadFileData(FileIndex,0,sizeof(SUT_LCD_PARAM),(unsigned char *)&sutLcdParam);
  971. if(sutLcdParam.OnTimeIndex > 4){
  972. sutLcdParam.OnTimeIndex = 0;
  973. sutLcdParam.OnTime=10;
  974. ModifyFileData(FileIndex,0,sizeof(SUT_LCD_PARAM),(unsigned char *)&sutLcdParam);
  975. //到此,说明是重新烧代码了,则初始化GPS为默认值
  976. sutProductPara.m_GPS_TimeIndex = DEFAULT_GPS_SEND_TIME_INDEX;
  977. GpsTimeUpdate();
  978. SaveProductParaToFlash("MAIN-PARA");
  979. }
  980. sutLcdParam.OnTimeCt = 0;
  981. //电话本
  982. SetPhoneNumFile("HGS.Tell");
  983. //短信
  984. SetMessageConfi();
  985. //SetCodePara();
  986. LedInit();
  987. SlwTrace(INF,"Led Init...",1);
  988. g_iFun2KeyEncodeCt=0;
  989. //create PocTask
  990. idModemUartTask=os_tsk_create_user(ModemUartTask,3,&stkModemUartTask,sizeof(stkModemUartTask));
  991. idModemTask=os_tsk_create_user(ModemTask,3,&stkModemTask,sizeof(stkModemTask));
  992. idTTSTask=os_tsk_create_user(TTSTask, 3, &stkTTSTask,sizeof(stkTTSTask));
  993. RunMake(THIS_FILE_ID);
  994. UI_Init();
  995. while(1)
  996. {
  997. UI_Loop();
  998. os_dly_wait(1);
  999. IncomingSMS();
  1000. //处理PC发送过来的消息
  1001. RunMake(THIS_FILE_ID);
  1002. if(g_usUart1RecvLen){
  1003. PcMsgHandle((char *)RxBuffer1);
  1004. g_usUart1RecvLen=0;
  1005. DMA1_Channel5->CNDTR = UART1_RX_BUFFER_SIZE;//重设DMA传输数据长度
  1006. DMA_Cmd(DMA1_Channel5,ENABLE);//打开DMA
  1007. }
  1008. RunMake(THIS_FILE_ID);
  1009. //键盘处理
  1010. if(0!=(KeyFlag=GetKey())){
  1011. //按键处理
  1012. if(1==KeyFlag){ //按键按下
  1013. KeyPress();
  1014. LCDTimeOut(0);
  1015. sutLcdParam.OnTimeCt=0;
  1016. }else{ //按键释放
  1017. KeyFree();
  1018. }
  1019. }
  1020. RunMake(THIS_FILE_ID);
  1021. //LED处理
  1022. LedProcess(0);
  1023. ConfigModeDetect();
  1024. GTMode_Detected();
  1025. //---以下控制每秒执行一次---
  1026. if(++sucCt>99)sucCt=0;
  1027. else continue;
  1028. RunMake(THIS_FILE_ID);
  1029. KeyCount();//键盘按下、释放计数控制
  1030. RunMake(THIS_FILE_ID);
  1031. //信号
  1032. //测量电池电压
  1033. Vbat=GetVbat();
  1034. if(Vbat>0)g_iVbat=Vbat;
  1035. //判断电池电压是否过低关机
  1036. if(ucCheckVbatCt<3)ucCheckVbatCt++;
  1037. else CheckVbat(g_iVbat);
  1038. //MODEM防护
  1039. FingerDaemonfinger(); //3.21关闭
  1040. SwitchGroupCtrl();
  1041. if(sutLcdParam.OnTime>0){
  1042. if(++sutLcdParam.OnTimeCt>=sutLcdParam.OnTime){
  1043. sutLcdParam.OnTimeCt=0;
  1044. LCDTimeOut(1);
  1045. }
  1046. }
  1047. }
  1048. }
  1049. void ADCInit(void)
  1050. {
  1051. ADC_InitTypeDef ADC_InitStructure;
  1052. GPIO_InitTypeDef GPIO_InitStructure;
  1053. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
  1054. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  1055. GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0;
  1056. GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;//先内部上拉模式给IO充能
  1057. GPIO_Init(GPIOA,&GPIO_InitStructure);
  1058. DelayMs(100);
  1059. GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AIN;
  1060. GPIO_Init(GPIOA,&GPIO_InitStructure); //默认速度为两兆
  1061. DelayMs(200);//让电平恢复正常
  1062. //配置ADC的运行:
  1063. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式
  1064. ADC_InitStructure.ADC_ScanConvMode =DISABLE; //连续多通道模式
  1065. ADC_InitStructure.ADC_ContinuousConvMode =DISABLE;//ENABLE; //连续转换
  1066. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换不受外界决定
  1067. ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right; //右对齐
  1068. ADC_InitStructure.ADC_NbrOfChannel =1; //扫描通道数
  1069. ADC_Init(ADC1,&ADC_InitStructure);
  1070. ADC_RegularChannelConfig(ADC1,ADC_Channel_0, 1,ADC_SampleTime_1Cycles5); //通道X,采样时间为1.5周期,1代表规则通道第1个这个1是啥意思我不太清楚只有是1的时候我的ADC才正常。
  1071. ADC_Cmd (ADC1,ENABLE); //使能或者失能指定的ADC
  1072. ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能或者失能指定的ADC的软件转换启动功能
  1073. }
  1074. void GPIO_Config_ALL_AIN(void)
  1075. {
  1076. GPIO_InitTypeDef GPIO_InitStructure;
  1077. /* Enable GPIOD and GPIOE clock */
  1078. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB
  1079. | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD
  1080. | RCC_APB2Periph_AFIO, ENABLE);
  1081. /* Disable the Serial Wire Jtag Debug Port SWJ-DP */
  1082. GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
  1083. /* PA */
  1084. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  1085. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  1086. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  1087. GPIO_Init(GPIOA, &GPIO_InitStructure);
  1088. /* PB */
  1089. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  1090. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  1091. GPIO_Init(GPIOB, &GPIO_InitStructure);
  1092. /* PC */
  1093. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  1094. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  1095. GPIO_Init(GPIOC, &GPIO_InitStructure);
  1096. /* PD */
  1097. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  1098. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  1099. GPIO_Init(GPIOD, &GPIO_InitStructure);
  1100. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA
  1101. | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD
  1102. , DISABLE);
  1103. }
  1104. /***********************************************************************
  1105. *获取电池电压
  1106. 返回值: -1为无效 ; 正数表示电池电压放大100倍,如 382表示3.82V
  1107. ***********************************************************************/
  1108. int GetVbat(void)
  1109. {
  1110. char buf[30];
  1111. static int Ct=0;
  1112. static int siVbat[10]={0,0,0,0,0,0,0,0,0,0};
  1113. int iVbat[10];
  1114. int max[5];
  1115. int sum;
  1116. int i,j,k;
  1117. int adc;
  1118. int Vbat;
  1119. #if 1
  1120. ADC_SoftwareStartConvCmd(ADC1,ENABLE);
  1121. while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
  1122. adc=ADC_GetConversionValue(ADC1);
  1123. if(adc<100 && adc>4095)
  1124. {
  1125. printf("VDAC OVER");
  1126. return -1;
  1127. }
  1128. #else
  1129. //采集ADC
  1130. if(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)!=RESET){//检查制定ADC标志位置1与否 ADC_FLAG_EOC 转换结束标志位 if(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)!=RESET){
  1131. ADC_SoftwareStartConvCmd(ADC1,ENABLE);
  1132. adc=ADC_GetConversionValue(ADC1);
  1133. if(adc<100 && adc>4095)
  1134. {
  1135. //printf("ERR1");
  1136. return -1;
  1137. }
  1138. }else
  1139. {
  1140. printf("ERR2");
  1141. return -1;
  1142. }
  1143. #endif
  1144. //循环存储
  1145. siVbat[Ct]=adc;
  1146. if(++Ct>9)Ct=0;
  1147. //printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\r\n",siVbat[0],siVbat[1],siVbat[2],siVbat[3],siVbat[4],siVbat[5],siVbat[6],siVbat[7],siVbat[8],siVbat[9]);
  1148. //滤波处理,排列取3个最大值,3个最大中去掉第一大,其余求平均
  1149. //拷贝
  1150. for(i=0;i<10;i++){
  1151. iVbat[i]=siVbat[i];
  1152. }
  1153. for(i=0;i<4;i++){
  1154. max[i]=0;
  1155. for(j=0;j<10;j++){
  1156. if(iVbat[j]>max[i]){
  1157. max[i]=iVbat[j];
  1158. k=j;
  1159. }
  1160. }
  1161. iVbat[k]=0;
  1162. }
  1163. // printf("%d,%d,%d\r\n",max[0],max[1],max[2]);
  1164. sum=max[1]+max[2];
  1165. if(max[2]<200)
  1166. {
  1167. //printf("ERR3");
  1168. return -1;
  1169. }
  1170. Vbat=sum*308/4096;
  1171. return Vbat;
  1172. }
  1173. void Sys_Standby(void)
  1174. {
  1175. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外设时钟
  1176. PWR_WakeUpPinCmd(ENABLE); //使能唤醒管脚功能,PA0
  1177. PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
  1178. }
  1179. /*******************************************************
  1180. *CheckVbat
  1181. *检查电池电压,控制低压报警,
  1182. *低压关机已由硬件监测
  1183. ******************************************************/
  1184. void CheckVbat(int Vbat)
  1185. {
  1186. static unsigned char sucCt=0;//提示“请充电”计数器
  1187. if(Vbat<300){//330
  1188. SlwTrace(INF,"Vbat low!shutdown now!",1);
  1189. os_dly_wait(1);
  1190. //关闭模块
  1191. if(sutPocStatus.ModemPowerOn==1){
  1192. SpeakerEnable();
  1193. ModemSendAT("AT+ZTTS=1,\"4E4F8B5373513A67\"\r");//低压关机
  1194. os_dly_wait(250);
  1195. SlwTrace(INF,"ModemPoweroff!",1);
  1196. ModemPoweroff();
  1197. }
  1198. sutPocStatus.ModemPowerOn=0;
  1199. PWR_EN_LOW;
  1200. ADC_Cmd (ADC1,DISABLE);//使能或者失能指定的ADC
  1201. GPIO_Config_ALL_AIN();
  1202. Sys_Standby();
  1203. while(1);
  1204. }else if(Vbat<315){//提示请充电 340
  1205. if(++sucCt>30){
  1206. sucCt=0;
  1207. SpeakerEnable();
  1208. ModemSendAT("AT+ZTTS=1,\"F78B45513575\"\r");//请充电
  1209. }
  1210. }else sucCt=0;
  1211. }
  1212. void GetXinHao(int CSQ,char *XinHao)
  1213. {
  1214. if(CSQ>31 || CSQ<1){
  1215. strcpy(XinHao,"2C00E065517FDC7EE14FF753");//无网络信号
  1216. }else if(CSQ>25){
  1217. //信号较强 "E14FF753838F3A5F"
  1218. strcpy(XinHao,"E14FF753838F3A5F");
  1219. }else if(CSQ>17){
  1220. //信号适中 "E14FF75302902D4E"
  1221. strcpy(XinHao,"E14FF75302902D4E");
  1222. }else if(CSQ>10){
  1223. //信号偏低 "E14FF7534F504E4F"
  1224. strcpy(XinHao,"E14FF7534F504E4F");
  1225. }else{
  1226. //信号很弱 "E14FF753885F315F"
  1227. strcpy(XinHao,"E14FF753885F315F");
  1228. }
  1229. }
  1230. void GetVbatPercent(int Vbat,char *Percent)
  1231. {
  1232. //10 20 30 40 50 60 70 80 90 100
  1233. const char *ccPercent[]={
  1234. "31003000",
  1235. "32003000",
  1236. "33003000",
  1237. "34003000",
  1238. "35003000",
  1239. "36003000",
  1240. "37003000",
  1241. "38003000",
  1242. "39003000",
  1243. "310030003000"};
  1244. //播报电量百分比 10,20,30, 40, 50, 60, 70, 80, 90,100
  1245. const int siVbat[] ={335,343,350,360,370,377,384,392,400,500};
  1246. int i;
  1247. for(i=0;i<10;i++){
  1248. if(Vbat<siVbat[i])break;
  1249. }
  1250. if(i>9)i=9;
  1251. strcpy(Percent,ccPercent[i]);
  1252. }
  1253. /****************************************************************
  1254. *语音播报 电量、信号、GPS
  1255. *****************************************************************/
  1256. void ReportVbatCsqGps(void)
  1257. {
  1258. unsigned char GpsFlag;
  1259. //电量百分之N,信号强,GPS已登陆已定位
  1260. char buf[30];
  1261. SpeakerEnable();
  1262. ModemSendAT("AT+ZTTS=1,");
  1263. ModemSendAT("\"3575CF917E7606524B4E");//电量百分之
  1264. GetVbatPercent(g_iVbat,buf);
  1265. ModemSendAT(buf); //10~100
  1266. GetXinHao(g_iCSQ,buf); // 信号
  1267. ModemSendAT(buf);
  1268. if(!sutGpsInfo.isGpsWork){
  1269. ModemSendAT("E065470050005300");//,无GPS
  1270. GpsFlag=0x00;
  1271. ModemSendAT("\"\r\n");
  1272. }else{
  1273. if(sutGpsInfo.isServerLogin){
  1274. ModemSendAT("470050005300F25D7B764696"); //,GPS已登陆
  1275. GpsFlag=0x20;
  1276. }else{
  1277. ModemSendAT("4700500053002A677B764696"); //,GPS未登陆
  1278. GpsFlag=0x10;
  1279. }
  1280. if(sutGpsInfo.isGpsValid){
  1281. ModemSendAT("F25D9A5B4D4F"); //已定位
  1282. GpsFlag |= 0x01;
  1283. }else{
  1284. ModemSendAT("2A679A5B4D4F"); //未定位
  1285. }
  1286. ModemSendAT("\"\r\n");
  1287. }
  1288. snprintf(buf,30,"Vbat=%d,CSQ=%d,GPS=%02x",g_iVbat,g_iCSQ,GpsFlag);
  1289. SlwTrace(INF,buf,1);
  1290. }
  1291. /***************************************************************************
  1292. 将数字转Unicode编码
  1293. pUnicode空间最长 5*4+1=21字节
  1294. ****************************************************************************/
  1295. void NumToUnicode(unsigned short Num,char *pUnicode)
  1296. {
  1297. char temp[6];
  1298. int i,j,len;
  1299. sprintf(temp,"%u",Num);//0~65535
  1300. len=strlen(temp);
  1301. j=0;
  1302. for(i=0;i<len;i++){
  1303. pUnicode[j++]=0x30+temp[i]/16;
  1304. pUnicode[j++]=0x30+temp[i]%16;
  1305. pUnicode[j++]=0x30;
  1306. pUnicode[j++]=0x30;
  1307. }
  1308. pUnicode[j]=0;
  1309. }
  1310. void ReportVersion(void)
  1311. {
  1312. char buf[150];
  1313. char temp[20];
  1314. sprintf(buf,"AT+ZTTS=1,\"945E287548722C67");
  1315. NumToUnicode(sutProductPara.ProductVersion,temp);
  1316. strcat(buf,temp);
  1317. strcat(buf,"2C00F95BB28B48722C67");
  1318. NumToUnicode((unsigned short)g_iModemVer,temp);
  1319. strcat(buf,temp);
  1320. strcat(buf,"\"\r\n");
  1321. SpeakerEnable();
  1322. ModemSendAT(buf);//应用版本
  1323. SlwTrace(INF,buf,0);
  1324. /*
  1325. SlwTrace(INF,"[ReportVersion]");
  1326. sprintf(buf,"Mcu=%u,Modem=%u\r\n",sutProductPara.ProductVersion,(unsigned short)g_iModemVer);
  1327. SlwTrace(INF,buf);
  1328. */
  1329. }
  1330. /*******************************************************************
  1331. *GetParaFromStr
  1332. *从Str中找到Para=后面至';'或非字符的字串并放入Value
  1333. 返回Value的长度
  1334. 举例:Str="GT+SMP=IP=192.168.1.1;Port=12345"
  1335. 如果Para="Port" 则Value将被赋值为"12345",并返回5
  1336. 如果Para="IP" 则Value将被赋值为"192.168.1.1",并返回11
  1337. 要求Para长度不大于20字节 ,Value长度不大于40字节
  1338. ********************************************************************/
  1339. int GetParaFromStr(char *Str,char *Para,char *Value)
  1340. {
  1341. int ValueLen=0,ParaLen=0;
  1342. char ParaTemp[22];
  1343. char *p;
  1344. char d;
  1345. int i=0;
  1346. if(0==*Str || 0==*Para)return 0;
  1347. while(0!=(d=*Para) && ParaLen<20){
  1348. ParaTemp[i++]=d;
  1349. if(d=='=' || d==';')return 0;
  1350. Para++;
  1351. ParaLen++;
  1352. }
  1353. ParaTemp[ParaLen++]='=';
  1354. ParaTemp[ParaLen]=0;
  1355. p=strstr(Str,ParaTemp);
  1356. p+=ParaLen;
  1357. //--
  1358. while(*p>0x20 && ';'!=*p && ValueLen<40){
  1359. *Value=*p;
  1360. p++;
  1361. Value++;
  1362. ValueLen++;
  1363. }
  1364. *Value=0;
  1365. return ValueLen;
  1366. }
  1367. void IWDG_Configuration(void)
  1368. {
  1369. // WWDG 时钟使能
  1370. RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
  1371. if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET)RCC_ClearFlag();
  1372. //写入0x5555,用于允许狗狗寄存器写入功能
  1373. IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
  1374. //狗狗时钟分频,40K/256=156HZ(6.4ms)
  1375. IWDG_SetPrescaler(IWDG_Prescaler_256);
  1376. //喂狗时间
  1377. //IWDG_SetReload(200);1.28s/6.4MS=200 .注意不能大于0xfff
  1378. IWDG_SetReload(500);//3.2s/6.4MS=500 .注意不能大于0xfff
  1379. //喂狗
  1380. IWDG_ReloadCounter();
  1381. //使能狗狗
  1382. IWDG_Enable();
  1383. }
  1384. /*
  1385. 此处修改:删去ModemSendAT("2C00");另外pocTask.cReplaceStrWithN(&msg[9]、msg[17]);强制将字符串后面的\n\r去掉
  1386. */
  1387. void ReportUserGroupName(void)
  1388. {
  1389. #if POC_USER_NAME_LEN>POC_GROUP_NAME_LEN
  1390. char buf[POC_USER_NAME_LEN*4];
  1391. #else
  1392. char buf[POC_GROUP_NAME_LEN*4];
  1393. #endif
  1394. SpeakerEnable();
  1395. ModemSendAT("AT+ZTTS=1,\"");
  1396. AnsiToStrUnicode((uint8_t *)buf,sizeof(buf),sutPocStatus.LocalUser.name); //函数功能未实现,需要修改
  1397. ModemSendAT(buf);
  1398. AnsiToStrUnicode((uint8_t *)buf,sizeof(buf),sutPocStatus.LocalUser.name);
  1399. ModemSendAT(buf);
  1400. ModemSendAT("\"\r");
  1401. }
  1402. void SetPowerEn(unsigned char en)
  1403. {
  1404. GPIO_InitTypeDef GPIO_InitStructure;
  1405. if(en!=0){
  1406. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  1407. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  1408. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  1409. GPIO_InitStructure.GPIO_Pin = PWR_EN_PIN;
  1410. GPIO_Init(PWR_EN_PORT, &GPIO_InitStructure);
  1411. PWR_EN_HIGH;
  1412. }else{
  1413. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  1414. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
  1415. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  1416. GPIO_InitStructure.GPIO_Pin = PWR_EN_PIN;
  1417. GPIO_Init(PWR_EN_PORT, &GPIO_InitStructure);
  1418. PWR_EN_LOW;
  1419. }
  1420. }
  1421. /*****************************************************************************************
  1422. *函数名:GetCheckCodeByPsnMEID
  1423. *功能:根据PSN号和MEID码,生成伪随机码
  1424. *入口:PSN--PSN码,无符号长整形,必须是大于150000000的数值,有可能是9位数也可能是10位数
  1425. pMEID--MEID字串,长度14位或15位,第16字节必须为0。
  1426. *出口:pCheckCode:--长度为6的字符串,第7字节为结束符0x00,因此必须留够7字节的空间!
  1427. 返回:1--成功 0--因参数非法而失败
  1428. ******************************************************************************************/
  1429. int GetCheckCodeByPsnMEID(char *pCheckCode,unsigned long PSN,char *pMEID)
  1430. {
  1431. const unsigned char sucRandTable[256]={
  1432. 0x68,0x59,0x63,0x64,0xc8,0xcc,0xaa,0xa7,0xa2,0xab,0xa5,0x6e,0x6a,0x56,0x8a,0x57,
  1433. 0xf4,0xbb,0xfe,0xfa,0x26,0x21,0x2d,0x29,0x0d,0x09,0x3e,0x3a,0x37,0x32,0x0a,0x07,
  1434. 0xf7,0xf2,0xfb,0xf5,0xff,0xf6,0x1c,0x18,0x13,0x14,0xf1,0xfd,0xf9,0x0c,0x9f,0x08,
  1435. 0x9a,0x97,0x92,0x9b,0x95,0x9f,0x12,0x1b,0x15,0x2c,0x28,0x23,0xf9,0x2a,0x27,0x22,
  1436. 0x24,0x2e,0x67,0x25,0x2f,0x98,0xfc,0x75,0xf8,0xf3,0x3c,0x38,0x33,0x34,0x03,0x04,
  1437. 0x05,0x0f,0x06,0x01,0x7a,0x77,0x72,0x62,0x6b,0x83,0x84,0x8e,0xc4,0xcb,0x87,0x82,
  1438. 0x35,0x3f,0x36,0x4f,0x3d,0x39,0x9c,0x98,0x93,0x94,0x42,0x4f,0x46,0x41,0x81,0x8d,
  1439. 0x4d,0x49,0x71,0x7d,0x79,0x96,0x91,0x9d,0x99,0xc3,0xc4,0x1d,0xce,0xca,0x7f,0x76,
  1440. 0x7c,0x78,0x73,0x74,0x7e,0x7b,0x75,0x1e,0x1a,0x17,0x1f,0x16,0x11,0x1d,0x47,0x19,
  1441. 0x5d,0xc7,0xc2,0xcb,0xc5,0xcf,0xd1,0xdd,0xd9,0x4c,0x48,0xc6,0xc1,0xcd,0x61,0xc9,
  1442. 0xd7,0x8c,0xfd,0x88,0xa1,0xad,0xa9,0xb1,0xbd,0xb9,0x8b,0x85,0x8f,0x4b,0x45,0x86,
  1443. 0xdc,0xd8,0xd3,0xd4,0xde,0xd2,0xdb,0xd5,0xdf,0xd6,0x43,0x44,0x4e,0x4a,0xe7,0x47,
  1444. 0xac,0xa8,0xa3,0xa4,0xae,0xba,0x0d,0xb7,0xb2,0xaf,0xa6,0xe4,0xee,0xea,0xe7,0xe2,
  1445. 0xe1,0xed,0x0f,0xe9,0x66,0x61,0x6d,0x69,0xbb,0xb5,0xbf,0xb6,0xec,0xe8,0x0b,0xe3,
  1446. 0x52,0x5c,0x65,0x6f,0x58,0x53,0x54,0x0c,0x5e,0x5b,0x55,0x5f,0x31,0x2f,0x9a,0x0b,
  1447. 0x0b,0x5a,0x2b,0x9e,0x02,0x89,0x59,0x3b,0x0e,0x51,0x6c,0xeb,0xda,0xe6,0x31,0xf6
  1448. };
  1449. char aucPSN[11];
  1450. char aucMEID[16];
  1451. unsigned char key[10];
  1452. unsigned char temp1,temp2;
  1453. int MeidLen,PsnLen;
  1454. int i,j;
  1455. //PSN合法性检测
  1456. if(PSN<150100000)return 0;
  1457. //MEID合法性检测
  1458. MeidLen=strlen(pMEID);
  1459. if(MeidLen!=14 && MeidLen!=15)return 0; //MEID号长度必须为14或15
  1460. //PSN转字符串,不够10位的前面补'0'
  1461. sprintf(aucPSN,"%010lu",PSN);
  1462. PsnLen=strlen(aucPSN);
  1463. //取MEID的最后10个字符
  1464. j=0;
  1465. for(i=(MeidLen-10);i<MeidLen;i++){
  1466. aucMEID[j]=pMEID[i];
  1467. j++;
  1468. }
  1469. //所有字节进行相互异或运算,使每个字节的变化对整体结果都敏感
  1470. temp1=0;
  1471. temp2=0;
  1472. for(i=0;i<10;i++){
  1473. temp1^=(unsigned char)aucPSN[i];
  1474. temp2^=(unsigned char)aucMEID[i];
  1475. }
  1476. temp1^=temp2;
  1477. temp2=sucRandTable[temp1];
  1478. //循环查表异或运算,生成key
  1479. for(i=0;i<10;i++){
  1480. temp1=aucPSN[i]^temp2;
  1481. key[i]=aucMEID[i]^temp1;
  1482. temp2=sucRandTable[temp1];
  1483. }
  1484. //取最后6个key,分别除10取余后再转Ascii,作为结果,结果为6个数字串,如"123456"
  1485. j=0;
  1486. for(i=4;i<10;i++){
  1487. pCheckCode[j]=key[i]%10;
  1488. pCheckCode[j]+=0x30;
  1489. j++;
  1490. }
  1491. pCheckCode[6]=0; //结束符,方便调试打印和语音播报。
  1492. return 1;
  1493. }
  1494. /***************************************************************************
  1495. 将数字串转Unicode编码,方便播报
  1496. pUnicode长度必须为pNum长度的8倍,否则内存溢出!
  1497. ****************************************************************************/
  1498. void NumStrToUnicode(char *pNum,char *pUnicode)
  1499. {
  1500. char temp[10];
  1501. int i,j,len;
  1502. len=strlen(pNum);
  1503. sprintf(temp,"len=%d",len);
  1504. SlwTrace(INF,temp,1);
  1505. j=0;
  1506. for(i=0;i<len;i++){
  1507. pUnicode[j++]='3';
  1508. pUnicode[j++]=pNum[i];
  1509. pUnicode[j++]='0';
  1510. pUnicode[j++]='0';
  1511. if(i==(len-1))break;//最后一个不用加逗号‘,’
  1512. //","
  1513. pUnicode[j++]='2';
  1514. pUnicode[j++]='0';
  1515. pUnicode[j++]='0';
  1516. pUnicode[j++]='0';
  1517. }
  1518. pUnicode[j]=0;
  1519. }
  1520. /**************************************************************
  1521. *ReportCheckCode
  1522. ***************************************************************/
  1523. void ReportCheckCode(void)
  1524. {
  1525. char temp[11];
  1526. char buf[80];
  1527. SpeakerEnable();
  1528. //终端编号xxxx
  1529. if(sutProductPara.PSN<150100000 || sutProductPara.PSN==0xffffffff){
  1530. SlwTrace(INF,"PSN Error!",1);
  1531. ModemSendAT("AT+ZTTS=1,\"C87EEF7A167FF7531995EF8B\"\r");//终端编号错误
  1532. return;
  1533. }
  1534. //校验码xxxx
  1535. if(GetCheckCodeByPsnMEID(temp,sutProductPara.PSN,sutProductPara.MEID)){
  1536. sprintf(buf,"CheckCode=%s",temp);
  1537. SlwTrace(INF,buf,1);
  1538. NumStrToUnicode(temp,buf);
  1539. ModemSendAT("AT+ZTTS=1,\"21688C9A01782C00");//校验码,
  1540. ModemSendAT(buf);
  1541. ModemSendAT("\"\r");
  1542. }else{
  1543. SlwTrace(INF,"CheckCode=NULL",1);
  1544. ModemSendAT("AT+ZTTS=1,\"21688C9A0178B783D6533159258D\"\r");//校验码获取失败
  1545. }
  1546. IWDG_ReloadCounter();//喂狗
  1547. os_dly_wait(100);
  1548. IWDG_ReloadCounter();//喂狗
  1549. os_dly_wait(100);
  1550. IWDG_ReloadCounter();//喂狗
  1551. os_dly_wait(100);
  1552. IWDG_ReloadCounter();//喂狗
  1553. //终端编码xxx
  1554. sprintf(temp,"%lu",sutProductPara.PSN);
  1555. sprintf(buf,"CheckCode=%s",temp);
  1556. SlwTrace(INF,buf,1);
  1557. NumStrToUnicode(temp,buf);
  1558. ModemSendAT("AT+ZTTS=1,\"C87EEF7A167FF7532C00");//终端编码,
  1559. ModemSendAT(buf);
  1560. ModemSendAT("\"\r");
  1561. }
  1562. /************************************************************************************
  1563. ResetModem
  1564. *************************************************************************************/
  1565. void ResetModem(void)
  1566. {
  1567. //set modem reset
  1568. MODEM_PWRKEY_HIGH;
  1569. MODEM_RESET_HIGH;
  1570. os_dly_wait(10);
  1571. MODEM_RESET_LOW;
  1572. //set uart3 reset
  1573. Uart3Init();
  1574. }
  1575. /*************************************************************************************
  1576. *FingerDaemonfinger
  1577. *守护进程
  1578. *用于防止通讯模块死机,或者与通讯模块通讯的串口异常而重新启动模块或通讯驱动。
  1579. *用于防止GPS模块异常而重启GPS
  1580. *此函数需要确保每秒调用一次
  1581. 入口参数
  1582. sutPocStatus.FirstLogined
  1583. sutPocStatus.PocLostCt
  1584. sutPocStatus.ModemPowerOn
  1585. sutPocStatus.ModemInactiveCt
  1586. g_iCSQ
  1587. **************************************************************************************/
  1588. void FingerDaemonfinger(void)
  1589. {
  1590. static unsigned char sucPocLostTimeoutCount=0;//
  1591. static unsigned char sucModemInactiveCount=0;
  1592. unsigned char PocLostCtMax;
  1593. IWDG_ReloadCounter();//喂狗
  1594. //return;
  1595. if(g_ucModemTaskEn==0)return;
  1596. //如果曾经登陆过POC系统,然后离线,开始计数,直到再次登陆,如果一直不登陆超过一定时间,则重启模块和串口
  1597. if(sutPocStatus.FirstLogined){
  1598. if(sutPocStatus.Logined==0){
  1599. if(g_iCSQ<5 || g_iCSQ==99){//如果信号不好
  1600. PocLostCtMax=180;//等待时间为3分钟
  1601. }else{//如果信号还行
  1602. PocLostCtMax=60;//等待时间为1分钟
  1603. }
  1604. if(++sutPocStatus.PocLostCt>PocLostCtMax){
  1605. sutPocStatus.PocLostCt=0;
  1606. //长时间不登陆,重启模块及串口驱动部分
  1607. SlwTrace(INF,"PocLostTimeout!Reset Modem!",1);
  1608. ResetModem();
  1609. // if(++sucPocLostTimeoutCount>2){//连续重启3次都失败,则复位整个系统
  1610. // sucPocLostTimeoutCount=0;
  1611. // SystemReset();
  1612. // }
  1613. }
  1614. }else{
  1615. sutPocStatus.PocLostCt=0;
  1616. sucPocLostTimeoutCount=0;
  1617. }
  1618. }
  1619. //如果模块已开机,长时间收不到串口消息,则重启模块及串口驱动部分
  1620. if(sutPocStatus.ModemPowerOn==1){
  1621. if(sutPocStatus.ModemInactiveCt==0){//ModemInactiveCt必须在接收到Modem串口消息后才清零
  1622. sucModemInactiveCount=0;
  1623. }
  1624. if(++sutPocStatus.ModemInactiveCt>15){//等待时间15秒
  1625. sutPocStatus.ModemInactiveCt=1;
  1626. //长时间收不到串口消息,重启模块及串口驱动
  1627. SlwTrace(INF,"ModemRecvTimeout!Reset Modem!",1);
  1628. ResetModem();
  1629. //连续重启3次无效,复位整个系统
  1630. // if(sucModemInactiveCount>2){
  1631. // sucModemInactiveCount=0;
  1632. // SystemReset();
  1633. // }
  1634. }
  1635. }
  1636. //GPS守护
  1637. if(sutGpsInfo.isGpsWork>0){
  1638. if(++sutGpsInfo.GpsInactiveCt>10){
  1639. sutGpsInfo.GpsInactiveCt=0;
  1640. //复位GPS
  1641. GPSInit();
  1642. Uart2Init();
  1643. TSGpsDataInit();
  1644. }
  1645. }
  1646. }
  1647. /**************************************
  1648. *延时(带喂狗)
  1649. t 系统滴答为单位
  1650. ***************************************/
  1651. void OsDelayTime(unsigned short t)
  1652. {
  1653. int i;
  1654. for(i=0;i<t;i++){
  1655. os_dly_wait(1);
  1656. IWDG_ReloadCounter();//喂狗
  1657. }
  1658. }
  1659. //255.255.255.255
  1660. //-->0xff 0xff 0xff 0xff
  1661. unsigned char GetStringIP2Bytes(unsigned char *IPBytes,char *IPString)
  1662. {
  1663. unsigned char len,i,segment,j;
  1664. char *p;
  1665. char temp[3];
  1666. len = strlen(IPString);
  1667. if(len<7 || len >15) return 1;
  1668. segment=0;
  1669. j=0;
  1670. p=IPString;
  1671. for(i=0;i<len;i++)
  1672. {
  1673. if(IPString[i] == '.')
  1674. {
  1675. if(segment < 4) IPBytes[segment++] = atoi(p);
  1676. else return 2;
  1677. p=&IPString[i+1];
  1678. }else if(IPString[i] < '0' || IPString[i] > '9') return 3;
  1679. }
  1680. if(segment < 5) IPBytes[segment++] = atoi(p);
  1681. return 0;
  1682. }
  1683. void MakeStrEndByNewLine(char *str)
  1684. {//一定要以'\r'结尾
  1685. unsigned short i;
  1686. for(i=0;i<strlen(str);i++)
  1687. {
  1688. if(str[i] == '\r')
  1689. {
  1690. str[i]=0;
  1691. return;
  1692. }
  1693. }
  1694. }
  1695. uint16_t StrUnicodeToAnsi(uint8_t *dest,uint16_t size,const char *src)
  1696. {
  1697. //不需要转
  1698. }
  1699. uint16_t AnsiToStrUnicode(uint8_t *dest,uint16_t size,const char *src)
  1700. {
  1701. //不需要转
  1702. }
  1703. //"3132" --> 0x31,0x32
  1704. void StrAsciiToHex(char *src, unsigned char *des)
  1705. {
  1706. unsigned char temp[2],i;
  1707. if(strlen(src)%2) return;
  1708. while(0!=*src)
  1709. {
  1710. for(i=0;i<2;i++)
  1711. {
  1712. temp[i] = *src++;
  1713. if(temp[i] >= '0' && temp[i] <= '9') temp[i] -= 0x30;
  1714. else if(temp[i] >= 'A' && temp[i] <= 'F') temp[i] -= 0x37;
  1715. else temp[i] -= 0x57;
  1716. }
  1717. temp[0] <<= 4;
  1718. temp[0] &= 0xf0;
  1719. *des++=temp[0]|temp[1];
  1720. }
  1721. *des=0;
  1722. }