MainTask.c 57 KB

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