MainTask.c 56 KB

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