UI.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378
  1. /********************************************************************************
  2. * File Name: UI.c
  3. * Function Describe:user interface module
  4. * Relate Module:
  5. * Explain: 用户界面,注意,为避免操作系统中多任务调用而导致资源访问冲突,只允许在同一个任务中调用。目前设定在MainTask任务中调用!
  6. * Writer: ShiLiangWen
  7. * Date: 2016.1.28
  8. *******************************************************************************/
  9. #include "includes.h"
  10. #include "LCD.h"
  11. char showPIP[40];
  12. char showGIP[40];
  13. SUT_UI_STATUS sutUIstatus;
  14. void UISetNextStatus(unsigned char status);
  15. void ShowStatusBar(int Update);//显示状态栏
  16. void ShowButton(u16 x,u16 y,const char *str);//显示一个按钮
  17. void ShowMessageBox(char *msg);
  18. int siCt1=-1;
  19. SUT_LIST_BOX sutListBox;//ListBox控件,因为内部用到了features[]数据比较大,为节省内存控件,建议整个项目共用一个list
  20. /******************************************************
  21. 在同一个位置交替显示本机用户名和本机当前群组名
  22. 参数:x,y 显示位置左上角的坐标
  23. update ==0 时根据内部静态群组名比较决定是否刷屏显示
  24. update !=0 时强制刷屏显示
  25. ******************************************************/
  26. void ShowGroupAndUserName(u16 x,u16 y,int update)
  27. {
  28. #if POC_USER_NAME_LEN>POC_GROUP_NAME_LEN
  29. static char scName[POC_USER_NAME_LEN];
  30. char name[POC_USER_NAME_LEN];
  31. #else
  32. static char scName[POC_GROUP_NAME_LEN];
  33. char name[POC_GROUP_NAME_LEN];
  34. #endif
  35. static char scCt=0;//0~2--显示群组名 3~5--显示用户名
  36. u16 len;
  37. unsigned char danHuanBuffer[9]={0xB5,0xA5,0xBA,0xF4,0xC4,0xA3,0xCA,0xBD,0};
  38. char GroupShowUpdate=0;
  39. if(++scCt>=6 || update!=0)scCt=0;
  40. if(scCt<3){
  41. if(sutPocStatus.danHunStatus==0){
  42. if(0!=strcmp(sutPocStatus.LocalGroup.name,scName) || update!=0){
  43. memcpy(scName,sutPocStatus.LocalGroup.name,sizeof(scName));
  44. GroupShowUpdate=1;
  45. }
  46. }else{
  47. if(0!=strcmp((char *)danHuanBuffer,scName) || update!=0){
  48. memcpy(scName, danHuanBuffer,sizeof(danHuanBuffer));
  49. GroupShowUpdate=1;
  50. }
  51. }
  52. if(GroupShowUpdate){
  53. GuiClearRect(x,y,159,y+16);
  54. StrIntercept(name,scName,sizeof(name));
  55. GuiShowStr(x,y,name,0x01);
  56. sutPocStatus.statusChaned=1;
  57. }
  58. }else{
  59. if(0!=strcmp(sutPocStatus.LocalUser.name,scName) || update!=0){
  60. memcpy(scName,sutPocStatus.LocalUser.name,sizeof(scName));
  61. GuiClearRect(x,y,159,y+16);
  62. StrIntercept(name,scName,sizeof(name));;
  63. GuiShowStr(x,y,name,0x01);
  64. sutPocStatus.statusChaned=1;
  65. }
  66. }
  67. }
  68. #if 1
  69. void ShowCallUserName(u16 x,u16 y)
  70. {
  71. static char scName[POC_USER_NAME_LEN];
  72. char name[POC_USER_NAME_LEN];
  73. uint8_t thisName;
  74. static uint8_t suCt=0;
  75. if(suCt%50)
  76. {
  77. if(strncmp(scName, sutPocStatus.Callname,sizeof(scName)) != 0 ||
  78. strncmp(scName, sutPocStatus.Callname,sizeof(sutPocStatus.Callname))!=0 ||
  79. sutPocStatus.statusChaned)
  80. {//当名字变更后,刷新
  81. GuiClearRect(0,18,159,18+16);
  82. memcpy(scName,sutPocStatus.Callname,sizeof(sutPocStatus.Callname));
  83. sutPocStatus.statusChaned=0;
  84. }
  85. StrIntercept(name,scName,sizeof(name));
  86. GuiShowStr(x+48,y,sutPocStatus.Callname,0x01);
  87. }
  88. if(++suCt>=50)
  89. suCt=0;
  90. }
  91. #else
  92. u8 statusChaned;//用来修复当低优先级用户一直在讲话,不释放,然后被抢麦,
  93. //只要抢麦者释放话语权后,低优先级用户显示出群组名字,再
  94. //被抢麦,都会显示有问题。第二次以后都会。
  95. void ShowCallUserName(u16 x,u16 y)
  96. {
  97. static char scName[POC_USER_NAME_LEN];
  98. char name[POC_USER_NAME_LEN];
  99. unsigned char thisName;
  100. static int siCt=0;
  101. static u8 lastFlag;
  102. if(siCt==0||siCt==50||siCt==100 || siCt==150|| siCt==200){
  103. if(strncmp(scName, sutPocStatus.Callname,sizeof(scName)) != 0 ||
  104. strncmp(scName, sutPocStatus.Callname,sizeof(sutPocStatus.Callname))!=0 ||
  105. statusChaned)
  106. {//当名字变更后,刷新
  107. GuiClearRect(0,18,159,18+16);
  108. memcpy(scName,sutPocStatus.Callname,sizeof(sutPocStatus.Callname));
  109. statusChaned=0;
  110. }
  111. StrIntercept(name,scName,sizeof(name));
  112. GuiShowStr(x+48,y,sutPocStatus.Callname,0x01);
  113. }
  114. if(++siCt>=200)siCt=0;
  115. }
  116. #endif
  117. /**********************************************************
  118. 显示主界面
  119. ************************************************************/
  120. void UIShowMainInterface(int StatusUpdate)
  121. {
  122. int Flag;//主界面状态:0--未登录 1--无人说话 2--本机说话 3--对方说话
  123. static int siLastFlag=-1;//上一个Flag状态值
  124. static int siCt=0;
  125. char info[20];
  126. static unsigned char lastLoginResult=0xff;
  127. if(StatusUpdate){
  128. GuiClearAll();
  129. ShowButton(1,107,"菜单");
  130. // if(sutPocStatus.danHunStatus==0)ShowButton(121,107,"消息");
  131. // else ShowButton(121,107,"挂断");
  132. siLastFlag=-1;
  133. siCt=0;
  134. ShowStatusBar(StatusUpdate);
  135. return;
  136. }
  137. //======以下持续调用,以便动态更新信息==========
  138. //----顶部显示状态栏-----------
  139. ShowStatusBar(StatusUpdate);
  140. //-----登陆状态标志更新--------
  141. if(0==sutPocStatus.Logined){//未登录时,显示LOGO
  142. Flag=0;
  143. }else if(sutPocStatus.Speaker==0 && sutPocStatus.PPTpress==0){//对方未说话,本机未说话
  144. Flag=1;
  145. siCt1=0;
  146. }else if(sutPocStatus.Speaker==0 && sutPocStatus.PPTpress>0 ){//对方未说话,本机说话
  147. Flag=2;
  148. }else if(sutPocStatus.Speaker>0){//对方说话了
  149. Flag=3;
  150. if(siCt1==0){
  151. siCt1=1;
  152. GuiClearRect(0,18,159,18+16);
  153. }
  154. }
  155. //-------中间图片显示-------
  156. switch(Flag){
  157. case 0://未登录
  158. if(Flag!=siLastFlag){
  159. GuiClearRect(0,38,159,38+59);
  160. GuiShowBmp(30,38,"logo.bmp");
  161. }
  162. break;
  163. case 1://已登录,但无人说话
  164. if(Flag!=siLastFlag){
  165. GuiClearRect(0,38,159,38+59);
  166. GuiShowBmp(30,38,"logo.bmp");
  167. sutPocStatus.statusChaned = 1;
  168. }
  169. break;
  170. case 2://已登录,本机说话
  171. if(Flag!=siLastFlag)GuiClearRect(0,38,159,38+59);
  172. if(0==siCt)GuiShowBmp(40+12,40,"Pickup.bmp");
  173. else if(100==siCt)GuiShowBmp(40+12,40,"Pickup1.bmp");
  174. else if(200==siCt)GuiShowBmp(40+12,40,"Pickup2.bmp");
  175. break;
  176. case 3://已登录,对方说话
  177. if(Flag!=siLastFlag)GuiClearRect(0,38,159,38+59);
  178. if(0==siCt)GuiShowBmp(30+24,38,"speaker.bmp");
  179. else if(100==siCt)GuiShowBmp(30+24,38,"speaker1.bmp");
  180. else if(200==siCt)GuiShowBmp(30+24,38,"speaker2.bmp");
  181. //显示对方名字
  182. ShowCallUserName(0,18);
  183. break;
  184. }
  185. //------群组、用户显示--------
  186. if(Flag>0){//已登陆
  187. if(siCt==0 || siCt==100 || siCt==200){//每秒刷一次,以便及时更新。刷太快也影响
  188. if(Flag!=3)
  189. {
  190. if(Flag!=siLastFlag)
  191. {
  192. ShowGroupAndUserName(0,18,1);//当前群组和用户名显示
  193. }else
  194. {
  195. ShowGroupAndUserName(0,18,0);//当前群组和用户名显示
  196. }
  197. }
  198. }
  199. }else{//未登陆
  200. memset(info, ' ',sizeof(info));
  201. memcpy(info, "正在登陆.", 9);
  202. if(0==siCt)
  203. {
  204. GuiShowStr(0,18,info,1);
  205. }
  206. else if(100==siCt)
  207. {
  208. info[9]='.';
  209. GuiShowStr(0,18,info,1);
  210. }
  211. else if(200==siCt)
  212. {
  213. info[9]='.';info[10]='.';
  214. GuiShowStr(0,18,info,1);
  215. }
  216. if(lastLoginResult != sutPocStatus.loginResult || siLastFlag==-1)
  217. {
  218. lastLoginResult=sutPocStatus.loginResult;
  219. if(lastLoginResult==1) snprintf(info, sizeof(info), "账号信息错误");
  220. else if(lastLoginResult==2) snprintf(info, sizeof(info), "无网络连接 ");
  221. else if(lastLoginResult==4) snprintf(info, sizeof(info), "请插卡 ");
  222. else if(lastLoginResult==5) snprintf(info, sizeof(info), "无法连接");
  223. else if(lastLoginResult==6) snprintf(info, sizeof(info), "没有服务");
  224. else goto NEXT_STEP;
  225. GuiShowStr(0,38,info,1);
  226. }
  227. }
  228. NEXT_STEP:
  229. //-------
  230. if(++siCt>=300)siCt=0;
  231. if(Flag!=siLastFlag){//状态变化 才更新 分页
  232. siLastFlag=Flag;
  233. siCt=0;
  234. }
  235. }
  236. void UI_Init(void)
  237. {
  238. memset(&sutUIstatus,0,sizeof(SUT_UI_STATUS));
  239. UISetNextStatus(UIS_STANDBY);
  240. }
  241. /******************************************************
  242. UIShowMenuMain
  243. 显示主菜单
  244. *******************************************************/
  245. SUT_MENU sutMenuMain;
  246. void UIShowMenuMain(int update)
  247. {
  248. static const char *apcMenuMain[]={
  249. "群组选择",
  250. "成员选择",
  251. "文本消息",//"短信查阅",
  252. // "电话管理",
  253. "系统设置",
  254. "终端信息",
  255. ""
  256. };
  257. if(update){
  258. GuiClearAll();
  259. ShowCaption("主菜单",1); //0的话有点靠顶
  260. GuiDrawHLine(0,159,20,1);
  261. MenuInit(&sutMenuMain,apcMenuMain);
  262. return;
  263. }
  264. //如果有需要持续调用,则在以下添加代码
  265. }
  266. /******************************************************
  267. UIShowMenuSysSetup
  268. 系统设置菜单
  269. *******************************************************/
  270. //SUT_MENU sutMenuSysSetup;
  271. void UIShowMenuSysSetup(int update)
  272. {
  273. static const char *apcMenuSysSetup[]={
  274. "APN设置",
  275. "北斗设置",
  276. "LCD设置",
  277. "网络设置",
  278. "服务器设置",
  279. "PTT提示音设置",
  280. "场景模式",
  281. "编码器设置",
  282. "模式设置",//功耗模式
  283. "快捷群组设置",
  284. "对讲版本升级",//此项放最后
  285. "应用版本升级",
  286. ""
  287. };
  288. static char *staticMenum[10];
  289. char i;
  290. if(update){
  291. GuiClearAll();
  292. ShowCaption("系统设置",1); //0
  293. GuiDrawHLine(0,159,20,1);
  294. if(hgs_poc_type != POC_OWN){
  295. for(i=0;i<7;i++) staticMenum[i]=(char *)apcMenuSysSetup[i];
  296. staticMenum[i]=(char *)apcMenuSysSetup[10];
  297. MenuInit(&sutMenuSysSetup,staticMenum);
  298. }else MenuInit(&sutMenuSysSetup,apcMenuSysSetup);
  299. return;
  300. }
  301. }
  302. /******************************************************
  303. UIShowGroupSel
  304. 群组选择
  305. *******************************************************/
  306. void UIShowGroupSel(int update)
  307. {
  308. char buf[30];
  309. unsigned short timeout;
  310. int i;
  311. static unsigned short susCt=0;
  312. static const char *accIconFileName[]={
  313. "Group1.bmp",
  314. "Group2.bmp",
  315. ""
  316. };
  317. static char NullGroup=0;
  318. static char *GroupsName[POC_ALL_GROUPS_NUM+1];//多一个成员,是为了当成员达到最大数目时,最后一个要设为0,ListBoxInit里面统计ITEM是以0为结尾的。
  319. static char GroupsFeatures[POC_ALL_GROUPS_NUM+1];//100
  320. if(sutPocStatus.Logined == 0)//not login
  321. {
  322. ShowMessageBox(" 请先登录... ");
  323. i=50;
  324. while(i--)
  325. OsDelayTime(1);
  326. UISetNextStatus(UIS_STANDBY);
  327. return;
  328. }
  329. if(update){
  330. ////////////////////////////////////////
  331. sutPocStatus.GroupNum_Update=0;
  332. ShowMessageBox("正在获取,请稍候...");
  333. susCt=0;
  334. GuiClearAll();
  335. ShowCaption("群组选择",1); //0
  336. GuiDrawHLine(0,159,20,1);
  337. //----------------------------
  338. for(i=0;i<=POC_ALL_GROUPS_NUM;i++){
  339. GroupsName[i]=&NullGroup;
  340. GroupsFeatures[i]=0;
  341. }
  342. snprintf(buf, sizeof(buf),"Gnum=%d\r\n", sutPocStatus.GroupsNum);
  343. SlwTrace(INF, buf, 0);
  344. #if 1
  345. for(i=0;i<sutPocStatus.GroupsNum && i<POC_ALL_GROUPS_NUM;i++)
  346. {//set local user to 0 index
  347. //设置Features 将决定选择图标
  348. if(sutPocStatus.AllGroups[i].ID==sutPocStatus.LocalGroup.ID)
  349. {
  350. if(i!=0)
  351. {
  352. //#error "有时显示不出当前群组"
  353. snprintf(buf, sizeof(buf), "i:%d****", i);
  354. SlwTrace(INF, buf, 1);
  355. sutPocStatus.AllGroups[i].ID = sutPocStatus.AllGroups[0].ID;
  356. memcpy(sutPocStatus.AllGroups[i].name,sutPocStatus.AllGroups[0].name,sizeof(sutPocStatus.AllGroups[0].name));
  357. sutPocStatus.AllGroups[i].usernum=sutPocStatus.AllGroups[0].usernum;
  358. sutPocStatus.AllGroups[0].ID=sutPocStatus.LocalGroup.ID;
  359. memcpy(sutPocStatus.AllGroups[0].name,sutPocStatus.LocalGroup.name,sizeof(sutPocStatus.LocalGroup.name));
  360. sutPocStatus.AllGroups[0].usernum=sutPocStatus.LocalGroup.usernum;
  361. }
  362. i=sutPocStatus.GroupsNum;
  363. }
  364. }
  365. for(i=0;i<sutPocStatus.GroupsNum && i<POC_ALL_GROUPS_NUM;i++)
  366. {//select icon
  367. //设置Features 将决定选择图标
  368. if(sutPocStatus.AllGroups[i].ID==sutPocStatus.LocalGroup.ID)GroupsFeatures[i]=1;
  369. //添加名字列表指针
  370. GroupsName[i]=sutPocStatus.AllGroups[i].name;
  371. }
  372. #else
  373. for(i=0;i<sutPocStatus.GroupsNum && i<POC_ALL_GROUPS_NUM;i++){
  374. //设置Features 将决定选择图标
  375. if(sutPocStatus.AllGroups[i].ID==sutPocStatus.LocalGroup.ID)GroupsFeatures[i]=1;
  376. //添加名字列表指针
  377. GroupsName[i]=sutPocStatus.AllGroups[i].name;
  378. }
  379. #endif
  380. //初始化ListBox控件
  381. ListBoxInit(&sutListBox,GroupsName,0,accIconFileName,GroupsFeatures);
  382. //----------------------------
  383. GuiDrawHLine(0,159,104,1);
  384. return;
  385. }
  386. //按键提示
  387. if(susCt==0){
  388. GuiShowStr(0,110,"[上]选择 [下]选择 ",0x01);
  389. }else if(susCt==200){
  390. GuiShowStr(0,110,"[M]确定 [EXIT]退出",0x01);
  391. }
  392. if(++susCt>=400)susCt=0;
  393. }
  394. void ReFlashItem(void)
  395. {
  396. //char buf[100];
  397. static unsigned short susCt=0;
  398. static const char *accIconFileName[]={
  399. "people2.bmp",
  400. "people2.bmp",
  401. "people1.bmp",
  402. ""
  403. };
  404. int i;
  405. unsigned short timeout;
  406. static char NullUser=0;
  407. static char *UsersName[POC_ALL_USERS_NUM+1]; //5
  408. static char UserFeatures[POC_ALL_USERS_NUM+1];//5
  409. //----------------------------
  410. for(i=0;i<=POC_ALL_USERS_NUM;i++){
  411. UsersName[i]=&NullUser;
  412. UserFeatures[i]=0;
  413. }
  414. for(i=0;i<sutPocStatus.FillUserIndex;i++)
  415. {
  416. UserFeatures[i]=sutPocStatus.AllUsers[i].status-1;
  417. UsersName[i]=sutPocStatus.AllUsers[i].name;
  418. }
  419. if(sutPocStatus.UserOnLineNum==0)
  420. {
  421. UsersName[0]="空";
  422. UserFeatures[i]=0;
  423. }
  424. //初始化ListBox控件
  425. ListBoxInit(&sutListBox,UsersName,0,accIconFileName,UserFeatures);
  426. }
  427. /******************************************************
  428. UIShowUserSel
  429. 用户选择
  430. *******************************************************/
  431. void UIShowUserSel(int update)
  432. {
  433. static unsigned short susCt=0;
  434. unsigned short timeout;
  435. if(update){
  436. if(sutPocStatus.Logined == 0)//not login
  437. {
  438. ShowMessageBox(" 请先登录... ");
  439. timeout=50;
  440. while(timeout--)
  441. OsDelayTime(1);
  442. UISetNextStatus(UIS_STANDBY);
  443. return;
  444. }
  445. SimpleUserInfoScan(1, 1);
  446. susCt=0;
  447. GuiClearAll();
  448. ShowCaption("用户选择",1); //0
  449. GuiDrawHLine(0,159,20,1);
  450. ReFlashItem();
  451. GuiDrawHLine(0,159,104,1);
  452. return;
  453. }
  454. //按键提示
  455. if(susCt==0){
  456. GuiShowStr(0,110,"[上]选择 [下]选择",0x01);
  457. }else if(susCt==200){
  458. GuiShowStr(0,110,"[M]单呼 [EXIT]退出",0x01);
  459. }
  460. if(++susCt>=400)susCt=0;
  461. }
  462. /******************************************************
  463. UIShowInformation
  464. 用户选择
  465. *******************************************************/
  466. void UIShowInformation(int update)
  467. {
  468. u16 x,y;
  469. char temp[11];
  470. char buf[50];
  471. static unsigned char flag=0;
  472. if(update)
  473. {
  474. flag=0;
  475. GuiClearAll();
  476. ShowCaption("终端信息",1); //0
  477. GuiDrawHLine(0,159,20,1);
  478. }
  479. x=2,y=22;
  480. if(KEY_PANEL_UP==g_ulKeyValue ||
  481. KEY_PANEL_DOWN==g_ulKeyValue ||
  482. update)
  483. {
  484. g_ulKeyValue = 0;
  485. if(flag==0 || flag==2)
  486. {//显示PSN
  487. GuiClearRect(0,y,LCD_WIDTH-1,LCD_HEIGHT-1);
  488. //终端型号
  489. snprintf(buf, sizeof(buf),"终端型号:%s",sutProductPara.ProductName);
  490. GuiShowStr(x,y,buf,0x01);
  491. y+=20;
  492. //终端编码
  493. snprintf(buf, sizeof(buf),"终端编码:%lu",sutProductPara.PSN);
  494. GuiShowStr(x,y,buf,0x01);
  495. y+=20;
  496. //应用版本号
  497. snprintf(buf, sizeof(buf),"应用版本:V%d.%d.%d",sutProductPara.ProductVersion,CUSTOMER_CODE,newPara.PcbNUm);
  498. GuiShowStr(x,y,buf,0x01);
  499. // y+=20;
  500. // //内部版本号
  501. // snprintf(buf, sizeof(buf),"内部版本:%d",CUSTOMER_CODE);
  502. // GuiShowStr(x,y,buf,0x01);
  503. y+=20;
  504. //模块版本号
  505. snprintf(buf, sizeof(buf),"模块版本:L%d",g_iModemVer);
  506. GuiShowStr(x,y,buf,0x01);
  507. y+=20;
  508. //校验码
  509. temp[0]=0;
  510. GetCheckCodeByPsnMEID(temp,sutProductPara.PSN,DEV_HARDID);
  511. snprintf(buf, sizeof(buf),"校验码:%s",temp);
  512. GuiShowStr(x,y,buf,0x01);
  513. flag=1;
  514. }else if(flag==1)
  515. {
  516. GuiClearRect(0,y,LCD_WIDTH-1,LCD_HEIGHT-1);
  517. //对讲版本号
  518. snprintf(buf, sizeof(buf),"对讲版本:V%d",g_iPocVer);
  519. GuiShowStr(x,y,buf,0x01);
  520. y+=20;
  521. //显示MCU主频率
  522. snprintf(buf, sizeof(buf),"MCU主频:%d.%d Mhz",USER_MAIN_SYSCLK/1000000,USER_MAIN_SYSCLK%1000000/100000);
  523. GuiShowStr(x,y,buf,0x01);
  524. y+=20;
  525. //
  526. memset(buf,sizeof(buf),0);
  527. if(support_type==Un_Known) snprintf(buf,sizeof(buf),"模块类型:未知");
  528. else if(support_type==ONLY_Telecom) snprintf(buf,sizeof(buf),"模块类型:单电信版");
  529. else if(support_type==Mobile_unicom) snprintf(buf,sizeof(buf),"模块类型:移动联通版");
  530. else if(support_type==All_Netcom) snprintf(buf,sizeof(buf),"模块类型:全网通版");
  531. //snprintf(buf, sizeof(buf),"模块类型:%s",buf);
  532. GuiShowStr(x,y,buf,0x01);
  533. flag=2;
  534. }
  535. }else if(KEY_OK_DOWN_GPS == g_ulKeyValue)
  536. {
  537. g_ulKeyValue=0;
  538. if(flag==1 || flag==2)
  539. {
  540. //显示IP
  541. GuiClearRect(0,y,LCD_WIDTH-1,LCD_HEIGHT-1);
  542. //交换IP
  543. GuiShowStr(x,y,"交换服务器:",0x01);
  544. y+= 20;
  545. snprintf(buf, sizeof(buf),"%s",showPIP);
  546. GuiShowStr(x,y,buf,0x01);
  547. y+=20;
  548. //GPS IP
  549. GuiShowStr(x,y,"北斗服务器:",0x01);
  550. y+= 20;
  551. snprintf(buf, sizeof(buf),"%s",showGIP);
  552. GuiShowStr(x,y,buf,0x01);
  553. y+=20;
  554. snprintf(buf, sizeof(buf),"PORT:%d",newPara.gpsPort);
  555. GuiShowStr(x,y,buf,1);
  556. flag=0;
  557. }
  558. }
  559. }
  560. /******************************************************
  561. UI_Loop
  562. UI循环调用,需要在MainTask的主循环中持续调用,及时处理状态发生变化时的UI显示
  563. 此处按下OK键显示里面内容
  564. *******************************************************/
  565. void UI_Loop(void)
  566. {
  567. int StatusUpdate;
  568. // if(fota_update.NewPocFlag==1)
  569. // {
  570. // //显示正在升级;
  571. // UISetNextStatus(UIS_UPDATA_SHOW);
  572. // }
  573. if(sutUIstatus.Status!=sutUIstatus.NextStatus){//状态发生变更
  574. sutUIstatus.LastStatus=sutUIstatus.Status;
  575. sutUIstatus.Status=sutUIstatus.NextStatus;
  576. StatusUpdate=1;
  577. }else{//状态没有发生变更
  578. StatusUpdate=0;
  579. }
  580. switch(sutUIstatus.Status){
  581. case UIS_STANDBY:
  582. UIShowMainInterface(StatusUpdate);
  583. break;
  584. case UIS_MENU_MAIN:
  585. UIShowMenuMain(StatusUpdate);
  586. break;
  587. case UIS_MENU_USER_SEL:
  588. UIShowUserSel(StatusUpdate);
  589. break;
  590. case UIS_MENU_GROUP_SEL:
  591. UIShowGroupSel(StatusUpdate);
  592. break;
  593. case UIS_MAIL_BOX:
  594. UIShowMailBox(StatusUpdate);
  595. break;
  596. case UIS_MENU_SYS_SET:
  597. UIShowMenuSysSetup(StatusUpdate);
  598. break;
  599. case UIS_MENU_INFO:
  600. UIShowInformation(StatusUpdate);
  601. break;
  602. case UIS_CALL_PHONE:
  603. CallPhoneShow(StatusUpdate);
  604. break;
  605. case UIS_CALL_PHONE_OPTION:
  606. CallPhoneOptionShow(StatusUpdate);
  607. break;
  608. case UIS_CALL_PHONE_INPUT:
  609. CallPhoneInputNumShow(StatusUpdate);
  610. break;
  611. case UIS_CALL_PHONE_MODIFY:
  612. CallPhoneInputNewNumShow(StatusUpdate);
  613. break;
  614. case UIS_CALL_PHONE_DELETE:
  615. CallPhoneDeleteNumShow(StatusUpdate);
  616. //CallPhoneInputNewNumShow(StatusUpdate);
  617. break;
  618. case UIS_MESSAGE_OPTION:
  619. MessageOptionShow(StatusUpdate);
  620. break;
  621. case UIS_MESSAGE_READ:
  622. MessageReadShow(StatusUpdate);
  623. break;
  624. case UIS_CALL_TO_PHONE:
  625. CallToPhoneNum(StatusUpdate);
  626. break;
  627. case UIS_MESSAGE_DELE:
  628. MessageDeletShow(StatusUpdate);
  629. break;
  630. case UIS_MESSAGE_FORMAT:
  631. MessageFormatShow(StatusUpdate);
  632. break;
  633. case UIS_SET_APN:
  634. SetAPNShow(StatusUpdate);
  635. break;
  636. case UIS_APN_DETAIL:
  637. SetApnDetailShow(StatusUpdate);
  638. break;
  639. case UIS_SET_GPS:
  640. SetGPSShow(StatusUpdate);
  641. break;
  642. case UIS_SET_LCD:
  643. SetLCDShow(StatusUpdate);
  644. break;
  645. ////////////////////////////
  646. case UIS_SET_NET:
  647. SetNetShow(StatusUpdate);
  648. break;
  649. ///////////////////////////
  650. case UIS_SET_SERVER_PASS:
  651. UIShowPOCSerPass(StatusUpdate);
  652. break;
  653. case UIS_SET_SERVER:
  654. UIShowPOCSer(StatusUpdate);
  655. break;
  656. case UIS_SET_CODETYPE:
  657. SetCodeTypeShow(StatusUpdate);
  658. break;
  659. case UIS_SET_KEYSound:
  660. SetKeySoundShow(StatusUpdate);
  661. break;
  662. case UIS_SET_SOUNDMODE:
  663. SetSoundModeShow(StatusUpdate);
  664. break;
  665. case UIS_SET_PWRMODE:
  666. SetPowerModeShow(StatusUpdate);
  667. break;
  668. case UIS_SET_POC_FOTA:
  669. SetUpIntercomVerShow(StatusUpdate);
  670. //SetPocFotaShow(StatusUpdate);
  671. break;
  672. case UIS_SET_QUICK_GROUP:
  673. SetQuickGroupShow(StatusUpdate);
  674. break;
  675. case UIS_UP_APPRICATION_VER:
  676. SetUpAppricationVerShow(StatusUpdate);
  677. break;
  678. case UIS_UP_APP_PENDING:
  679. SetUpAppricationVerPending();
  680. break;
  681. }
  682. }
  683. /******************************************************
  684. UI_Key
  685. 按键处理
  686. *******************************************************/
  687. void UI_Key(void)
  688. {
  689. char buf[100];
  690. unsigned long key;
  691. int i,temp;
  692. static unsigned char lastOption=0;//向下
  693. switch(sutUIstatus.Status){
  694. case UIS_STANDBY://----待机界面---
  695. switch(g_ulKeyValue){
  696. case KEY_PANEL_MENU:
  697. if(m_GroupSwitch==0)
  698. UISetNextStatus(UIS_MENU_MAIN);
  699. break;
  700. case KEY_PANEL_EXIT:
  701. if(!sutPocStatus.danHunStatus)UISetNextStatus(UIS_MAIL_BOX);
  702. else ModemSendAT("AT+POC=500000\r\n");
  703. break;
  704. }
  705. break;
  706. case UIS_MENU_MAIN://----主菜单----
  707. key=MenuResponse(&sutMenuMain);
  708. if(KEY_PANEL_MENU==key){
  709. switch(sutMenuMain.handle){
  710. case 0://群组选择
  711. UISetNextStatus(UIS_MENU_GROUP_SEL);
  712. break;
  713. case 1://成员选择
  714. UISetNextStatus(UIS_MENU_USER_SEL);
  715. break;
  716. case 2://信箱查阅
  717. UISetNextStatus(UIS_MAIL_BOX);
  718. break;
  719. #if 0
  720. case 3://电话管理
  721. UISetNextStatus(UIS_CALL_PHONE);//UIS_CALL_PHONE_INPUT UIS_CALL_PHONE
  722. break;
  723. case 4://系统设置
  724. UISetNextStatus(UIS_MENU_SYS_SET);
  725. break;
  726. case 5://终端信息
  727. UISetNextStatus(UIS_MENU_INFO);
  728. break;
  729. #else
  730. case 3://系统设置
  731. UISetNextStatus(UIS_MENU_SYS_SET);
  732. break;
  733. case 4://终端信息
  734. UISetNextStatus(UIS_MENU_INFO);
  735. break;
  736. #endif
  737. }
  738. }
  739. // else if(KEY_PANEL_MENU==key){
  740. // UISetNextStatus(UIS_STANDBY);
  741. // }
  742. else if(KEY_PANEL_EXIT==key){
  743. UISetNextStatus(UIS_STANDBY);
  744. }
  745. break;
  746. case UIS_MENU_GROUP_SEL://-----群组选择-----
  747. key=ListBoxResponse(&sutListBox);
  748. if(!QuickGroupSelect) {
  749. if(KEY_PANEL_EXIT==key)UISetNextStatus(sutUIstatus.LastStatus);
  750. //else if(KEY_PANEL_MENU==key)UISetNextStatus(UIS_MENU_MAIN);
  751. else if(KEY_PANEL_MENU==key){
  752. //进入群组AT+POC=09000000000001
  753. snprintf(buf, sizeof(buf),"AT+POC=090000%08x\r\n",sutPocStatus.AllGroups[sutListBox.handle].ID);
  754. //保存name
  755. for(i=0;i <sizeof(sutPocStatus.AllGroups[sutListBox.handle].name);i++) //strlen你就悲剧了
  756. g_cGroupName[i] = sutPocStatus.AllGroups[sutListBox.handle].name[i];
  757. g_ulGroupID=sutPocStatus.AllGroups[sutListBox.handle].ID;
  758. ModemSendAT((u8 *)buf);
  759. UISetNextStatus(UIS_STANDBY);
  760. ////////////////////////////
  761. //防止当优先级高的群组用户讲话,当前机子从同群组切到默认组时,出现一直显示播报却没有声音的问题
  762. //逻辑应该是切换了群组就得重新拉才有播报
  763. sutPocStatus.Speaker=0;
  764. SpeakerDisable();
  765. ////////////////////////////
  766. }
  767. }else{
  768. if(KEY_PANEL_EXIT==key)UISetNextStatus(UIS_SET_QUICK_GROUP);
  769. //else if(KEY_PANEL_MENU==key)UISetNextStatus(UIS_MENU_MAIN);
  770. else if(KEY_PANEL_MENU==key){
  771. printf("key_down-----------\r\n");
  772. newPara.QuickGroupId[QuickGrouPIndex]=sutPocStatus.AllGroups[sutListBox.handle].ID;
  773. UISetNextStatus(UIS_SET_QUICK_GROUP);
  774. }
  775. }
  776. break;
  777. case UIS_MENU_USER_SEL://-----成员选择-----
  778. if(sutListBox.handle==0 && KEY_PANEL_UP==g_ulKeyValue)
  779. {
  780. if(sutPocStatus.handleIndex >=5) sutPocStatus.handleIndex -=5;
  781. else if(sutPocStatus.handleIndex==0) sutPocStatus.handleIndex=sutPocStatus.UserOnLineNum-1;
  782. SimpleUserInfoScan(0,0);
  783. ReFlashItem();//指针会被重置到0位置
  784. lastOption=1;
  785. //reload up
  786. break;
  787. }else if((sutListBox.handle+1) == sutListBox.itemnum && (KEY_PANEL_DOWN==g_ulKeyValue))
  788. {
  789. if(lastOption)
  790. {
  791. sutPocStatus.handleIndex += sutListBox.itemnum;
  792. }
  793. if(sutPocStatus.handleIndex+1>=sutPocStatus.UserOnLineNum) sutPocStatus.handleIndex=0;
  794. SimpleUserInfoScan(0,1);
  795. ReFlashItem();//指针会被重置到0位置
  796. lastOption=0;
  797. //reload down
  798. break;
  799. }
  800. key=ListBoxResponse(&sutListBox);
  801. if(KEY_PANEL_EXIT==g_ulKeyValue)
  802. {
  803. lastOption=0;
  804. UISetNextStatus(sutUIstatus.LastStatus);
  805. }
  806. // else if(KEY_PANEL_MENU==g_ulKeyValue)
  807. // {
  808. // lastOption=0;
  809. // UISetNextStatus(UIS_MENU_MAIN);
  810. // }
  811. else if(KEY_PANEL_MENU==key){
  812. //单呼成员 AT+POC=AT+POC=0A0000xxxxxxxx
  813. ///////////////////////////////////////
  814. if(0 == sutPocStatus.UserOnLineNum)
  815. {
  816. // sprintf(buf, "无法呼叫自己");
  817. // ShowMessageBox(buf);
  818. // OsDelayTime(200);
  819. // UISetNextStatus(sutUIstatus.LastStatus);
  820. break;
  821. }
  822. ///////////////////////////////////////
  823. snprintf(buf, sizeof(buf),"AT+POC=0A0000%08x\r\n",sutPocStatus.AllUsers[sutListBox.handle].ID);
  824. ModemSendAT(buf);
  825. snprintf(buf, sizeof(buf),"呼叫:%s",sutPocStatus.AllUsers[sutListBox.handle].name);
  826. ShowMessageBox(buf);
  827. OsDelayTime(200);
  828. UISetNextStatus(UIS_STANDBY);
  829. }
  830. break;
  831. case UIS_MAIL_BOX://-----短信查阅-----
  832. MessageResponse();
  833. break;
  834. case UIS_CALL_PHONE://-----电话管理----
  835. CallPhoneResponse();
  836. break;
  837. case UIS_MENU_SYS_SET://-----系统设置-----
  838. SetSYSResponse(); //名字没取好,实际上是系统
  839. break;
  840. case UIS_MENU_INFO://-----终端信息-----
  841. if(KEY_PANEL_EXIT==g_ulKeyValue){
  842. UISetNextStatus(sutUIstatus.LastStatus);//UIS_STANDBY
  843. }
  844. //else if(KEY_PANEL_MENU==g_ulKeyValue)UISetNextStatus(UIS_MENU_MAIN);
  845. break;
  846. case UIS_CALL_PHONE_OPTION:
  847. CallPhoneOptionResponse();
  848. break;
  849. case UIS_CALL_PHONE_INPUT: //-----电话设置----
  850. CallPhoneInputNumResponse();
  851. break;
  852. case UIS_CALL_PHONE_MODIFY:
  853. CallPhoneInputNewNumResponse();
  854. break;
  855. case UIS_CALL_PHONE_DELETE:
  856. CallPhoneInputDeleNumResponse();
  857. break;
  858. case UIS_MESSAGE_OPTION:
  859. MessageOptionResponse();
  860. break;
  861. case UIS_MESSAGE_READ:
  862. MessageReadResponse();
  863. break;
  864. case UIS_MESSAGE_FORMAT:
  865. MessageFormatResponse();
  866. break;
  867. case UIS_CALL_TO_PHONE:
  868. CallToPhoneNumResponse();
  869. break;
  870. case UIS_MESSAGE_DELE:
  871. MessageDeletResponse();
  872. break;
  873. case UIS_SET_APN: //-----系统设置-------
  874. SetAPNResponse();
  875. break;
  876. case UIS_APN_DETAIL:
  877. SetApnDetailResponse();
  878. break;
  879. case UIS_SET_GPS:
  880. SetGPSResponse();
  881. break;
  882. case UIS_SET_LCD:
  883. SetLCDResponse();
  884. break;
  885. ////////////////////////////////////
  886. case UIS_SET_NET:
  887. SetNetResponse();
  888. break;
  889. //////////////////////////////////
  890. case UIS_SET_SERVER_PASS:
  891. POCSetSerPassResponse();
  892. break;
  893. case UIS_SET_SERVER:
  894. POCSetSerResponse();
  895. break;
  896. case UIS_SET_CODETYPE:
  897. SetCodeTypeResponse();
  898. break;
  899. case UIS_SET_KEYSound:
  900. SetKeysoundResponse();
  901. break;
  902. case UIS_SET_SOUNDMODE:
  903. SetSoundModeResponse();
  904. break;
  905. case UIS_SET_PWRMODE:
  906. SetPowerModeResponse();
  907. break;
  908. case UIS_SET_POC_FOTA:
  909. SetUpIntercomVerResponse();
  910. //SetPocFotaResponse();
  911. break;
  912. case UIS_SET_QUICK_GROUP:
  913. SetQuickGroupResponse();
  914. break;
  915. case UIS_UP_APPRICATION_VER:
  916. SetUpAppricationVerResponse();
  917. break;
  918. // case UIS_UP_APP_PENDING:
  919. // SetUpAppricationVerPending();
  920. // break;
  921. default:
  922. break;
  923. }
  924. }
  925. /******************************************************
  926. UISetNextStatus
  927. 设置下一个UI状态
  928. *******************************************************/
  929. void UISetNextStatus(unsigned char status)
  930. {
  931. sutUIstatus.LastStatus=sutUIstatus.NextStatus;
  932. sutUIstatus.NextStatus=status;
  933. }
  934. /******************************************************
  935. 显示开机动画
  936. 完整图片 尺寸
  937. logo.bmp 100*59
  938. 子图片 与主图片坐标偏移
  939. logo-down 2,42
  940. logo-g 38,25
  941. logo-h 4,10
  942. logo-i 29,19
  943. logo-o 59,25
  944. logo-s 77,25
  945. logo-up 2,0
  946. *******************************************************/
  947. void ShowBootAnimation(void)
  948. {
  949. int i;
  950. int x,y;
  951. int w,h;
  952. x=30;y=34;//最终整张logo图片的位置
  953. w=100;h=59;//整张图片的尺寸
  954. LCD_BL_HIGH; //改正用户体验
  955. KEY_LED(1);
  956. #if 0
  957. GuiDrawBmpMoving(x+38,0,x+38,y+25,"logo-g.bmp",5);//从上往下移动
  958. GuiDrawBmpMoving(0,y+19,x+29,y+19,"logo-i.bmp",5);//从左往右
  959. GuiShowBmp(x+38,y+25,"logo-g.bmp");
  960. GuiDrawBmpMoving(159-19,y+25,x+59,y+25,"logo-o.bmp",5);//从右往左
  961. GuiDrawBmpMoving(0,y+10,x+4,y+10,"logo-h.bmp",5);//从左往右
  962. GuiShowBmp(x+29,y+19,"logo-i.bmp");
  963. GuiShowBmp(x+38,y+25,"logo-g.bmp");
  964. IWDG_ReloadCounter();//
  965. GuiDrawBmpMoving(159-19,y+25,x+77,y+25,"logo-s.bmp",5);//从右往左
  966. GuiDrawBmpMoving(0,0,x+2,y+0,"logo-up.bmp",5);//从上往下
  967. GuiDrawBmpMoving(159-98,127-17,x+2,y+42,"logo-down.bmp",5);//从下往上
  968. GuiShowBmp(x,y,"logo.bmp");
  969. #else
  970. GuiClearAll();
  971. GuiShowBmp(0,0,"welcome.bmp");
  972. for(i=0;i<400000;i++)
  973. {
  974. if(i%100==0) IWDG_ReloadCounter();
  975. }
  976. #endif
  977. ///////////////////////////////////
  978. // LCD_BL_HIGH;
  979. // sutLcdParam.OnTimeCt=0;
  980. }
  981. /***********************************
  982. 显示信号状态
  983. **********************************/
  984. void ShowSingle(int CSQ)
  985. {
  986. if(sutGpsStatus.PPPStatus == OPEN) GuiShowBmp(0,0+2,"SingleOK.bmp");
  987. else GuiShowBmp(0,0+2,"Single.bmp");
  988. if(CSQ<1 || CSQ==99){
  989. GuiClearRect(7,4,21,14);
  990. }else if(CSQ<8){
  991. GuiDrawVLine(12,14,7,2,COLOR_DEFAULT_BLUE);
  992. GuiClearRect(11,4,21,14);
  993. }else if(CSQ<16){
  994. GuiDrawVLine(12,14,7,2,COLOR_DEFAULT_BLUE);
  995. GuiDrawVLine(9,14,11,2,COLOR_DEFAULT_BLUE);
  996. GuiClearRect(15,4,21,14);
  997. }else if(CSQ<22){
  998. GuiDrawVLine(12,14,7,2,COLOR_DEFAULT_BLUE);
  999. GuiDrawVLine(9,14,11,2,COLOR_DEFAULT_BLUE);
  1000. GuiDrawVLine(7,14,15,2,COLOR_DEFAULT_BLUE);
  1001. GuiClearRect(19,4,21,14);
  1002. }else{
  1003. GuiDrawVLine(12,14,7,2,COLOR_DEFAULT_BLUE);
  1004. GuiDrawVLine(9,14,11,2,COLOR_DEFAULT_BLUE);
  1005. GuiDrawVLine(7,14,15,2,COLOR_DEFAULT_BLUE);
  1006. GuiDrawVLine(4,14,19,2,COLOR_DEFAULT_BLUE);
  1007. }
  1008. //2G-4G 显示
  1009. //GuiShowBmp(28,5,"2g.bmp");
  1010. }
  1011. /************************************************************************
  1012. 显示电量
  1013. *************************************************************************/
  1014. void ShowBatttery(int bat)
  1015. {
  1016. static unsigned int flashCnt=0;
  1017. static unsigned char flag=0;
  1018. int x=46;
  1019. if(bat<WARN_PWR_LEVEL){//请充电
  1020. if(os_time_get()< flashCnt) return;
  1021. flashCnt=os_time_get()+80;
  1022. if(flag==0)
  1023. {
  1024. GuiShowBmp(x+41,3,"VBAT1.bmp");
  1025. flag=1;
  1026. }else{
  1027. flag=0;
  1028. GuiClearRect(x+41,3,x+41+27,3+12);
  1029. }
  1030. //GuiDrawVLine(5,12,64+x,2,COLOR_WARN_RED);
  1031. }
  1032. else if(bat<355){//340<x<=355 1格
  1033. GuiShowBmp(x+41,3,"VBAT1.bmp");
  1034. GuiDrawVLine(5,12,62+x,4,COLOR_DEFAULT_BLUE);
  1035. }
  1036. else if(bat<375){//355<x<=375 2格
  1037. GuiShowBmp(x+41,3,"VBAT1.bmp");
  1038. GuiDrawVLine(5,12,57+x,4,COLOR_DEFAULT_BLUE);
  1039. GuiDrawVLine(5,12,62+x,4,COLOR_DEFAULT_BLUE);
  1040. }
  1041. else if(bat<400){//375<x<=400 3格
  1042. GuiShowBmp(x+41,3,"VBAT1.bmp");
  1043. GuiDrawVLine(5,12,52+x,4,COLOR_DEFAULT_BLUE);
  1044. GuiDrawVLine(5,12,57+x,4,COLOR_DEFAULT_BLUE);
  1045. GuiDrawVLine(5,12,62+x,4,COLOR_DEFAULT_BLUE);
  1046. }
  1047. else{//>=400 4格
  1048. GuiShowBmp(x+41,3,"VBAT1.bmp");
  1049. GuiDrawVLine(5,12,47+x,4,COLOR_DEFAULT_BLUE);
  1050. GuiDrawVLine(5,12,52+x,4,COLOR_DEFAULT_BLUE);
  1051. GuiDrawVLine(5,12,57+x,4,COLOR_DEFAULT_BLUE);
  1052. GuiDrawVLine(5,12,62+x,4,COLOR_DEFAULT_BLUE);
  1053. }
  1054. }
  1055. void ShowTime(void)
  1056. {
  1057. static unsigned char TimeReNewCount;
  1058. static int lastS;
  1059. int time,h,m,s;
  1060. char buf[30];
  1061. if(sutPocStatus.FirstLogined==0) return;
  1062. time = RTC_GetCounter();
  1063. h = time/3600%24;
  1064. m = (time%3600)/60;
  1065. s=0;
  1066. if(TimeFlag)
  1067. {
  1068. s = (time%3600)%60;
  1069. if(lastS!=s)
  1070. {
  1071. g_usModeSTime++;
  1072. if(g_usModeSTime>=60)
  1073. {
  1074. g_usModeSTime=0;
  1075. g_usModeMTime++;
  1076. if(sutPocStatus.Logined)
  1077. {
  1078. if(++TimeReNewCount>=5)
  1079. {//每5分钟获取最新时间
  1080. TimeReNewCount=0;
  1081. TimeFlag=0;
  1082. }
  1083. }
  1084. }
  1085. if(g_usModeMTime>=60)
  1086. {
  1087. g_usModeMTime=0;
  1088. g_usModeHTime++;
  1089. }
  1090. if(g_usModeHTime>=24)
  1091. g_usModeHTime=0;
  1092. }
  1093. }else
  1094. {//CDMA没登陆时使用本地时间,一开机就能显示
  1095. s = time%60;
  1096. g_usModeHTime = h;
  1097. g_usModeMTime = m;
  1098. g_usModeSTime = s;
  1099. }
  1100. if(lastS!=s){
  1101. lastS=s;
  1102. snprintf(buf, sizeof(buf),"%02d:%02d",g_usModeHTime,g_usModeMTime);//-02d"g_usModeMTime,g_usModeSTime
  1103. GuiShowStr(118,0,buf,0x01);
  1104. }
  1105. }
  1106. #if 0
  1107. void ShowGPSICon(void)
  1108. {
  1109. GuiClearRect(30,0,50,20);//30
  1110. if(0== sutGpsInfo.isGpsWork) GuiClearRect(30,0,50,20);//未工作或未检测到
  1111. else
  1112. {//GPS已工作
  1113. if(0 == sutGpsInfo.isGpsValid)
  1114. {//未定位
  1115. if(sutGpsInfo.isGpsAuthOk==0)//未鉴权
  1116. {
  1117. GuiShowBmp(36,0,"GPS1.bmp");
  1118. }else//已鉴权
  1119. {
  1120. GuiShowBmp(36,0,"GPSA.bmp");//已鉴权
  1121. }
  1122. }else
  1123. {//已定位
  1124. if(sutGpsInfo.isGpsAuthOk==0)//未鉴权
  1125. {
  1126. GuiShowBmp(36,0,"GPS1.bmp");
  1127. }else//已鉴权
  1128. {
  1129. GuiShowBmp(36,0,"GPSA.bmp");//已鉴权
  1130. }
  1131. GuiShowBmp(36+10-2,0+2,"GPS2.bmp");//定位辐射放最后
  1132. }
  1133. }
  1134. }
  1135. #else
  1136. void ShowGPSICon(void)
  1137. {
  1138. GuiClearRect(45,0,50,20);//30
  1139. if(0== sutGpsInfo.isGpsWork) GuiClearRect(45,0,75,20);//未工作或未检测到
  1140. else
  1141. {
  1142. //GuiShowBmp(28,0,"3g.bmp");
  1143. //GPS已工作
  1144. if(0 == sutGpsInfo.isGpsValid)
  1145. {//未定位
  1146. if(sutGpsInfo.isGpsAuthOk==0)//未鉴权
  1147. {
  1148. GuiShowBmp(45,0,"GPS1.bmp");
  1149. }else//已鉴权
  1150. {
  1151. GuiShowBmp(45,0,"GPSA.bmp");//已鉴权
  1152. }
  1153. }else
  1154. {//已定位
  1155. if(sutGpsInfo.isGpsAuthOk==0)//未鉴权
  1156. {
  1157. GuiShowBmp(45,0,"GPS1.bmp");
  1158. }else//已鉴权
  1159. {
  1160. GuiShowBmp(45,0,"GPSA.bmp");//已鉴权
  1161. }
  1162. GuiShowBmp(45+10-2,0+2,"GPS2.bmp");//定位辐射放最后
  1163. }
  1164. }
  1165. }
  1166. #endif
  1167. /************************************************************************
  1168. ShowStatusBar
  1169. 显示状态栏
  1170. *************************************************************************/
  1171. void ShowStatusBar(int Update)
  1172. {
  1173. static char batFirstShow=0;
  1174. static uint8_t siHNS;
  1175. static int siCSQ;
  1176. static int siVbat;
  1177. unsigned short usGps;
  1178. static unsigned short susGps;
  1179. static STATUE lastPPPStatus;
  1180. static unsigned int s_netshowvalue;
  1181. static signed char danhu=-1;
  1182. if(Update){
  1183. GuiClearRect(0,0,159,15);
  1184. siCSQ=g_iCSQ;
  1185. ShowSingle(g_iCSQ);
  1186. siVbat=g_iVbat;
  1187. danhu=sutPocStatus.danHunStatus;
  1188. if(danhu==0)ShowButton(121,107,"消息");
  1189. else ShowButton(121,107,"挂断");
  1190. ShowGPSICon();
  1191. ShowBatttery(g_iVbat);
  1192. ShowMessageFlag(1);
  1193. ShowTime();
  1194. s_netshowvalue=netshowvalue;
  1195. Show_Net(s_netshowvalue);
  1196. return;
  1197. }
  1198. //2G-4G显示
  1199. if(s_netshowvalue!=netshowvalue){
  1200. s_netshowvalue=netshowvalue;
  1201. Show_Net(s_netshowvalue);
  1202. }
  1203. //信号显示
  1204. if(siCSQ!=g_iCSQ || lastPPPStatus != sutGpsStatus.PPPStatus){
  1205. lastPPPStatus=sutGpsStatus.PPPStatus;
  1206. siCSQ=g_iCSQ;
  1207. ShowSingle(g_iCSQ);
  1208. }
  1209. if(batFirstShow < 100)
  1210. {//开机大概前1秒显示50%电量,之后根据实际显示
  1211. g_iVbat=360;
  1212. batFirstShow++;
  1213. }
  1214. //电量显示
  1215. if(siVbat!=g_iVbat || g_iVbat < WARN_PWR_LEVEL){
  1216. siVbat=g_iVbat;
  1217. ShowBatttery(g_iVbat);
  1218. }
  1219. //消息显示
  1220. ShowMessageFlag(0);
  1221. //GPS显示
  1222. usGps=((unsigned short)sutGpsInfo.isGpsWork<<8) | ((unsigned short)sutGpsInfo.isGpsValid) | ((unsigned short)sutGpsInfo.isGpsAuthOk<<2);
  1223. if(susGps!=usGps ){
  1224. susGps =usGps;
  1225. ShowGPSICon();
  1226. }
  1227. //时间显示
  1228. ShowTime();
  1229. if(danhu!=sutPocStatus.danHunStatus)
  1230. {
  1231. danhu=sutPocStatus.danHunStatus;
  1232. if(danhu==0)ShowButton(121,107,"消息");
  1233. else ShowButton(121,107,"挂断");
  1234. }
  1235. }
  1236. void ShowMessageBox(char *msg)
  1237. {
  1238. char buf[70];
  1239. u16 len,x,y;
  1240. y=LCD_HEIGHT/2;
  1241. GuiClearRect(0,y-20,159,y+20);
  1242. GuiDrawRect(2,y-18,157,y+18,1);
  1243. StrIntercept(buf,msg,18);
  1244. len=GetStrXLen(buf);
  1245. x=(LCD_WIDTH-len)/2;
  1246. GuiShowStr(x,y-8,buf,0x01);
  1247. }
  1248. void ShowNumBox(unsigned short msg)
  1249. {
  1250. char buf[10];
  1251. u16 len,x,y;
  1252. y=LCD_HEIGHT/2; //中间
  1253. GuiClearRect(0,y-20,159,y+20);
  1254. //GuiDrawRect(2,y-6,157,y+16,1); //上面显示要修改的号码 下面显示文字
  1255. GuiDrawRect(2,y-6,130,y+16,1);
  1256. // StrIntercept(buf,(char *)msg,18);
  1257. snprintf(buf, sizeof(buf),"%u",msg);
  1258. len=GetStrXLen(buf);
  1259. //x=(LCD_WIDTH-len)/2;
  1260. GuiShowStr(4,y,buf,0x01);
  1261. }
  1262. /************************************************************************
  1263. ShowButton
  1264. 显示一个按钮
  1265. *************************************************************************/
  1266. void ShowButton(u16 x,u16 y,const char *str)
  1267. {
  1268. int len;
  1269. len=GetStrXLen((char *)str);
  1270. GuiClearRect(x,y,x+len+8,y+20);
  1271. GuiShowStr(x+4,y+2,str,0x01);
  1272. GuiReverseRect(x,y,(x+len+8),(y+16+4));
  1273. }
  1274. void Show_Net(unsigned int s_netshowvalue)
  1275. {
  1276. if(s_netshowvalue==2||s_netshowvalue==3){
  1277. GuiShowBmp(24,2,"2g.bmp");
  1278. }else if(s_netshowvalue==4||s_netshowvalue==5||s_netshowvalue==8){
  1279. GuiShowBmp(24,2,"3g.bmp");
  1280. }else if(s_netshowvalue==9){
  1281. GuiShowBmp(24,2,"4g.bmp");
  1282. }else {
  1283. GuiClearRect(24,2,45,20);
  1284. }
  1285. }