uiBlock.c 60 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078
  1. #include "includes.h"
  2. unsigned char uiTmpVal;
  3. /****************************状态栏显示部分开始***********************************/
  4. //显示信号强度
  5. static void ShowSingle(int CSQ){
  6. unsigned short x=SIGNAL_ICON_X;
  7. unsigned short y=2;
  8. //if(sutApp.pocPpp == 0) guiShowBmp(x,y,"Single.bmp");
  9. //else guiShowBmp(x,y,"SingleOK.bmp");
  10. guiShowBinMap(0,1,"signal.bin");
  11. //11 3格
  12. x += 7;
  13. if(CSQ<5 || CSQ==99){
  14. GuiDrawSignalVLine(5);
  15. }else if(CSQ<11){
  16. GuiDrawSignalVLine(4);
  17. }else if(CSQ<18){
  18. GuiDrawSignalVLine(3);
  19. }else if(CSQ<22){
  20. GuiDrawSignalVLine(2);
  21. }else{
  22. GuiDrawSignalVLine(1);
  23. }
  24. }
  25. unsigned char netshowvalue=0xff;
  26. unsigned char ctecCurrentSet=0;
  27. //显示网络制式
  28. static void Show_Net(unsigned char s_netshowvalue){
  29. unsigned short y=0;
  30. if(s_netshowvalue==4){
  31. if(sutApp.UserInfo.tnet==5) newGuiShowStr(19, 1, "5G",REVERSED_NO,FONT_MODE_12X12);
  32. else newGuiShowStr(19, 1, "4G",REVERSED_NO,FONT_MODE_12X12);
  33. }
  34. }
  35. static void gpsIconShow(char flash){
  36. typedef struct{
  37. unsigned char located:1;
  38. unsigned char auth:1;
  39. unsigned char gpsF:1;
  40. }TMP_GPS_DEF;
  41. static TMP_GPS_DEF tmpGps;
  42. unsigned short x=GPS_ICON_X,y=0;
  43. return;
  44. if(tmpGps.located==gpsInfo.gpsLocated && tmpGps.auth==gpsInfo.bbAuth && tmpGps.gpsF==gpsInfo.gpsF && flash==0) return;
  45. guiClearRect(x,y,x+GPS_ICON_WX,y+11,COLOR_STATUS_BAR);
  46. if(gpsInfo.gpsF==0){//GPS未打开时
  47. if(gpsInfo.bbAuth==1) guiShowBmp(x,y,"GPS3.bmp");//已鉴权
  48. }else{//GPS已打开
  49. if(gpsInfo.bbAuth==1) guiShowBmp(x,y,"GPS1.bmp");//已鉴权
  50. else if(gpsInfo.bbAuth==1) guiShowBmp(x,y,"GPSA.bmp");//未鉴权
  51. if(gpsInfo.gpsLocated==1) guiShowBmp(x+10,y,"GPS2.bmp");//已定位
  52. }
  53. tmpGps.located=gpsInfo.gpsLocated;
  54. tmpGps.auth=gpsInfo.bbAuth;
  55. tmpGps.gpsF=gpsInfo.gpsF;
  56. }
  57. static void ShowCardType(char card){
  58. unsigned short x= CARD_ICON_X;
  59. unsigned short y=3;
  60. if(card==0) guiShowBmp(x, y, "SIM1.bmp");
  61. else if(card==1) guiShowBmp(x, y, "SIM2.bmp");
  62. }
  63. //显示电量
  64. static void ShowBatttery(int bat,unsigned int exeInterval){
  65. #if 0
  66. static unsigned int flashCnt=0;
  67. static unsigned char flag=0;
  68. static unsigned short cnt=0;
  69. unsigned short x=BAT_ICON_X,y=2,h=y+2;
  70. if(sutApp.chargeStatus!=0){//正在充电
  71. guiShowBmp(x, y, "CHARGE.bmp");
  72. }else if(bat<WARN_PWR_LEVEL){//请充电
  73. if(++cnt<(800/exeInterval)) return;
  74. cnt=0;
  75. if(sutApp.lowPwrWarn==0){
  76. sutApp.lowPwrWarn=1;
  77. sutApp.lowPwrCnt=WARN_TTS_INTERVAL-5000;//从非充电电压到充电电压,持续5秒开始播放,如果跳回非充电电压
  78. }
  79. if(flag==0){
  80. guiShowBmp(x,y,"VBAT1.bmp");
  81. flag=1;
  82. }else{
  83. flag=0;
  84. guiClearRect(x,y-2,x+21,y-2+0+12,COLOR_STATUS_BAR);
  85. }
  86. return;
  87. }else if(bat<355){//340<x<=355 1格
  88. guiShowBmp(x,y,"VBAT1.bmp");//3
  89. guiDrawVLine(h,h+5,x+16,y+1,guiGetBackColor());
  90. }
  91. else if(bat<375){//355<x<=375 2格
  92. guiShowBmp(x,y,"VBAT1.bmp");
  93. guiDrawVLine(h,h+5,x+12,y+1,guiGetBackColor());
  94. guiDrawVLine(h,h+5,x+16,y+1,guiGetBackColor());//5.12
  95. }
  96. else if(bat<400){//375<x<=400 3格
  97. guiShowBmp(x,y,"VBAT1.bmp");
  98. guiDrawVLine(h,h+5,x+8,y+1,guiGetBackColor());
  99. guiDrawVLine(h,h+5,x+12,y+1,guiGetBackColor());
  100. guiDrawVLine(h,h+5,x+16,y+1,guiGetBackColor());//5.12
  101. }
  102. else{//>=400 4格
  103. guiShowBmp(x,y,"VBAT1.bmp");
  104. guiDrawVLine(h,h+5,x+4,y+1,guiGetBackColor());
  105. guiDrawVLine(h,h+5,x+8,y+1,guiGetBackColor());
  106. guiDrawVLine(h,h+5,x+12,y+1,guiGetBackColor());
  107. guiDrawVLine(h,h+5,x+16,y+1,guiGetBackColor());//5.12
  108. }
  109. sutApp.lowPwrWarn=0;
  110. #else
  111. const unsigned short batTable[13]={320,328,336,344,352,360,368,376,384,392,400,405,410};
  112. short i;
  113. guiShowBinMap(114,1,"battery.bin");
  114. for(i=13;i>0;i--)
  115. {
  116. if(bat >= batTable[i-1]) NewDrawVLine(129-i,2,6);
  117. }
  118. LCDFlashPainPage(104,0);
  119. #endif
  120. }
  121. //显示时间
  122. static void ShowTime(char flash,unsigned int exeInterval){
  123. static unsigned short nextExe=0;
  124. static unsigned char flag=0;
  125. MY_CLOCK myclock;
  126. char buf[30];
  127. if(nextExe==0 || flash){
  128. if(flag){
  129. snprintf(buf, sizeof(buf), "%02d:%02d",myclock.hour, myclock. min);
  130. flag=0;
  131. }else{
  132. snprintf(buf, sizeof(buf), "%02d %02d",myclock.hour, myclock. min);
  133. flag=1;
  134. }
  135. newGuiShowStr((GLCD_WIDTH-40)/2,1, buf,REVERSED_NO,FONT_MODE_12X12);
  136. }
  137. if(++nextExe>=(1000/exeInterval)) nextExe=0;
  138. }
  139. //显示耳机接入状态
  140. static void ShowEarStatus(char flash){
  141. static unsigned char lastStatus=0;
  142. if(lastStatus==sutApp.earLev && flash==0) return;
  143. if(sutApp.earLev!=0) guiShowBmp(EAR_ICON_X, 1, "ear.bmp");
  144. else guiClearRect(EAR_ICON_X, 1, EAR_ICON_X+EAR_ICON_WX,1+12, COLOR_STATUS_BAR);
  145. lastStatus=sutApp.earLev;
  146. }
  147. //显示键盘锁状态
  148. static void ShowKeyLocStatus(char flash){
  149. static unsigned char lastStatus=0;
  150. if(lastStatus==sutApp.keyLock && flash==0) return;
  151. if(sutApp.keyLock!=0) guiShowBmp(LOCK_ICON_X, 1, "lock.bmp");
  152. else guiClearRect(LOCK_ICON_X, 1, LOCK_ICON_X+LOCK_ICON_WX,12, COLOR_STATUS_BAR);
  153. lastStatus=sutApp.keyLock;
  154. }
  155. //显示状态栏
  156. void uiShowStatusBar(char flash,unsigned int exeInterval){
  157. static unsigned char s_netshowvalue=0xff;
  158. static unsigned char lastPPPStatus;
  159. static int siCSQ;
  160. static int siVbat;
  161. static unsigned short batFirstShow=0;
  162. static char cardType=0;
  163. char tempFlash=flash;
  164. if(sutApp.enableKey==0) return;
  165. if(sutApp.updateStatusBar!=0){
  166. sutApp.updateStatusBar=0;
  167. tempFlash=1;
  168. newGuiClearBar();
  169. }
  170. //显示信号
  171. if(tempFlash || siCSQ!=sutApp.g_iCSQ || lastPPPStatus != sutApp.pocPpp){
  172. lastPPPStatus=sutApp.pocPpp;
  173. siCSQ=sutApp.g_iCSQ;
  174. ShowSingle(sutApp.g_iCSQ);
  175. }
  176. //显示卡选项
  177. // if(tempFlash || cardType != sutApp.simSel){
  178. // cardType=sutApp.simSel;
  179. // ShowCardType(cardType);
  180. // }
  181. //显示2G/3G/4G
  182. if(tempFlash || s_netshowvalue!=netshowvalue){
  183. s_netshowvalue=netshowvalue;
  184. Show_Net(s_netshowvalue);
  185. }
  186. //显示GPS是否正常及鉴权情况
  187. //gpsInfo.gpsLocated=1;
  188. //gpsInfo.bbAuth=1;
  189. //gpsInfo.gpsF=1;
  190. // gpsIconShow(tempFlash);
  191. //电量显示
  192. if(tempFlash || siVbat!=sutApp.g_iBAT || sutApp.g_iBAT < WARN_PWR_LEVEL){
  193. if(sutApp.g_iBAT>=0){
  194. siVbat=sutApp.g_iBAT;
  195. ShowBatttery(sutApp.g_iBAT,exeInterval);
  196. }
  197. }
  198. //时间显示
  199. ShowTime(tempFlash,exeInterval);
  200. //显示耳机状态
  201. // ShowEarStatus(tempFlash);
  202. //显示键盘锁状态
  203. // ShowKeyLocStatus(tempFlash);
  204. }
  205. /****************************状态栏显示部分结束***********************************/
  206. /****************************待机界面显示部分开始***********************************/
  207. typedef enum{
  208. ME_NO_LOGIN,
  209. ME_NOBODY_SPEAK,
  210. ME_IAM_SPEAK,
  211. ME_SOMEBODY_SPEAK
  212. }ME_ENUM;
  213. static void uiShowGUName(int update);
  214. static void uiShowGuaDuan(unsigned char danhu);
  215. static void uiShowGroup(const char* info);
  216. static void uiShowUser(const char* info);
  217. static void uiShowHuaQuan(const char* info);
  218. static void uiShowCallUserName(void);
  219. static void uiShowOffLineMessage(void);
  220. static void uiShowCopsInfo(void){
  221. char info[50];
  222. if(newPara.itemShowType==0){
  223. switch(sutApp.copstype){
  224. case 0:case 2:case 4:case 7://中国移动
  225. snprintf(info, sizeof(info), "中国移动");
  226. break;
  227. case 1:case 6:case 9://中移联通
  228. snprintf(info, sizeof(info), "中国联通");
  229. break;
  230. case 3:case 8:case 11://中国电信
  231. snprintf(info, sizeof(info), "中国电信");
  232. break;
  233. default:snprintf(info, sizeof(info), "公网集群对讲系统");break;
  234. }
  235. }else snprintf(info, sizeof(info), "公网集群对讲系统");
  236. guiFillRect(0, UI_STATUS_ITEM_Y, GLCD_WIDTH-1, UI_CONTENT_SHOW_Y-1, guiGetForeColor());//清除第二区
  237. guiShowCaption(0,info, UI_STATUS_ITEM_Y+1,guiGetBackColor(),guiGetForeColor(),FONT_MODE_12X12);
  238. }
  239. #ifdef USE_LEFT_MOVING
  240. void movingShowNames(unsigned int dlyInterval,unsigned char reset, unsigned char now,unsigned char voice){
  241. const char *idleptr="空闲";
  242. const char *voiceptr="本机在讲话";
  243. const char *danhuptr="单呼模式";
  244. char *gname=danhuptr;
  245. char *voicePri=idleptr;
  246. char *uname=NULL;
  247. static unsigned int interval=0xffffff;
  248. if(sutPocStatus.logined==0) return;
  249. //if(sutPocStatus.statusChaned!=0){
  250. // sutPocStatus.statusChaned=0;
  251. // reset=1;
  252. //}
  253. if(++interval<500/dlyInterval && reset==0 && now==0) return;//0.5秒刷新一次
  254. interval=0;
  255. if(sutPocStatus.danHuStatus==0){
  256. if(sutPocStatus.LocalGroup.name[0]==0) gname=NULL;
  257. else gname=sutPocStatus.LocalGroup.name;
  258. }
  259. if(voice==0) voicePri=idleptr;
  260. else if(voice==1) voicePri=voiceptr;
  261. else voicePri=sutPocStatus.CallName;
  262. if(sutPocStatus.LocalUser.name[0]!=0) uname=sutPocStatus.LocalUser.name;
  263. mainScreenShowMoving(UI_GROUP_SHOW_Y, reset,gname,uname,voicePri);
  264. }
  265. #endif
  266. void uiShowMainInterface(char status,unsigned int exeInterval){
  267. short Flag=ME_NO_LOGIN;//ME_ENUM
  268. static unsigned char danhu=0;
  269. static short lastFlag=-1;
  270. static unsigned short siCt=0;
  271. char info[20];
  272. static char firstRun=0;
  273. static unsigned short dly=0;
  274. char tmpStatus=status;
  275. static int copsStatus;
  276. static unsigned int timer;
  277. static char lockStep=0;
  278. unsigned char reset=0;
  279. unsigned char moveFlash=0;
  280. static unsigned char voice=0;
  281. //提示解锁
  282. if(sutApp.lockShow!=0){
  283. if(lockStep==0){
  284. lockStep=1;
  285. backLightReset();
  286. uTimerStart(&timer, 1000);
  287. newGuiClearMainPage();
  288. newGuiShowStr(GLCD_WIDTH/2-32,STATUS_BAR_HEIGH, "键盘已锁",REVERSED_NO,FONT_MODE_16X16);
  289. newGuiShowStr(GLCD_WIDTH/2-32+8,STATUS_BAR_HEIGH+16,"请解锁",REVERSED_NO,FONT_MODE_16X16);
  290. }
  291. }else lockStep=0;
  292. if(lockStep==1){
  293. if(uTimerExpired(&timer)){
  294. newGuiClearMainPage();
  295. lastFlag=-1;//让以下刷新一下
  296. sutApp.lockShow=0;
  297. lockStep=0;
  298. sutUIstatus.ItemRefresh=1;//如果"请插卡"有显示,会被刷掉不再显示,这里让它重新显示出来
  299. }
  300. return;
  301. }
  302. /*逻辑处理开始*/
  303. if(tmpStatus){
  304. newGuiClearMainPage();
  305. danhu=sutPocStatus.danHuStatus;
  306. uiShowGuaDuan(danhu);
  307. lastFlag=-1;
  308. siCt=0;
  309. //return;
  310. }
  311. if(copsStatus != sutApp.copstype || tmpStatus){
  312. copsStatus=sutApp.copstype;
  313. //uiShowCopsInfo();
  314. }
  315. //更新单呼显示与否
  316. if(sutPocStatus.danHuStatus != danhu){
  317. danhu=sutPocStatus.danHuStatus;
  318. uiShowGuaDuan(danhu);
  319. }
  320. //以下持续调用,以便动态更新信息
  321. if(0==sutPocStatus.logined) Flag=ME_NO_LOGIN;//未登录
  322. else if(0==sutPocStatus.spk && 0==sutPocStatus.mic){//已登录,无人说话
  323. Flag=ME_NOBODY_SPEAK;
  324. }else if(0!=sutPocStatus.mic) Flag=ME_IAM_SPEAK;//已登录,本机说话
  325. else if(0!=sutPocStatus.spk) Flag=ME_SOMEBODY_SPEAK;//有人说话
  326. switch(Flag){
  327. case ME_NO_LOGIN://未登录
  328. if(Flag != lastFlag){
  329. newGuiClearMainPage();
  330. }
  331. break;
  332. case ME_NOBODY_SPEAK://已登录,无人说话
  333. if(Flag != lastFlag){
  334. if(ME_NO_LOGIN==lastFlag) newGuiClearPage(0, ROW_TWO);
  335. newGuiClearPage(0, ROW_FOUR);
  336. #ifdef USE_LEFT_MOVING
  337. voice=0;
  338. moveFlash=1;
  339. #else
  340. uiShowHuaQuan("空闲");
  341. #endif
  342. sutPocStatus.statusChaned = 1;
  343. }
  344. break;
  345. case ME_IAM_SPEAK://已登录,本机说话
  346. if(Flag != lastFlag){
  347. #ifdef USE_LEFT_MOVING
  348. voice=1;
  349. moveFlash=1;
  350. #else
  351. newGuiClearMainPage();
  352. uiShowHuaQuan("本机在讲话");
  353. #endif
  354. }
  355. break;
  356. case ME_SOMEBODY_SPEAK://已登录,有人说话
  357. if(Flag != lastFlag){
  358. newGuiClearPage(0, ROW_FOUR);
  359. sutPocStatus.statusChaned=1;//保证要刷新名字
  360. #ifdef USE_LEFT_MOVING
  361. voice=2;
  362. moveFlash=1;
  363. #endif
  364. }
  365. #ifndef USE_LEFT_MOVING
  366. uiShowCallUserName();
  367. #endif
  368. break;
  369. }
  370. if(Flag>0){//已登录
  371. if(Flag != lastFlag && (lastFlag==-1 || ME_NO_LOGIN==lastFlag)){
  372. #ifdef USE_LEFT_MOVING
  373. reset=1;
  374. #else
  375. uiShowGUName(1);
  376. #endif
  377. }
  378. #ifndef USE_LEFT_MOVING
  379. else uiShowGUName(0);
  380. #endif
  381. }else{//未登录
  382. snprintf(info, sizeof(info),"正在登陆.");
  383. switch(siCt){//not finished yet
  384. case 0:
  385. strcat(info, " ");
  386. newGuiShowStr(0, STATUS_BAR_HEIGH, info, REVERSED_NO, FONT_MODE_16X16);
  387. break;
  388. case (1000/APP_SUB_DIV_TIME):
  389. strcat(info, ". ");
  390. newGuiShowStr(0, STATUS_BAR_HEIGH, info, REVERSED_NO, FONT_MODE_16X16);
  391. break;
  392. case (2000/APP_SUB_DIV_TIME):
  393. strcat(info, "..");
  394. newGuiShowStr(0, STATUS_BAR_HEIGH, info, REVERSED_NO, FONT_MODE_16X16);
  395. break;
  396. }
  397. //显示登录状态
  398. uiShowOffLineMessage();
  399. }
  400. #ifdef USE_LEFT_MOVING
  401. movingShowNames(APP_SUB_DIV_TIME,reset,moveFlash,voice);
  402. #endif
  403. if(++siCt>=(3000/APP_SUB_DIV_TIME)) siCt=0;
  404. if(Flag != lastFlag) lastFlag=Flag;
  405. }
  406. static void uiShowGUName(int update){
  407. static char scNameUser[POC_GROUP_USER_NAME_LEN];
  408. static char scNameGroup[POC_GROUP_USER_NAME_LEN];
  409. char name[POC_GROUP_USER_NAME_LEN];
  410. unsigned short len;
  411. const unsigned char danHuanBuffer[9]={0xB5,0xA5,0xBA,0xF4,0xC4,0xA3,0xCA,0xBD,0};
  412. char GroupShowUpdate=0;
  413. char UserShowUpdate=0;
  414. if(sutPocStatus.danHuStatus==0){
  415. if(0!=strcmp(sutPocStatus.LocalGroup.name,scNameGroup) || update!=0){
  416. memset(scNameGroup,0,sizeof(scNameGroup));
  417. memcpy(scNameGroup,sutPocStatus.LocalGroup.name,sizeof(scNameGroup));
  418. GroupShowUpdate=1;
  419. }
  420. }else{
  421. if(0!=strcmp((char *)danHuanBuffer,scNameGroup) || update!=0){
  422. memset(scNameGroup,0,sizeof(scNameGroup));
  423. memcpy(scNameGroup, danHuanBuffer,sizeof(danHuanBuffer));
  424. GroupShowUpdate=1;
  425. }
  426. }
  427. if(0!=strcmp(sutPocStatus.LocalUser.name,scNameUser) || update!=0){
  428. memset(scNameUser,0,sizeof(scNameUser));
  429. memcpy(scNameUser,sutPocStatus.LocalUser.name,sizeof(scNameUser));
  430. UserShowUpdate=1;
  431. }
  432. if(GroupShowUpdate){
  433. guiClearRect(0,UI_GROUP_SHOW_Y,GLCD_WIDTH-1,UI_GROUP_SHOW_Y+16+2,guiGetBackColor());//18
  434. //刷新群组栏
  435. if(sutPocStatus.danHuStatus==0) StrIntercept(name, scNameGroup, sizeof(name));
  436. else snprintf(name, sizeof(name), "单呼模式");
  437. uiShowGroup(name);
  438. sutPocStatus.statusChaned=1;
  439. }
  440. if(UserShowUpdate){
  441. guiClearRect(0,UI_USER_SHOW_Y,GLCD_WIDTH-1,UI_GROUP_SHOW_Y+16,guiGetBackColor());//18
  442. //刷新成员栏
  443. StrIntercept(name, scNameUser, sizeof(name));
  444. uiShowUser(name);
  445. }
  446. }
  447. static void uiShowGuaDuan(unsigned char danhu){
  448. return;
  449. if(danhu==0) guiClearArea(GLCD_WIDTH-32, UI_BOTTOM_SHOW_Y, 32, 14, guiGetBackColor());
  450. else guiShowStr(GLCD_WIDTH-32, UI_BOTTOM_SHOW_Y, "挂断", FONT_MODE_12X12, REVERSED_NO, COLOR_STATUS_BAR,guiGetBackColor());
  451. }
  452. static void uiShowGroup(const char* info){
  453. guiClearRect(2, UI_GROUP_SHOW_Y-2, GLCD_WIDTH-1, UI_GROUP_SHOW_Y-2+17, guiGetBackColor());
  454. guiShowStr(2, UI_GROUP_SHOW_Y+2,"群组:", FONT_MODE_12X12, REVERSED_NO,COLOR_BLACK,guiGetBackColor());
  455. #ifdef USE_12X12_FONT_ONLY
  456. guiShowStr(2+30, UI_GROUP_SHOW_Y+2,info, FONT_MODE_12X12, REVERSED_NO,COLOR_BLACK,guiGetBackColor());
  457. #else
  458. guiShowStr(2+30, UI_GROUP_SHOW_Y+2,info, FONT_MODE_12X12, REVERSED_NO,COLOR_BLACK,guiGetBackColor());
  459. #endif
  460. }
  461. static void uiShowUser(const char* info){
  462. guiClearRect(2, UI_USER_SHOW_Y-2, GLCD_WIDTH-1, UI_USER_SHOW_Y-2+17, guiGetBackColor());
  463. guiShowStr(2, UI_USER_SHOW_Y+2,"成员:", FONT_MODE_12X12, REVERSED_NO,COLOR_BLACK,guiGetBackColor());
  464. #ifdef USE_12X12_FONT_ONLY
  465. guiShowStr(2+30, UI_USER_SHOW_Y+2,info, FONT_MODE_12X12, REVERSED_NO,COLOR_BLACK,guiGetBackColor());
  466. #else
  467. guiShowStr(2+30, UI_USER_SHOW_Y+2,info, FONT_MODE_12X12, REVERSED_NO,COLOR_BLACK,guiGetBackColor());
  468. #endif
  469. }
  470. void showGroup(void){
  471. uiShowGroup("默认群组");
  472. }
  473. void showUser(void){
  474. uiShowUser("小明");
  475. }
  476. static void uiShowHuaQuan(const char* info){
  477. guiClearRect(2, UI_VOICE_SHOW_Y-2, GLCD_WIDTH-1, UI_VOICE_SHOW_Y-2+17, guiGetBackColor());
  478. guiShowStr(2, UI_VOICE_SHOW_Y+2,"话权:", FONT_MODE_12X12, REVERSED_NO,COLOR_BLACK,guiGetBackColor());
  479. #ifdef USE_12X12_FONT_ONLY
  480. guiShowStr(2+30, UI_VOICE_SHOW_Y+2,info, FONT_MODE_12X12, REVERSED_NO,COLOR_BLACK,guiGetBackColor());
  481. #else
  482. guiShowStr(2+30, UI_VOICE_SHOW_Y+2,info, FONT_MODE_12X12, REVERSED_NO,COLOR_BLACK,guiGetBackColor());
  483. #endif
  484. }
  485. static void uiShowCallUserName(void){
  486. static char scName[POC_GROUP_USER_NAME_LEN];
  487. char name[POC_GROUP_USER_NAME_LEN];
  488. if(0 != strncmp(scName, sutPocStatus.CallName, POC_GROUP_USER_NAME_LEN) ||
  489. sutPocStatus.statusChaned){
  490. //当名字变更或UI切换了,刷新显示
  491. sutPocStatus.statusChaned=0;
  492. memcpy(scName, sutPocStatus.CallName, POC_GROUP_USER_NAME_LEN);
  493. uiShowHuaQuan(scName);
  494. }
  495. }
  496. static void uiShowOffLineMessage(void){
  497. static unsigned char laReason;
  498. char info[50],update=0;
  499. unsigned short y;
  500. if(sutUIstatus.Status != UIS_STANDBY) return;
  501. if(sutPocStatus.PocLineOffReason==laReason && sutUIstatus.ItemRefresh==0) return;
  502. sutUIstatus.ItemRefresh=0;
  503. laReason=sutPocStatus.PocLineOffReason;
  504. if(sutApp.cardStatus==0){
  505. snprintf(info, sizeof(info), "请插卡");
  506. update=1;
  507. }else{
  508. switch(sutPocStatus.PocLineOffReason){
  509. case 1:snprintf(info, sizeof(info), "无网络连接");break;
  510. case 2:snprintf(info, sizeof(info), "无法连接");break;
  511. case 3:snprintf(info, sizeof(info), "没有服务");break;
  512. case 4:snprintf(info, sizeof(info), "账号信息错误");break;
  513. }
  514. if(sutPocStatus.PocLineOffReason!=0) update=1;
  515. }
  516. if(update!=0){
  517. newGuiClearMainPage();
  518. newGuiShowStr(0, STATUS_BAR_HEIGH+16, info, REVERSED_NO, FONT_MODE_16X16);
  519. }
  520. }
  521. /****************************待机界面显示部分结束***********************************/
  522. /****************************主菜单显示部分开始*************************************/
  523. #include "Palace.h"
  524. void uiShowMenuMain(char update){
  525. static const char *apcMenuMain[]={
  526. "群组选择",
  527. "成员选择",
  528. "文本信息",
  529. "系统设置",
  530. "定位设置",
  531. "终端信息",
  532. ""
  533. };
  534. if(update) dotListBoxInit(apcMenuMain,"主菜单",-1,-1,0);
  535. }
  536. void MenuMainResponse(void){
  537. unsigned short handle;
  538. unsigned short key;
  539. key=dotListBoxResponse();
  540. if(MKEY_VALUE_MENU==key){
  541. handle=dotListGetHandle();
  542. switch(handle){
  543. case 0:
  544. uISetNextStatus(UIS_MENU_GROUP_SEL);
  545. break;
  546. case 1:
  547. uISetNextStatus(UIS_MENU_USER_SEL);
  548. break;
  549. case 2:
  550. uISetNextStatus(UIS_MENU_MAIL_SEL);
  551. break;
  552. case 3:
  553. uISetNextStatus(UIS_MENU_SYS_SEL);
  554. break;
  555. case 4:
  556. uISetNextStatus(UIS_MENU_LOCATION_SEL);
  557. break;
  558. case 5:
  559. uISetNextStatus(UIS_MENU_INFO_SEL);
  560. break;
  561. }
  562. uiPushStack(handle);
  563. }
  564. else if(MKEY_VALUE_ESC==key){
  565. uISetNextStatus(UIS_STANDBY);
  566. }
  567. }
  568. /****************************主菜单显示部分结束*************************************/
  569. /*****************************群组选择/成员选择部分开始*********************************/
  570. bool uiSwitchLock=false;
  571. bool isUiSwitchReady(void){return uiSwitchLock;}
  572. static char GUListBoxInited=0;
  573. static char SelMachine=0;
  574. static void ReFlashItemGU(char type);
  575. static void UserAssistAdd(void);
  576. void numGUFlash(int index, int total){
  577. char info[10];
  578. int x;
  579. snprintf(info, sizeof(info), "%d", total);
  580. x=GLCD_WIDTH-strlen(info)*12;
  581. guiClearRect(78, UI_STATUS_ITEM_Y, GLCD_WIDTH-1, UI_STATUS_ITEM_Y+12, guiGetForeColor());
  582. guiShowStr(x, UI_STATUS_ITEM_Y+1, info, FONT_MODE_12X12, REVERSED_NO, guiGetBackColor(), guiGetForeColor());
  583. }
  584. bool setHandleToZero=true;
  585. void uiShowGUSel(char StatusUpdate,unsigned int exeInterval,char type){
  586. static char machine;
  587. static unsigned int timer;
  588. unsigned short timeout;
  589. char temp;
  590. if(StatusUpdate) machine=0;
  591. switch(machine){
  592. case 0:
  593. newGuiClearMainPage();
  594. if(sutPocStatus.logined == 0){//not login
  595. newGuiShowMessageBox("请先登录", ROW_TWO);
  596. uTimerStart(&timer, 1000);
  597. machine=1;
  598. }else{
  599. newGuiShowMessageBox("请等候", ROW_TWO);
  600. uiSwitchLock=true;
  601. if(type==0) appSleepCtl(ASLEEP_GGROUP, 1);//要获取群组信息,不让休眠,记得超时或获取成功或获取失败后需要释放
  602. else appSleepCtl(ASLEEP_GUSER, 1);
  603. UiassistStart(0);
  604. machine=2;
  605. setHandleToZero=true;
  606. }
  607. break;
  608. case 1:
  609. if(uTimerExpired(&timer)){
  610. uISetNextStatus(UIS_STANDBY);
  611. }
  612. break;
  613. case 2:
  614. temp=getAssistResult();
  615. if(temp){//??è?íê3é
  616. ReFlashItemGU(type);
  617. machine=3;
  618. //获取成功后退出释放休眠
  619. if(type==0) appSleepCtl(ASLEEP_GGROUP, 0);
  620. else appSleepCtl(ASLEEP_GUSER, 0);
  621. uiSwitchLock=false;
  622. }
  623. break;
  624. }
  625. if(machine != 3) return;
  626. UserAssistAdd();
  627. dotLeftMoveSelectedItem();
  628. }
  629. void GroupSelResponse(){
  630. unsigned int key;
  631. char buf[50];
  632. int i;
  633. key=getKeyValue();
  634. switch(SelMachine){
  635. case 0:
  636. if(dotListGetHandle()==0 && MKEY_VALUE_UP==key){
  637. UiassistStart(1);
  638. SelMachine=1;
  639. }else if(((dotListGetHandle()+1) == dotListGetItemNum()) && (MKEY_VALUE_DOWN==key)){
  640. setHandleToZero=true;
  641. UiassistStart(2);
  642. SelMachine=2;
  643. }
  644. key=dotListBoxResponse();
  645. if(MKEY_VALUE_ESC==key){
  646. uiAssist.status=0;
  647. if(getStackStruct()->FastUiChange)uISetNextStatus(UIS_STANDBY);
  648. else uISetNextStatus(UIS_MENU_MAIN);
  649. appSleepCtl(ASLEEP_GGROUP, 0);//按键退出后释放休眠
  650. GUListBoxInited=0;
  651. uiSwitchLock=false;
  652. }else if(MKEY_VALUE_MENU==key){
  653. if(0 == sutPocStatus.ListCurOnlineNum) break;
  654. ///////////////////////////////////////
  655. UiassistEnd(0);
  656. sutApp.groupTTSEnable=1;
  657. snprintf(buf, sizeof(buf),"AT+POC=090000%08x\r\n",sutPocStatus.AllGroups[dotListGetHandle()].ID);
  658. msgAtSend(buf);
  659. MSG_INFO(1,buf);
  660. snprintf(buf, sizeof(buf),"进入:%s",sutPocStatus.AllGroups[dotListGetHandle()].name);
  661. MSG_INFO(1,buf);
  662. uISetNextStatus(UIS_STANDBY);
  663. SelMachine=0;
  664. }
  665. break;
  666. }
  667. }
  668. void UserSelResponse(){
  669. char buf[50];
  670. unsigned int key;
  671. key=getKeyValue();
  672. switch(SelMachine){
  673. case 0:
  674. if(GUListBoxInited==0) break;//还未初始化listbox时,不执行按键响应
  675. if(dotListGetHandle()==0 && MKEY_VALUE_UP==key){
  676. UiassistStart(1);
  677. SelMachine=1;
  678. }else if((dotListGetHandle()+1) == dotListGetItemNum() && (MKEY_VALUE_DOWN==key)){
  679. setHandleToZero=true;
  680. UiassistStart(2);
  681. SelMachine=2;
  682. }
  683. key=dotListBoxResponse();
  684. if(MKEY_VALUE_ESC==key){
  685. uiAssist.status=0;
  686. if(getStackStruct()->FastUiChange)uISetNextStatus(UIS_STANDBY);
  687. else uISetNextStatus(UIS_MENU_MAIN);
  688. appSleepCtl(ASLEEP_GUSER, 0);//按键退出后释放休眠
  689. GUListBoxInited=0;
  690. uiSwitchLock=false;
  691. }else if(MKEY_VALUE_MENU==key){
  692. if(0 == sutPocStatus.ListCurOnlineNum) break;
  693. UiassistEnd(0);
  694. snprintf(buf, sizeof(buf),"AT+POC=0A0000%08x\r\n",sutPocStatus.AllUsers[dotListGetHandle()].ID);
  695. msgAtSend(buf);
  696. MSG_INFO(1, buf);
  697. snprintf(buf, sizeof(buf),"呼叫:%s",sutPocStatus.AllUsers[dotListGetHandle()].name);
  698. MSG_INFO(1, buf);
  699. uISetNextStatus(UIS_STANDBY);
  700. SelMachine=0;
  701. }
  702. break;
  703. }
  704. }
  705. static void UserAssistAdd(void){
  706. switch(SelMachine){
  707. case 1:
  708. if(getAssistResult()){
  709. if(sutUIstatus.Status==UIS_MENU_GROUP_SEL)ReFlashItemGU(0);
  710. else ReFlashItemGU(1);
  711. SelMachine=0;
  712. }
  713. break;
  714. case 2:
  715. if(getAssistResult()){
  716. if(sutUIstatus.Status==UIS_MENU_GROUP_SEL)ReFlashItemGU(0);
  717. else ReFlashItemGU(1);
  718. SelMachine=0;
  719. }
  720. break;
  721. }
  722. }
  723. static void ReFlashItemGU(char type){
  724. int i;
  725. static char *GUName[POC_ALL_GROUPS_NUM+1];
  726. static const char *NullGU="";
  727. unsigned int showHandle;
  728. for(i=0;i<=POC_ALL_GROUPS_NUM;i++) GUName[i]=NullGU;
  729. for(i=0;i<sutPocStatus.ListFillIndex;i++){
  730. if(type==0){
  731. GUName[i]=sutPocStatus.AllGroups[i].name;
  732. }else{
  733. GUName[i]=sutPocStatus.AllUsers[i].name;
  734. }
  735. }
  736. if(sutPocStatus.ListCurOnlineNum==0 || sutPocStatus.ListDetailValid==0){//没有成员总数或没有获取到明细
  737. GUName[0]="空";
  738. }
  739. if(setHandleToZero==true){
  740. showHandle=0;
  741. setHandleToZero=false;
  742. }else{
  743. if(sutPocStatus.ListFillIndex) showHandle=sutPocStatus.ListFillIndex-1;
  744. else showHandle=0;
  745. }
  746. if(type==0) dotListBoxInit(GUName,"群组列表",sutPocStatus.ListCurOnlineNum,showHandle,sutPocStatus.handleIndex);
  747. else dotListBoxInit(GUName,"成员列表",sutPocStatus.ListCurOnlineNum,showHandle,sutPocStatus.handleIndex);
  748. GUListBoxInited=1;
  749. }
  750. /*****************************群组选择/成员选择部分结束*********************************/
  751. /*****************************系统设置部分开始*********************************/
  752. void uiShowMenuSysSetup(char flash){
  753. static const char *apcPtr[]={
  754. "LCD设置",
  755. "功耗模式设置",
  756. "提示音设置",
  757. "键锁设置",
  758. "工程设置",
  759. ""
  760. };
  761. if(flash){
  762. msgAtSend("AT+RSIM\r\n");//进此菜单前查询一下卡用于后面显示
  763. dotListBoxInit(apcPtr,"系统设置",-1,-1,0);
  764. }
  765. }
  766. void sysTemSetResponse(void){
  767. unsigned short key;
  768. unsigned short handle;
  769. key=dotListBoxResponse();
  770. if(MKEY_VALUE_MENU==key){
  771. handle=dotListGetHandle();
  772. switch(handle){
  773. case 0://LCD设置
  774. uISetNextStatus(UIS_MENU_SYS_LCD);
  775. break;
  776. case 1://功耗模式设置
  777. uISetNextStatus(UIS_MENU_SYS_PWR);
  778. break;
  779. case 2://提示音设置
  780. uISetNextStatus(UIS_MENU_SYS_NOTE);
  781. break;
  782. case 3://键锁设置
  783. uISetNextStatus(UIS_MENU_SYS_LOCK);
  784. break;
  785. case 4://工程设置
  786. uISetNextStatus(UIS_MENU_SYS_FACTORY);
  787. break;
  788. }
  789. if(handle<=4) uiPushStack(handle);
  790. }else if(MKEY_VALUE_ESC==key) uISetNextStatus(UIS_MENU_MAIN);
  791. }
  792. /*****************************系统设置部分结束*********************************/
  793. /*****************************定位设置部分开始*********************************/
  794. static locationTimeFlash(char type);
  795. static locationXYFlash(char flash);
  796. void uiShowMenuLocationSel(char flash){
  797. static unsigned int timer;
  798. static char machine=0;
  799. if(flash){
  800. machine=0;
  801. newGuiClearMainPage();
  802. newGuiShowStr(0, 16, "定位设置",REVERSED_NO,FONT_MODE_16X16);
  803. if(newPara.gpsEnable==0){
  804. machine=1;
  805. newGuiShowMessageBox("版本不支持", ROW_THREE);
  806. uTimerStart(&timer, 1000);
  807. return;
  808. }
  809. locationTimeFlash(0);
  810. }
  811. if(newPara.gpsEnable!=0) locationXYFlash(flash);
  812. if(machine==1){
  813. if(uTimerExpired(&timer)){
  814. machine=0;
  815. uISetNextStatus(UIS_MENU_MAIN);
  816. }
  817. }
  818. }
  819. void loationSetResponse(void){
  820. unsigned short key;
  821. key=getKeyValue();
  822. if(newPara.gpsEnable==0){
  823. if(key!=MKEY_VALUE_ESC) return;
  824. }
  825. if(MKEY_VALUE_UP==key) locationTimeFlash(1);
  826. else if(MKEY_VALUE_DOWN==key) locationTimeFlash(2);
  827. else if(MKEY_VALUE_ESC==key) uISetNextStatus(UIS_MENU_MAIN);
  828. else if(MKEY_VALUE_MENU==key){
  829. if(uiTmpVal != newPara.gpsTimeIndex){
  830. MSG_INFO(1, "GPS timeIndex update:%d",getGPSTimeValue(uiTmpVal));
  831. newPara.gpsTimeIndex=uiTmpVal;
  832. sysIniSave();
  833. gpsCheckInfo();//检测一下
  834. }
  835. uISetNextStatus(UIS_MENU_MAIN);
  836. }
  837. }
  838. static locationTimeFlash(char type){
  839. unsigned short gpsTimeValue;
  840. char buf[50];
  841. unsigned short y=70;
  842. if(type==0){
  843. uiTmpVal=newPara.gpsTimeIndex;
  844. }else if(type==1){
  845. if(++uiTmpVal>=GPS_TABLE_NUM) uiTmpVal=0;
  846. }else if(type==2){
  847. if(uiTmpVal>0) uiTmpVal--;
  848. else uiTmpVal=GPS_TABLE_NUM-1;
  849. }else return;
  850. gpsTimeValue=getGPSTimeValue(uiTmpVal);
  851. if(gpsTimeValue==0) snprintf(buf, sizeof(buf), "关闭");
  852. else snprintf(buf, sizeof(buf), "间隔:%d秒",gpsTimeValue);
  853. newGuiClearPage(0, ROW_THREE);
  854. newGuiShowStr(0, 32, buf,REVERSED_NO,FONT_MODE_16X16);
  855. }
  856. static locationXYFlash(char flash){
  857. char buf[50];
  858. unsigned short y=UI_CONTENT_SHOW_Y+2;
  859. if(gpsInfo.update==0 && flash==0) return;
  860. gpsInfo.update=0;
  861. guiClearRect(0, y,GLCD_WIDTH-1, y+12+5+12,guiGetBackColor());
  862. snprintf(buf, sizeof(buf), "纬度 S:%d.%05d",gpsInfo.Lat/1000000,gpsInfo.Lat%1000000);
  863. guiShowStr(30,y, buf,FONT_MODE_12X12, REVERSED_NO, COLOR_BLACK, guiGetBackColor());
  864. y+=12+5;
  865. snprintf(buf, sizeof(buf), "经度 W:%d.%05d",gpsInfo.Long/1000000,gpsInfo.Long%1000000);
  866. guiShowStr(30,y, buf,FONT_MODE_12X12, REVERSED_NO, COLOR_BLACK, guiGetBackColor());
  867. }
  868. /*****************************定位设置部分结束*********************************/
  869. /*******************************终端信息开始**********************************/
  870. unsigned char sysInfoType;
  871. static void sysInfoFlash(void){
  872. int len;
  873. char info[60];
  874. unsigned char i=STATUS_BAR_HEIGH;
  875. newGuiClearMainPage();
  876. if(sysInfoType==0){
  877. snprintf(info, sizeof(info), "PSN:%s", sutApp.UserInfo.psn);
  878. newGuiShowStr(0, i, info,REVERSED_NO,FONT_MODE_16X16);
  879. i+= 16;
  880. snprintf(info, sizeof(info), "AVER:%s", OHPOC_VERSION);
  881. newGuiShowStr(0, i, info,REVERSED_NO,FONT_MODE_16X16);
  882. i+= 16;
  883. snprintf(info, sizeof(info), "IVER:%d", CUSTOMER_CODE);
  884. newGuiShowStr(0, i, info,REVERSED_NO,FONT_MODE_16X16);
  885. }else if(sysInfoType==1){
  886. snprintf(info, sizeof(info), "PLAT:%s", OHPOC_POC_PLATFORM);
  887. newGuiShowStr(0, i, info,REVERSED_NO,FONT_MODE_16X16);
  888. i+= 16;
  889. snprintf(info, sizeof(info), "VPOC:%s",sutApp.pocVersion);
  890. newGuiShowStr(0, i, info,REVERSED_NO,FONT_MODE_16X16);
  891. }else if(sysInfoType==2){
  892. snprintf(info, sizeof(info), "VMOD:%s", sutApp.modemVer);
  893. len=strlen(info);
  894. if(len>16){
  895. i+= 16;
  896. newGuiShowStr(0, i, info+16,REVERSED_NO,FONT_MODE_16X16);
  897. i-= 16;
  898. info[16]=0;
  899. }
  900. newGuiShowStr(0, i, info,REVERSED_NO,FONT_MODE_16X16);
  901. }else if(sysInfoType==3){
  902. snprintf(info, sizeof(info), "IMEI:%s", ohpocGetIMEI());
  903. len=strlen(info);
  904. if(len>16){
  905. i+= 16;
  906. newGuiShowStr(0, i, info+16,REVERSED_NO,FONT_MODE_16X16);
  907. i-= 16;
  908. info[16]=0;
  909. }
  910. newGuiShowStr(0, i, info,REVERSED_NO,FONT_MODE_16X16);
  911. }else if(sysInfoType==4){
  912. snprintf(info, sizeof(info), "P%s",showPIP);
  913. newGuiShowStr(0, i, info,REVERSED_NO,FONT_MODE_16X16);
  914. i+= 16;
  915. snprintf(info, sizeof(info), "G%s",showGIP);
  916. newGuiShowStr(0, i, info,REVERSED_NO,FONT_MODE_16X16);
  917. i+= 16;
  918. snprintf(info, sizeof(info), "%d",newPara.gpsPort);
  919. newGuiShowStr(0, i, info,REVERSED_NO,FONT_MODE_16X16);
  920. }
  921. }
  922. void uiShowInformation(char update){
  923. if(update){
  924. sysInfoType=0;
  925. sysInfoFlash();
  926. }
  927. }
  928. void uiShowInformationResponse(void){
  929. unsigned short key=getKeyValue();
  930. if(MKEY_VALUE_ESC==key) uISetNextStatus(sutUIstatus.LastStatus);
  931. else if(MKEY_VALUE_DOWN==key){
  932. if(++sysInfoType>3) sysInfoType=0;
  933. sysInfoFlash();
  934. }else if(MKEY_VALUE_UP==key){
  935. if(sysInfoType==0) sysInfoType=3;
  936. else sysInfoType--;
  937. sysInfoFlash();
  938. }else if(MKEY_VALUE_CB_IP==key){
  939. sysInfoType=4;
  940. sysInfoFlash();
  941. }
  942. }
  943. /*****************************终端信息结束**********************************/
  944. static const char *commonIcon2[]={
  945. "APN.bmp",
  946. "APN1.bmp",
  947. ""
  948. };
  949. /*****************************LCD设置开始**********************************/
  950. static void lcdTimeFlash(char type){
  951. char buf[50];
  952. unsigned short x=4,y=56,value;
  953. if(type==1){
  954. if(++uiTmpVal>=5) uiTmpVal=0;
  955. }else if(type==2){
  956. if(uiTmpVal>0) uiTmpVal--;
  957. else uiTmpVal=4;
  958. }else if(type!=0) return;
  959. value=newPara.lcdParaList[uiTmpVal];
  960. if(value==0) snprintf(buf, sizeof(buf), "常亮");
  961. else snprintf(buf, sizeof(buf), "%3d 秒", value);
  962. newGuiClearPage(0, ROW_FOUR);
  963. newGuiShowStr(0, 48, buf,REVERSED_NO,FONT_MODE_16X16);
  964. if(uiTmpVal==newPara.lcdParaDefaultIndex) guiShowBinMap(GLCD_WIDTH-15,48,"APN1.bin");
  965. }
  966. void uiShowLcdSel(char StatusUpdate){
  967. if(StatusUpdate){
  968. newGuiClearMainPage();
  969. newGuiShowStr(0, 16, "LCD设置",REVERSED_NO,FONT_MODE_16X16);
  970. newGuiShowStr(0, 32, "背光时长",REVERSED_NO,FONT_MODE_16X16);
  971. uiTmpVal=newPara.lcdParaDefaultIndex;
  972. lcdTimeFlash(0);
  973. }
  974. }
  975. void uiShowLcdSelResponse(void){
  976. unsigned short key=getKeyValue();
  977. if(MKEY_VALUE_ESC==key) uISetNextStatus(UIS_MENU_SYS_SEL);
  978. else if(MKEY_VALUE_DOWN==key)lcdTimeFlash(1);
  979. else if(MKEY_VALUE_UP==key) lcdTimeFlash(2);
  980. else if(MKEY_VALUE_MENU==key){
  981. getStackStruct()->ok_back=1;
  982. if(uiTmpVal != newPara.lcdParaDefaultIndex){
  983. newPara.lcdParaDefaultIndex=uiTmpVal;
  984. MSG_INFO(1, "LCD TimeUpdate");
  985. backLightReset();
  986. sysIniSave();
  987. }
  988. uISetNextStatus(UIS_MENU_SYS_SEL);
  989. }
  990. }
  991. /*****************************LCD设置结束**********************************/
  992. /*****************************网络设置开始**********************************/
  993. const unsigned char netModeSetTable[3]={1,2,4};//设置制式:AUTH,2G,4G
  994. /*输入制式源始值,返回索引值对应值*/
  995. unsigned char getNetModeIndex(unsigned char netModeValue){
  996. unsigned char i;
  997. for(i=0;i<sizeof(netModeSetTable);i++){
  998. if(netModeValue==netModeSetTable[i]) return i;
  999. }
  1000. return 0xff;//无对应值
  1001. }
  1002. /*输入制式索引值,返回制式源始值*/
  1003. unsigned char getNetModeValue(unsigned char netModeIndex){
  1004. if(netModeIndex>=sizeof(netModeSetTable)) return 0xff;
  1005. else return netModeSetTable[netModeIndex];
  1006. }
  1007. /*输入制式索引值,发送对应该命令给模块*/
  1008. void netModeSetCmd(unsigned char netMode){
  1009. char buf[30];
  1010. snprintf(buf, sizeof(buf), "AT+CTEC=%d,%d\r\n",ctecCurrentSet, netMode);
  1011. msgAtSend(buf);
  1012. }
  1013. #define NET_MODE_NUM 3
  1014. void uiShowNetSel(char StatusUpdate){
  1015. static const char *netMode[NET_MODE_NUM+1]={
  1016. "AUTO",
  1017. "2G",
  1018. "4G",
  1019. ""
  1020. };
  1021. char Features[NET_MODE_NUM];
  1022. unsigned char i;
  1023. if(StatusUpdate){
  1024. guiClearAll(guiGetBackColor());
  1025. guiShowCaption(0,"网络设置",UI_STATUS_ITEM_Y+1,guiGetBackColor(),guiGetForeColor(),FONT_MODE_12X12);
  1026. uiMenuShowBottomLine();
  1027. for(i=0;i<NET_MODE_NUM;i++){
  1028. if(i==newPara.netMode) Features[i]=1;
  1029. else Features[i]=0;
  1030. }
  1031. ListBoxInit(&sutListBox,netMode,0,commonIcon2,Features,0);
  1032. uiMenuShowBottomIndacitor("保存", "返回");
  1033. }
  1034. }
  1035. void uiShowNetSelResponse(void){
  1036. unsigned short key=ListBoxResponse(&sutListBox);
  1037. if(MKEY_VALUE_ESC==key) uISetNextStatus(UIS_MENU_SYS_SEL);
  1038. else if(MKEY_VALUE_MENU==key){
  1039. getStackStruct()->ok_back=1;
  1040. if(sutListBox.handle*2 != newPara.netMode){
  1041. newPara.netMode=sutListBox.handle*2;
  1042. MSG_INFO(1, "netMode update:%d", newPara.netMode);
  1043. sysIniSave();
  1044. netModeSetCmd(newPara.netMode);
  1045. }
  1046. uISetNextStatus(UIS_MENU_SYS_SEL);
  1047. }
  1048. }
  1049. /*****************************网络设置结束**********************************/
  1050. /*****************************卡选择设置开始**********************************/
  1051. #define SIM_MODE_NUM 2
  1052. void uiShowSimSel(char StatusUpdate){
  1053. static const char *simMode[SIM_MODE_NUM+1]={
  1054. "卡1",
  1055. "卡2",
  1056. ""
  1057. };
  1058. char Features[SIM_MODE_NUM];
  1059. unsigned char i;
  1060. if(StatusUpdate){
  1061. guiClearAll(guiGetBackColor());
  1062. guiShowCaption(0,"SIM设置",UI_STATUS_ITEM_Y+1,guiGetBackColor(),guiGetForeColor(),FONT_MODE_12X12);
  1063. uiMenuShowBottomLine();
  1064. for(i=0;i<SIM_MODE_NUM;i++){
  1065. if(i==sutApp.simSel) Features[i]=1;
  1066. else Features[i]=0;
  1067. }
  1068. ListBoxInit(&sutListBox,simMode,0,commonIcon2,Features,0);
  1069. uiMenuShowBottomIndacitor("保存", "返回");
  1070. }
  1071. }
  1072. void uiShowSimSelResponse(void){
  1073. char buf[30];
  1074. unsigned short key=ListBoxResponse(&sutListBox);
  1075. if(MKEY_VALUE_ESC==key){
  1076. if(getStackStruct()->FastUiChange)uISetNextStatus(UIS_STANDBY);
  1077. else uISetNextStatus(UIS_MENU_SYS_SEL);
  1078. }else if(MKEY_VALUE_MENU==key){
  1079. getStackStruct()->ok_back=1;
  1080. if(sutListBox.handle != sutApp.simSel){
  1081. snprintf(buf, sizeof(buf), "AT+SIMCROSS=%d\r\n",sutListBox.handle);
  1082. msgAtSend(buf);
  1083. guiShowMessageBox("请重启设备");
  1084. msgAtSend("AT+TRB\r\n");
  1085. LSAPI_OSI_ThreadSleep(100);
  1086. CTL_POWER_HOLD(false);
  1087. for(;;){
  1088. MSG_INFO(1, "card changed, wait user reboot");
  1089. CTL_POWER_HOLD(false);
  1090. LSAPI_OSI_ThreadSleep(1000);
  1091. }
  1092. }
  1093. uISetNextStatus(UIS_MENU_SYS_SEL);
  1094. }
  1095. }
  1096. /*****************************卡选择设置结束**********************************/
  1097. /*****************************功耗设置开始**********************************/
  1098. typedef enum{
  1099. PMODE_DEFAULT_LOW,
  1100. PMODE_SUPER_LOW,
  1101. PMODE_NORMAL
  1102. }PWR_ENUMDEF;
  1103. //低功耗模式
  1104. #define MODE_LOW_PWR_NONE_4G 5
  1105. #define MODE_LOW_PWR_IS_4G 25
  1106. //超长待机模式
  1107. #define MODE_LONG_LOW_PWR_NONE_4G 5
  1108. #define MODE_LONG_LOW_PWR_IS_4G 55
  1109. //常规模式
  1110. #define MODE_NORMAL__NONE_4G 5
  1111. #define MODE_NORMAL__IS_4G 5
  1112. //终端放弃设置模式,由服务器决定使用什么
  1113. #define MODE_AUTO____NONE_4G 0
  1114. #define MODE_AUTO____IS_4G 0
  1115. //默认功耗模式
  1116. #define MODE_PWR_DEFAULT_NONE_4G MODE_LOW_PWR_NONE_4G
  1117. #define MODE_PWR_DEFAULT_IS_4G MODE_LOW_PWR_IS_4G
  1118. static void pwrModeSetCmd(unsigned char pwrMode){
  1119. unsigned char seg1,seg2;
  1120. char buf[30];
  1121. if(pwrMode==PMODE_DEFAULT_LOW){
  1122. seg1=MODE_PWR_DEFAULT_NONE_4G;
  1123. seg2=MODE_PWR_DEFAULT_IS_4G;
  1124. }else if(pwrMode==PMODE_SUPER_LOW){
  1125. seg1=MODE_LONG_LOW_PWR_NONE_4G;
  1126. seg2=MODE_LONG_LOW_PWR_IS_4G;
  1127. }else if(pwrMode==PMODE_NORMAL){
  1128. seg1=MODE_NORMAL__NONE_4G;
  1129. seg2=MODE_NORMAL__IS_4G;
  1130. }else return;
  1131. snprintf(buf, sizeof(buf), "AT+UDP=%d,%d\r\n",seg1,seg2);
  1132. msgAtSend(buf);
  1133. }
  1134. void pwrModeAckHandler(unsigned char seg1, unsigned char seg2){
  1135. if(seg1==MODE_PWR_DEFAULT_NONE_4G && seg2==MODE_PWR_DEFAULT_IS_4G && newPara.pwrMode != PMODE_DEFAULT_LOW){
  1136. goto SAVE_PWR_MODE;
  1137. }else if(seg1==MODE_LONG_LOW_PWR_NONE_4G && seg2==MODE_LONG_LOW_PWR_IS_4G && newPara.pwrMode != PMODE_SUPER_LOW){
  1138. goto SAVE_PWR_MODE;
  1139. }else if(seg1==MODE_NORMAL__NONE_4G && seg2==MODE_NORMAL__IS_4G && newPara.pwrMode != PMODE_NORMAL){
  1140. goto SAVE_PWR_MODE;
  1141. }else if(seg2!=MODE_LOW_PWR_IS_4G&&seg2!=MODE_LONG_LOW_PWR_IS_4G&& seg2!=MODE_NORMAL__IS_4G){
  1142. //Seg2 3个模式都不满足则切换为默认模式
  1143. newPara.pwrMode = PMODE_DEFAULT_LOW;
  1144. goto SAVE_PWR_MODE;
  1145. }
  1146. return;
  1147. SAVE_PWR_MODE:
  1148. sysIniSave();
  1149. pwrModeSetCmd(newPara.pwrMode);
  1150. }
  1151. #define PWR_MODE_NUM 3
  1152. void pwrModeFlash(char type,unsigned char defaultVal){
  1153. if(type==1){
  1154. if(++uiTmpVal>=3) uiTmpVal=0;
  1155. }else if(type==2){
  1156. if(uiTmpVal==0) uiTmpVal=2;
  1157. else uiTmpVal--;
  1158. }else if(type != 0)return;
  1159. newGuiClearPage(0, ROW_FOUR);
  1160. switch(uiTmpVal){
  1161. case 0:newGuiShowStr(0, 48, "低功耗模式",REVERSED_NO,FONT_MODE_16X16);
  1162. break;
  1163. case 1:newGuiShowStr(0, 48, "超长待机模式",REVERSED_NO,FONT_MODE_16X16);
  1164. break;
  1165. case 2:newGuiShowStr(0, 48, "常规模式",REVERSED_NO,FONT_MODE_16X16);
  1166. break;
  1167. }
  1168. if(uiTmpVal==defaultVal) guiShowBinMap(GLCD_WIDTH-15,48,"APN1.bin");
  1169. }
  1170. void uiShowPwrSel(char StatusUpdate){
  1171. if(StatusUpdate){
  1172. newGuiClearMainPage();
  1173. newGuiShowStr(0, 16, "功耗设置",REVERSED_NO,FONT_MODE_16X16);
  1174. newGuiShowStr(0, 32, "类别:",REVERSED_NO,FONT_MODE_16X16);
  1175. uiTmpVal=newPara.pwrMode;
  1176. pwrModeFlash(0,newPara.pwrMode);
  1177. }
  1178. }
  1179. void uiShowPwrSelResponse(void){
  1180. unsigned short key=getKeyValue();
  1181. if(MKEY_VALUE_ESC==key) uISetNextStatus(UIS_MENU_SYS_SEL);
  1182. else if(MKEY_VALUE_MENU==key){
  1183. getStackStruct()->ok_back=1;
  1184. if(uiTmpVal != newPara.pwrMode){
  1185. newPara.pwrMode=uiTmpVal;
  1186. MSG_INFO(1, "pwrMode update:%d", newPara.pwrMode);
  1187. sysIniSave();
  1188. pwrModeSetCmd(newPara.pwrMode);
  1189. }
  1190. uISetNextStatus(UIS_MENU_SYS_SEL);
  1191. }else if(MKEY_VALUE_DOWN==key) pwrModeFlash(1,newPara.pwrMode);
  1192. }
  1193. /*****************************功耗设置结束**********************************/
  1194. /*****************************服务器设置输入密码开始**********************************/
  1195. unsigned char keybuf[6];
  1196. unsigned char keyflash=0;
  1197. void KeyNumFlash(void){
  1198. static char status=0;
  1199. char info[6];
  1200. static unsigned int timer;
  1201. if(++timer<(500/APP_SUB_DIV_TIME) && keyflash==0) return;
  1202. timer=0;
  1203. if(status==0) status=1;
  1204. else status=0;
  1205. if(keyflash==1) status=0;
  1206. else if(keyflash==2) status=1;
  1207. keyflash=0;
  1208. sprintf(info, "%c%c%c%c%c%c",keybuf[0],keybuf[1],keybuf[2],keybuf[3],keybuf[4],keybuf[5]);
  1209. if(status) info[uiTmpVal]='*';
  1210. newGuiShowStr(0, 48, info,REVERSED_NO,FONT_MODE_16X16);
  1211. }
  1212. void uiShowServerPassSel(char StatusUpdate){
  1213. if(StatusUpdate){
  1214. newGuiClearMainPage();
  1215. newGuiShowStr(0, 16, "密码验证",REVERSED_NO,FONT_MODE_16X16);
  1216. newGuiShowStr(0, 32, "P2移动",REVERSED_NO,FONT_MODE_16X16);
  1217. memset(keybuf, '0', sizeof(keybuf));
  1218. uiTmpVal=0;
  1219. }
  1220. KeyNumFlash();
  1221. }
  1222. void uiShowServerSelPassResponse(void){
  1223. unsigned short key=getKeyValue();
  1224. if(MKEY_VALUE_F1==key){
  1225. if(++keybuf[uiTmpVal]>'9') keybuf[uiTmpVal]='0';
  1226. keyflash=1;
  1227. }else if(MKEY_VALUE_F2==key){
  1228. if(++uiTmpVal>=sizeof(keybuf)) uiTmpVal=0;
  1229. keyflash=2;
  1230. }else if(MKEY_VALUE_ESC==key) uISetNextStatus(UIS_MENU_SYS_FACTORY);
  1231. else if(MKEY_VALUE_MENU==key){
  1232. if(memcmp(keybuf, getMenuKey(), 6)==0) uISetNextStatus(UIS_MENU_SYS_SERVER);
  1233. else{
  1234. newGuiShowStr(0, 48, "密码错误!!!",REVERSED_NO,FONT_MODE_16X16);
  1235. LSAPI_OSI_ThreadSleep(1000);
  1236. getStackStruct()->ok_back=1;
  1237. uISetNextStatus(UIS_MENU_SYS_FACTORY);
  1238. }
  1239. }
  1240. }
  1241. /*****************************服务器设置输入密码结束**********************************/
  1242. /*****************************服务器设置开始**********************************/
  1243. void serverFlash(unsigned char defaultVal){
  1244. newGuiClearPage(0, ROW_FOUR);
  1245. switch(uiTmpVal){
  1246. case 0:newGuiShowStr(0, 48, "杭州服务器",REVERSED_NO,FONT_MODE_16X16);break;
  1247. case 1:newGuiShowStr(0, 48, "山东服务器",REVERSED_NO,FONT_MODE_16X16);break;
  1248. case 2:newGuiShowStr(0, 48, "IP分发服务器",REVERSED_NO,FONT_MODE_16X16);break;
  1249. case 3:newGuiShowStr(0, 48, "集群服务器",REVERSED_NO,FONT_MODE_16X16);break;
  1250. case 4:newGuiShowStr(0, 48, "自定义服务器",REVERSED_NO,FONT_MODE_16X16);break;
  1251. }
  1252. if(uiTmpVal==defaultVal) guiShowBinMap(GLCD_WIDTH-15,48,"APN1.bin");
  1253. }
  1254. void uiShowServerSel(char StatusUpdate){
  1255. if(StatusUpdate){
  1256. newGuiClearMainPage();
  1257. newGuiShowStr(0, 16, "服务器列表",REVERSED_NO,FONT_MODE_16X16);
  1258. newGuiShowStr(0, 32, "类别",REVERSED_NO,FONT_MODE_16X16);
  1259. uiTmpVal=newPara.serList.defaultuse;
  1260. serverFlash(newPara.serList.defaultuse);
  1261. }
  1262. }
  1263. void uiShowServerSelResponse(void){
  1264. // unsigned char tempSer;
  1265. // char buf[50],buf1[100];
  1266. // unsigned short key=ListBoxResponse(&sutListBox);
  1267. //
  1268. // if(MKEY_VALUE_ESC==key) uISetNextStatus(UIS_MENU_SYS_SEL);
  1269. // else if(MKEY_VALUE_MENU==key){
  1270. // tempSer=uiTmpVal;
  1271. // if(tempSer != newPara.serList.defaultuse){
  1272. // newPara.serList.defaultuse=tempSer;
  1273. // sysIniSave();
  1274. // getGIPAddr();
  1275. // snprintf(buf, sizeof(buf), "ip=%s;domain=%s;",getPIPAddr(),getDOMAINAddr());
  1276. // AscStrTurnHexStr(buf,buf1);
  1277. // msgAtSend("AT+POC=010000");
  1278. // msgAtSend(buf1);
  1279. // msgAtSend("\r\n");
  1280. // LSAPI_OSI_ThreadSleep(100);
  1281. // msgAtSend("AT+POC=040000\r\n");
  1282. // }
  1283. // uISetNextStatus(UIS_STANDBY );
  1284. // }else if(MKEY_VALUE_DOWN==key){
  1285. // if(++uiTmpVal>=5) uiTmpVal=0;
  1286. // serverFlash(newPara.serList.defaultuse);
  1287. // }
  1288. }
  1289. /*****************************服务器设置结束**********************************/
  1290. /*****************************版本设置开始**********************************/
  1291. unsigned char fotaStep;
  1292. unsigned int fotaTick;
  1293. void fotaStepSet(unsigned char newStep){
  1294. fotaStep=newStep;
  1295. }
  1296. void fotaMsgShow(char *msg){
  1297. #if 1
  1298. newGuiClearPage(0, ROW_THREE);
  1299. newGuiShowStr(0, 32, msg,REVERSED_NO,FONT_MODE_16X16);
  1300. #else
  1301. #ifdef USE_12X12_FONT_ONLY
  1302. int len=guiGetStrXLen((char *)msg,FONT_MODE_12X12);
  1303. #else
  1304. int len=guiGetStrXLen((char *)msg,FONT_MODE_16X16);
  1305. #endif
  1306. guiClearRect(0, 60, GLCD_WIDTH-1, 60+16,guiGetBackColor());
  1307. #ifdef USE_12X12_FONT_ONLY
  1308. guiShowStr((GLCD_WIDTH-len)/2,60+2, msg,FONT_MODE_12X12, REVERSED_NO, COLOR_BLACK, guiGetBackColor());
  1309. #else
  1310. guiShowStr((GLCD_WIDTH-len)/2,60, msg,FONT_MODE_16X16, REVERSED_NO, COLOR_BLACK, guiGetBackColor());
  1311. #endif
  1312. #endif
  1313. }
  1314. void fotaMsgShow2(char *msg1, char *msg2){
  1315. #if 1
  1316. newGuiClearPage(0, ROW_THREE);
  1317. newGuiShowStr(0, 32, msg1,REVERSED_NO,FONT_MODE_16X16);
  1318. newGuiClearPage(0, ROW_FOUR);
  1319. newGuiShowStr(0, 48, msg2,REVERSED_NO,FONT_MODE_16X16);
  1320. #else
  1321. guiClearRect(0, 45, GLCD_WIDTH-1, 45+16+2+16,guiGetBackColor());
  1322. int len=guiGetStrXLen((char *)msg1,FONT_MODE_16X16);
  1323. guiShowStr((GLCD_WIDTH-len)/2,45, msg1,FONT_MODE_16X16, REVERSED_NO, COLOR_BLACK, guiGetBackColor());
  1324. len=guiGetStrXLen((char *)msg2,FONT_MODE_16X16);
  1325. guiShowStr((GLCD_WIDTH-len)/2,45+16+2, msg2,FONT_MODE_16X16, REVERSED_NO, COLOR_BLACK, guiGetBackColor());
  1326. #endif
  1327. }
  1328. void uiShowVersionSel(char StatusUpdate){
  1329. char buf[50];
  1330. if(StatusUpdate){
  1331. sutApp.fotaVersion[0]=0;
  1332. newGuiClearMainPage();
  1333. newGuiShowStr(0, 16, "版本更新",REVERSED_NO,FONT_MODE_16X16);
  1334. msgAtSend("AT+FOTA?\r\n");
  1335. fotaStep=0;
  1336. sutApp.fotaStatus=0;
  1337. fotaMsgShow("正在检测版本.");
  1338. uTimerStart(&fotaTick, 2000);
  1339. }
  1340. switch(fotaStep){
  1341. case 0:
  1342. if(sutApp.fotaStatus==1){
  1343. fotaMsgShow("无更新版本");
  1344. fotaStep=4;
  1345. break;
  1346. }else if(sutApp.fotaStatus==2){
  1347. fotaMsgShow("是否更新到:");
  1348. snprintf(buf, sizeof(buf), "%s",sutApp.fotaVersion);
  1349. fotaMsgShow(buf);
  1350. fotaStep=1;
  1351. break;
  1352. }
  1353. if(uTimerExpired(&fotaTick)){
  1354. fotaMsgShow("检测超时");
  1355. fotaStep=4;
  1356. }
  1357. break;
  1358. case 1://等待用户确定
  1359. break;
  1360. case 2://用户确定后等待结果
  1361. if(sutApp.fotaStatus==3){
  1362. fotaMsgShow("升级失败");
  1363. fotaStep=4;
  1364. break;
  1365. }else if(sutApp.fotaStatus==4){
  1366. sutApp.fotaStatus=0;//否则会一直刷新本消息
  1367. fotaMsgShow("正在下载");
  1368. break;
  1369. }else if(sutApp.fotaStatus==5){
  1370. fotaMsgShow("下载成功");
  1371. fotaStep=3;
  1372. break;
  1373. }
  1374. if(uTimerExpired(&fotaTick)){
  1375. fotaMsgShow("超时退出");
  1376. fotaStep=4;
  1377. }
  1378. break;
  1379. case 3://升级成功,等待重启
  1380. LSAPI_OSI_ThreadSleep(1000);
  1381. fotaStep=6;
  1382. fotaMsgShow2("确定将关机,再","开机需约60秒");
  1383. //msgAtSend("AT+POC=050000\r\n");//停止POC后复位
  1384. //MSG_INFO(1, "Stop poc");
  1385. //LSAPI_OSI_ThreadSleep(2000);
  1386. //msgAtSend("AT+TRB\r\n");
  1387. //MSG_INFO(1, "Reset system!!!");
  1388. //while(1){LSAPI_OSI_ThreadSleep(1000);}
  1389. break;
  1390. case 4://延时显示2秒后退出
  1391. uTimerStart(&fotaTick, 2000);
  1392. fotaStep=5;
  1393. break;
  1394. case 5://退出升级流程
  1395. if(uTimerExpired(&fotaTick)){
  1396. getStackStruct()->ok_back=1;
  1397. uISetNextStatus(UIS_MENU_SYS_FACTORY);
  1398. }
  1399. break;
  1400. case 6://无更新版本
  1401. sutApp.timeOutCnt=0;//不让界面返回待机界面
  1402. break;
  1403. }
  1404. }
  1405. void uiShowVersionSelResponse(void){
  1406. unsigned char key=getKeyValue();
  1407. if(fotaStep!=1 && fotaStep!=6) return;
  1408. if(MKEY_VALUE_ESC==key) uISetNextStatus(UIS_MENU_SYS_FACTORY);
  1409. else if(MKEY_VALUE_MENU==key){
  1410. if(fotaStep==1){
  1411. fotaMsgShow("请勿断电!");
  1412. fotaStep=2;
  1413. msgAtSend("AT+FOTA=1\r\n");
  1414. uTimerStart(&fotaTick, 10000);
  1415. }else if(fotaStep==6){
  1416. paControl(false);//防止一直滴音
  1417. MSG_INFO(1, "Reset system!!!");
  1418. msgAtSend("AT+POC=050000\r\n");
  1419. msgAtSend("AT+TRB\r\n");
  1420. while(1){LSAPI_OSI_ThreadSleep(1000);}
  1421. }
  1422. }
  1423. }
  1424. /*****************************版本设置结束**********************************/
  1425. /*****************************工程设置开始*********************************/
  1426. void uiShowFactory(char flash){
  1427. static const char *apcPtr[]={
  1428. "服务器设置",
  1429. "版本升级",
  1430. "CSQ查看",
  1431. "耳机MIC增益",
  1432. // "耳机SPK增益",
  1433. "字库更新",
  1434. ""
  1435. };
  1436. if(flash) dotListBoxInit(apcPtr,"工程设置",-1,-1,0);
  1437. }
  1438. void uiShowFactoryResponse(void){
  1439. unsigned short key;
  1440. unsigned char handle;
  1441. key=dotListBoxResponse();
  1442. if(MKEY_VALUE_MENU==key){
  1443. handle=dotListGetHandle();
  1444. switch(handle){
  1445. case 0://服务器设置
  1446. uISetNextStatus(UIS_MENU_SYS_SERVERPASS);
  1447. break;
  1448. case 1://版本升级
  1449. uISetNextStatus(UIS_MENU_SYS_VERSION);
  1450. break;
  1451. case 2://CSQ查看
  1452. uISetNextStatus(UIS_MENU_SYS_CSQ);
  1453. break;
  1454. case 3://设置mic增益
  1455. uISetNextStatus(UIS_MENU_SYS_MIC);
  1456. break;
  1457. //case 4://耳机SPK增益
  1458. // uISetNextStatus(UIS_MENU_SYS_SPK);
  1459. // break;
  1460. case 4://字库更新
  1461. uISetNextStatus(UIS_MENU_SYS_FONT);
  1462. break;
  1463. }
  1464. if(handle<=4) uiPushStack(handle);
  1465. }else if(MKEY_VALUE_ESC==key) uISetNextStatus(UIS_MENU_SYS_SEL);
  1466. }
  1467. /*****************************工程设置结束***********************************/
  1468. /*****************************提示音设置开始********************************/
  1469. static void switchFlash(unsigned char defaultVal){
  1470. char info[10];
  1471. if(uiTmpVal==0) snprintf(info, sizeof(info), "关闭");
  1472. else snprintf(info, sizeof(info), "打开");
  1473. newGuiClearPage(0, ROW_FOUR);
  1474. newGuiShowStr(0,48,info,REVERSED_NO,FONT_MODE_16X16);
  1475. if(uiTmpVal==defaultVal) guiShowBinMap(GLCD_WIDTH-15,48,"APN1.bin");
  1476. }
  1477. void uiShowNoteSel(char StatusUpdate){
  1478. if(StatusUpdate){
  1479. newGuiClearMainPage();
  1480. newGuiShowStr(0, 16, "提示音设置",REVERSED_NO,FONT_MODE_16X16);
  1481. newGuiShowStr(0, 32, "类别:",REVERSED_NO,FONT_MODE_16X16);
  1482. uiTmpVal=newPara.KeySound;
  1483. switchFlash(newPara.KeySound);
  1484. }
  1485. }
  1486. void uiShowNoteSelResponse(void){
  1487. unsigned short key=getKeyValue();
  1488. if(MKEY_VALUE_ESC==key) uISetNextStatus(UIS_MENU_SYS_SEL);
  1489. else if(MKEY_VALUE_MENU==key){
  1490. getStackStruct()->ok_back=1;
  1491. if(newPara.KeySound != uiTmpVal){
  1492. newPara.KeySound=uiTmpVal;
  1493. #ifndef ENABLE_PWM_BEEP
  1494. if(uiTmpVal==0) msgAtSend("AT+TONES=0\r\n");
  1495. else msgAtSend("AT+TONES=1\r\n");
  1496. #endif
  1497. sysIniSave();
  1498. }
  1499. uISetNextStatus(UIS_MENU_SYS_SEL);
  1500. }else if(MKEY_VALUE_DOWN || MKEY_VALUE_UP){
  1501. if(uiTmpVal==0) uiTmpVal=1;
  1502. else uiTmpVal=0;
  1503. switchFlash(newPara.KeySound);
  1504. }
  1505. }
  1506. /*****************************提示音设置结束********************************/
  1507. /*****************************关机界面提示开始**********************************/
  1508. void uiShowShutDown(char update){
  1509. if(update){
  1510. lcdBackLightApi(1);
  1511. guiClearAll(guiGetBackColor());
  1512. guiShowCaption(0,"关机",UI_STATUS_BAR_HEIGH,guiGetBackColor(),guiGetForeColor(),FONT_MODE_12X12);
  1513. guiShowMessageBox("确定关机?");
  1514. uiMenuShowBottomLine();
  1515. uiMenuShowBottomIndacitor("确定", "取消");
  1516. }
  1517. }
  1518. void uiShowShutDownResponse(void){
  1519. unsigned short key=getKeyValue();
  1520. if(MKEY_VALUE_ESC==key){
  1521. if(sutApp.waitEscReleased==0) uISetNextStatus(UIS_STANDBY);
  1522. }else if(MKEY_VALUE_MENU==key){
  1523. MSG_INFO(1, "Power is off!");
  1524. appSleepCtl(ASLEEP_PWR, 1);
  1525. }
  1526. }
  1527. /*****************************关机界面提示结束**********************************/
  1528. /*****************************CSQ查看开始********************************/
  1529. void CSQShow(unsigned int exeInterval,char StatusUpdate){
  1530. char info[30];
  1531. static int g_iCSQ=-1,cnt=1000;
  1532. int y=UI_CONTENT_SHOW_Y+(GLCD_HEIGHT-UI_CONTENT_SHOW_Y)/2-12;
  1533. if(g_iCSQ!=sutApp.g_iCSQ || StatusUpdate){
  1534. g_iCSQ=sutApp.g_iCSQ;
  1535. snprintf(info, sizeof(info), "CSQ:%d", g_iCSQ);
  1536. newGuiClearPage(0, ROW_THREE);
  1537. newGuiShowStr(0, 32, info,REVERSED_NO,FONT_MODE_16X16);
  1538. }
  1539. if(++cnt<(1500/exeInterval)) return;
  1540. cnt=0;
  1541. msgAtSend("AT+CSQ\r\n");
  1542. }
  1543. void uiShowCsqSel(char StatusUpdate,unsigned int exeInterval){
  1544. if(StatusUpdate){
  1545. newGuiClearMainPage();
  1546. newGuiShowStr(0, 16, "CSQ查看",REVERSED_NO,FONT_MODE_16X16);
  1547. }
  1548. CSQShow(exeInterval,StatusUpdate);
  1549. }
  1550. void uiShowCsqSelResponse(void){
  1551. unsigned short key=getKeyValue();
  1552. if(MKEY_VALUE_ESC==key) uISetNextStatus(UIS_MENU_SYS_FACTORY);
  1553. }
  1554. /*****************************CSQ查看结束********************************/
  1555. /*******************************MIC/SPK查看************************************/
  1556. void MicSpkShow(unsigned char defaultVal){
  1557. char info[30];
  1558. unsigned short x,y,len;
  1559. snprintf(info, sizeof(info), "%d",uiTmpVal+1);
  1560. newGuiClearPage(0, ROW_THREE);
  1561. newGuiShowStr(0, 32, info,REVERSED_NO,FONT_MODE_16X16);
  1562. if(uiTmpVal==newPara.micGain) guiShowBinMap(GLCD_WIDTH-15,32,"APN1.bin");
  1563. }
  1564. void uiShowMicSel(char StatusUpdate){
  1565. if(StatusUpdate){
  1566. newGuiClearMainPage();
  1567. newGuiShowStr(0, 16, "耳机MIC增益",REVERSED_NO,FONT_MODE_16X16);
  1568. uiTmpVal=newPara.micGain;
  1569. MicSpkShow(newPara.micGain);
  1570. }
  1571. }
  1572. void uiShowMicSelResponse(void){
  1573. unsigned short key=getKeyValue();
  1574. if(MKEY_VALUE_DOWN==key){
  1575. if(uiTmpVal==0) uiTmpVal=MIC_GAIN_NUM-1;
  1576. else uiTmpVal--;
  1577. MicSpkShow(newPara.micGain);
  1578. }else if(MKEY_VALUE_ESC==key) uISetNextStatus(UIS_MENU_SYS_FACTORY);
  1579. else if(MKEY_VALUE_MENU==key){
  1580. if(uiTmpVal!= newPara.micGain){
  1581. newPara.micGain=uiTmpVal;
  1582. sysIniSave();
  1583. if(sutApp.earLev!=0) VolMicUpdate();
  1584. }
  1585. getStackStruct()->ok_back=1;
  1586. uISetNextStatus(UIS_MENU_SYS_FACTORY);
  1587. }
  1588. }
  1589. void uiShowSpkSel(char StatusUpdate){
  1590. if(StatusUpdate){
  1591. newGuiClearMainPage();
  1592. newGuiShowStr(0, 16, "耳机SPK增益",REVERSED_NO,FONT_MODE_16X16);
  1593. uiTmpVal=newPara.spkGain;
  1594. MicSpkShow(newPara.spkGain);
  1595. }
  1596. }
  1597. void uiShowSpkSelResponse(void){
  1598. unsigned short key=getKeyValue();
  1599. if(MKEY_VALUE_DOWN==key){
  1600. if(uiTmpVal==0) uiTmpVal=SPK_GAIN_NUM-1;
  1601. else uiTmpVal--;
  1602. MicSpkShow(newPara.spkGain);
  1603. }else if(MKEY_VALUE_ESC==key) uISetNextStatus(UIS_MENU_SYS_FACTORY);
  1604. else if(MKEY_VALUE_MENU==key){
  1605. if(uiTmpVal!= newPara.spkGain){
  1606. newPara.spkGain=uiTmpVal;
  1607. sysIniSave();
  1608. if(sutApp.earLev!=0) VolSpkUpdate();
  1609. }
  1610. getStackStruct()->ok_back=1;
  1611. uISetNextStatus(UIS_MENU_SYS_FACTORY);
  1612. }
  1613. }
  1614. /******************************MIC/SPK查看结束*********************************/
  1615. /******************************fota更新生辟字库**********************************/
  1616. #include "lsapi_http.h"
  1617. #define FONT_16_FILE HZK_16_NEW_FILE
  1618. #define FONT_16_MD5 "HZK16_Ext_md5.txt"
  1619. #define FONT_12_FILE HZK_12_NEW_FILE
  1620. #define FONT_12_MD5 "HZK12_Ext_md5.txt"
  1621. LSAPI_OSI_Thread_t *fontThread=NULL;
  1622. short fontLoadStatus;
  1623. bool fontResult;
  1624. HttpInfoSet httpFont;
  1625. //return:false, not finished, true, done
  1626. //status:1:busy
  1627. //status:-1:get 16 file failed
  1628. //status:-2:16 file len err
  1629. //status:-3:16 file format err
  1630. //status:-4:16 ok, get 12 file failed
  1631. //status:-5:16 ok, get 12 file len err
  1632. //status:-6:16 ok, get 12 file fotmat err
  1633. //status:0 16,12 ok
  1634. bool httpFontGetStatus(short *status){//获取更新结果接口
  1635. if(fontResult==true) *status=fontLoadStatus;
  1636. return fontResult;
  1637. }
  1638. static void fontEntry(void *param);
  1639. bool httpFontGetStart(void){//开启更新接口
  1640. fontResult=false;
  1641. if(NULL != fontThread) return true;
  1642. fontLoadStatus=-1;
  1643. fontThread=LSAPI_OSI_ThreadCreate("lteEntry", fontEntry,NULL,LSAPI_OSI_PRIORITY_NORMAL,1024*10,4);
  1644. if(NULL==fontThread) return false;
  1645. }
  1646. void fontSaveData(unsigned char *data, unsigned int len){
  1647. int fd;
  1648. char filename[30];
  1649. if(data[0]==12){
  1650. extFontFileCtl(data[0],false);
  1651. snprintf(filename,sizeof(filename), "%s",FONT_12_FILE);
  1652. }else if(data[0]==16){
  1653. extFontFileCtl(data[0],false);
  1654. snprintf(filename,sizeof(filename), "%s",FONT_16_FILE);
  1655. }
  1656. else return;
  1657. fd=LSAPI_FS_Open(filename, LSAPI_FS_O_RDWR | LSAPI_FS_O_CREAT | LSAPI_FS_O_TRUNC,0x0);
  1658. if(fd<0){
  1659. extFontFileCtl(data[0],true);
  1660. return;
  1661. }
  1662. LSAPI_FS_Write(fd, data, len);
  1663. LSAPI_FS_Close(fd);
  1664. extFontFileCtl(data[0],true);
  1665. }
  1666. bool checkFileMd5(char type, unsigned char *md5, unsigned int len){
  1667. int fd;
  1668. char filename[30];
  1669. unsigned char rmd5[32];
  1670. if(type==0)snprintf(filename,sizeof(filename), "%s",FONT_16_MD5);
  1671. else if(type==1)snprintf(filename,sizeof(filename), "%s",FONT_12_MD5);
  1672. else return false;
  1673. fd=LSAPI_FS_Open(filename, LSAPI_FS_O_RDONLY,0);
  1674. if(fd<0){
  1675. MSG_WARN(1, "'%s' open failed to read", filename);
  1676. return false;
  1677. }
  1678. LSAPI_FS_Read(fd, rmd5, sizeof(rmd5));
  1679. LSAPI_FS_Close(fd);
  1680. if(0==memcmp(rmd5, md5, len)) return true;
  1681. else return false;
  1682. }
  1683. void fontSaveMd5(char type, unsigned char *md5, unsigned int len){
  1684. int fd;
  1685. char filename[30];
  1686. if(type==0)snprintf(filename,sizeof(filename), "%s",FONT_16_MD5);
  1687. else if(type==1)snprintf(filename,sizeof(filename), "%s",FONT_12_MD5);
  1688. else return;
  1689. fd=LSAPI_FS_Open(filename, LSAPI_FS_O_RDWR | LSAPI_FS_O_CREAT | LSAPI_FS_O_TRUNC,0);
  1690. if(fd<0){
  1691. MSG_WARN(1, "'%s' open failed to save", filename);
  1692. return;
  1693. }
  1694. LSAPI_FS_Write(fd, md5, len);
  1695. LSAPI_FS_Close(fd);
  1696. }
  1697. static void fontEntry(void *param){
  1698. bool font12_noneed_update=true;
  1699. bool font16_noneed_update=true;
  1700. char type=0;
  1701. unsigned int md5_len;
  1702. unsigned char rmd5[32];
  1703. bool needClear=true;
  1704. //get 16 md5
  1705. MSG_INFO(1,"try get 16 md5");
  1706. memset(&httpFont, 0, sizeof(httpFont));httpFont.cid=1;
  1707. snprintf(httpFont.url, sizeof(httpFont.url),"http://120.77.66.129/higos/extFonts/%s",FONT_16_MD5);
  1708. if(LSAPI_HTTP_GET(&httpFont)){
  1709. fontLoadStatus=-2;
  1710. goto FONT_END;
  1711. }
  1712. //ana 16 md5
  1713. if(httpFont.recvlen!=32){
  1714. fontLoadStatus=-3;
  1715. goto FONT_END;
  1716. }
  1717. md5_len=httpFont.recvlen;
  1718. memcpy(rmd5, httpFont.RecvData, md5_len);
  1719. LSAPI_HTTP_ParaClear(&httpFont);
  1720. font16_noneed_update=checkFileMd5(type, rmd5, md5_len);
  1721. if(false==font16_noneed_update){
  1722. MSG_INFO(1,"try get 16 file");
  1723. //get 16 first
  1724. memset(&httpFont, 0, sizeof(httpFont));httpFont.cid=1;
  1725. snprintf(httpFont.url, sizeof(httpFont.url),"http://120.77.66.129/higos/extFonts/%s",FONT_16_FILE);
  1726. if(LSAPI_HTTP_GET(&httpFont)){//尝试获取差分包
  1727. fontLoadStatus=-4;
  1728. goto FONT_END;
  1729. }
  1730. if(httpFont.recvlen<35){//1+[2+32]....
  1731. fontLoadStatus=-5;
  1732. goto FONT_END;
  1733. }else if(httpFont.RecvData[0]!=16 || (httpFont.recvlen-1)%34){
  1734. fontLoadStatus=-6;
  1735. goto FONT_END;
  1736. }
  1737. fontSaveData(httpFont.RecvData, httpFont.recvlen);
  1738. fontSaveMd5(type, rmd5, md5_len);
  1739. LSAPI_HTTP_ParaClear(&httpFont);
  1740. }
  1741. type=1;
  1742. //get 12 md5
  1743. MSG_INFO(1,"try get 12 md5");
  1744. memset(&httpFont, 0, sizeof(httpFont));httpFont.cid=1;
  1745. snprintf(httpFont.url, sizeof(httpFont.url),"http://120.77.66.129/higos/extFonts/%s",FONT_12_MD5);
  1746. if(LSAPI_HTTP_GET(&httpFont)){
  1747. fontLoadStatus=-7;
  1748. goto FONT_END;
  1749. }
  1750. //ana 12 md5
  1751. if(httpFont.recvlen!=32){
  1752. fontLoadStatus=-8;
  1753. goto FONT_END;
  1754. }
  1755. md5_len=httpFont.recvlen;
  1756. memcpy(rmd5, httpFont.RecvData, md5_len);
  1757. LSAPI_HTTP_ParaClear(&httpFont);
  1758. font12_noneed_update=checkFileMd5(type, rmd5, md5_len);
  1759. if(false==font12_noneed_update){
  1760. MSG_INFO(1,"try get 12 file");
  1761. //get 12 then
  1762. memset(&httpFont, 0, sizeof(httpFont));httpFont.cid=1;
  1763. snprintf(httpFont.url, sizeof(httpFont.url),"http://120.77.66.129/higos/extFonts/%s",FONT_12_FILE);
  1764. if(LSAPI_HTTP_GET(&httpFont)){//尝试获取差分包
  1765. fontLoadStatus=-9;
  1766. goto FONT_END;
  1767. }
  1768. if(httpFont.recvlen<27){//1+[2+24]....
  1769. fontLoadStatus=-10;
  1770. goto FONT_END;
  1771. }else if(httpFont.RecvData[0]!=12 || (httpFont.recvlen-1)%26){
  1772. fontLoadStatus=-11;
  1773. goto FONT_END;
  1774. }
  1775. fontSaveData(httpFont.RecvData, httpFont.recvlen);
  1776. fontSaveMd5(type, rmd5, md5_len);
  1777. LSAPI_HTTP_ParaClear(&httpFont);
  1778. needClear=false;
  1779. }else needClear=false;
  1780. if(font12_noneed_update==true && font16_noneed_update==true) fontLoadStatus=0;
  1781. else fontLoadStatus=1;
  1782. FONT_END:
  1783. fontThread=NULL;
  1784. fontResult=true;
  1785. if(needClear==true) LSAPI_HTTP_ParaClear(&httpFont);
  1786. LSAPI_OSI_ThreadExit();
  1787. }
  1788. //6、UI接口界面(供参考)
  1789. char fontUpdateStatus=0;
  1790. void uiShowFontUpdate(char StatusUpdate){
  1791. static unsigned int timer;
  1792. short status;
  1793. if(StatusUpdate){
  1794. newGuiClearMainPage();
  1795. newGuiShowStr(0, 16, "字库更新",REVERSED_NO,FONT_MODE_16X16);
  1796. newGuiShowStr(0, 32, "确定更新?",REVERSED_NO,FONT_MODE_16X16);
  1797. fontUpdateStatus=0;
  1798. }
  1799. if(fontUpdateStatus==1){
  1800. if(true==httpFontGetStatus(&status)){
  1801. if(status==1){
  1802. newGuiShowStr(0, 32, "更新成功",REVERSED_NO,FONT_MODE_16X16);
  1803. uTimerStart(&timer, 2000);
  1804. }else if(status==0){
  1805. newGuiShowStr(0, 32, "无需更新",REVERSED_NO,FONT_MODE_16X16);
  1806. uTimerStart(&timer, 2000);
  1807. }else{
  1808. newGuiShowStr(0, 32, "更新失败",REVERSED_NO,FONT_MODE_16X16);
  1809. uTimerStart(&timer, 2000);
  1810. }
  1811. fontUpdateStatus=2;
  1812. }
  1813. }else if(fontUpdateStatus==2){
  1814. if(uTimerExpired(&timer)){
  1815. getStackStruct()->ok_back=1;
  1816. uISetNextStatus(UIS_MENU_SYS_FACTORY);
  1817. }
  1818. }
  1819. }
  1820. void uiShowFontUpdateResponse(){
  1821. unsigned short key=getKeyValue();
  1822. if(fontUpdateStatus!=0) return;
  1823. if(MKEY_VALUE_ESC==key) uISetNextStatus(UIS_MENU_SYS_FACTORY);
  1824. else if(MKEY_VALUE_MENU==key){
  1825. httpFontGetStart();
  1826. fontUpdateStatus=1;
  1827. newGuiShowStr(0, 32, "正在更新.",REVERSED_NO,FONT_MODE_16X16);
  1828. }
  1829. }
  1830. /******************************fota更新生辟字库结束***********************************/
  1831. #ifdef USE_LEFT_MOVING
  1832. /***************************主界面滚动显示**********************************/
  1833. #define MOVING_ITME_NUM 3 //显示三条项目
  1834. #define MAX_ROW_BYTE (20+1+2) //最多显示20个字节,10个中文
  1835. #define MAX_SHOW_BYTE 11 //最多一次性显示10个字节
  1836. void leftMoveStr(char *name, unsigned short len){
  1837. char temp[3];
  1838. unsigned char move=1;
  1839. unsigned short i;
  1840. if(name[0] > 0x80) move=2;
  1841. for(i=0;i<move;i++) temp[i]=name[i];
  1842. for(i=0;i<len-move;i++) name[i]=name[i+move];
  1843. for(i=0;i<move;i++) name[i+len-move]=temp[i];
  1844. }
  1845. void getRealShow(char *des, char *src,int maxsize)
  1846. {//??è?×??à12+1??×??ú??ê?
  1847. int i,j,cpsize=maxsize-1;
  1848. for(i=0;i<cpsize;i++){
  1849. if(src[i]>0x80){
  1850. if(i+2>cpsize){//装不下了,停止
  1851. break;
  1852. }
  1853. des[i]=src[i];
  1854. des[i+1]=src[i+1];
  1855. i++;
  1856. }else des[i]=src[i];
  1857. }
  1858. des[i]=0;
  1859. }
  1860. void showbufdata(char type, unsigned char *data, int len){
  1861. char info[100],buf[3];
  1862. int i;
  1863. sprintf(info, "D[%d]%c:",len,type);
  1864. for(i=0;i<len;i++){
  1865. sprintf(buf, "%02x",data[i]);
  1866. strcat(info, buf);
  1867. }
  1868. MSG_INFO(1, info);
  1869. }
  1870. //除去标识(群组:/成员:/话权:)外的字节数,多的1字节用于加空格
  1871. void mainScreenShowMoving(unsigned short y, unsigned char reset,char *gname,char *uname,char *voicePri){
  1872. unsigned char i;
  1873. int j,len;
  1874. unsigned short showX,showY,showPage;
  1875. //显示缓存,最多显示7个中文
  1876. const char indicators[MOVING_ITME_NUM][6]={
  1877. "群组:","成员:","话权:",
  1878. };
  1879. static char item[MOVING_ITME_NUM][MAX_ROW_BYTE];
  1880. static unsigned short itemSum[MOVING_ITME_NUM];
  1881. unsigned short *sum,tsum;
  1882. char *ptr,*showPtr;
  1883. char showMax[MAX_ROW_BYTE];//用于临时存储条目全内容,判定是否发生变化
  1884. char needMove;
  1885. for(i=0;i<MOVING_ITME_NUM;i++){
  1886. showX=0;
  1887. showPage=ROW_TWO+i;
  1888. showY=STATUS_BAR_HEIGH+16*i;
  1889. sum=&itemSum[i];
  1890. showPtr=&item[i][0];
  1891. switch(i){
  1892. case 0://群组:默认群组
  1893. snprintf(showMax, sizeof(showMax), "%s ",gname);
  1894. break;
  1895. case 1://成员:测试组1
  1896. snprintf(showMax, sizeof(showMax), "%s ",uname);
  1897. break;
  1898. case 2://话权:空闲
  1899. snprintf(showMax, sizeof(showMax), "%s ",voicePri);
  1900. break;
  1901. }
  1902. ptr=showMax;
  1903. len=strlen(ptr);
  1904. //计算buff的sum
  1905. tsum=0;
  1906. for(j=0;j<len;j++) tsum += ptr[j];
  1907. //检测是否需要移动处理
  1908. if(len>MAX_SHOW_BYTE) needMove=1;
  1909. else needMove=0;
  1910. if(*sum != tsum || reset){
  1911. newGuiClearPage(0,showPage);
  1912. newGuiShowStr(showX, showY, &indicators[i][0], REVERSED_NO, FONT_MODE_16X16);
  1913. }
  1914. showX += 40;
  1915. if(needMove==0){
  1916. if(*sum != tsum || reset){//内容发生了变化
  1917. //只显示一次即可
  1918. snprintf(showPtr, MAX_ROW_BYTE, "%s", ptr);
  1919. newGuiClearPage(showX,showPage);
  1920. newGuiShowStr(showX, showY, showPtr, REVERSED_NO, FONT_MODE_16X16);
  1921. }
  1922. }else{//做移动处理
  1923. if(*sum != tsum) memcpy(showPtr, ptr, MAX_ROW_BYTE);
  1924. else leftMoveStr(showPtr, strlen(showPtr));
  1925. getRealShow(showMax, showPtr,MAX_SHOW_BYTE);
  1926. newGuiClearPage(showX,showPage);
  1927. newGuiShowStr(showX, showY, showMax, REVERSED_NO, FONT_MODE_16X16);
  1928. }
  1929. *sum=tsum;
  1930. }
  1931. }
  1932. #endif
  1933. /*****************************提示音设置开始********************************/
  1934. #define LOCK_MODE_NUM 2
  1935. void lockFlash(unsigned char defaultVal){
  1936. char info[20];
  1937. newGuiClearPage(0, ROW_FOUR);
  1938. if(uiTmpVal==0) snprintf(info, sizeof(info), "锁按键");
  1939. else snprintf(info,sizeof(info), "锁按键+PTT");
  1940. newGuiShowStr(0, 48, info,REVERSED_NO,FONT_MODE_16X16);
  1941. if(uiTmpVal==defaultVal) guiShowBinMap(GLCD_WIDTH-15,48,"APN1.bin");
  1942. }
  1943. void uiShowLockUpdate(char StatusUpdate){
  1944. if(StatusUpdate){
  1945. newGuiClearMainPage();
  1946. newGuiShowStr(0, 16, "键锁设置",REVERSED_NO,FONT_MODE_16X16);
  1947. newGuiShowStr(0, 32, "类别:",REVERSED_NO,FONT_MODE_16X16);
  1948. uiTmpVal=newPara.lockType;
  1949. lockFlash(newPara.lockType);
  1950. }
  1951. }
  1952. void uiShowLockUpdateResponse(void){
  1953. unsigned short key=getKeyValue();
  1954. if(MKEY_VALUE_ESC==key) uISetNextStatus(UIS_MENU_SYS_SEL);
  1955. else if(MKEY_VALUE_MENU==key){
  1956. getStackStruct()->ok_back=1;
  1957. if(newPara.lockType != uiTmpVal){
  1958. newPara.lockType=uiTmpVal;
  1959. sysIniSave();
  1960. }
  1961. uISetNextStatus(UIS_MENU_SYS_SEL);
  1962. }else if(MKEY_VALUE_DOWN==key){
  1963. if(uiTmpVal==0) uiTmpVal=1;
  1964. else uiTmpVal=0;
  1965. lockFlash(newPara.lockType);
  1966. }
  1967. }
  1968. /*****************************提示音设置结束********************************/