MainTask.c 56 KB

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