Module_LcmControl.c 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216
  1. #include <sys/time.h>
  2. #include <sys/timeb.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <sys/types.h>
  6. #include <sys/ioctl.h>
  7. #include <sys/socket.h>
  8. #include <sys/ipc.h>
  9. #include <sys/shm.h>
  10. #include <sys/shm.h>
  11. #include <sys/mman.h>
  12. #include <linux/wireless.h>
  13. #include <arpa/inet.h>
  14. #include <netinet/in.h>
  15. #include <unistd.h>
  16. #include <stdarg.h>
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <unistd.h>
  20. #include <fcntl.h>
  21. #include <termios.h>
  22. #include <errno.h>
  23. #include <errno.h>
  24. #include <string.h>
  25. #include <time.h>
  26. #include <ctype.h>
  27. #include <ifaddrs.h>
  28. #include "define.h"
  29. #include "main.h"
  30. #include "lcmComm.h"
  31. #include "Image.h"
  32. #include "qrcode.h"
  33. #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0]))
  34. #define PASS 1
  35. #define FAIL -1
  36. #define YES 1
  37. #define NO 0
  38. #define ON 1
  39. #define OFF 0
  40. #define PAGE_DISPLAY_PERIOD 3
  41. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  42. struct StatusCodeData *ShmStatusCodeData;
  43. struct Charger *ShmCharger;
  44. void trim(char *s);
  45. int mystrcmp(char *p1,char *p2);
  46. void substr(char *dest, const char* src, unsigned int start, unsigned int cnt);
  47. void split(char **arr, char *str, const char *del);
  48. int Uart1Fd;
  49. QRCode qrcode;
  50. //=================================
  51. // Common routine
  52. //=================================
  53. int StoreLogMsg(const char *fmt, ...)
  54. {
  55. char Buf[4096+256];
  56. char buffer[4096];
  57. time_t CurrentTime;
  58. struct tm *tm;
  59. struct timeval tv;
  60. va_list args;
  61. va_start(args, fmt);
  62. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  63. va_end(args);
  64. memset(Buf,0,sizeof(Buf));
  65. CurrentTime = time(NULL);
  66. tm=localtime(&CurrentTime);
  67. gettimeofday(&tv, NULL); // get microseconds, 10^-6
  68. sprintf(Buf,"echo -n \"[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s\" >> /Storage/SystemLog/[%04d.%02d]Module_LcmControlLog",
  69. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec,
  70. buffer,
  71. tm->tm_year+1900,tm->tm_mon+1);
  72. #ifdef SystemLogMessage
  73. system(Buf);
  74. #endif
  75. #ifdef ConsloePrintLog
  76. printf("[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec, buffer);
  77. #endif
  78. return rc;
  79. }
  80. int DiffTimeb(struct timeb ST, struct timeb ET)
  81. {
  82. //return milli-second
  83. unsigned int StartTime,StopTime;
  84. StartTime=(unsigned int)ST.time;
  85. StopTime=(unsigned int)ET.time;
  86. return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  87. }
  88. void trim(char *s)
  89. {
  90. int i=0, j, k, l=0;
  91. while((s[i]==' ')||(s[i]=='\t')||(s[i]=='\n'))
  92. i++;
  93. j = strlen(s)-1;
  94. while((s[j]==' ')||(s[j]=='\t')||(s[j]=='\n'))
  95. j--;
  96. if(i==0 && j==strlen(s)-1) { }
  97. else if(i==0) s[j+1] = '\0';
  98. else {
  99. for(k=i; k<=j; k++) s[l++] = s[k];
  100. s[l] = '\0';
  101. }
  102. }
  103. int mystrcmp(char *p1,char *p2)
  104. {
  105. while(*p1==*p2)
  106. {
  107. if(*p1=='\0' || *p2=='\0')
  108. break;
  109. p1++;
  110. p2++;
  111. }
  112. if(*p1=='\0' && *p2=='\0')
  113. return(PASS);
  114. else
  115. return(FAIL);
  116. }
  117. void substr(char *dest, const char* src, unsigned int start, unsigned int cnt)
  118. {
  119. strncpy(dest, src + start, cnt);
  120. dest[cnt] = 0;
  121. }
  122. void split(char **arr, char *str, const char *del)
  123. {
  124. char *s = strtok(str, del);
  125. while(s != NULL)
  126. {
  127. *arr++ = s;
  128. s = strtok(NULL, del);
  129. }
  130. }
  131. //==========================================
  132. // Page routine
  133. //==========================================
  134. void page_booting()
  135. {
  136. DEBUG_INFO("Page booting.\n");
  137. switch(ShmSysConfigAndInfo->SysConfig.DefaultLanguage)
  138. {
  139. case LCD_LANG_CHT:
  140. case LCD_LANG_CHS:
  141. case LCD_LANG_JAPANESE:
  142. case LCD_LANG_FRENCH:
  143. case LCD_LANG_ITALIAN:
  144. case LCD_LANG_SPANISH:
  145. case LCD_LANG_GERMAN:
  146. case LCD_LANG_DUTCH:
  147. case LCD_LANG_NORWEGIAN:
  148. case LCD_LANG_FINNISH:
  149. case LCD_LANG_SWEDISH:
  150. case LCD_LANG_SLOVENIAN:
  151. case LCD_LANG_THAI:
  152. case LCD_LANG_ENGLISH:
  153. default:
  154. dispGraphicConfig(Uart1Fd, AREAD_ID_0, YES, 0, 8, 128, 64);
  155. dispGraphicPartial(Uart1Fd, AREAD_ID_0, YES, 0, 0, 0, 8, 128, 64, IMG_ADDR_INIT);
  156. break;
  157. }
  158. }
  159. void page_idle()
  160. {
  161. uint8_t qrcontent[196];
  162. DEBUG_INFO("Page idle.\n");
  163. switch(ShmSysConfigAndInfo->SysConfig.DefaultLanguage)
  164. {
  165. case LCD_LANG_CHT:
  166. case LCD_LANG_CHS:
  167. case LCD_LANG_JAPANESE:
  168. case LCD_LANG_FRENCH:
  169. case LCD_LANG_ITALIAN:
  170. case LCD_LANG_SPANISH:
  171. case LCD_LANG_GERMAN:
  172. case LCD_LANG_DUTCH:
  173. case LCD_LANG_NORWEGIAN:
  174. case LCD_LANG_FINNISH:
  175. case LCD_LANG_SWEDISH:
  176. case LCD_LANG_SLOVENIAN:
  177. case LCD_LANG_THAI:
  178. case LCD_LANG_ENGLISH:
  179. default:
  180. // Display QR code by call display picture
  181. dispGraphicArea(Uart1Fd, AREAD_ID_0, YES, 4, 8, 64, 64, IMG_ADDR_QRCODE);
  182. // Display QR code by LCD built-in function
  183. if(ShmSysConfigAndInfo->SysConfig.QRCodeMadeMode)
  184. {
  185. // Customization content
  186. qrCodeOperation(Uart1Fd, 4, 8, ShmSysConfigAndInfo->SysConfig.QRCodeContent, strlen((char*)ShmSysConfigAndInfo->SysConfig.QRCodeContent));
  187. }
  188. else
  189. {
  190. // Default content model name & serial number
  191. sprintf((char*)qrcontent, "%s%s", ShmSysConfigAndInfo->SysConfig.ModelName, ShmSysConfigAndInfo->SysConfig.SerialNumber);
  192. qrCodeOperation(Uart1Fd, 4, 8, qrcontent, strlen((char*)qrcontent));
  193. }
  194. dispGraphicArea(Uart1Fd, AREAD_ID_1, YES, 70, 18, 70+48, 18+38, IMG_ADDR_TAP_RFID);
  195. break;
  196. }
  197. }
  198. void page_authorizing()
  199. {
  200. DEBUG_INFO("Page authorizing.\n");
  201. switch(ShmSysConfigAndInfo->SysConfig.DefaultLanguage)
  202. {
  203. case LCD_LANG_CHT:
  204. case LCD_LANG_CHS:
  205. case LCD_LANG_JAPANESE:
  206. case LCD_LANG_FRENCH:
  207. case LCD_LANG_ITALIAN:
  208. case LCD_LANG_SPANISH:
  209. case LCD_LANG_GERMAN:
  210. case LCD_LANG_DUTCH:
  211. case LCD_LANG_NORWEGIAN:
  212. case LCD_LANG_FINNISH:
  213. case LCD_LANG_SWEDISH:
  214. case LCD_LANG_SLOVENIAN:
  215. case LCD_LANG_THAI:
  216. case LCD_LANG_ENGLISH:
  217. default:
  218. dispGraphicConfig(Uart1Fd, AREAD_ID_0, YES, 0, 8, 128, 64);
  219. dispGraphicPartial(Uart1Fd, AREAD_ID_0, YES, 0, 0, 0, 8, 128, 64, IMG_ADDR_VERIFY);
  220. break;
  221. }
  222. }
  223. void page_preparing()
  224. {
  225. static uint8_t idxPage = 0;
  226. DEBUG_INFO("Page preparing.\n");
  227. switch(ShmSysConfigAndInfo->SysConfig.DefaultLanguage)
  228. {
  229. case LCD_LANG_CHT:
  230. case LCD_LANG_CHS:
  231. case LCD_LANG_JAPANESE:
  232. case LCD_LANG_FRENCH:
  233. case LCD_LANG_ITALIAN:
  234. case LCD_LANG_SPANISH:
  235. case LCD_LANG_GERMAN:
  236. case LCD_LANG_DUTCH:
  237. case LCD_LANG_NORWEGIAN:
  238. case LCD_LANG_FINNISH:
  239. case LCD_LANG_SWEDISH:
  240. case LCD_LANG_SLOVENIAN:
  241. case LCD_LANG_THAI:
  242. case LCD_LANG_ENGLISH:
  243. default:
  244. dispGraphicConfig(Uart1Fd, AREAD_ID_0, YES, 0, 15, 128, 64);
  245. dispGraphicPartial(Uart1Fd, AREAD_ID_0, YES, 0, 0, 0, 10, 128, 54, IMG_ADDR_HANDSHAKE_1+idxPage);
  246. break;
  247. }
  248. idxPage ^= 1;
  249. }
  250. void page_charging()
  251. {
  252. uint8_t buf[128];
  253. static uint8_t idxBatt = 0;
  254. static uint8_t idxPage = 0;
  255. DEBUG_INFO("Page charging.\n");
  256. switch(ShmSysConfigAndInfo->SysConfig.DefaultLanguage)
  257. {
  258. case LCD_LANG_CHT:
  259. case LCD_LANG_CHS:
  260. case LCD_LANG_JAPANESE:
  261. case LCD_LANG_FRENCH:
  262. case LCD_LANG_ITALIAN:
  263. case LCD_LANG_SPANISH:
  264. case LCD_LANG_GERMAN:
  265. case LCD_LANG_DUTCH:
  266. case LCD_LANG_NORWEGIAN:
  267. case LCD_LANG_FINNISH:
  268. case LCD_LANG_SWEDISH:
  269. case LCD_LANG_SLOVENIAN:
  270. case LCD_LANG_THAI:
  271. case LCD_LANG_ENGLISH:
  272. default:
  273. dispGraphicArea(Uart1Fd, AREAD_ID_0, YES, 0, 19, 48, 36, IMG_ADDR_ICON_B0+idxBatt);
  274. //dispGraphicArea(Uart1Fd, AREAD_ID_1, YES, 0, 40, 48, 64, IMG_ADDR_ICON_COMPLETE);
  275. switch(idxPage/PAGE_DISPLAY_PERIOD)
  276. {
  277. case 0:
  278. dispGraphicArea(Uart1Fd, AREAD_ID_1, YES, 48, 14, 70, 38, IMG_ADDR_ICON_ENERGY);
  279. sprintf((char*)buf, " 000.0000");
  280. dispCharacterArea(Uart1Fd, AREAD_ID_2, 72, 22, 128, 40, FONT_ASCII_6X8, buf, strlen((char*)buf));
  281. dispGraphicArea(Uart1Fd, AREAD_ID_3, YES, 48, 40, 81, 64, IMG_ADDR_ICON_TIME);
  282. sprintf((char*)buf, " 000:00");
  283. dispCharacterArea(Uart1Fd, AREAD_ID_4, 84, 48, 128, 64, FONT_ASCII_6X8, buf, strlen((char*)buf));
  284. idxPage++;
  285. break;
  286. case 1:
  287. dispGraphicArea(Uart1Fd, AREAD_ID_1, YES, 48, 14, 70, 38, IMG_ADDR_ICON_COST);
  288. sprintf((char*)buf, " 0.45");
  289. dispCharacterArea(Uart1Fd, AREAD_ID_2, 72, 22, 128, 40, FONT_ASCII_6X8, buf, strlen((char*)buf));
  290. dispGraphicArea(Uart1Fd, AREAD_ID_3, YES, 48, 40, 81, 64, IMG_ADDR_ICON_PRICE);
  291. sprintf((char*)buf, " 123.88");
  292. dispCharacterArea(Uart1Fd, AREAD_ID_4, 84, 48, 128, 64, FONT_ASCII_6X8, buf, strlen((char*)buf));
  293. idxPage++;
  294. break;
  295. default:
  296. idxPage = 0;
  297. break;
  298. }
  299. break;
  300. }
  301. if(idxBatt<5)
  302. idxBatt++;
  303. else
  304. idxBatt =0;
  305. }
  306. void page_complete()
  307. {
  308. uint8_t buf[128];
  309. static uint8_t idxPage = 0;
  310. DEBUG_INFO("Page complete.\n");
  311. switch(ShmSysConfigAndInfo->SysConfig.DefaultLanguage)
  312. {
  313. case LCD_LANG_CHT:
  314. case LCD_LANG_CHS:
  315. case LCD_LANG_JAPANESE:
  316. case LCD_LANG_FRENCH:
  317. case LCD_LANG_ITALIAN:
  318. case LCD_LANG_SPANISH:
  319. case LCD_LANG_GERMAN:
  320. case LCD_LANG_DUTCH:
  321. case LCD_LANG_NORWEGIAN:
  322. case LCD_LANG_FINNISH:
  323. case LCD_LANG_SWEDISH:
  324. case LCD_LANG_SLOVENIAN:
  325. case LCD_LANG_THAI:
  326. case LCD_LANG_ENGLISH:
  327. default:
  328. dispGraphicArea(Uart1Fd, AREAD_ID_0, YES, 0, 20, 48, 36, IMG_ADDR_ICON_B100);
  329. dispGraphicArea(Uart1Fd, AREAD_ID_1, YES, 0, 40, 48, 64, IMG_ADDR_ICON_COMPLETE);
  330. switch(idxPage/PAGE_DISPLAY_PERIOD)
  331. {
  332. case 0:
  333. dispGraphicArea(Uart1Fd, AREAD_ID_1, YES, 48, 14, 70, 38, IMG_ADDR_ICON_ENERGY);
  334. sprintf((char*)buf, " 000.0000");
  335. dispCharacterArea(Uart1Fd, AREAD_ID_2, 72, 22, 128, 40, FONT_ASCII_6X8, buf, strlen((char*)buf));
  336. dispGraphicArea(Uart1Fd, AREAD_ID_3, YES, 48, 40, 81, 64, IMG_ADDR_ICON_TIME);
  337. sprintf((char*)buf, " 000:00");
  338. dispCharacterArea(Uart1Fd, AREAD_ID_4, 84, 48, 128, 64, FONT_ASCII_6X8, buf, strlen((char*)buf));
  339. idxPage++;
  340. break;
  341. case 1:
  342. dispGraphicArea(Uart1Fd, AREAD_ID_1, YES, 48, 14, 70, 38, IMG_ADDR_ICON_COST);
  343. sprintf((char*)buf, " 0.45");
  344. dispCharacterArea(Uart1Fd, AREAD_ID_2, 72, 22, 128, 40, FONT_ASCII_6X8, buf, strlen((char*)buf));
  345. dispGraphicArea(Uart1Fd, AREAD_ID_3, YES, 48, 40, 81, 64, IMG_ADDR_ICON_PRICE);
  346. sprintf((char*)buf, " 123.88");
  347. dispCharacterArea(Uart1Fd, AREAD_ID_4, 84, 48, 128, 64, FONT_ASCII_6X8, buf, strlen((char*)buf));
  348. idxPage++;
  349. break;
  350. }
  351. break;
  352. }
  353. }
  354. void page_terminating()
  355. {
  356. uint8_t buf[128];
  357. static uint8_t idxPage = 0;
  358. DEBUG_INFO("Page terminating.\n");
  359. switch(ShmSysConfigAndInfo->SysConfig.DefaultLanguage)
  360. {
  361. case LCD_LANG_CHT:
  362. case LCD_LANG_CHS:
  363. case LCD_LANG_JAPANESE:
  364. case LCD_LANG_FRENCH:
  365. case LCD_LANG_ITALIAN:
  366. case LCD_LANG_SPANISH:
  367. case LCD_LANG_GERMAN:
  368. case LCD_LANG_DUTCH:
  369. case LCD_LANG_NORWEGIAN:
  370. case LCD_LANG_FINNISH:
  371. case LCD_LANG_SWEDISH:
  372. case LCD_LANG_SLOVENIAN:
  373. case LCD_LANG_THAI:
  374. case LCD_LANG_ENGLISH:
  375. default:
  376. dispGraphicArea(Uart1Fd, AREAD_ID_0, YES, 0, 20, 48, 36, IMG_ADDR_ICON_B100);
  377. dispGraphicArea(Uart1Fd, AREAD_ID_1, YES, 0, 40, 48, 64, IMG_ADDR_ICON_COMPLETE);
  378. switch(idxPage/PAGE_DISPLAY_PERIOD)
  379. {
  380. case 0:
  381. dispGraphicArea(Uart1Fd, AREAD_ID_1, YES, 48, 14, 70, 38, IMG_ADDR_ICON_ENERGY);
  382. sprintf((char*)buf, " 000.0000");
  383. dispCharacterArea(Uart1Fd, AREAD_ID_2, 72, 22, 128, 40, FONT_ASCII_6X8, buf, strlen((char*)buf));
  384. dispGraphicArea(Uart1Fd, AREAD_ID_3, YES, 48, 40, 81, 64, IMG_ADDR_ICON_TIME);
  385. sprintf((char*)buf, " 000:00");
  386. dispCharacterArea(Uart1Fd, AREAD_ID_4, 84, 48, 128, 64, FONT_ASCII_6X8, buf, strlen((char*)buf));
  387. idxPage++;
  388. break;
  389. case 1:
  390. dispGraphicArea(Uart1Fd, AREAD_ID_1, YES, 48, 14, 70, 38, IMG_ADDR_ICON_COST);
  391. sprintf((char*)buf, " 0.45");
  392. dispCharacterArea(Uart1Fd, AREAD_ID_2, 72, 22, 128, 40, FONT_ASCII_6X8, buf, strlen((char*)buf));
  393. dispGraphicArea(Uart1Fd, AREAD_ID_3, YES, 48, 40, 81, 64, IMG_ADDR_ICON_PRICE);
  394. sprintf((char*)buf, " 123.88");
  395. dispCharacterArea(Uart1Fd, AREAD_ID_4, 84, 48, 128, 64, FONT_ASCII_6X8, buf, strlen((char*)buf));
  396. idxPage++;
  397. break;
  398. }
  399. break;
  400. }
  401. }
  402. void page_alarm()
  403. {
  404. uint8_t buf[128];
  405. DEBUG_INFO("Page alarm.\n");
  406. switch(ShmSysConfigAndInfo->SysConfig.DefaultLanguage)
  407. {
  408. case LCD_LANG_CHT:
  409. case LCD_LANG_CHS:
  410. case LCD_LANG_JAPANESE:
  411. case LCD_LANG_FRENCH:
  412. case LCD_LANG_ITALIAN:
  413. case LCD_LANG_SPANISH:
  414. case LCD_LANG_GERMAN:
  415. case LCD_LANG_DUTCH:
  416. case LCD_LANG_NORWEGIAN:
  417. case LCD_LANG_FINNISH:
  418. case LCD_LANG_SWEDISH:
  419. case LCD_LANG_SLOVENIAN:
  420. case LCD_LANG_THAI:
  421. case LCD_LANG_ENGLISH:
  422. default:
  423. dispGraphicArea(Uart1Fd, AREAD_ID_0, YES, 32, 24, 48, 40, IMG_ADDR_ICON_ALERT);
  424. sprintf((char*)buf, "012336");
  425. dispCharacterArea(Uart1Fd, AREAD_ID_1, 50, 26, 128, 40, FONT_ASCII_8X12, buf, strlen((char*)buf));
  426. break;
  427. }
  428. }
  429. void page_fault()
  430. {
  431. uint8_t buf[128];
  432. DEBUG_INFO("Page fault.\n");
  433. switch(ShmSysConfigAndInfo->SysConfig.DefaultLanguage)
  434. {
  435. case LCD_LANG_CHT:
  436. case LCD_LANG_CHS:
  437. case LCD_LANG_JAPANESE:
  438. case LCD_LANG_FRENCH:
  439. case LCD_LANG_ITALIAN:
  440. case LCD_LANG_SPANISH:
  441. case LCD_LANG_GERMAN:
  442. case LCD_LANG_DUTCH:
  443. case LCD_LANG_NORWEGIAN:
  444. case LCD_LANG_FINNISH:
  445. case LCD_LANG_SWEDISH:
  446. case LCD_LANG_SLOVENIAN:
  447. case LCD_LANG_THAI:
  448. case LCD_LANG_ENGLISH:
  449. default:
  450. dispGraphicArea(Uart1Fd, AREAD_ID_0, YES, 32, 24, 48, 40, IMG_ADDR_ICON_ALERT);
  451. sprintf((char*)buf, "012336");
  452. dispCharacterArea(Uart1Fd, AREAD_ID_1, 50, 26, 128, 40, FONT_ASCII_8X12, buf, strlen((char*)buf));
  453. break;
  454. }
  455. }
  456. void page_maintain()
  457. {
  458. DEBUG_INFO("Page maintain.\n");
  459. switch(ShmSysConfigAndInfo->SysConfig.DefaultLanguage)
  460. {
  461. case LCD_LANG_CHT:
  462. case LCD_LANG_CHS:
  463. case LCD_LANG_JAPANESE:
  464. case LCD_LANG_FRENCH:
  465. case LCD_LANG_ITALIAN:
  466. case LCD_LANG_SPANISH:
  467. case LCD_LANG_GERMAN:
  468. case LCD_LANG_DUTCH:
  469. case LCD_LANG_NORWEGIAN:
  470. case LCD_LANG_FINNISH:
  471. case LCD_LANG_SWEDISH:
  472. case LCD_LANG_SLOVENIAN:
  473. case LCD_LANG_THAI:
  474. case LCD_LANG_ENGLISH:
  475. default:
  476. dispGraphicConfig(Uart1Fd, AREAD_ID_0, YES, 0, 8, 128, 64);
  477. dispGraphicPartial(Uart1Fd, AREAD_ID_0, YES, 0, 0, 0, 8, 128, 64, IMG_ADDR_MAINTIAN);
  478. break;
  479. }
  480. }
  481. void page_update()
  482. {
  483. DEBUG_INFO("Page update.\n");
  484. switch(ShmSysConfigAndInfo->SysConfig.DefaultLanguage)
  485. {
  486. case LCD_LANG_CHT:
  487. case LCD_LANG_CHS:
  488. case LCD_LANG_JAPANESE:
  489. case LCD_LANG_FRENCH:
  490. case LCD_LANG_ITALIAN:
  491. case LCD_LANG_SPANISH:
  492. case LCD_LANG_GERMAN:
  493. case LCD_LANG_DUTCH:
  494. case LCD_LANG_NORWEGIAN:
  495. case LCD_LANG_FINNISH:
  496. case LCD_LANG_SWEDISH:
  497. case LCD_LANG_SLOVENIAN:
  498. case LCD_LANG_THAI:
  499. case LCD_LANG_ENGLISH:
  500. default:
  501. dispGraphicConfig(Uart1Fd, AREAD_ID_0, YES, 0, 8, 128, 64);
  502. dispGraphicPartial(Uart1Fd, AREAD_ID_0, YES, 0, 0, 0, 8, 128, 64, IMG_ADDR_MAINTIAN);
  503. break;
  504. }
  505. }
  506. void page_reservation()
  507. {
  508. DEBUG_INFO("Page reservation.\n");
  509. switch(ShmSysConfigAndInfo->SysConfig.DefaultLanguage)
  510. {
  511. case LCD_LANG_CHT:
  512. case LCD_LANG_CHS:
  513. case LCD_LANG_JAPANESE:
  514. case LCD_LANG_FRENCH:
  515. case LCD_LANG_ITALIAN:
  516. case LCD_LANG_SPANISH:
  517. case LCD_LANG_GERMAN:
  518. case LCD_LANG_DUTCH:
  519. case LCD_LANG_NORWEGIAN:
  520. case LCD_LANG_FINNISH:
  521. case LCD_LANG_SWEDISH:
  522. case LCD_LANG_SLOVENIAN:
  523. case LCD_LANG_THAI:
  524. case LCD_LANG_ENGLISH:
  525. default:
  526. break;
  527. }
  528. }
  529. void page_booking()
  530. {
  531. DEBUG_INFO("Page booking.\n");
  532. switch(ShmSysConfigAndInfo->SysConfig.DefaultLanguage)
  533. {
  534. case LCD_LANG_CHT:
  535. case LCD_LANG_CHS:
  536. case LCD_LANG_JAPANESE:
  537. case LCD_LANG_FRENCH:
  538. case LCD_LANG_ITALIAN:
  539. case LCD_LANG_SPANISH:
  540. case LCD_LANG_GERMAN:
  541. case LCD_LANG_DUTCH:
  542. case LCD_LANG_NORWEGIAN:
  543. case LCD_LANG_FINNISH:
  544. case LCD_LANG_SWEDISH:
  545. case LCD_LANG_SLOVENIAN:
  546. case LCD_LANG_THAI:
  547. case LCD_LANG_ENGLISH:
  548. default:
  549. break;
  550. }
  551. }
  552. void page_debug()
  553. {
  554. DEBUG_INFO("Page debug.\n");
  555. switch(ShmSysConfigAndInfo->SysConfig.DefaultLanguage)
  556. {
  557. case LCD_LANG_CHT:
  558. case LCD_LANG_CHS:
  559. case LCD_LANG_JAPANESE:
  560. case LCD_LANG_FRENCH:
  561. case LCD_LANG_ITALIAN:
  562. case LCD_LANG_SPANISH:
  563. case LCD_LANG_GERMAN:
  564. case LCD_LANG_DUTCH:
  565. case LCD_LANG_NORWEGIAN:
  566. case LCD_LANG_FINNISH:
  567. case LCD_LANG_SWEDISH:
  568. case LCD_LANG_SLOVENIAN:
  569. case LCD_LANG_THAI:
  570. case LCD_LANG_ENGLISH:
  571. default:
  572. dispGraphicConfig(Uart1Fd, AREAD_ID_0, YES, 0, 8, 128, 64);
  573. dispGraphicPartial(Uart1Fd, AREAD_ID_0, YES, 0, 0, 0, 8, 128, 64, IMG_ADDR_MAINTIAN);
  574. break;
  575. }
  576. }
  577. void page_unknown()
  578. {
  579. DEBUG_INFO("Page unknown.\n");
  580. switch(ShmSysConfigAndInfo->SysConfig.DefaultLanguage)
  581. {
  582. case LCD_LANG_CHT:
  583. case LCD_LANG_CHS:
  584. case LCD_LANG_JAPANESE:
  585. case LCD_LANG_FRENCH:
  586. case LCD_LANG_ITALIAN:
  587. case LCD_LANG_SPANISH:
  588. case LCD_LANG_GERMAN:
  589. case LCD_LANG_DUTCH:
  590. case LCD_LANG_NORWEGIAN:
  591. case LCD_LANG_FINNISH:
  592. case LCD_LANG_SWEDISH:
  593. case LCD_LANG_SLOVENIAN:
  594. case LCD_LANG_THAI:
  595. case LCD_LANG_ENGLISH:
  596. default:
  597. dispGraphicConfig(Uart1Fd, AREAD_ID_0, YES, 0, 8, 128, 64);
  598. dispGraphicPartial(Uart1Fd, AREAD_ID_0, YES, 0, 0, 0, 8, 128, 64, IMG_ADDR_MAINTIAN);
  599. break;
  600. }
  601. }
  602. void page_header()
  603. {
  604. uint8_t buf[128];
  605. DEBUG_INFO("Page heading.\n");
  606. if(sysFlag.isEnable4G)
  607. {
  608. // Drawing 4G signal strength
  609. if((ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi == 0) || (ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi == 99))
  610. {
  611. drawRfSignal(Uart1Fd, 0, YES);
  612. }
  613. else if((1 <= ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi) && (ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi < 9)) // -95dBm ~ -111dBm
  614. {
  615. drawRfSignal(Uart1Fd, 1, YES);
  616. }
  617. else if((9 <= ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi) && (ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi < 14)) // -85dBm ~ -95dBm
  618. {
  619. drawRfSignal(Uart1Fd, 2, YES);
  620. }
  621. else if((14 <= ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi) && (ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi < 19)) // -75dBm ~ -85dBm
  622. {
  623. drawRfSignal(Uart1Fd, 3, YES);
  624. }
  625. else if((19 <= ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi) && (ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi < 27)) // -60dBm ~ -75dBm
  626. {
  627. drawRfSignal(Uart1Fd, 4, YES);
  628. }
  629. else if((27 <= ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi)) // 60dBm ~
  630. {
  631. drawRfSignal(Uart1Fd, 5, YES);
  632. }
  633. else
  634. {
  635. drawRfSignal(Uart1Fd, 0, YES);
  636. }
  637. }
  638. if(sysFlag.isEnableWiFi)
  639. {
  640. // Drawing WIFI signal strength
  641. if(ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi == 0)
  642. {
  643. drawRfSignal(Uart1Fd, 0, NO);
  644. }
  645. else if((-100 <= ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi) && (ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi < -80))
  646. {
  647. drawRfSignal(Uart1Fd, 1, NO);
  648. }
  649. else if((-80 <= ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi) && (ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi < -70))
  650. {
  651. drawRfSignal(Uart1Fd, 2, NO);
  652. }
  653. else if((-70 <= ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi) && (ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi < -50))
  654. {
  655. drawRfSignal(Uart1Fd, 3, NO);
  656. }
  657. else if((-50 <= ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi) && (ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi < -30))
  658. {
  659. drawRfSignal(Uart1Fd, 4, NO);
  660. }
  661. else if((-30 <= ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi))
  662. {
  663. drawRfSignal(Uart1Fd, 5, NO);
  664. }
  665. else
  666. {
  667. drawRfSignal(Uart1Fd, 0, NO);
  668. }
  669. }
  670. // Drawing ethernet status
  671. dispGraphic(Uart1Fd, YES, 121-(sysFlag.isEnableWiFi?26:0)+(sysFlag.isEnable4G?26:0), 0, (ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet?IMG_ADDR_ICON_LAN_OFF:IMG_ADDR_ICON_LAN_ON));
  672. // Unit price display
  673. if(ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
  674. {
  675. sprintf((char*)buf, "%.2f %s/KWH", ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee, Currency[ShmSysConfigAndInfo->SysConfig.BillingData.Currency]);
  676. dispCharacterArea(Uart1Fd, AREAD_ID_HEADER_PRICE, 0, 0, 30, 7, FONT_ASCII_4X6, buf, strlen((char*)buf));
  677. }
  678. else
  679. {
  680. dispCharacterArea(Uart1Fd, AREAD_ID_HEADER_PRICE, 0, 0, 30, 7, FONT_ASCII_4X6, (uint8_t*)" ", strlen(" "));
  681. }
  682. //dispCharacterConfig(Uart1Fd, AREAD_ID_HEADER, YES, 0, 0, 30, 7);
  683. //dispCharacterScroll(Uart1Fd, AREAD_ID_HEADER, 0, 0, 40, 7, FONT_ASCII_4X6, NO, 25, (uint8_t*)"012334", strlen("012334"));
  684. //dispCharacterBlink(Uart1Fd, AREAD_ID_HEADER, 0, 0, FONT_ASCII_4X6, 1, 100, (uint8_t*)"ABCDEFG", strlen("ABCDEFG"));
  685. }
  686. //==========================================
  687. // Init all share memory
  688. //==========================================
  689. int InitShareMemory()
  690. {
  691. int result = PASS;
  692. int MeterSMId;
  693. //creat ShmSysConfigAndInfo
  694. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  695. {
  696. #ifdef SystemLogMessage
  697. DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
  698. #endif
  699. result = FAIL;
  700. }
  701. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  702. {
  703. #ifdef SystemLogMessage
  704. DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
  705. #endif
  706. result = FAIL;
  707. }
  708. else
  709. {}
  710. //creat ShmStatusCodeData
  711. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  712. {
  713. #ifdef SystemLogMessage
  714. DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
  715. #endif
  716. result = FAIL;
  717. }
  718. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  719. {
  720. #ifdef SystemLogMessage
  721. DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
  722. #endif
  723. result = FAIL;
  724. }
  725. else
  726. {}
  727. //Initial ShmCharger
  728. if ((MeterSMId = shmget(ShmChargerKey, sizeof(struct Charger), 0777)) < 0)
  729. {
  730. #ifdef SystemLogMessage
  731. DEBUG_ERROR("shmget ShmChargerKey NG\r\n");
  732. #endif
  733. result = FAIL;
  734. }
  735. else if ((ShmCharger = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  736. {
  737. #ifdef SystemLogMessage
  738. DEBUG_ERROR("shmat ShmChargerKey NG\r\n");
  739. #endif
  740. result = FAIL;
  741. }
  742. if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D') || (ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T'))
  743. sysFlag.isEnable4G = ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomEnabled;
  744. else
  745. sysFlag.isEnable4G = OFF;
  746. if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D') || (ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W'))
  747. sysFlag.isEnableWiFi = ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode;
  748. else
  749. sysFlag.isEnableWiFi = OFF;
  750. DEBUG_INFO("sysFlag.isEnable4G: %d\n", sysFlag.isEnable4G);
  751. DEBUG_INFO("sysFlag.isEnableWiFi: %d\n", sysFlag.isEnableWiFi);
  752. return result;
  753. }
  754. int InitComPort()
  755. {
  756. int fd;
  757. struct termios tios;
  758. fd = open("/dev/ttyS3", O_RDWR);
  759. if(fd<=0)
  760. {
  761. DEBUG_ERROR("open /dev/ttyS3 NG\n");
  762. return -1;
  763. }
  764. ioctl (fd, TCGETS, &tios);
  765. tios.c_cflag = B115200| CS8 | CLOCAL | CREAD;
  766. tios.c_lflag = 0;
  767. tios.c_iflag = 0;
  768. tios.c_oflag = 0;
  769. tios.c_cc[VMIN]=0;
  770. tios.c_cc[VTIME]=(unsigned char)5; // timeout 500ms
  771. tios.c_lflag=0;
  772. tcflush(fd, TCIFLUSH);
  773. ioctl (fd, TCSETS, &tios);
  774. return fd;
  775. }
  776. int InitLcdModule()
  777. {
  778. int result = FAIL;
  779. uint8_t qrcodeData[qrcode_getBufferSize(SIZE_53X53)];
  780. uint8_t qrImageRaw[((53/8)+1)*53];
  781. uint16_t dataMaxLen = 512;
  782. uint8_t qrcontent[196];
  783. if(ShmSysConfigAndInfo->SysConfig.QRCodeMadeMode)
  784. {
  785. // Customization content
  786. qrcode_initText(&qrcode, qrcodeData, SIZE_53X53, 0, (char*)ShmSysConfigAndInfo->SysConfig.QRCodeContent);
  787. }
  788. else
  789. {
  790. // Default content model name & serial number
  791. sprintf((char*)qrcontent, "%s%s", ShmSysConfigAndInfo->SysConfig.ModelName, ShmSysConfigAndInfo->SysConfig.SerialNumber);
  792. qrcode_initText(&qrcode, qrcodeData, SIZE_53X53, 0, (char*)qrcontent);
  793. }
  794. // Power on LCD
  795. setPower(Uart1Fd, ON);
  796. // Clear LCD page
  797. clearScreen(Uart1Fd, NO, 0, 0, 128, 64);
  798. // Set LCE brightness
  799. setContrast(Uart1Fd, 255, 255, 1);
  800. // Display initial screen
  801. page_booting();
  802. // QR code raw data generate
  803. memset(qrImageRaw, 0x00, ARRAY_SIZE(qrImageRaw));
  804. for(uint16_t idxY = 0;idxY<qrcode.size;idxY++)
  805. {
  806. for(uint16_t idxX = 0;idxX<qrcode.size;idxX++)
  807. {
  808. if(qrcode_getModule(&qrcode, idxX, idxY))
  809. {
  810. //drawPoint(Uart1Fd, idxX, idxY);
  811. qrImageRaw[(7*idxY) + (idxX/8)] |= (0x01<<(7-(idxX%8)));
  812. }
  813. else
  814. {
  815. qrImageRaw[(7*idxY) + (idxX/8)] &= ~(0x01<<(7-(idxX%8)));
  816. }
  817. }
  818. }
  819. // Upload image file
  820. // QR Code
  821. picUploadStart(Uart1Fd, IMG_ADDR_QRCODE, 53, 53);
  822. for(uint8_t idx=0;idx<=ARRAY_SIZE(qrImageRaw)/dataMaxLen;idx++)
  823. {
  824. if((idx < (ARRAY_SIZE(qrImageRaw)/dataMaxLen)) || ((idx == (ARRAY_SIZE(qrImageRaw)/dataMaxLen)) && ((ARRAY_SIZE(qrImageRaw)%dataMaxLen)>0)))
  825. picUploadData(Uart1Fd, IMG_ADDR_QRCODE, (idx*dataMaxLen), &qrImageRaw[idx*dataMaxLen], (idx<(ARRAY_SIZE(qrImageRaw)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(qrImageRaw)%dataMaxLen)) );
  826. }
  827. // LAN icon
  828. for(uint8_t idxLAN=0;idxLAN<6;idxLAN++)
  829. {
  830. picUploadStart(Uart1Fd, IMG_ADDR_ICON_LAN_OFF+idxLAN, 7, 7);
  831. for(uint8_t idx=0;idx<=ARRAY_SIZE(LAN_Icon[idxLAN])/dataMaxLen;idx++)
  832. {
  833. if((idx < (ARRAY_SIZE(LAN_Icon[idxLAN])/dataMaxLen)) || ((idx == (ARRAY_SIZE(LAN_Icon[idxLAN])/dataMaxLen)) && ((ARRAY_SIZE(LAN_Icon[idxLAN])%dataMaxLen)>0)))
  834. picUploadData(Uart1Fd, IMG_ADDR_ICON_LAN_OFF+idxLAN, (idx*dataMaxLen), &LAN_Icon[idxLAN][idx*dataMaxLen], (idx<(ARRAY_SIZE(LAN_Icon[idxLAN])/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(LAN_Icon[idxLAN])%dataMaxLen)) );
  835. }
  836. }
  837. // RF icon
  838. for(uint8_t idxRF=0;idxRF<6;idxRF++)
  839. {
  840. picUploadStart(Uart1Fd, IMG_ADDR_RF_0+idxRF, 19, 7);
  841. for(uint8_t idx=0;idx<=ARRAY_SIZE(RF_Icon[idxRF])/dataMaxLen;idx++)
  842. {
  843. if((idx < (ARRAY_SIZE(RF_Icon[idxRF])/dataMaxLen)) || ((idx == (ARRAY_SIZE(RF_Icon[idxRF])/dataMaxLen)) && ((ARRAY_SIZE(RF_Icon[idxRF])%dataMaxLen)>0)))
  844. picUploadData(Uart1Fd, IMG_ADDR_RF_0+idxRF, (idx*dataMaxLen), &RF_Icon[idxRF][idx*dataMaxLen], (idx<(ARRAY_SIZE(RF_Icon[idxRF])/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(RF_Icon[idxRF])%dataMaxLen)) );
  845. }
  846. }
  847. // Init image
  848. picUploadStart(Uart1Fd, IMG_ADDR_INIT, 128, 64);
  849. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_init)/dataMaxLen;idx++)
  850. {
  851. if((idx < (ARRAY_SIZE(img_init)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_init)/dataMaxLen)) && ((ARRAY_SIZE(img_init)%dataMaxLen)>0)))
  852. picUploadData(Uart1Fd, IMG_ADDR_INIT, (idx*dataMaxLen), &img_init[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_init)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_init)%dataMaxLen)) );
  853. }
  854. // RIFD image
  855. picUploadStart(Uart1Fd, IMG_ADDR_TAP_RFID, 48, 38);
  856. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_rfid)/dataMaxLen;idx++)
  857. {
  858. if((idx < (ARRAY_SIZE(img_rfid)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_rfid)/dataMaxLen)) && ((ARRAY_SIZE(img_rfid)%dataMaxLen)>0)))
  859. picUploadData(Uart1Fd, IMG_ADDR_TAP_RFID, (idx*dataMaxLen), &img_rfid[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_rfid)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_rfid)%dataMaxLen)) );
  860. }
  861. // Handshake 1 image
  862. picUploadStart(Uart1Fd, IMG_ADDR_HANDSHAKE_1, 128, 64);
  863. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_handshake_1)/dataMaxLen;idx++)
  864. {
  865. if((idx < (ARRAY_SIZE(img_handshake_1)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_handshake_1)/dataMaxLen)) && ((ARRAY_SIZE(img_handshake_1)%dataMaxLen)>0)))
  866. picUploadData(Uart1Fd, IMG_ADDR_HANDSHAKE_1, (idx*dataMaxLen), &img_handshake_1[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_handshake_1)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_handshake_1)%dataMaxLen)) );
  867. }
  868. // Handshake 2 image
  869. picUploadStart(Uart1Fd, IMG_ADDR_HANDSHAKE_2, 128, 64);
  870. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_handshake_2)/dataMaxLen;idx++)
  871. {
  872. if((idx < (ARRAY_SIZE(img_handshake_2)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_handshake_2)/dataMaxLen)) && ((ARRAY_SIZE(img_handshake_2)%dataMaxLen)>0)))
  873. picUploadData(Uart1Fd, IMG_ADDR_HANDSHAKE_2, (idx*dataMaxLen), &img_handshake_2[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_handshake_2)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_handshake_2)%dataMaxLen)) );
  874. }
  875. // Maintain image
  876. picUploadStart(Uart1Fd, IMG_ADDR_MAINTIAN, 128, 64);
  877. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_maintain)/dataMaxLen;idx++)
  878. {
  879. if((idx < (ARRAY_SIZE(img_maintain)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_maintain)/dataMaxLen)) && ((ARRAY_SIZE(img_maintain)%dataMaxLen)>0)))
  880. picUploadData(Uart1Fd, IMG_ADDR_MAINTIAN, (idx*dataMaxLen), &img_maintain[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_maintain)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_maintain)%dataMaxLen)) );
  881. }
  882. // Verify image
  883. picUploadStart(Uart1Fd, IMG_ADDR_VERIFY, 128, 64);
  884. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_verify)/dataMaxLen;idx++)
  885. {
  886. if((idx < (ARRAY_SIZE(img_verify)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_verify)/dataMaxLen)) && ((ARRAY_SIZE(img_verify)%dataMaxLen)>0)))
  887. picUploadData(Uart1Fd, IMG_ADDR_VERIFY, (idx*dataMaxLen), &img_verify[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_verify)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_verify)%dataMaxLen)) );
  888. }
  889. // Verify OK image
  890. picUploadStart(Uart1Fd, IMG_ADDR_VERIFYOK, 128, 64);
  891. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_verify_ok)/dataMaxLen;idx++)
  892. {
  893. if((idx < (ARRAY_SIZE(img_verify_ok)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_verify_ok)/dataMaxLen)) && ((ARRAY_SIZE(img_verify_ok)%dataMaxLen)>0)))
  894. picUploadData(Uart1Fd, IMG_ADDR_VERIFYOK, (idx*dataMaxLen), &img_verify_ok[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_verify_ok)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_verify_ok)%dataMaxLen)) );
  895. }
  896. // Verify fail image
  897. picUploadStart(Uart1Fd, IMG_ADDR_VERIFYFAIL, 128, 64);
  898. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_verify_fail)/dataMaxLen;idx++)
  899. {
  900. if((idx < (ARRAY_SIZE(img_verify_fail)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_verify_fail)/dataMaxLen)) && ((ARRAY_SIZE(img_verify_fail)%dataMaxLen)>0)))
  901. picUploadData(Uart1Fd, IMG_ADDR_VERIFYFAIL, (idx*dataMaxLen), &img_verify_fail[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_verify_fail)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_verify_fail)%dataMaxLen)) );
  902. }
  903. // Icon alert image
  904. picUploadStart(Uart1Fd, IMG_ADDR_ICON_ALERT, 16, 16);
  905. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_icon_alert)/dataMaxLen;idx++)
  906. {
  907. if((idx < (ARRAY_SIZE(img_icon_alert)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_icon_alert)/dataMaxLen)) && ((ARRAY_SIZE(img_icon_alert)%dataMaxLen)>0)))
  908. picUploadData(Uart1Fd, IMG_ADDR_ICON_ALERT, (idx*dataMaxLen), &img_icon_alert[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_icon_alert)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_icon_alert)%dataMaxLen)) );
  909. }
  910. // Icon energy image
  911. picUploadStart(Uart1Fd, IMG_ADDR_ICON_ENERGY, 24, 24);
  912. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_icon_energy)/dataMaxLen;idx++)
  913. {
  914. if((idx < (ARRAY_SIZE(img_icon_energy)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_icon_energy)/dataMaxLen)) && ((ARRAY_SIZE(img_icon_energy)%dataMaxLen)>0)))
  915. picUploadData(Uart1Fd, IMG_ADDR_ICON_ENERGY, (idx*dataMaxLen), &img_icon_energy[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_icon_energy)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_icon_energy)%dataMaxLen)) );
  916. }
  917. // Icon energy image
  918. picUploadStart(Uart1Fd, IMG_ADDR_ICON_COST, 24, 24);
  919. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_icon_cost)/dataMaxLen;idx++)
  920. {
  921. if((idx < (ARRAY_SIZE(img_icon_cost)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_icon_cost)/dataMaxLen)) && ((ARRAY_SIZE(img_icon_cost)%dataMaxLen)>0)))
  922. picUploadData(Uart1Fd, IMG_ADDR_ICON_COST, (idx*dataMaxLen), &img_icon_cost[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_icon_cost)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_icon_cost)%dataMaxLen)) );
  923. }
  924. // Icon time image
  925. picUploadStart(Uart1Fd, IMG_ADDR_ICON_TIME, 24, 24);
  926. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_icon_time)/dataMaxLen;idx++)
  927. {
  928. if((idx < (ARRAY_SIZE(img_icon_time)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_icon_time)/dataMaxLen)) && ((ARRAY_SIZE(img_icon_time)%dataMaxLen)>0)))
  929. picUploadData(Uart1Fd, IMG_ADDR_ICON_TIME, (idx*dataMaxLen), &img_icon_time[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_icon_time)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_icon_time)%dataMaxLen)) );
  930. }
  931. // Icon price image
  932. picUploadStart(Uart1Fd, IMG_ADDR_ICON_PRICE, 33, 24);
  933. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_icon_price)/dataMaxLen;idx++)
  934. {
  935. if((idx < (ARRAY_SIZE(img_icon_price)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_icon_price)/dataMaxLen)) && ((ARRAY_SIZE(img_icon_price)%dataMaxLen)>0)))
  936. picUploadData(Uart1Fd, IMG_ADDR_ICON_PRICE, (idx*dataMaxLen), &img_icon_price[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_icon_price)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_icon_price)%dataMaxLen)) );
  937. }
  938. // Icon battery 0% image
  939. picUploadStart(Uart1Fd, IMG_ADDR_ICON_B0, 48, 16);
  940. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_icon_b0)/dataMaxLen;idx++)
  941. {
  942. if((idx < (ARRAY_SIZE(img_icon_b0)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_icon_b0)/dataMaxLen)) && ((ARRAY_SIZE(img_icon_b0)%dataMaxLen)>0)))
  943. picUploadData(Uart1Fd, IMG_ADDR_ICON_B0, (idx*dataMaxLen), &img_icon_b0[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_icon_b0)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_icon_b0)%dataMaxLen)) );
  944. }
  945. // Icon battery 20% image
  946. picUploadStart(Uart1Fd, IMG_ADDR_ICON_B20, 48, 16);
  947. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_icon_b20)/dataMaxLen;idx++)
  948. {
  949. if((idx < (ARRAY_SIZE(img_icon_b20)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_icon_b20)/dataMaxLen)) && ((ARRAY_SIZE(img_icon_b20)%dataMaxLen)>0)))
  950. picUploadData(Uart1Fd, IMG_ADDR_ICON_B20, (idx*dataMaxLen), &img_icon_b20[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_icon_b20)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_icon_b20)%dataMaxLen)) );
  951. }
  952. // Icon battery 40% image
  953. picUploadStart(Uart1Fd, IMG_ADDR_ICON_B40, 48, 16);
  954. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_icon_b40)/dataMaxLen;idx++)
  955. {
  956. if((idx < (ARRAY_SIZE(img_icon_b40)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_icon_b40)/dataMaxLen)) && ((ARRAY_SIZE(img_icon_b40)%dataMaxLen)>0)))
  957. picUploadData(Uart1Fd, IMG_ADDR_ICON_B40, (idx*dataMaxLen), &img_icon_b40[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_icon_b40)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_icon_b40)%dataMaxLen)) );
  958. }
  959. // Icon battery 60% image
  960. picUploadStart(Uart1Fd, IMG_ADDR_ICON_B60, 48, 16);
  961. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_icon_b60)/dataMaxLen;idx++)
  962. {
  963. if((idx < (ARRAY_SIZE(img_icon_b60)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_icon_b60)/dataMaxLen)) && ((ARRAY_SIZE(img_icon_b60)%dataMaxLen)>0)))
  964. picUploadData(Uart1Fd, IMG_ADDR_ICON_B60, (idx*dataMaxLen), &img_icon_b60[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_icon_b60)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_icon_b60)%dataMaxLen)) );
  965. }
  966. // Icon battery 80% image
  967. picUploadStart(Uart1Fd, IMG_ADDR_ICON_B80, 48, 16);
  968. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_icon_b80)/dataMaxLen;idx++)
  969. {
  970. if((idx < (ARRAY_SIZE(img_icon_b80)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_icon_b80)/dataMaxLen)) && ((ARRAY_SIZE(img_icon_b80)%dataMaxLen)>0)))
  971. picUploadData(Uart1Fd, IMG_ADDR_ICON_B80, (idx*dataMaxLen), &img_icon_b80[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_icon_b80)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_icon_b80)%dataMaxLen)) );
  972. }
  973. // Icon battery 100% image
  974. picUploadStart(Uart1Fd, IMG_ADDR_ICON_B100, 48, 16);
  975. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_icon_b100)/dataMaxLen;idx++)
  976. {
  977. if((idx < (ARRAY_SIZE(img_icon_b100)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_icon_b100)/dataMaxLen)) && ((ARRAY_SIZE(img_icon_b100)%dataMaxLen)>0)))
  978. picUploadData(Uart1Fd, IMG_ADDR_ICON_B100, (idx*dataMaxLen), &img_icon_b100[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_icon_b100)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_icon_b100)%dataMaxLen)) );
  979. }
  980. // Icon battery 100% image
  981. picUploadStart(Uart1Fd, IMG_ADDR_ICON_COMPLETE, 48, 18);
  982. for(uint8_t idx=0;idx<=ARRAY_SIZE(img_icon_complete)/dataMaxLen;idx++)
  983. {
  984. if((idx < (ARRAY_SIZE(img_icon_complete)/dataMaxLen)) || ((idx == (ARRAY_SIZE(img_icon_complete)/dataMaxLen)) && ((ARRAY_SIZE(img_icon_complete)%dataMaxLen)>0)))
  985. picUploadData(Uart1Fd, IMG_ADDR_ICON_COMPLETE, (idx*dataMaxLen), &img_icon_complete[idx*dataMaxLen], (idx<(ARRAY_SIZE(img_icon_complete)/dataMaxLen)?dataMaxLen:(ARRAY_SIZE(img_icon_complete)%dataMaxLen)) );
  986. }
  987. return result;
  988. }
  989. //================================================
  990. // Main process
  991. //================================================
  992. int main(void)
  993. {
  994. uint8_t previousMode = 0xff;
  995. uint8_t previousLan = 0xff;
  996. if(InitShareMemory() == FAIL)
  997. {
  998. #ifdef SystemLogMessage
  999. DEBUG_ERROR("InitShareMemory NG\n");
  1000. #endif
  1001. if(ShmStatusCodeData!=NULL)
  1002. {
  1003. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
  1004. }
  1005. sleep(5);
  1006. return FAIL;
  1007. }
  1008. Uart1Fd=InitComPort();
  1009. if(Uart1Fd<0)
  1010. {
  1011. #ifdef SystemLogMessage
  1012. DEBUG_ERROR("InitComPort NG\n");
  1013. #endif
  1014. if(ShmStatusCodeData!=NULL)
  1015. {
  1016. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  1017. }
  1018. sleep(5);
  1019. return FAIL;
  1020. }
  1021. else
  1022. {
  1023. InitLcdModule();
  1024. }
  1025. DEBUG_INFO("Initial completed\n");
  1026. for(;;)
  1027. {
  1028. // Clear LCD if page change.
  1029. if((previousMode != ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus) ||
  1030. (previousLan != ShmSysConfigAndInfo->SysConfig.DefaultLanguage))
  1031. {
  1032. // Clear screen
  1033. clearScreen(Uart1Fd, NO, 0, 0, 128, 64);
  1034. previousMode = ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus;
  1035. previousLan = ShmSysConfigAndInfo->SysConfig.DefaultLanguage;
  1036. }
  1037. switch(ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus)
  1038. {
  1039. case SYS_MODE_BOOTING:
  1040. page_booting();
  1041. break;
  1042. case SYS_MODE_IDLE:
  1043. page_idle();
  1044. break;
  1045. case SYS_MODE_AUTHORIZING:
  1046. page_authorizing();
  1047. break;
  1048. case SYS_MODE_PREPARING:
  1049. page_preparing();
  1050. break;
  1051. case SYS_MODE_CHARGING:
  1052. page_charging();
  1053. break;
  1054. case SYS_MODE_TERMINATING:
  1055. page_terminating();
  1056. break;
  1057. case SYS_MODE_COMPLETE:
  1058. page_complete();
  1059. break;
  1060. case SYS_MODE_ALARM:
  1061. page_alarm();
  1062. break;
  1063. case SYS_MODE_FAULT:
  1064. page_fault();
  1065. break;
  1066. case SYS_MODE_MAINTAIN:
  1067. page_maintain();
  1068. break;
  1069. case SYS_MODE_UPDATE:
  1070. page_update();
  1071. break;
  1072. case SYS_MODE_RESERVATION:
  1073. page_reservation();
  1074. break;
  1075. case SYS_MODE_BOOKING:
  1076. page_booking();
  1077. break;
  1078. case SYS_MODE_DEBUG:
  1079. page_debug();
  1080. break;
  1081. default:
  1082. page_unknown();
  1083. break;
  1084. }
  1085. page_header();
  1086. usleep(1000000);
  1087. }
  1088. return FAIL;
  1089. }