UI.c 29 KB

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