Module_LcmControl.c 20 KB

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