Module_LcmControl.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912
  1. #include "Module_LcmContro.h"
  2. void PRINTF_FUNC(char *string, ...);
  3. int StoreLogMsg(const char *fmt, ...);
  4. #define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
  5. #define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
  6. #define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
  7. char* getTimeString(void);
  8. //=================================
  9. // Common routine
  10. //=================================
  11. int StoreLogMsg(const char *fmt, ...)
  12. {
  13. char Buf[4096+256];
  14. char buffer[4096];
  15. time_t CurrentTime;
  16. struct tm *tm;
  17. va_list args;
  18. va_start(args, fmt);
  19. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  20. va_end(args);
  21. memset(Buf,0,sizeof(Buf));
  22. CurrentTime = time(NULL);
  23. tm=localtime(&CurrentTime);
  24. sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
  25. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,
  26. buffer,
  27. tm->tm_year+1900,tm->tm_mon+1);
  28. system(Buf);
  29. return rc;
  30. }
  31. char* getTimeString(void)
  32. {
  33. char *result=malloc(21);
  34. time_t timep;
  35. struct tm *p;
  36. time(&timep);
  37. p=gmtime(&timep);
  38. sprintf(result, "[%04d-%02d-%02d %02d:%02d:%02d]", (1900+p->tm_year), (1+p->tm_mon), p->tm_mday, p->tm_hour, p->tm_hour, p->tm_sec);
  39. return result;
  40. }
  41. void PRINTF_FUNC(char *string, ...)
  42. {
  43. va_list args;
  44. char buffer[4096];
  45. va_start(args, string);
  46. vsnprintf(buffer, sizeof(buffer), string, args);
  47. va_end(args);
  48. if (DEBUG)
  49. printf("%s \n", buffer);
  50. else
  51. DEBUG_INFO("%s \n", buffer);
  52. }
  53. //==========================================
  54. // Init all share memory
  55. //==========================================
  56. int InitShareMemory()
  57. {
  58. int result = PASS;
  59. int MeterSMId;
  60. //creat ShmSysConfigAndInfo
  61. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  62. {
  63. #ifdef SystemLogMessage
  64. DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
  65. #endif
  66. result = FAIL;
  67. }
  68. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  69. {
  70. #ifdef SystemLogMessage
  71. DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
  72. #endif
  73. result = FAIL;
  74. }
  75. else
  76. {}
  77. //creat ShmStatusCodeData
  78. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  79. {
  80. #ifdef SystemLogMessage
  81. DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
  82. #endif
  83. result = FAIL;
  84. }
  85. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  86. {
  87. #ifdef SystemLogMessage
  88. DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
  89. #endif
  90. result = FAIL;
  91. }
  92. else
  93. {}
  94. return result;
  95. }
  96. //==========================================
  97. // Open and Close RS232 and R/W
  98. //==========================================
  99. int CreateCommunicationLcmPort()
  100. {
  101. int fd;
  102. struct termios tios;
  103. fd = open(pPortName, O_RDWR);
  104. if (fd <= 0) {
  105. #ifdef SystemLogMessage
  106. DEBUG_ERROR("open /dev/ttyS3 NG \n");
  107. #endif
  108. return -1;
  109. }
  110. ioctl(fd, TCGETS, &tios);
  111. tios.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
  112. tios.c_lflag = 0;
  113. tios.c_iflag = 0;
  114. tios.c_oflag = 0;
  115. tios.c_cc[VMIN] = 0;
  116. tios.c_cc[VTIME] = (unsigned char) 5;
  117. tios.c_lflag = 0;
  118. tcflush(fd, TCIFLUSH);
  119. ioctl(fd, TCSETS, &tios);
  120. return fd;
  121. }
  122. void CloseCommunicationLcmPort()
  123. {
  124. close(_port);
  125. }
  126. void WriteCmdToLcm(byte *cmd, byte cmdLen)
  127. {
  128. int len = write(_port, cmd, cmdLen);
  129. if(len >= sizeof(cmd))
  130. {
  131. //PRINTF_FUNC("Write cmd to LCM successfully. \n");
  132. }
  133. }
  134. void ReadMsgFromLcm(byte *msg, byte readLen)
  135. {
  136. read(_port, msg, readLen);
  137. if(*msg == CMD_TITLE_1 && *(msg + 1) == CMD_TITLE_2)
  138. {
  139. if(*(msg + 3) == CMD_WRITE)
  140. {
  141. switch (*(msg + 4))
  142. {
  143. case CMD_REGISTER:
  144. {
  145. // 頁面
  146. strcpy((char *)ShmSysConfigAndInfo->SysInfo.LcmHwRev, moduleName);
  147. }
  148. break;
  149. }
  150. }
  151. else if (*(msg + 3) == CMD_MULTI_READ)
  152. {
  153. // switch ((unsigned short) (*(msg + 4) << 8) + (unsigned short) *(msg + 5))
  154. // {
  155. // case BUTTON_GUN_INDEX:
  156. // {
  157. // // 當前選的槍號
  158. // _curGunIndex = (*(msg + 8));
  159. // }
  160. // break;
  161. // }
  162. }
  163. }
  164. }
  165. //================================================
  166. // Function
  167. //================================================
  168. void ChangeToOtherPage(short newPage)
  169. {
  170. byte cmd[7];
  171. memset(cmd, 0x00, sizeof(cmd));
  172. cmd[0] = CMD_TITLE_1;
  173. cmd[1] = CMD_TITLE_2;
  174. cmd[2] = 0x02 + sizeof(newPage);
  175. cmd[3] = CMD_READ;
  176. cmd[4] = CMD_REGISTER;
  177. cmd[5] = newPage >> 8;
  178. cmd[6] = newPage & 0x00FF;
  179. WriteCmdToLcm(cmd, ARRAY_SIZE(cmd));
  180. usleep(100000);
  181. }
  182. void ChangeBackLight(bool islight)
  183. {
  184. byte value = 0x01;
  185. if (islight)
  186. {
  187. value = 0x20;
  188. }
  189. byte cmd[7];
  190. memset(cmd, 0x00, sizeof(cmd));
  191. cmd[0] = CMD_TITLE_1;
  192. cmd[1] = CMD_TITLE_2;
  193. cmd[2] = 0x03;
  194. cmd[3] = CMD_READ;
  195. cmd[4] = CMD_BACKLIGHT;
  196. cmd[5] = value;
  197. WriteCmdToLcm(cmd, ARRAY_SIZE(cmd));
  198. usleep(100000);
  199. }
  200. void GetCurrentPage()
  201. {
  202. byte cmd[6];
  203. memset(cmd, 0x00, sizeof(cmd));
  204. byte msg[8];
  205. memset(msg, 0x00, sizeof(msg));
  206. cmd[0] = CMD_TITLE_1;
  207. cmd[1] = CMD_TITLE_2;
  208. cmd[2] = 0x03; // 底下總長度
  209. cmd[3] = CMD_WRITE;
  210. cmd[4] = CMD_REGISTER;
  211. cmd[5] = 0x02;
  212. WriteCmdToLcm(cmd, ARRAY_SIZE(cmd));
  213. usleep(100000);
  214. ReadMsgFromLcm(msg, ARRAY_SIZE(msg));
  215. }
  216. void DisplayValueToLcm(short address, byte *data, byte len)
  217. {
  218. byte cmd[256];
  219. memset(cmd, 0x00, sizeof(cmd));
  220. cmd[0] = CMD_TITLE_1;
  221. cmd[1] = CMD_TITLE_2;
  222. cmd[2] = 0x03 + len;
  223. cmd[3] = CMD_MULTI_WRITE;
  224. cmd[4] = address >> 8;
  225. cmd[5] = address & 0x00FF;
  226. for(byte count = 0; count < len; count++)
  227. {
  228. cmd[6 + count] = *(data + count);
  229. }
  230. WriteCmdToLcm(cmd, cmd[2] + 3);
  231. }
  232. void ChangeDisplay2Value(short address, short value)
  233. {
  234. byte data[2];
  235. data[0] = value >> 8;
  236. data[1] = value & 0x00FF;
  237. DisplayValueToLcm(address, data, sizeof(data));
  238. }
  239. void GetBtnStatus(short address, byte len)
  240. {
  241. byte cmd[8];
  242. memset(cmd, 0x00, sizeof(cmd));
  243. byte msg[8];
  244. memset(msg, 0x00, sizeof(msg));
  245. cmd[0] = CMD_TITLE_1;
  246. cmd[1] = CMD_TITLE_2;
  247. cmd[2] = 0x03 + len;
  248. cmd[3] = CMD_MULTI_READ;
  249. cmd[4] = address >> 8;
  250. cmd[5] = address & 0x00FF;
  251. cmd[6] = 0x00 + len;
  252. WriteCmdToLcm(cmd, cmd[2] + 3);
  253. usleep(100000);
  254. ReadMsgFromLcm(msg, (len * 2) + sizeof(msg));
  255. }
  256. //================================================
  257. // Warning process
  258. //================================================
  259. void string2ByteArray(unsigned char *input, byte *output)
  260. {
  261. int loop;
  262. int i;
  263. loop = 0;
  264. i = 0;
  265. while(input[loop] != '\0')
  266. {
  267. output[i++] = input[loop++];
  268. }
  269. output[loop] = '\0';
  270. }
  271. void ChangeWarningFunc()
  272. {
  273. byte cmd[7];
  274. byte i = 0;
  275. //PRINTF_FUNC("ChangeWarningFunc \n");
  276. // 最多一次五筆
  277. //PRINTF_FUNC("LCM PageIndex = %d \n", ShmSysConfigAndInfo->SysWarningInfo.PageIndex);
  278. //PRINTF_FUNC("WarningCount = %d \n", ShmSysConfigAndInfo->SysWarningInfo.WarningCount);
  279. for(i = 0; (i + ShmSysConfigAndInfo->SysWarningInfo.PageIndex * 5) < ShmSysConfigAndInfo->SysWarningInfo.WarningCount; i++)
  280. {
  281. memset(cmd, 0x00, sizeof(cmd));
  282. if(i >= 5)
  283. {
  284. break;
  285. }
  286. //error code
  287. string2ByteArray(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i + ShmSysConfigAndInfo->SysWarningInfo.PageIndex * 5][0], cmd);
  288. DisplayValueToLcm(0x0010 + (i * 6), cmd, sizeof(cmd));
  289. //警告標示
  290. memset(cmd, 0x00, sizeof(cmd));
  291. cmd[0] = 0x00;
  292. cmd[1] = 0x01;
  293. DisplayValueToLcm(0x0002 + (i * 2), cmd, 2);
  294. }
  295. memset(cmd, 0x00, sizeof(cmd));
  296. for(; i < 5; i++)
  297. {
  298. DisplayValueToLcm(0x0010 + (i * 6), cmd, sizeof(cmd));
  299. DisplayValueToLcm(0x0002 + (i * 2), cmd, 2);
  300. }
  301. }
  302. //================================================
  303. // QR Code process
  304. //================================================
  305. void ChangeQrCode_Idle(char *input)
  306. {
  307. int len = strlen(input);
  308. byte cmd[len];
  309. int loop = 0;
  310. int i = 0;
  311. while(input[loop] != '\0')
  312. {
  313. cmd[i++] = input[loop++];
  314. }
  315. DisplayValueToLcm(__qr_code, cmd, len);
  316. }
  317. void ChangeQrCode_Charge(char *input)
  318. {
  319. int len = strlen(input);
  320. byte cmd[len];
  321. int loop = 0;
  322. int i = 0;
  323. while(input[loop] != '\0')
  324. {
  325. cmd[i++] = input[loop++];
  326. }
  327. DisplayValueToLcm(__qr_code_pre, cmd, len);
  328. }
  329. //================================================
  330. // Change current page
  331. //================================================
  332. void ChangeCurPage()
  333. {
  334. //PRINTF_FUNC("cur = %d, new = %d \n", _currentPage, ShmSysConfigAndInfo->SysInfo.PageIndex);
  335. if (_currentPage != ShmSysConfigAndInfo->SysInfo.PageIndex)
  336. {
  337. _currentPage = ShmSysConfigAndInfo->SysInfo.PageIndex;
  338. ChangeToOtherPage(_currentPage);
  339. _everyPageRollChange = 0;
  340. }
  341. }
  342. //================================================
  343. // Main process
  344. //================================================
  345. byte demoCount = 0;
  346. void DemoFunction()
  347. {
  348. if (demoCount == 0)
  349. {
  350. ShmSysConfigAndInfo->SysWarningInfo.WarningCount = 6;
  351. memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[0][0], "000001", 7);
  352. memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[1][0], "000002", 7);
  353. memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[2][0], "000003", 7);
  354. memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[3][0], "000004", 7);
  355. memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[4][0], "000005", 7);
  356. memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[5][0], "000006", 7);
  357. }
  358. else
  359. {
  360. if (demoCount == 20) {
  361. ShmSysConfigAndInfo->SysInfo.PageIndex = _LCM_IDLE;
  362. } else if (demoCount == 80) {
  363. ShmSysConfigAndInfo->SysInfo.PageIndex = _LCM_AUTHORIZING;
  364. } else if (demoCount == 100) {
  365. ShmSysConfigAndInfo->SysInfo.PageIndex = _LCM_AUTHORIZ_COMP;
  366. } else if (demoCount == 120) {
  367. ShmSysConfigAndInfo->SysInfo.PageIndex = _LCM_AUTHORIZ_FAIL;
  368. } else if (demoCount == 140) {
  369. ShmSysConfigAndInfo->SysInfo.PageIndex = _LCM_PRE_CHARGE;
  370. } else if (demoCount == 180) {
  371. ShmSysConfigAndInfo->SysInfo.PageIndex = _LCM_CHARGING;
  372. }
  373. }
  374. if (demoCount < 180)
  375. demoCount++;
  376. }
  377. //================================================
  378. // Main process
  379. //================================================
  380. bool FindChargingInfoData(byte target, struct ChargingInfoData **_chargingData)
  381. {
  382. for (byte index = 0; index < CHAdeMO_QUANTITY; index++)
  383. {
  384. if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == target)
  385. {
  386. _chargingData[target] = &ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index];
  387. return true;
  388. }
  389. }
  390. for (byte index = 0; index < CCS_QUANTITY; index++)
  391. {
  392. if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == target)
  393. {
  394. _chargingData[target] = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[index];
  395. return true;
  396. }
  397. }
  398. for (byte index = 0; index < GB_QUANTITY; index++)
  399. {
  400. if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == target)
  401. {
  402. _chargingData[target] = &ShmSysConfigAndInfo->SysInfo.GbChargingData[index];
  403. return true;
  404. }
  405. }
  406. return false;
  407. }
  408. void ChangeBattMapAndValue(short page, int soc)
  409. {
  410. // srand(time(NULL));
  411. // int min = 10;
  412. // int max = 90;
  413. // soc = rand() % (max - min + 1) + min;
  414. if (page == _LCM_CHARGING)
  415. {
  416. if (soc < 20)
  417. ChangeDisplay2Value(__batt_map, _battery_cap_20);
  418. else if (soc >= 20 && soc < 40)
  419. ChangeDisplay2Value(__batt_map, _battery_cap_40);
  420. else if (soc >= 40 && soc < 60)
  421. ChangeDisplay2Value(__batt_map, _battery_cap_60);
  422. else if (soc >= 60 && soc < 80)
  423. ChangeDisplay2Value(__batt_map, _battery_cap_80);
  424. else if (soc >= 80 && soc <= 100)
  425. ChangeDisplay2Value(__batt_map, _battery_cap_100);
  426. }
  427. else if (page == _LCM_COMPLETE)
  428. {
  429. if (soc < 20)
  430. ChangeDisplay2Value(__batt_map, _battery_soc_20);
  431. else if (soc >= 20 && soc < 40)
  432. ChangeDisplay2Value(__batt_map, _battery_soc_40);
  433. else if (soc >= 40 && soc < 60)
  434. ChangeDisplay2Value(__batt_map, _battery_soc_60);
  435. else if (soc >= 60 && soc < 80)
  436. ChangeDisplay2Value(__batt_map, _battery_soc_80);
  437. else if (soc >= 80 && soc <= 100)
  438. ChangeDisplay2Value(__batt_map, _battery_soc_100);
  439. }
  440. byte cmd[5];
  441. byte value[5];
  442. memset(cmd, 0x00, sizeof(cmd));
  443. memset(value, 0x00, sizeof(value));
  444. sprintf((char *)value, "%d%%", soc);
  445. string2ByteArray(value, cmd);
  446. DisplayValueToLcm(__soc_value_charging, cmd, sizeof(cmd));
  447. }
  448. void ChangeRemainTime(int sec)
  449. {
  450. int h, m, s;
  451. byte cmd[10];
  452. byte value[10];
  453. memset(cmd, 0x00, sizeof(cmd));
  454. // srand(time(NULL));
  455. // int min = 0;
  456. // int max = 65536;
  457. // sec = rand() % (max - min + 1) + min;
  458. h = (sec / 3600);
  459. m = (sec - (3600 * h)) / 60;
  460. s = (sec - (3600 * h) - (m * 60));
  461. sprintf((char *)value, "%02d:%02d:%02d", h, m, s);
  462. string2ByteArray(value, cmd);
  463. DisplayValueToLcm(__remain_time_tx, cmd, sizeof(cmd));
  464. }
  465. void ChangeChargingEnergyValue(float energy)
  466. {
  467. byte cmd[10];
  468. byte value[10];
  469. memset(cmd, 0x00, sizeof(cmd));
  470. sprintf((char *) value, "%.1f kWh", energy);
  471. string2ByteArray(value, cmd);
  472. DisplayValueToLcm(__total_out_eng_tx, cmd, sizeof(cmd));
  473. }
  474. void ChangeChargingPowerValue(float pow)
  475. {
  476. byte cmd[10];
  477. byte value[10];
  478. memset(cmd, 0x00, sizeof(cmd));
  479. // float min = 0.0;
  480. // float max = 50;
  481. // pow = (max - min) * rand() / (RAND_MAX + 1.0) + min;
  482. sprintf((char *) value, "%.1f kW", pow);
  483. string2ByteArray(value, cmd);
  484. DisplayValueToLcm(__output_eng_tx, cmd, sizeof(cmd));
  485. }
  486. void ChangeStopMap(byte value)
  487. {
  488. }
  489. void RefreshPageAnimation(byte value)
  490. {
  491. switch(_currentPage)
  492. {
  493. case _LCM_IDLE:
  494. {
  495. if (value == 0)
  496. {
  497. ChangeToOtherPage(_currentPage);
  498. }
  499. else if (value == 15)
  500. {
  501. ChangeToOtherPage(_currentPage + 1);
  502. }
  503. else if (value == 30)
  504. {
  505. ChangeToOtherPage(_currentPage + 2);
  506. }
  507. _everyPageRollChange > 45 ? _everyPageRollChange = 0 : _everyPageRollChange++;
  508. }
  509. break;
  510. case _LCM_WAIT_FOR_PLUG:
  511. {
  512. if(_everyPageRollChange == 0)
  513. ChangeDisplay2Value(__plug_in_arrow, _arrow_dark);
  514. else if(_everyPageRollChange == 15)
  515. ChangeDisplay2Value(__plug_in_arrow, _arrow_light);
  516. _everyPageRollChange > 30 ? _everyPageRollChange = 0 : _everyPageRollChange++;
  517. }
  518. break;
  519. case _LCM_PRE_CHARGE:
  520. case _LCM_CHARGING:
  521. case _LCM_COMPLETE:
  522. {
  523. if (_currentPage == _LCM_PRE_CHARGE)
  524. {
  525. if (_everyPageRollChange == 0 || _everyPageRollChange == 22)
  526. ChangeDisplay2Value(__conn_line, _conn_map1);
  527. else if (_everyPageRollChange == 11 || _everyPageRollChange == 33)
  528. ChangeDisplay2Value(__conn_line, _conn_map2);
  529. }
  530. else if (_currentPage == _LCM_CHARGING)
  531. {
  532. if (_everyPageRollChange == 0 || _everyPageRollChange == 22)
  533. ChangeDisplay2Value(__conn_line_chag, _charging_map1);
  534. else if (_everyPageRollChange == 11 || _everyPageRollChange == 33)
  535. ChangeDisplay2Value(__conn_line_chag, _charging_map2);
  536. }
  537. else if (_currentPage == _LCM_COMPLETE)
  538. {
  539. if (_everyPageRollChange == 0)
  540. ChangeDisplay2Value(__conn_line_comp, _complete_map);
  541. }
  542. if (_totalCount == 2 && _currentPage != _LCM_PRE_CHARGE)
  543. {
  544. byte index = 0;
  545. for (index = 0; index < _totalCount; index++) {
  546. if (ShmSysConfigAndInfo->SysInfo.CurGunSelected != index)
  547. {
  548. break;
  549. }
  550. }
  551. ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
  552. if (_chargingInfoData[index]->SystemStatus == S_IDLE ||
  553. _chargingInfoData[index]->SystemStatus == S_RESERVATION)
  554. {
  555. if(value == 0)
  556. {
  557. ChangeDisplay2Value(__side_top, _side_rfid_1);
  558. ChangeDisplay2Value(__side_down, _side_rfid_2);
  559. }
  560. else if (value == 15)
  561. {
  562. ChangeDisplay2Value(__side_top, _side_qr_1);
  563. ChangeDisplay2Value(__side_down, _side_qr_2);
  564. }
  565. else if (value == 30)
  566. {
  567. ChangeDisplay2Value(__side_top, _side_app_1);
  568. ChangeDisplay2Value(__side_down, _side_app_2);
  569. }
  570. }
  571. else
  572. {
  573. ChangeDisplay2Value(__side_top, _disappear);
  574. ChangeDisplay2Value(__side_down, _disappear);
  575. ChangeDisplay2Value(__qr_code_pre, _disappear);
  576. }
  577. }
  578. else
  579. {
  580. ChangeDisplay2Value(__sel_gun_btn, _disappear);
  581. ChangeDisplay2Value(__side_top, _disappear);
  582. ChangeDisplay2Value(__side_down, _disappear);
  583. ChangeDisplay2Value(__qr_code_pre, _disappear);
  584. }
  585. _everyPageRollChange >= 45 ? _everyPageRollChange = 0 : _everyPageRollChange++;
  586. }
  587. break;
  588. }
  589. }
  590. void RefreshConnStatus()
  591. {
  592. // Wifi priority is higher than Ethernet
  593. if (ShmSysConfigAndInfo->SysConfig.AthInterface.WifiNetworkConn == YES)
  594. {
  595. _wifi_conn_status = true;
  596. ChangeDisplay2Value(__wifi_status, _wifi_connect);
  597. ChangeDisplay2Value(__ethernet_status, _disappear);
  598. }
  599. else
  600. {
  601. _wifi_conn_status = false;
  602. ChangeDisplay2Value(__wifi_status, _disappear);
  603. }
  604. if (!_wifi_conn_status)
  605. {
  606. if (ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomNetworkConn == YES)
  607. {
  608. ChangeDisplay2Value(__ethernet_status, _ethernet_connect);
  609. }
  610. else
  611. {
  612. ChangeDisplay2Value(__ethernet_status, _ethernet_disconnect);
  613. }
  614. }
  615. // 連線到後台
  616. if (ShmSysConfigAndInfo->SysInfo.OcppConnStatus == YES)
  617. ChangeDisplay2Value(__conn_status, _connect);
  618. else
  619. ChangeDisplay2Value(__conn_status, _disconnect);
  620. }
  621. void ProcessPageInfo()
  622. {
  623. switch(_currentPage)
  624. {
  625. case _LCM_IDLE:
  626. {
  627. // QR Code 處理
  628. ChangeQrCode_Idle("http://google.com.tw");
  629. }
  630. break;
  631. case _LCM_PRE_CHARGE:
  632. case _LCM_CHARGING:
  633. case _LCM_COMPLETE:
  634. {
  635. // gun type and charging info
  636. for(byte i = 0; i < _totalCount; i++)
  637. {
  638. switch(_chargingInfoData[i]->Type)
  639. {
  640. case _Type_Chademo:
  641. {
  642. if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == i)
  643. {
  644. ChangeDisplay2Value(__gun_type_index + (i * 2), _chademo_light);
  645. }
  646. else
  647. {
  648. ChangeDisplay2Value(__gun_type_index + (i * 2), _chademo_dark);
  649. }
  650. }
  651. break;
  652. case _Type_CCS_2:
  653. {
  654. if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == i)
  655. {
  656. ChangeDisplay2Value(__gun_type_index + (i * 2), _ccs_light);
  657. }
  658. else
  659. {
  660. ChangeDisplay2Value(__gun_type_index + (i * 2), _ccs_dark);
  661. }
  662. }
  663. break;
  664. }
  665. if (_currentPage == _LCM_CHARGING)
  666. {
  667. if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == i)
  668. {
  669. ChangeBattMapAndValue(_LCM_CHARGING, _chargingInfoData[i]->EvBatterySoc);
  670. if (_chargingInfoData[i]->RemainChargingDuration >= 0)
  671. ChangeRemainTime(_chargingInfoData[i]->RemainChargingDuration);
  672. if (_chargingInfoData[i]->PresentChargingPower >= 0)
  673. ChangeChargingPowerValue(_chargingInfoData[i]->PresentChargingPower);
  674. if (_chargingInfoData[i]->PresentChargedEnergy >= 0)
  675. ChangeChargingEnergyValue(_chargingInfoData[i]->PresentChargedEnergy);
  676. if (strcmp((char *)_chargingInfoData[i]->StartUserId, "") == 0)
  677. ChangeDisplay2Value(__stop_method_btn, _stop_charging_btn);
  678. else
  679. ChangeDisplay2Value(__stop_method_btn, _stop_charging_btn_scan);
  680. }
  681. }
  682. else if (_currentPage == _LCM_COMPLETE)
  683. {
  684. if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == i)
  685. {
  686. ChangeBattMapAndValue(_LCM_COMPLETE, _chargingInfoData[i]->EvBatterySoc);
  687. if (_chargingInfoData[i]->RemainChargingDuration >= 0)
  688. ChangeRemainTime(_chargingInfoData[i]->RemainChargingDuration);
  689. if (_chargingInfoData[i]->PresentChargingPower >= 0)
  690. ChangeChargingPowerValue(_chargingInfoData[i]->PresentChargingPower);
  691. if (_chargingInfoData[i]->PresentChargedEnergy >= 0)
  692. ChangeChargingEnergyValue(_chargingInfoData[i]->PresentChargedEnergy);
  693. }
  694. }
  695. }
  696. // gun btn and QR code
  697. if (_totalCount == 2 && _currentPage != _LCM_PRE_CHARGE)
  698. {
  699. byte index = 0;
  700. for(index = 0; index < _totalCount; index++)
  701. {
  702. if(ShmSysConfigAndInfo->SysInfo.CurGunSelected != index)
  703. {
  704. break;
  705. }
  706. }
  707. if (_chargingInfoData[index]->SystemStatus == S_IDLE ||
  708. _chargingInfoData[index]->SystemStatus == S_RESERVATION ||
  709. _chargingInfoData[index]->SystemStatus == S_BOOTING)
  710. {
  711. // QR Code 處理
  712. ChangeQrCode_Charge("http://google.com.tw");
  713. }
  714. }
  715. }
  716. break;
  717. }
  718. }
  719. void Initialization()
  720. {
  721. //strcpy((char *)ShmSysConfigAndInfo->SysInfo.LcmHwRev, moduleName);
  722. bool isPass = false;
  723. byte count = 5;
  724. while(!isPass && count > 0)
  725. {
  726. isPass = true;
  727. for (byte _index = 0; _index < _totalCount; _index++)
  728. {
  729. if (!FindChargingInfoData(_index, &_chargingInfoData[0]))
  730. {
  731. DEBUG_ERROR("EvComm (main) : FindChargingInfoData false \n");
  732. isPass = false;
  733. count--;
  734. break;
  735. }
  736. }
  737. }
  738. if (count == 0)
  739. PRINTF_FUNC("LCM Initialization Gun Fail.............\n");
  740. }
  741. int main(void)
  742. {
  743. if(InitShareMemory() == FAIL)
  744. {
  745. #ifdef SystemLogMessage
  746. DEBUG_ERROR("InitShareMemory NG\n");
  747. #endif
  748. if (ShmStatusCodeData != NULL)
  749. {
  750. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory = 1;
  751. }
  752. sleep(5);
  753. return 0;
  754. }
  755. _port = CreateCommunicationLcmPort();
  756. byte changeWarningPriority = 0;
  757. byte curWarningCount = 255;
  758. //ChangeBackLight(true);
  759. _totalCount = GUN_COUNT;
  760. Initialization();
  761. // ChangeToOtherPage(_LCM_FIX);
  762. // return 0;
  763. while(_port != -1)
  764. {
  765. if (strlen((char *)ShmSysConfigAndInfo->SysInfo.LcmHwRev) != 0 ||
  766. ShmSysConfigAndInfo->SysInfo.LcmHwRev[0] != '\0')
  767. {
  768. GetCurrentPage();
  769. sleep(1);
  770. }
  771. else
  772. {
  773. //DemoFunction();
  774. // Warning 處理
  775. if(curWarningCount != ShmSysConfigAndInfo->SysWarningInfo.WarningCount)
  776. {
  777. changeWarningPriority = 0;
  778. ShmSysConfigAndInfo->SysWarningInfo.PageIndex = 0;
  779. curWarningCount = ShmSysConfigAndInfo->SysWarningInfo.WarningCount;
  780. ChangeWarningFunc();
  781. }
  782. else if (ShmSysConfigAndInfo->SysWarningInfo.WarningCount > 5 && changeWarningPriority == 0)
  783. {
  784. // 當有兩頁 Warning 則每隔三秒改變一次
  785. if(ShmSysConfigAndInfo->SysWarningInfo.PageIndex == 0)
  786. ShmSysConfigAndInfo->SysWarningInfo.PageIndex = 1;
  787. else
  788. ShmSysConfigAndInfo->SysWarningInfo.PageIndex = 0;
  789. ChangeWarningFunc();
  790. }
  791. // 頁面資訊處理
  792. ProcessPageInfo();
  793. // 網路 - wifi - 連線訊號處理
  794. RefreshConnStatus();
  795. // 換頁處理
  796. ChangeCurPage();
  797. RefreshPageAnimation(_everyPageRollChange);
  798. changeWarningPriority >= 30 ? changeWarningPriority = 0 : changeWarningPriority++;
  799. usleep(100000);
  800. }
  801. }
  802. CloseCommunicationLcmPort();
  803. return FAIL;
  804. }