Module_LcmControl.c 61 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099
  1. /*
  2. * Module_LcmControl.c
  3. *
  4. * Created on : 2020-10-20
  5. * Update on : 2021-02-20
  6. * Author : Folus Wen, Eason Yang
  7. * Version : D0.01
  8. *
  9. */
  10. #include <sys/time.h>
  11. #include "define.h"
  12. #include "main.h"
  13. #include "lcmComm_dgus.h"
  14. //=======================================
  15. // Declare share memory
  16. //=======================================
  17. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  18. struct StatusCodeData *ShmStatusCodeData;
  19. struct OCPP16Data *ShmOCPP16Data;
  20. struct OCPP20Data *ShmOCPP20Data;
  21. struct Charger *ShmCharger;
  22. //=======================================
  23. // Declare Basic function
  24. //=======================================
  25. void trim(char *s);
  26. int mystrcmp(char *p1,char *p2);
  27. void substr(char *dest, const char* src, unsigned int start, unsigned int cnt);
  28. uint8_t split(char **arr, char *str, const char *del);
  29. void string2ByteArray(uint8_t *input, uint8_t *output);
  30. //=======================================
  31. // Declare Control panel function
  32. //=======================================
  33. uint8_t getCurrentPage();
  34. void setCurrentPage(uint8_t page);
  35. void setCurrencyFromWebsite(char *unit);
  36. void setWarningStatus(uint8_t gun_index);
  37. void setAuthorizationPage(uint8_t gun_index);
  38. void setPriceFromWebsite(float monry_rate);
  39. void setBillingFromBackend(uint8_t gun_index, uint8_t system_mode);
  40. void setPresentChargedEnergy(uint8_t gun_index);
  41. void setPresentChargingPower(uint8_t gun_index);
  42. void setBatteryPercentageValue(uint8_t gun_index);
  43. void setPresentChargedDuration(uint8_t gun_index);
  44. void setQRcodeContent(char *input, uint8_t length);
  45. void setDisplayValue(uint16_t address, uint8_t value);
  46. void setGunPluginAnimation(uint8_t gun_index);
  47. void setBatteryAnimation(uint8_t gun_index, uint8_t system_mode);
  48. void setConnectionAnimation(uint8_t gun_index, uint8_t system_mode);
  49. void setPresentFinalCost(float cost);
  50. float getPresentFinalCost(uint8_t gun_index);
  51. void setUserPrice(uint8_t type);
  52. void setDefaultPrice(uint8_t type);
  53. void setFinalCost(uint8_t gun_index, uint8_t type);
  54. void setCurrencyAndUnitFromBackend(uint8_t type_price,uint8_t type_currency_unit, uint8_t gun_index);
  55. void setRTC();
  56. void setRfidIcon();
  57. void setWifi4GIcon();
  58. void setQRCodeIcon();
  59. void setBackendIcon();
  60. void setEthernetIcon();
  61. void setAlarmCodeAndIcon();
  62. void setBillingFromWebsite();
  63. //=======================================
  64. // Declare Timer
  65. //=======================================
  66. #define TMR_IDX_BATTERY 0
  67. #define TMR_IDX_CONNECTION 1
  68. #define TMR_IDX_PLUGIN 2
  69. #define TMR_IDX_ALARM 3
  70. #define TMR_IDX_PRICE 4
  71. #define TMR_IDX_EMULATOR 5
  72. #define TMR_IDX_6 6
  73. #define TMR_IDX_7 7
  74. #define TMR_IDX_8 8
  75. #define TMR_IDX_9 9
  76. struct timeb startTime[AC_QUANTITY][10];
  77. #define TIME_ANIMATION_PLUGIN 1000
  78. #define TIME_ANIMATION_BATTERY 1000
  79. #define TIME_ANIMATION_CONNECTION 1000
  80. #define TIME_ANIMATION_ALARM 5000
  81. #define TIME_REFRESH_TIME 2000
  82. //=======================================
  83. // Declare Variable
  84. //=======================================
  85. uint8_t BATTERY_LEVEL_STATUS = BATTERY_LEVEL_5;
  86. uint8_t CONNECTION_LEVEL_STATUS = CONNECTION_LEVEL_0;
  87. uint8_t GUN_PLUGING_LEVEL_STATUS = GUN_PLUGING_LEVEL_0;
  88. uint8_t WarningCount = 255;
  89. int Uart1Fd;
  90. //=======================================
  91. // Emulator
  92. //=======================================
  93. int PERCENTAGE;
  94. uint8_t isChange;
  95. uint8_t isEmulator = NO;
  96. uint8_t isCharging = YES;
  97. //=======================================
  98. // Record version and date
  99. //=======================================
  100. char *FIRMWARE_UPDATE_IMAGE[3] = {"V0.16", "2021-03-26", "REV.01.00"};
  101. //=======================================
  102. // Common routine
  103. //=======================================
  104. int StoreLogMsg(const char *fmt, ...)
  105. {
  106. char Buf[4096+256];
  107. char buffer[4096];
  108. time_t CurrentTime;
  109. struct tm *tm;
  110. struct timeval tv;
  111. va_list args;
  112. va_start(args, fmt);
  113. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  114. va_end(args);
  115. memset(Buf,0,sizeof(Buf));
  116. CurrentTime = time(NULL);
  117. tm=localtime(&CurrentTime);
  118. gettimeofday(&tv, NULL); // get microseconds, 10^-6
  119. sprintf(Buf,"echo -n \'[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s\' >> /Storage/SystemLog/[%04d.%02d]Module_LcmControlLog",
  120. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec,
  121. buffer,
  122. tm->tm_year+1900,tm->tm_mon+1);
  123. #ifdef SystemLogMessage
  124. system(Buf);
  125. #endif
  126. #ifdef ConsloePrintLog
  127. 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);
  128. #endif
  129. return rc;
  130. }
  131. long long DiffTimebWithNow(struct timeb ST)
  132. {
  133. //return milli-second
  134. struct timeb ET;
  135. long long StartTime,StopTime;
  136. ftime(&ET);
  137. StartTime=(long long)ST.time;
  138. StopTime=(long long)ET.time;
  139. return ((StopTime-StartTime)*1000) + (ET.millitm-ST.millitm);
  140. }
  141. int DiffTimeb(struct timeb ST, struct timeb ET)
  142. {
  143. //return milli-second
  144. unsigned int StartTime,StopTime;
  145. StartTime=(unsigned int)ST.time;
  146. StopTime=(unsigned int)ET.time;
  147. return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  148. }
  149. void trim(char *s)
  150. {
  151. int i=0, j, k, l=0;
  152. while((s[i]==' ')||(s[i]=='\t')||(s[i]=='\n'))
  153. i++;
  154. j = strlen(s)-1;
  155. while((s[j]==' ')||(s[j]=='\t')||(s[j]=='\n'))
  156. j--;
  157. if(i==0 && j==strlen(s)-1) { }
  158. else if(i==0) s[j+1] = '\0';
  159. else {
  160. for(k=i; k<=j; k++) s[l++] = s[k];
  161. s[l] = '\0';
  162. }
  163. }
  164. void trim_string(char *s, unsigned char len)
  165. {
  166. for(unsigned char i = 0 ; i < len; i++)
  167. {
  168. if (!(s[i] =='.')&& !((s[i]>='0') && (s[i]<='9')))
  169. {
  170. s[i] = s[i + 1];
  171. strncpy(s + i, s + i + 1, len);
  172. i -= 1;
  173. len -= 1;
  174. }
  175. }
  176. s[len + 1] = '\0';
  177. }
  178. int mystrcmp(char *p1,char *p2)
  179. {
  180. while(*p1==*p2)
  181. {
  182. if(*p1=='\0' || *p2=='\0')
  183. break;
  184. p1++;
  185. p2++;
  186. }
  187. if(*p1=='\0' && *p2=='\0')
  188. return(PASS);
  189. else
  190. return(FAIL);
  191. }
  192. void substr(char *dest, const char* src, unsigned int start, unsigned int cnt)
  193. {
  194. strncpy(dest, src + start, cnt);
  195. dest[cnt] = 0;
  196. }
  197. uint8_t split(char **arr, char *str, const char *del)
  198. {
  199. uint8_t result = 0;
  200. char *s = strtok(str, del);
  201. while(s != NULL)
  202. {
  203. *arr++ = s;
  204. result += 1;
  205. s = strtok(NULL, del);
  206. }
  207. return result;
  208. }
  209. void getDateTimeString(char* result)
  210. {
  211. time_t CurrentTime;
  212. struct tm *tm;
  213. CurrentTime = time(NULL);
  214. tm=localtime(&CurrentTime);
  215. sprintf(result, "%04d/%02d/%02d %02d:%02d", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min);
  216. }
  217. //=======================================
  218. // Function to page routine
  219. //=======================================
  220. void page_booting()
  221. {
  222. if(getCurrentPage() != SYSTEM_SCREEN_BOOTING)
  223. {
  224. setCurrentPage(SYSTEM_SCREEN_BOOTING);
  225. DEBUG_INFO("Setting page to booting.\n");
  226. }
  227. else
  228. {
  229. //DEBUG_INFO("Page booting.\n");
  230. }
  231. }
  232. void page_idle(uint8_t gun_index, uint8_t system_mode)
  233. {
  234. if(getCurrentPage() != SYSTEM_SCREEN_IDLE)
  235. {
  236. setCurrentPage(SYSTEM_SCREEN_IDLE);
  237. setBatteryAnimation(gun_index, system_mode);
  238. //DEBUG_INFO("Setting page to idle.\n");
  239. }
  240. else
  241. {
  242. setRfidIcon();
  243. setQRCodeIcon();
  244. //if(isCharging == YES)
  245. //PERCENTAGE = 0;
  246. //else
  247. //PERCENTAGE = 100;
  248. //DEBUG_INFO("Page idle.\n");
  249. }
  250. }
  251. void page_authorizing(uint8_t gun_index)
  252. {
  253. if((ShmSysConfigAndInfo->SysInfo.OcppConnStatus == ON))
  254. {
  255. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
  256. {
  257. if((strcmp((char*)ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartUserId, (char *)ShmOCPP16Data->Cost.SetUserPrice.idToken) == 0) &&
  258. ((strcmp((char *)ShmOCPP16Data->Cost.SetUserPrice.idToken,"") != 0)))
  259. {
  260. // Searching User price for account balance
  261. setUserPrice(ACCOUNT_BALANCE);
  262. }
  263. else
  264. {
  265. // Disappear account balance and icon
  266. setDisplayValue(ICON_BALANCE_WALLET, DISAPPEAR);
  267. setDisplayValue(TEXT_BALANCE, DISAPPEAR);
  268. }
  269. }
  270. else
  271. {
  272. // Display by OCPP 2.0.1
  273. }
  274. }
  275. else
  276. {
  277. // Disappear account balance and icon
  278. setDisplayValue(ICON_BALANCE_WALLET, DISAPPEAR);
  279. setDisplayValue(TEXT_BALANCE, DISAPPEAR);
  280. }
  281. setAuthorizationPage(gun_index);
  282. }
  283. void page_preparing(uint8_t gun_index, uint8_t system_mode)
  284. {
  285. // Check handshaking mode BS / HLC
  286. if(ShmCharger->gun_info[gun_index].chargingMode == CHARGING_MODE_BS)
  287. {
  288. if((getCurrentPage() != SYSTEM_SCREEN_PREPARING))
  289. {
  290. setCurrentPage(SYSTEM_SCREEN_PREPARING);
  291. setDisplayValue(ICON_PLUGIN_ARROW, PLUGIN_ARROW_1);
  292. ftime(&startTime[gun_index][TMR_IDX_PLUGIN]);
  293. GUN_PLUGING_LEVEL_STATUS = GUN_PLUGING_LEVEL_0;
  294. DEBUG_INFO("Setting page to preparing.\n");
  295. }
  296. else
  297. {
  298. setGunPluginAnimation(gun_index);
  299. //DEBUG_INFO("Page preparing.\n");
  300. }
  301. }
  302. else if(ShmCharger->gun_info[gun_index].chargingMode == CHARGING_MODE_HLC)
  303. {
  304. if((getCurrentPage() != SYSTEM_SCREEN_PREPARE_FOR_EVSE))
  305. {
  306. setCurrentPage(SYSTEM_SCREEN_PREPARE_FOR_EVSE);
  307. setDisplayValue(ICON_BATTERY_PRECHARGING, BATTERY_CAPACITY_EMPTY);
  308. setDisplayValue(ICON_CONNECTION_PRECHARGING, CONNECTION_QUESTION_MARK_1);
  309. ftime(&startTime[gun_index][TMR_IDX_CONNECTION]);
  310. CONNECTION_LEVEL_STATUS = CONNECTION_LEVEL_0;
  311. DEBUG_INFO("Setting page to prepare for EVSE.\n");
  312. }
  313. else
  314. {
  315. setConnectionAnimation(gun_index, system_mode);
  316. //DEBUG_INFO("Page preparing.\n");
  317. }
  318. }
  319. }
  320. void page_charging(uint8_t gun_index, uint8_t system_mode)
  321. {
  322. if((getCurrentPage() != SYSTEM_SCREEN_CHARGING) && (ShmCharger->gun_info[gun_index].resultAuthorization == DEFAULT_RFID))
  323. {
  324. setCurrentPage(SYSTEM_SCREEN_CHARGING);
  325. setDisplayValue(ICON_CONNECTION_CHARGING, CONNECTION_ELECTRIC_MARK_1);
  326. ftime(&startTime[gun_index][TMR_IDX_BATTERY]);
  327. ftime(&startTime[gun_index][TMR_IDX_CONNECTION]);
  328. BATTERY_LEVEL_STATUS = BATTERY_LEVEL_5;
  329. CONNECTION_LEVEL_STATUS = CONNECTION_LEVEL_0;
  330. DEBUG_INFO("Setting page to charging.\n");
  331. //isChange = 0;
  332. //ftime(&startTime[gun_index][TMR_IDX_EMULATOR]);
  333. }
  334. else
  335. {
  336. setConnectionAnimation(gun_index, system_mode);
  337. setBatteryAnimation(gun_index, system_mode);
  338. setPresentChargedDuration(gun_index);
  339. setPresentChargedEnergy(gun_index);
  340. setPresentChargingPower(gun_index);
  341. setAuthorizationPage(gun_index);
  342. //DEBUG_INFO("Page charging.\n");
  343. }
  344. }
  345. void page_complete(uint8_t gun_index, uint8_t system_mode)
  346. {
  347. if(getCurrentPage() != SYSTEM_SCREEN_COMPLETE)
  348. {
  349. setCurrentPage(SYSTEM_SCREEN_COMPLETE);
  350. DEBUG_INFO("Setting page to complete.\n");
  351. }
  352. else
  353. {
  354. setPresentChargedDuration(gun_index);
  355. setPresentChargedEnergy(gun_index);
  356. setBatteryAnimation(gun_index, system_mode);
  357. if((ShmSysConfigAndInfo->SysInfo.OcppConnStatus == ON))
  358. {
  359. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
  360. {
  361. setFinalCost(gun_index, TOTAL_COST);
  362. setFinalCost(gun_index, ACCOUNT_BALANCE);
  363. setCurrencyAndUnitFromBackend(FINAL_COST, ACCOUNT_BALANCE, gun_index);
  364. }
  365. else
  366. {
  367. // Display by OCPP 2.0.1
  368. }
  369. }
  370. else
  371. {
  372. if(ShmSysConfigAndInfo->SysConfig.BillingData.isBilling == ON)
  373. {
  374. // Appear cost and icon
  375. setDisplayValue(ICON_COST_COMPLETE, APPEAR);
  376. setPresentFinalCost(getPresentFinalCost(gun_index));
  377. }
  378. else
  379. {
  380. // Disappear account balance and icon
  381. setDisplayValue(ICON_WALLER_COMPLETE, DISAPPEAR);
  382. setDisplayValue(TEXT_ACCOUNT_COMPLETE, DISAPPEAR);
  383. // Disappear cost and icon
  384. setDisplayValue(ICON_COST_COMPLETE, DISAPPEAR);
  385. setDisplayValue(TEXT_COST_COMPLETE, DISAPPEAR);
  386. // Disappear balance currency unit
  387. setDisplayValue(TEXT_CURRENCY_COMPLETE, DISAPPEAR);
  388. }
  389. }
  390. //DEBUG_INFO("Page complete.\n");
  391. }
  392. }
  393. void page_terminating(uint8_t gun_index, uint8_t system_mode)
  394. {
  395. if((getCurrentPage() != SYSTEM_SCREEN_TERMINATING) && (ShmCharger->gun_info[gun_index].resultAuthorization == DEFAULT_RFID))
  396. {
  397. setCurrentPage(SYSTEM_SCREEN_TERMINATING);
  398. setDisplayValue(ICON_CONNECTION_CHARGING, CONNECTION_QUESTION_MARK_1);
  399. ftime(&startTime[gun_index][TMR_IDX_CONNECTION]);
  400. BATTERY_LEVEL_STATUS = BATTERY_LEVEL_5;
  401. CONNECTION_LEVEL_STATUS = CONNECTION_LEVEL_0;
  402. DEBUG_INFO("Setting page to terminating.\n");
  403. }
  404. else
  405. {
  406. setConnectionAnimation(gun_index, system_mode);
  407. setBatteryAnimation(gun_index, system_mode);
  408. setPresentChargedDuration(gun_index);
  409. setPresentChargedEnergy(gun_index);
  410. setPresentChargingPower(gun_index);
  411. setAuthorizationPage(gun_index);
  412. if((ShmSysConfigAndInfo->SysInfo.OcppConnStatus == ON))
  413. {
  414. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
  415. {
  416. setFinalCost(gun_index, TOTAL_COST);
  417. setFinalCost(gun_index, ACCOUNT_BALANCE);
  418. setCurrencyAndUnitFromBackend(FINAL_COST, ACCOUNT_BALANCE, gun_index);
  419. }
  420. else
  421. {
  422. // Display by OCPP 2.0.1
  423. }
  424. }
  425. else
  426. {
  427. // Disappear account balance and icon
  428. setDisplayValue(ICON_WALLER_COMPLETE, DISAPPEAR);
  429. setDisplayValue(TEXT_ACCOUNT_COMPLETE, DISAPPEAR);
  430. // Disappear cost and icon
  431. setDisplayValue(ICON_COST_COMPLETE, DISAPPEAR);
  432. setDisplayValue(TEXT_COST_COMPLETE, DISAPPEAR);
  433. // Disappear balance currency unit
  434. setDisplayValue(TEXT_CURRENCY_COMPLETE, DISAPPEAR);
  435. }
  436. //DEBUG_INFO("Page terminating.\n");
  437. }
  438. }
  439. void page_alarm()
  440. {
  441. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip != ON)
  442. {
  443. if(getCurrentPage() != SYSTEM_SCREEN_MAINTAIN)
  444. {
  445. setCurrentPage(SYSTEM_SCREEN_MAINTAIN);
  446. DEBUG_INFO("Setting page to repair man.\n");
  447. }
  448. else
  449. {}
  450. }
  451. else
  452. {
  453. if(getCurrentPage() != SYSTEM_SCREEN_EMERGENCY)
  454. {
  455. setCurrentPage(SYSTEM_SCREEN_EMERGENCY);
  456. DEBUG_INFO("Setting page to emergency.\n");
  457. }
  458. else
  459. {}
  460. }
  461. }
  462. void page_fault()
  463. {
  464. DEBUG_INFO("Page fault.\n");
  465. }
  466. void page_maintain()
  467. {
  468. if(getCurrentPage() != SYSTEM_SCREEN_MAINTAIN)
  469. {
  470. setCurrentPage(SYSTEM_SCREEN_MAINTAIN);
  471. DEBUG_INFO("Setting page to maintain.\n");
  472. }
  473. else
  474. {
  475. //DEBUG_INFO("Page maintain.\n");
  476. }
  477. }
  478. void page_update()
  479. {
  480. if(getCurrentPage() != SYSTEM_SCREEN_MAINTAIN)
  481. {
  482. setCurrentPage(SYSTEM_SCREEN_MAINTAIN);
  483. DEBUG_INFO("Setting page to update.\n");
  484. }
  485. else
  486. {
  487. //DEBUG_INFO("Page update.\n");
  488. }
  489. }
  490. void page_reservation()
  491. {
  492. DEBUG_INFO("Page reservation.\n");
  493. }
  494. void page_booking()
  495. {
  496. DEBUG_INFO("Page booking.\n");
  497. }
  498. void page_debug()
  499. {
  500. if(getCurrentPage() != SYSTEM_SCREEN_MAINTAIN)
  501. {
  502. setCurrentPage(SYSTEM_SCREEN_MAINTAIN);
  503. DEBUG_INFO("Setting page to debug.\n");
  504. }
  505. else
  506. {
  507. //DEBUG_INFO("Page debug.\n");
  508. }
  509. }
  510. void page_unknown()
  511. {
  512. DEBUG_INFO("Page unknown.\n");
  513. }
  514. void page_header(uint8_t gun_index, uint8_t system_mode)
  515. {
  516. setEthernetIcon();
  517. setBackendIcon();
  518. setWifi4GIcon();
  519. setRTC();
  520. setWarningStatus(gun_index);
  521. // Set LCM to save energy mode
  522. if((ShmCharger->isLcdOn == ON))
  523. setDisplayValue(REG_ADDRESS_WRITE_BRIGHTNESS,BRIGHTNESS_100);
  524. else
  525. setDisplayValue(REG_ADDRESS_WRITE_BRIGHTNESS,BRIGHTNESS_10);
  526. // Set billing
  527. if(ShmSysConfigAndInfo->SysConfig.BillingData.isBilling == ON)
  528. {
  529. setBillingFromWebsite();
  530. }
  531. else
  532. {
  533. if(DiffTimebWithNow(startTime[gun_index][TMR_IDX_PRICE]) > (TIME_REFRESH_TIME))
  534. {
  535. ftime(&startTime[gun_index][TMR_IDX_PRICE]);
  536. setBillingFromBackend(gun_index, system_mode);
  537. }
  538. }
  539. //DEBUG_INFO("Page heading.\n");
  540. }
  541. //=======================================
  542. // Setting icon display value
  543. //=======================================
  544. void setDisplayValue(uint16_t address, uint8_t value)
  545. {
  546. uint8_t data[2];
  547. data[0] = value >> 8;
  548. data[1] = value & 0X00FF;
  549. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, address, data, ARRAY_SIZE(data));
  550. }
  551. //=======================================
  552. // Getting current page
  553. //=======================================
  554. uint8_t getCurrentPage()
  555. {
  556. uint8_t currentPage[2];
  557. uint8_t result = 255;
  558. if(lcdRegisterRead(Uart1Fd, REG_TYPE_CONTROL, REG_ADDRESS_READ_PAGE_ID, currentPage, ARRAY_SIZE(currentPage)))
  559. {
  560. result = currentPage[1];
  561. // DEBUG_INFO("currentPage[0] : %X\n", currentPage[0]);
  562. // DEBUG_INFO("currentPage[1] : %X\n", currentPage[1]);
  563. // DEBUG_INFO("getCurrentPage : %d \n", result);
  564. }
  565. else
  566. {
  567. DEBUG_INFO("Get current page fail! \n");
  568. }
  569. return result;
  570. }
  571. //=======================================
  572. // Setting current page
  573. //=======================================
  574. void setCurrentPage(uint8_t page)
  575. {
  576. uint8_t settingPage[2] = {0x00, page};
  577. if(lcdRegisterWrite(Uart1Fd, REG_TYPE_CONTROL, REG_ADDRESS_SET_PAGE_ID, settingPage, ARRAY_SIZE(settingPage)))
  578. DEBUG_INFO("setCurrentPage : %d \n", page);
  579. else
  580. DEBUG_INFO("Setting current page fail! \n");
  581. }
  582. //=======================================
  583. // Convert string to byte array
  584. //=======================================
  585. void string2ByteArray(unsigned char *input, uint8_t *output)
  586. {
  587. int loop;
  588. int i;
  589. loop = 0;
  590. i = 0;
  591. while(input[loop] != '\0')
  592. {
  593. output[i++] = input[loop++];
  594. }
  595. output[loop] = '\0';
  596. }
  597. //=======================================
  598. // Setting ETHERNET icon status
  599. //=======================================
  600. void setEthernetIcon()
  601. {
  602. if(ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet == ON)
  603. setDisplayValue(ICON_ETHERENT_CONNECTION, ETHERENT_OFFLINE);
  604. else
  605. setDisplayValue(ICON_ETHERENT_CONNECTION, EHTERNET_ONLINE);
  606. }
  607. //=======================================
  608. // Setting BACKEND icon status
  609. //=======================================
  610. void setBackendIcon()
  611. {
  612. if(ShmSysConfigAndInfo->SysInfo.OcppConnStatus != ON)
  613. setDisplayValue(ICON_BACKEND_CONNECTION,BACKEND_OFFLINE);
  614. else
  615. setDisplayValue(ICON_BACKEND_CONNECTION,BACKEND_ONLINE);
  616. }
  617. //=======================================
  618. // Setting WIFI / 4G icon status
  619. //=======================================
  620. void setWifi4GIcon()
  621. {
  622. //==============================================
  623. // Setting WIFI + 4G icon status online / off-line
  624. //==============================================
  625. if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D')
  626. {
  627. if(ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode == DISABLE_WIFI)
  628. {
  629. if(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomEnabled == DISABLE_4G)
  630. {
  631. setDisplayValue(ICON_WIFI_CONNECTION, DISAPPEAR);
  632. setDisplayValue(ICON_4G_CONNECTION, DISAPPEAR);
  633. }
  634. else
  635. {
  636. setDisplayValue(ICON_4G_CONNECTION, DISAPPEAR);
  637. if(ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi == ON)
  638. setDisplayValue(ICON_WIFI_CONNECTION, TELECOM_OFFLINE);
  639. else
  640. setDisplayValue(ICON_WIFI_CONNECTION, TELECOM_ONLINE);
  641. }
  642. }
  643. else
  644. {
  645. if(ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode == WIFI_STATION)
  646. {
  647. if(ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi == ON)
  648. setDisplayValue(ICON_WIFI_CONNECTION, WIFI_OFFLINE);
  649. else
  650. setDisplayValue(ICON_WIFI_CONNECTION, WIFI_ONLINE);
  651. }
  652. else
  653. setDisplayValue(ICON_WIFI_CONNECTION, WIFI_OFFLINE);
  654. if(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomEnabled == DISABLE_4G)
  655. {
  656. setDisplayValue(ICON_4G_CONNECTION, DISAPPEAR);
  657. }
  658. else
  659. {
  660. if(ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi == ON)
  661. setDisplayValue(ICON_4G_CONNECTION, TELECOM_OFFLINE);
  662. else
  663. setDisplayValue(ICON_4G_CONNECTION, TELECOM_ONLINE);
  664. }
  665. }
  666. }
  667. else
  668. {
  669. //========================================
  670. // Setting 4G icon status online / off-line
  671. //========================================
  672. if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T')
  673. {
  674. switch(ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomEnabled)
  675. {
  676. case DISABLE_4G:
  677. setDisplayValue(ICON_WIFI_CONNECTION, DISAPPEAR);
  678. setDisplayValue(ICON_4G_CONNECTION, DISAPPEAR);
  679. break;
  680. case ENABLE_4G:
  681. if(ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi == ON)
  682. setDisplayValue(ICON_WIFI_CONNECTION, TELECOM_OFFLINE);
  683. else
  684. setDisplayValue(ICON_WIFI_CONNECTION, TELECOM_ONLINE);
  685. break;
  686. default:
  687. break;
  688. }
  689. }
  690. //========================================
  691. // Setting WIFI icon status online / off-line
  692. //========================================
  693. if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W')
  694. {
  695. switch(ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode)
  696. {
  697. case DISABLE_WIFI:
  698. setDisplayValue(ICON_WIFI_CONNECTION, DISAPPEAR);
  699. setDisplayValue(ICON_4G_CONNECTION, DISAPPEAR);
  700. break;
  701. case WIFI_STATION:
  702. if(ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi == ON)
  703. setDisplayValue(ICON_WIFI_CONNECTION, WIFI_OFFLINE);
  704. else
  705. setDisplayValue(ICON_WIFI_CONNECTION, WIFI_ONLINE);
  706. break;
  707. case WIFI_ACCESS_POINT:
  708. setDisplayValue(ICON_WIFI_CONNECTION, WIFI_OFFLINE);
  709. break;
  710. default:
  711. break;
  712. }
  713. }
  714. }
  715. }
  716. //=======================================
  717. // Setting billing (Web page)
  718. //=======================================
  719. void setBillingFromWebsite()
  720. {
  721. if(ShmSysConfigAndInfo->SysConfig.BillingData.isBilling == ON)
  722. {
  723. setDisplayValue(ICON_PRICE, APPEAR);
  724. struct timeb csuTime;
  725. struct tm *tmCSU;
  726. ftime(&csuTime);
  727. tmCSU = localtime(&csuTime.time);
  728. if(tmCSU->tm_hour <= 23)
  729. {
  730. ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee = ShmSysConfigAndInfo->SysConfig.BillingData.Fee[tmCSU->tm_hour];
  731. setPriceFromWebsite(ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee);
  732. }
  733. // Currency unit 53 countries
  734. if(ShmSysConfigAndInfo->SysConfig.BillingData.Currency <= 53)
  735. {
  736. setCurrencyFromWebsite((char *)Currency[ShmSysConfigAndInfo->SysConfig.BillingData.Currency]);
  737. }
  738. }
  739. else
  740. {
  741. setDisplayValue(ICON_PRICE, DISAPPEAR);
  742. setDisplayValue(TEXT_CURRENCY_UNIT, DISAPPEAR);
  743. setDisplayValue(TEXT_PRICE, DISAPPEAR);
  744. }
  745. }
  746. //=======================================
  747. // Setting currency (Web page)
  748. //=======================================
  749. void setCurrencyFromWebsite(char *unit)
  750. {
  751. uint8_t data[16];
  752. uint8_t currency[16];
  753. unsigned char kWh [16];
  754. memset(data, 0x00, ARRAY_SIZE(data));
  755. memset(currency, 0x00, ARRAY_SIZE(currency));
  756. strcpy((char*)kWh, "/kWh");
  757. *(unit + 3) = '\0';
  758. sprintf((char *) currency, "%s%s", unit,kWh);
  759. string2ByteArray(currency, data);
  760. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_CURRENCY_UNIT, data, ARRAY_SIZE(data));
  761. }
  762. //=======================================
  763. // Setting price (Web page)
  764. //=======================================
  765. void setPriceFromWebsite(float monry_rate)
  766. {
  767. uint8_t data[16];
  768. uint8_t price[16];
  769. memset(data, 0x00, ARRAY_SIZE(data));
  770. memset(price, 0x00, ARRAY_SIZE(price));
  771. sprintf((char *)price, "%.2f", monry_rate);
  772. string2ByteArray(price, data);
  773. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_PRICE, data, ARRAY_SIZE(data));
  774. }
  775. //=======================================
  776. // Setting final cost
  777. //=======================================
  778. void setPresentFinalCost(float cost)
  779. {
  780. uint8_t data[16];
  781. uint8_t finalCost[16];
  782. memset(data, 0x00, ARRAY_SIZE(data));
  783. memset(finalCost, 0x00, ARRAY_SIZE(finalCost));
  784. sprintf((char *)finalCost, "%.2f", cost);
  785. string2ByteArray(finalCost, data);
  786. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_COST_COMPLETE, data, ARRAY_SIZE(data));
  787. }
  788. //=======================================
  789. // Getting final cost
  790. //=======================================
  791. float getPresentFinalCost(uint8_t gun_index)
  792. {
  793. float result = 0.0f;
  794. for(int idx=0;idx<ARRAY_SIZE(ShmCharger->gun_info[gun_index].presentChargedEnergyPeriod);idx++)
  795. {
  796. result += ((ShmCharger->gun_info[gun_index].presentChargedEnergyPeriod[idx]/10) * ShmSysConfigAndInfo->SysConfig.BillingData.Fee[idx]);
  797. }
  798. return result;
  799. }
  800. //=======================================
  801. // Setting billing (Backend)
  802. //=======================================
  803. void setBillingFromBackend(uint8_t gun_index, uint8_t system_mode)
  804. {
  805. if((system("pidof -s OcppBackend > /dev/null") != 0))
  806. {
  807. // Price, currency and icon disappear
  808. setDisplayValue(ICON_PRICE, DISAPPEAR);
  809. setDisplayValue(TEXT_PRICE, DISAPPEAR);
  810. setDisplayValue(TEXT_CURRENCY_UNIT, DISAPPEAR);
  811. }
  812. else
  813. {
  814. if((ShmSysConfigAndInfo->SysInfo.OcppConnStatus == ON))
  815. {
  816. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
  817. {
  818. if((strcmp((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[DefaultPrice].ItemData,"") != 0))
  819. {
  820. if(system_mode == SYS_MODE_IDLE)
  821. {
  822. // Searching defaultPrice for price
  823. setDefaultPrice(CURRENT_RATE);
  824. // Searching DefaultPrice for Currency and unit appear
  825. setCurrencyAndUnitFromBackend(DEFAULE_PRICE, CURRENT_RATE, gun_index);
  826. }
  827. else
  828. {
  829. // If startUserId is not match with idToken and it can not be null, otherwise the system should use default price
  830. if((strcmp((char*)ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartUserId, (char *)ShmOCPP16Data->Cost.SetUserPrice.idToken) == 0) &&
  831. ((strcmp((char *)ShmOCPP16Data->Cost.SetUserPrice.idToken,"") != 0)))
  832. {
  833. // Searching UserPrice for price
  834. setUserPrice(CURRENT_RATE);
  835. // Searching UserPrice for Currency and unit appear
  836. setCurrencyAndUnitFromBackend(SET_USER_PRICE, CURRENT_RATE,gun_index);
  837. }
  838. else
  839. {
  840. // Searching defaultPrice for price
  841. setDefaultPrice(CURRENT_RATE);
  842. // Searching DefaultPrice for Currency and unit appear
  843. setCurrencyAndUnitFromBackend(DEFAULE_PRICE, CURRENT_RATE, gun_index);
  844. }
  845. }
  846. }
  847. else
  848. {
  849. // Price, currency and icon disappear
  850. setDisplayValue(ICON_PRICE, DISAPPEAR);
  851. setDisplayValue(TEXT_PRICE, DISAPPEAR);
  852. setDisplayValue(TEXT_CURRENCY_UNIT, DISAPPEAR);
  853. }
  854. }
  855. else
  856. {
  857. // Display default price by OCPP 2.0.1
  858. }
  859. }
  860. else
  861. {
  862. // Price, currency and icon disappear
  863. setDisplayValue(ICON_PRICE, DISAPPEAR);
  864. setDisplayValue(TEXT_PRICE, DISAPPEAR);
  865. setDisplayValue(TEXT_CURRENCY_UNIT, DISAPPEAR);
  866. }
  867. }
  868. }
  869. //=======================================
  870. // Setting UserPrice (Backend)
  871. //=======================================
  872. void setUserPrice(uint8_t type)
  873. {
  874. uint8_t length;
  875. uint8_t Split_String_Count;
  876. uint8_t output_data[32];
  877. char input_data[32];
  878. char tmp[256];
  879. char *splitString[10];
  880. const char *Symbol = ";";
  881. memset(tmp, 0, ARRAY_SIZE(tmp));
  882. memset(input_data, 0x00, ARRAY_SIZE(input_data));
  883. memset(output_data, 0x00, ARRAY_SIZE(output_data));
  884. switch(type)
  885. {
  886. case CONNECTION_FEE:
  887. break;
  888. case CURRENT_RATE:
  889. if(strstr((char *)ShmOCPP16Data->Cost.SetUserPrice.price, "Current Rate:") > 0)
  890. {
  891. // Appear price icon
  892. setDisplayValue(ICON_PRICE, APPEAR);
  893. // Appear price text
  894. strcpy((char*)tmp,(char *)ShmOCPP16Data->Cost.SetUserPrice.price);
  895. Split_String_Count = split((char**)splitString, tmp, Symbol);
  896. memcpy(input_data, splitString[1], strlen(splitString[1]));
  897. length = strlen(input_data);
  898. trim_string(input_data,length);
  899. memcpy(output_data ,input_data, strlen(input_data));
  900. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_PRICE, output_data, ARRAY_SIZE(output_data));
  901. }
  902. else
  903. {
  904. // Disappear price text and price icon
  905. setDisplayValue(ICON_PRICE, DISAPPEAR);
  906. setDisplayValue(TEXT_PRICE, DISAPPEAR);
  907. }
  908. break;
  909. case OCCUPANCY_FEE:
  910. break;
  911. case ACCOUNT_BALANCE:
  912. if(strstr((char *)ShmOCPP16Data->Cost.SetUserPrice.price, "Account Balance:") > 0)
  913. {
  914. // Appear account balance icon
  915. setDisplayValue(ICON_BALANCE_WALLET, APPEAR);
  916. // Appear account balance text
  917. strcpy((char*)tmp,(char *)ShmOCPP16Data->Cost.SetUserPrice.price);
  918. Split_String_Count = split((char**)splitString, tmp, Symbol);
  919. memcpy(input_data, splitString[3], strlen(splitString[3]));
  920. length = strlen(input_data);
  921. trim_string(input_data,length);
  922. memcpy(output_data ,input_data, strlen(input_data));
  923. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_BALANCE, output_data, ARRAY_SIZE(output_data));
  924. }
  925. else
  926. {
  927. // Disappear balance text and balance icon
  928. setDisplayValue(ICON_BALANCE_WALLET, DISAPPEAR);
  929. setDisplayValue(TEXT_BALANCE, DISAPPEAR);
  930. }
  931. break;
  932. default:
  933. break;
  934. }
  935. }
  936. //=======================================
  937. // Setting DefaultPrice (Backend)
  938. //=======================================
  939. void setDefaultPrice(uint8_t type)
  940. {
  941. uint8_t length;
  942. uint8_t Split_String_Count;
  943. uint8_t output_data[32];
  944. char input_data[32];
  945. char tmp[256];
  946. char *splitString[10];
  947. const char *Symbol = ";";
  948. memset(tmp, 0, ARRAY_SIZE(tmp));
  949. memset(input_data, 0x00, ARRAY_SIZE(input_data));
  950. memset(output_data, 0x00, ARRAY_SIZE(output_data));
  951. switch(type)
  952. {
  953. case CONNECTION_FEE:
  954. break;
  955. case CURRENT_RATE:
  956. if(strstr((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[DefaultPrice].ItemData, "Current Rate:") > 0)
  957. {
  958. // Appear price icon
  959. setDisplayValue(ICON_PRICE, APPEAR);
  960. // Appear price text
  961. strcpy((char*)tmp,(char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[DefaultPrice].ItemData);
  962. Split_String_Count = split((char**)splitString, tmp, Symbol);
  963. memcpy(input_data, splitString[1], strlen(splitString[1]));
  964. length = strlen(input_data);
  965. trim_string(input_data,length);
  966. memcpy(output_data ,input_data, strlen(input_data));
  967. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_PRICE, output_data, ARRAY_SIZE(output_data));
  968. }
  969. else
  970. {
  971. setDisplayValue(TEXT_PRICE, DISAPPEAR);
  972. setDisplayValue(ICON_PRICE, DISAPPEAR);
  973. }
  974. break;
  975. case OCCUPANCY_FEE:
  976. break;
  977. default:
  978. break;
  979. }
  980. }
  981. //=======================================
  982. // Setting FinalCost (Backend)
  983. //=======================================
  984. void setFinalCost(uint8_t gun_index, uint8_t type)
  985. {
  986. uint8_t length;
  987. uint8_t Split_String_Count;
  988. uint8_t output_data[32];
  989. char input_data[32];
  990. char tmp[256];
  991. char *splitString[10];
  992. const char *Symbol = ";";
  993. memset(tmp, 0, ARRAY_SIZE(tmp));
  994. memset(output_data, 0x00, ARRAY_SIZE(output_data));
  995. memset(input_data, 0x00, ARRAY_SIZE(input_data));
  996. switch(type)
  997. {
  998. case CONNECTION_FEE:
  999. break;
  1000. case SESSION_FEE:
  1001. break;
  1002. case OCCUPANCY_FEE:
  1003. break;
  1004. case TOTAL_COST:
  1005. if((strstr((char*)ShmOCPP16Data->Cost.FinalCost[gun_index].description, "Total Cost:") > 0))
  1006. {
  1007. // Appear cost icon
  1008. setDisplayValue(ICON_COST_COMPLETE, APPEAR);
  1009. // Appear cost test
  1010. strcpy((char*)tmp,(char*)ShmOCPP16Data->Cost.FinalCost[gun_index].description);
  1011. Split_String_Count = split((char**)splitString, tmp, Symbol);
  1012. memcpy(input_data, splitString[3], strlen(splitString[3]));
  1013. length = strlen(input_data);
  1014. trim_string(input_data,length);
  1015. memcpy(output_data ,input_data, strlen(input_data));
  1016. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_COST_COMPLETE, output_data, ARRAY_SIZE(output_data));
  1017. }
  1018. else
  1019. {
  1020. // Disappear cost icon and text
  1021. setDisplayValue(ICON_COST_COMPLETE, DISAPPEAR);
  1022. setDisplayValue(TEXT_COST_COMPLETE, DISAPPEAR);
  1023. }
  1024. break;
  1025. case ACCOUNT_BALANCE:
  1026. if((strstr((char*)ShmOCPP16Data->Cost.FinalCost[gun_index].description, "Account Balance:") > 0))
  1027. {
  1028. // Appear balance icon
  1029. setDisplayValue(ICON_WALLER_COMPLETE, APPEAR);
  1030. setDisplayValue(ICON_BALANCE_WALLET, APPEAR);
  1031. // Appear balance test
  1032. strcpy((char*)tmp,(char*)ShmOCPP16Data->Cost.FinalCost[gun_index].description);
  1033. Split_String_Count = split((char**)splitString, tmp, Symbol);
  1034. memcpy(input_data, splitString[4], strlen(splitString[4]));
  1035. length = strlen(input_data);
  1036. trim_string(input_data,length);
  1037. memcpy(output_data ,input_data, strlen(input_data));
  1038. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_ACCOUNT_COMPLETE, output_data, ARRAY_SIZE(output_data));
  1039. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_BALANCE, output_data, ARRAY_SIZE(output_data));
  1040. }
  1041. else
  1042. {
  1043. // Disappear account balance and icon on complete
  1044. setDisplayValue(ICON_WALLER_COMPLETE, DISAPPEAR);
  1045. setDisplayValue(TEXT_ACCOUNT_COMPLETE, DISAPPEAR);
  1046. setDisplayValue(ICON_BALANCE_WALLET, DISAPPEAR);
  1047. setDisplayValue(TEXT_BALANCE, DISAPPEAR);
  1048. }
  1049. break;
  1050. default:
  1051. break;
  1052. }
  1053. }
  1054. //=======================================
  1055. // Setting currency (Backend)
  1056. //=======================================
  1057. void setCurrencyAndUnitFromBackend(uint8_t type_price ,uint8_t type_currency_unit,uint8_t gun_index)
  1058. {
  1059. uint8_t length;
  1060. uint8_t Split_String_Count;
  1061. uint8_t output_data[32];
  1062. char input_data[32];
  1063. char tmp[256];
  1064. char *splitString[10];
  1065. const char *Symbol = ";";
  1066. memset(tmp, 0, ARRAY_SIZE(tmp));
  1067. memset(input_data, 0x00, ARRAY_SIZE(input_data));
  1068. memset(output_data, 0x00, ARRAY_SIZE(output_data));
  1069. if(type_price == DEFAULE_PRICE)
  1070. {
  1071. switch(type_currency_unit)
  1072. {
  1073. case CONNECTION_FEE:
  1074. break;
  1075. case CURRENT_RATE:
  1076. if(strstr((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[DefaultPrice].ItemData, "Current Rate:") > 0)
  1077. {
  1078. strcpy((char*)tmp,(char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[DefaultPrice].ItemData);
  1079. Split_String_Count = split((char**)splitString, tmp, Symbol);
  1080. memcpy(input_data, splitString[1], strlen(splitString[1]));
  1081. length = strlen(input_data);
  1082. memcpy(output_data , input_data+(length-7), 7);
  1083. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_CURRENCY_UNIT, output_data, ARRAY_SIZE(output_data));
  1084. }
  1085. else
  1086. {
  1087. setDisplayValue(TEXT_CURRENCY_UNIT, DISAPPEAR);
  1088. }
  1089. break;
  1090. case OCCUPANCY_FEE:
  1091. break;
  1092. default:
  1093. break;
  1094. }
  1095. }
  1096. else if(type_price == SET_USER_PRICE)
  1097. {
  1098. switch(type_currency_unit)
  1099. {
  1100. case CONNECTION_FEE:
  1101. break;
  1102. case CURRENT_RATE:
  1103. if(strstr((char *)ShmOCPP16Data->Cost.SetUserPrice.price, "Current Rate:") > 0)
  1104. {
  1105. strcpy((char*)tmp,(char *)ShmOCPP16Data->Cost.SetUserPrice.price);
  1106. Split_String_Count = split((char**)splitString, tmp, Symbol);
  1107. memcpy(input_data, splitString[1], strlen(splitString[1]));
  1108. length = strlen(input_data);
  1109. memcpy(output_data , input_data+(length-7), 7);
  1110. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_CURRENCY_UNIT, output_data, ARRAY_SIZE(output_data));
  1111. }
  1112. else
  1113. {
  1114. setDisplayValue(TEXT_CURRENCY_UNIT, DISAPPEAR);
  1115. }
  1116. break;
  1117. case OCCUPANCY_FEE:
  1118. break;
  1119. case ACCOUNT_BALANCE:
  1120. break;
  1121. default:
  1122. break;
  1123. }
  1124. }
  1125. else if(type_price == FINAL_COST)
  1126. {
  1127. switch(type_currency_unit)
  1128. {
  1129. case CONNECTION_FEE:
  1130. break;
  1131. case SESSION_FEE:
  1132. break;
  1133. case OCCUPANCY_FEE:
  1134. break;
  1135. case TOTAL_COST:
  1136. break;
  1137. case ACCOUNT_BALANCE:
  1138. if((strstr((char*)ShmOCPP16Data->Cost.FinalCost[gun_index].description, "Account Balance:") > 0))
  1139. {
  1140. strcpy((char*)tmp,(char*)ShmOCPP16Data->Cost.FinalCost[gun_index].description);
  1141. Split_String_Count = split((char**)splitString, tmp, Symbol);
  1142. memcpy(input_data, splitString[4], strlen(splitString[4]));
  1143. length = strlen(input_data);
  1144. memcpy(output_data , input_data+(length-3), 3);
  1145. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_CURRENCY_COMPLETE, output_data, ARRAY_SIZE(output_data));
  1146. }
  1147. else
  1148. {
  1149. setDisplayValue(TEXT_CURRENCY_COMPLETE, DISAPPEAR);
  1150. }
  1151. break;
  1152. default:
  1153. break;
  1154. }
  1155. }
  1156. else
  1157. {}
  1158. }
  1159. //=======================================
  1160. // Setting RTC value
  1161. //=======================================
  1162. void setRTC()
  1163. {
  1164. uint8_t data[32];
  1165. uint8_t rtc[32];
  1166. memset(data, 0x00, ARRAY_SIZE(data));
  1167. memset(rtc, 0x00, ARRAY_SIZE(rtc));
  1168. getDateTimeString((char*)rtc);
  1169. string2ByteArray(rtc, data);
  1170. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_RTC, data, ARRAY_SIZE(data));
  1171. }
  1172. //=======================================
  1173. // Setting RFID icon status
  1174. //=======================================
  1175. void setRfidIcon()
  1176. {
  1177. //=======================================
  1178. // AX-Series Generation 1
  1179. //=======================================
  1180. if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'A') &&
  1181. (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'X') &&
  1182. (ShmSysConfigAndInfo->SysConfig.ModelName[11] == '1'))
  1183. {
  1184. if(ShmSysConfigAndInfo->SysConfig.isRFID == ON)
  1185. setDisplayValue(ICON_RFID, RFID_ENABLE);
  1186. else
  1187. setDisplayValue(ICON_RFID, RFID_DISABLE);
  1188. }
  1189. //=======================================
  1190. // AX-Series Generation 2/3/4
  1191. //=======================================
  1192. if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'A') &&
  1193. (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'X') &&
  1194. ((ShmSysConfigAndInfo->SysConfig.ModelName[11] == '2') || (ShmSysConfigAndInfo->SysConfig.ModelName[11] == '3') || (ShmSysConfigAndInfo->SysConfig.ModelName[11] == '4')))
  1195. {
  1196. if(ShmSysConfigAndInfo->SysConfig.isRFID == ON)
  1197. setDisplayValue(ICON_RFID, VISA_ENABLE);
  1198. else
  1199. setDisplayValue(ICON_RFID, VISA_DISABLE);
  1200. }
  1201. //=======================================
  1202. // AW-Series Generation
  1203. //=======================================
  1204. if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'A') &&
  1205. (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'w'))
  1206. {
  1207. if(ShmSysConfigAndInfo->SysConfig.isRFID == ON)
  1208. setDisplayValue(ICON_RFID, RFID_ENABLE);
  1209. else
  1210. setDisplayValue(ICON_RFID, RFID_DISABLE);
  1211. }
  1212. }
  1213. //=======================================
  1214. // Setting QRCODE icon status
  1215. //=======================================
  1216. void setQRCodeIcon()
  1217. {
  1218. uint8_t length = 0;
  1219. // QR code enable / disable
  1220. if(ShmSysConfigAndInfo->SysConfig.isQRCode == ON)
  1221. {
  1222. setDisplayValue(ICON_QRCODE,QRCODE_ENABLE);
  1223. if(ShmSysConfigAndInfo->SysConfig.QRCodeMadeMode == NO)
  1224. {
  1225. length = strlen((char *)ShmSysConfigAndInfo->SysConfig.SystemId);
  1226. setQRcodeContent((char *)ShmSysConfigAndInfo->SysConfig.SystemId, length);
  1227. }
  1228. else
  1229. {
  1230. length = strlen((char *)ShmSysConfigAndInfo->SysConfig.QRCodeContent);
  1231. setQRcodeContent((char *)ShmSysConfigAndInfo->SysConfig.QRCodeContent, length);
  1232. }
  1233. }
  1234. else
  1235. {
  1236. setDisplayValue(TEXT_QRCODE_CONTENT, DISAPPEAR);
  1237. setDisplayValue(ICON_QRCODE,QRCODE_DISABLE);
  1238. }
  1239. }
  1240. //=======================================
  1241. // Setting QR code content
  1242. //=======================================
  1243. void setQRcodeContent(char *input, uint8_t length)
  1244. {
  1245. uint8_t output[length];
  1246. int loop = 0;
  1247. input[length] = '\0';
  1248. output[length] = '\0';
  1249. while(input[loop] != '\0')
  1250. {
  1251. output[loop] = input[loop];
  1252. loop++;
  1253. }
  1254. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_QRCODE_CONTENT, output, ARRAY_SIZE(output)+1);
  1255. }
  1256. //=======================================
  1257. // Setting warning page switch
  1258. //=======================================
  1259. void setWarningStatus(uint8_t gun_index)
  1260. {
  1261. if(WarningCount != ShmSysConfigAndInfo->SysWarningInfo.WarningCount)
  1262. {
  1263. WarningCount = ShmSysConfigAndInfo->SysWarningInfo.WarningCount;
  1264. ShmSysConfigAndInfo->SysWarningInfo.PageIndex = 0;
  1265. setAlarmCodeAndIcon();
  1266. }
  1267. else if(ShmSysConfigAndInfo->SysWarningInfo.WarningCount > 4 && (DiffTimebWithNow(startTime[gun_index][TMR_IDX_ALARM]) > (TIME_ANIMATION_ALARM)))
  1268. {
  1269. ftime(&startTime[gun_index][TMR_IDX_ALARM]);
  1270. if(ShmSysConfigAndInfo->SysWarningInfo.PageIndex == 0)
  1271. {
  1272. ShmSysConfigAndInfo->SysWarningInfo.PageIndex = 1;
  1273. }
  1274. else
  1275. {
  1276. ShmSysConfigAndInfo->SysWarningInfo.PageIndex = 0;
  1277. }
  1278. setAlarmCodeAndIcon();
  1279. }
  1280. }
  1281. //=======================================
  1282. // Setting alarm code and icon status
  1283. //=======================================
  1284. void setAlarmCodeAndIcon()
  1285. {
  1286. uint8_t cmd[7];
  1287. uint8_t index = 0;
  1288. for(index = 0; (index + ShmSysConfigAndInfo->SysWarningInfo.PageIndex * 4) < ShmSysConfigAndInfo->SysWarningInfo.WarningCount; index++)
  1289. {
  1290. memset(cmd, 0x00, sizeof(cmd));
  1291. if(index >= 4)
  1292. {
  1293. break;
  1294. }
  1295. // Alarm code
  1296. string2ByteArray(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[index + ShmSysConfigAndInfo->SysWarningInfo.PageIndex * 4][0], cmd);
  1297. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_ALARM_CODE_1 + (index * 6), cmd, ARRAY_SIZE(cmd));
  1298. // Icon status
  1299. memset(cmd, 0x00, sizeof(cmd));
  1300. cmd[0] = 0x00;
  1301. cmd[1] = 0x01;
  1302. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, ICON_ALARM_1 + index, cmd, 2);
  1303. }
  1304. memset(cmd, 0x00, sizeof(cmd));
  1305. for(; index < 4; index++)
  1306. {
  1307. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_ALARM_CODE_1 + (index * 6), cmd, ARRAY_SIZE(cmd));
  1308. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, ICON_ALARM_1 + index, cmd, 2);
  1309. }
  1310. }
  1311. //=======================================
  1312. // Setting Battery icon animation
  1313. //=======================================
  1314. void setBatteryAnimation(uint8_t gun_index, uint8_t system_mode)
  1315. {
  1316. switch(system_mode)
  1317. {
  1318. case SYS_MODE_IDLE:
  1319. // Setting battery icon to initial status
  1320. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_EMPTY);
  1321. setDisplayValue(ICON_BATTERY_COMPLETE, BATTERY_SOC_EMPTY);
  1322. setDisplayValue(TEXT_PERCENTAGE, DISAPPEAR);
  1323. break;
  1324. case SYS_MODE_CHARGING:
  1325. if(ShmCharger->gun_info[gun_index].chargingMode == CHARGING_MODE_BS)
  1326. {
  1327. // Set battery percentage text to disappear
  1328. setDisplayValue(TEXT_PERCENTAGE, DISAPPEAR);
  1329. // Set battery animation
  1330. if((BATTERY_LEVEL_STATUS == BATTERY_LEVEL_5))
  1331. {
  1332. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_EMPTY);
  1333. BATTERY_LEVEL_STATUS = BATTERY_LEVEL_0;
  1334. }
  1335. else if((BATTERY_LEVEL_STATUS == BATTERY_LEVEL_0) && (DiffTimebWithNow(startTime[gun_index][TMR_IDX_BATTERY]) > (TIME_ANIMATION_BATTERY)))
  1336. {
  1337. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_20);
  1338. BATTERY_LEVEL_STATUS = BATTERY_LEVEL_1;
  1339. }
  1340. else if((BATTERY_LEVEL_STATUS == BATTERY_LEVEL_1) && (DiffTimebWithNow(startTime[gun_index][TMR_IDX_BATTERY]) > (TIME_ANIMATION_BATTERY*2)))
  1341. {
  1342. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_40);
  1343. BATTERY_LEVEL_STATUS = BATTERY_LEVEL_2;
  1344. }
  1345. else if((BATTERY_LEVEL_STATUS == BATTERY_LEVEL_2) && (DiffTimebWithNow(startTime[gun_index][TMR_IDX_BATTERY]) > (TIME_ANIMATION_BATTERY*3)))
  1346. {
  1347. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_60);
  1348. BATTERY_LEVEL_STATUS = BATTERY_LEVEL_3;
  1349. }
  1350. else if((BATTERY_LEVEL_STATUS == BATTERY_LEVEL_3) && (DiffTimebWithNow(startTime[gun_index][TMR_IDX_BATTERY]) > (TIME_ANIMATION_BATTERY*4)))
  1351. {
  1352. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_80);
  1353. BATTERY_LEVEL_STATUS = BATTERY_LEVEL_4;
  1354. }
  1355. else if((BATTERY_LEVEL_STATUS == BATTERY_LEVEL_4) && (DiffTimebWithNow(startTime[gun_index][TMR_IDX_BATTERY]) > (TIME_ANIMATION_BATTERY*5)))
  1356. {
  1357. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_100);
  1358. BATTERY_LEVEL_STATUS = BATTERY_LEVEL_5;
  1359. ftime(&startTime[gun_index][TMR_IDX_BATTERY]);
  1360. }
  1361. }
  1362. else if(ShmCharger->gun_info[gun_index].chargingMode == CHARGING_MODE_HLC)
  1363. {
  1364. if(isEmulator == YES)
  1365. {
  1366. if((DiffTimebWithNow(startTime[gun_index][TMR_IDX_EMULATOR]) > 3000))
  1367. {
  1368. if(isCharging == YES)
  1369. PERCENTAGE++;
  1370. else
  1371. PERCENTAGE--;
  1372. ftime(&startTime[gun_index][TMR_IDX_EMULATOR]);
  1373. }
  1374. if(isCharging == YES)
  1375. {
  1376. if(PERCENTAGE > 100)
  1377. PERCENTAGE = 0;
  1378. }
  1379. else
  1380. {
  1381. if(PERCENTAGE <= 0)
  1382. PERCENTAGE = 100;
  1383. }
  1384. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc = PERCENTAGE;
  1385. if((isChange == 0) && (DiffTimebWithNow(startTime[gun_index][TMR_IDX_BATTERY]) > (TIME_ANIMATION_BATTERY)))
  1386. {
  1387. isChange = 1;
  1388. }
  1389. else if((isChange == 1) && (DiffTimebWithNow(startTime[gun_index][TMR_IDX_BATTERY]) > (TIME_ANIMATION_BATTERY*2)))
  1390. {
  1391. isChange = 0;
  1392. ftime(&startTime[gun_index][TMR_IDX_BATTERY]);
  1393. }
  1394. }
  1395. else
  1396. {}
  1397. // Set battery animation
  1398. if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc < 20)
  1399. {
  1400. if(isChange == 0)
  1401. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_EMPTY);
  1402. else
  1403. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_20);
  1404. }
  1405. else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc >= 20) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc < 40))
  1406. {
  1407. if(isChange == 0)
  1408. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_20);
  1409. else
  1410. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_40);
  1411. }
  1412. else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc >= 40) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc < 60))
  1413. {
  1414. if(isChange == 0)
  1415. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_40);
  1416. else
  1417. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_60);
  1418. }
  1419. else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc >= 60) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc < 80))
  1420. {
  1421. if(isChange == 0)
  1422. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_60);
  1423. else
  1424. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_80);
  1425. }
  1426. else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc >= 80) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc < 100))
  1427. {
  1428. if(isChange == 0)
  1429. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_80);
  1430. else
  1431. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_100);
  1432. }
  1433. else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc == 100)
  1434. {
  1435. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_100);
  1436. }
  1437. // Set battery SOC value
  1438. setBatteryPercentageValue(gun_index);
  1439. // Set electric arrow icon direction
  1440. if(isCharging == YES)
  1441. setDisplayValue(ICON_ELECTRICITY_DIRECTION, ELECTRICITY_DIRECTION_LEFT);
  1442. else
  1443. setDisplayValue(ICON_ELECTRICITY_DIRECTION, ELECTRICITY_DIRECTION_RIGHT);
  1444. }
  1445. break;
  1446. case SYS_MODE_TERMINATING:
  1447. if(ShmCharger->gun_info[gun_index].chargingMode == CHARGING_MODE_BS)
  1448. {
  1449. // Set battery icon to empty
  1450. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_EMPTY);
  1451. // Set battery percentage to disappear
  1452. setDisplayValue(TEXT_PERCENTAGE, DISAPPEAR);
  1453. }
  1454. else if(ShmCharger->gun_info[gun_index].chargingMode == CHARGING_MODE_HLC)
  1455. {
  1456. // Set battery animation
  1457. if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc < 20)
  1458. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_20);
  1459. else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc >= 20) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc < 40))
  1460. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_40);
  1461. else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc >= 40) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc < 60))
  1462. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_60);
  1463. else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc >= 60) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc < 80))
  1464. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_80);
  1465. else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc >= 80) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc <= 100))
  1466. setDisplayValue(ICON_BATTERY_CHARGING, BATTERY_CAPACITY_100);
  1467. // Set battery SOC value
  1468. setBatteryPercentageValue(gun_index);
  1469. // Set electric arrow icon direction disappear
  1470. setDisplayValue(ICON_ELECTRICITY_DIRECTION, DISAPPEAR);
  1471. }
  1472. break;
  1473. case SYS_MODE_COMPLETE:
  1474. if(ShmCharger->gun_info[gun_index].chargingMode == CHARGING_MODE_BS)
  1475. {
  1476. // Set battery icon to 100%
  1477. setDisplayValue(ICON_BATTERY_COMPLETE, BATTERY_SOC_100);
  1478. // Set battery percentage to disappear
  1479. setDisplayValue(TEXT_PERCENTAGE, DISAPPEAR);
  1480. }
  1481. else if(ShmCharger->gun_info[gun_index].chargingMode == CHARGING_MODE_HLC)
  1482. {
  1483. // Set battery animation
  1484. if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc < 20)
  1485. setDisplayValue(ICON_BATTERY_COMPLETE, BATTERY_SOC_20);
  1486. else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc >= 20) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc < 40))
  1487. setDisplayValue(ICON_BATTERY_COMPLETE, BATTERY_SOC_40);
  1488. else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc >= 40) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc < 60))
  1489. setDisplayValue(ICON_BATTERY_COMPLETE, BATTERY_SOC_60);
  1490. else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc >= 60) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc < 80))
  1491. setDisplayValue(ICON_BATTERY_COMPLETE, BATTERY_SOC_80);
  1492. else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc >= 80) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc <= 100))
  1493. setDisplayValue(ICON_BATTERY_COMPLETE, BATTERY_SOC_100);
  1494. // Set battery SOC value
  1495. setBatteryPercentageValue(gun_index);
  1496. // Set electric arrow icon direction disappear
  1497. setDisplayValue(ICON_ELECTRICITY_DIRECTION, DISAPPEAR);
  1498. }
  1499. break;
  1500. default:
  1501. break;
  1502. }
  1503. }
  1504. //=======================================
  1505. // Setting connection icon animation
  1506. //=======================================
  1507. void setConnectionAnimation(uint8_t gun_index, uint8_t system_mode)
  1508. {
  1509. switch(system_mode)
  1510. {
  1511. case SYS_MODE_PREPARING:
  1512. if((CONNECTION_LEVEL_STATUS == CONNECTION_LEVEL_0) && (DiffTimebWithNow(startTime[gun_index][TMR_IDX_CONNECTION]) > (TIME_ANIMATION_CONNECTION)))
  1513. {
  1514. setDisplayValue(ICON_CONNECTION_PRECHARGING, CONNECTION_QUESTION_MARK_1);
  1515. CONNECTION_LEVEL_STATUS = CONNECTION_LEVEL_1;
  1516. }
  1517. else if((CONNECTION_LEVEL_STATUS == CONNECTION_LEVEL_1) && (DiffTimebWithNow(startTime[gun_index][TMR_IDX_CONNECTION]) > (TIME_ANIMATION_CONNECTION*2)))
  1518. {
  1519. setDisplayValue(ICON_CONNECTION_PRECHARGING, CONNECTION_QUESTION_MARK_2);
  1520. CONNECTION_LEVEL_STATUS = CONNECTION_LEVEL_0;
  1521. ftime(&startTime[gun_index][TMR_IDX_CONNECTION]);
  1522. }
  1523. break;
  1524. case SYS_MODE_CHARGING:
  1525. if((CONNECTION_LEVEL_STATUS == CONNECTION_LEVEL_0) && (DiffTimebWithNow(startTime[gun_index][TMR_IDX_CONNECTION]) > (TIME_ANIMATION_CONNECTION)))
  1526. {
  1527. setDisplayValue(ICON_CONNECTION_CHARGING, CONNECTION_ELECTRIC_MARK_1);
  1528. CONNECTION_LEVEL_STATUS = CONNECTION_LEVEL_1;
  1529. }
  1530. else if((CONNECTION_LEVEL_STATUS == CONNECTION_LEVEL_1) && (DiffTimebWithNow(startTime[gun_index][TMR_IDX_CONNECTION]) > (TIME_ANIMATION_CONNECTION*2)))
  1531. {
  1532. setDisplayValue(ICON_CONNECTION_CHARGING, CONNECTION_ELECTRIC_MARK_2);
  1533. CONNECTION_LEVEL_STATUS = CONNECTION_LEVEL_0;
  1534. ftime(&startTime[gun_index][TMR_IDX_CONNECTION]);
  1535. }
  1536. break;
  1537. case SYS_MODE_TERMINATING:
  1538. if((CONNECTION_LEVEL_STATUS == CONNECTION_LEVEL_0) && (DiffTimebWithNow(startTime[gun_index][TMR_IDX_CONNECTION]) > (TIME_ANIMATION_CONNECTION)))
  1539. {
  1540. setDisplayValue(ICON_CONNECTION_CHARGING, CONNECTION_QUESTION_MARK_1);
  1541. CONNECTION_LEVEL_STATUS = CONNECTION_LEVEL_1;
  1542. }
  1543. else if((CONNECTION_LEVEL_STATUS == CONNECTION_LEVEL_1) && (DiffTimebWithNow(startTime[gun_index][TMR_IDX_CONNECTION]) > (TIME_ANIMATION_CONNECTION*2)))
  1544. {
  1545. setDisplayValue(ICON_CONNECTION_CHARGING, CONNECTION_QUESTION_MARK_2);
  1546. CONNECTION_LEVEL_STATUS = CONNECTION_LEVEL_0;
  1547. ftime(&startTime[gun_index][TMR_IDX_CONNECTION]);
  1548. }
  1549. break;
  1550. default:
  1551. break;
  1552. }
  1553. }
  1554. //=======================================
  1555. // Setting gun plug-in animation
  1556. //=======================================
  1557. void setGunPluginAnimation(uint8_t gun_index)
  1558. {
  1559. if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState != CP_STATE_B)
  1560. {
  1561. if((GUN_PLUGING_LEVEL_STATUS == GUN_PLUGING_LEVEL_0) && (DiffTimebWithNow(startTime[gun_index][TMR_IDX_PLUGIN]) > (TIME_ANIMATION_PLUGIN)))
  1562. {
  1563. setDisplayValue(ICON_PLUGIN_ARROW, PLUGIN_ARROW_1);
  1564. GUN_PLUGING_LEVEL_STATUS = GUN_PLUGING_LEVEL_1;
  1565. }
  1566. else if((GUN_PLUGING_LEVEL_STATUS == GUN_PLUGING_LEVEL_1) && (DiffTimebWithNow(startTime[gun_index][TMR_IDX_PLUGIN]) > (TIME_ANIMATION_PLUGIN*2)))
  1567. {
  1568. setDisplayValue(ICON_PLUGIN_ARROW, PLUGIN_ARROW_2);
  1569. GUN_PLUGING_LEVEL_STATUS = GUN_PLUGING_LEVEL_0;
  1570. ftime(&startTime[gun_index][TMR_IDX_PLUGIN]);
  1571. }
  1572. }
  1573. else
  1574. {
  1575. setDisplayValue(ICON_PLUGIN_ARROW, PLUGIN_ARROW_2);
  1576. }
  1577. }
  1578. //=======================================
  1579. // Setting battery SOC value
  1580. //=======================================
  1581. void setBatteryPercentageValue(uint8_t gun_index)
  1582. {
  1583. uint8_t data[16];
  1584. uint8_t soc[16];
  1585. memset(data, 0x00, ARRAY_SIZE(data));
  1586. memset(soc, 0x00, ARRAY_SIZE(soc));
  1587. sprintf((char *)soc, "%d%%", ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc);
  1588. string2ByteArray(soc, data);
  1589. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_PERCENTAGE, data, ARRAY_SIZE(data));
  1590. }
  1591. //=======================================
  1592. // Setting present charging power
  1593. //=======================================
  1594. void setPresentChargingPower(uint8_t gun_index)
  1595. {
  1596. uint8_t data[16];
  1597. uint8_t power[16];
  1598. memset(data, 0x00, ARRAY_SIZE(data));
  1599. memset(power, 0x00, ARRAY_SIZE(power));
  1600. sprintf((char *)power, "%.2f kW", ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargingPower);
  1601. string2ByteArray(power, data);
  1602. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_POWER_CHARGING, data, ARRAY_SIZE(data));
  1603. }
  1604. //=======================================
  1605. // Setting present charged energy
  1606. //=======================================
  1607. void setPresentChargedEnergy(uint8_t gun_index)
  1608. {
  1609. uint8_t data[16];
  1610. uint8_t energy[16];
  1611. memset(data, 0x00, ARRAY_SIZE(data));
  1612. memset(energy, 0x00, ARRAY_SIZE(energy));
  1613. sprintf((char *)energy, "%.4f kWh", ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedEnergy);
  1614. string2ByteArray(energy, data);
  1615. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_ENERGY_CHARGING, data, ARRAY_SIZE(data));
  1616. }
  1617. //=======================================
  1618. // Setting present charged duration
  1619. //=======================================
  1620. void setPresentChargedDuration(uint8_t gun_index)
  1621. {
  1622. uint8_t data[16];
  1623. uint8_t time[16];
  1624. uint16_t hour;
  1625. uint16_t minute;
  1626. uint16_t second;
  1627. uint16_t PresentChargedDuration = ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedDuration;
  1628. memset(data, 0x00, ARRAY_SIZE(data));
  1629. memset(time, 0x00, ARRAY_SIZE(time));
  1630. hour = (PresentChargedDuration / 3600);
  1631. minute = (PresentChargedDuration - (3600 * hour)) / 60;
  1632. second = (PresentChargedDuration - (3600 * hour) - (minute * 60));
  1633. sprintf((char *)time, "%02d:%02d:%02d", hour, minute, second);
  1634. string2ByteArray(time, data);
  1635. lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, TEXT_TIMER_CHARGING, data, ARRAY_SIZE(data));
  1636. }
  1637. //=======================================
  1638. // Setting authorization page
  1639. //=======================================
  1640. void setAuthorizationPage(uint8_t gun_index)
  1641. {
  1642. switch(ShmCharger->gun_info[gun_index].resultAuthorization)
  1643. {
  1644. case VALIDATED_RFID:
  1645. if(getCurrentPage() != SYSTEM_SCREEN_AUTH_PASS)
  1646. {
  1647. setCurrentPage(SYSTEM_SCREEN_AUTH_PASS);
  1648. DEBUG_INFO("Setting page to authorizing : Validated RFID.\n");
  1649. }
  1650. else
  1651. {
  1652. DEBUG_INFO("Page authorizing validated.\n");
  1653. }
  1654. break;
  1655. case UNVALIDATED_RFID:
  1656. if(getCurrentPage() != SYSTEM_SCREEN_AUTH_FAIL)
  1657. {
  1658. setCurrentPage(SYSTEM_SCREEN_AUTH_FAIL);
  1659. DEBUG_INFO("Setting page to authorizing : Unvalidated RFID.\n");
  1660. }
  1661. else
  1662. {
  1663. DEBUG_INFO("Page authorizing unvalidated.\n");
  1664. }
  1665. break;
  1666. case UNKNOW_RFID:
  1667. if(getCurrentPage() != SYSTEM_SCREEN_AUTH_UNKNOW)
  1668. {
  1669. setCurrentPage(SYSTEM_SCREEN_AUTH_UNKNOW);
  1670. DEBUG_INFO("Setting page to authorizing : Unknow RFID\n");
  1671. }
  1672. else
  1673. {
  1674. DEBUG_INFO("Page authorizing unknow.\n");
  1675. }
  1676. break;
  1677. case DEFAULT_RFID:
  1678. break;
  1679. default:
  1680. break;
  1681. }
  1682. }
  1683. //=======================================
  1684. // Initial all share memory
  1685. //=======================================
  1686. int InitShareMemory()
  1687. {
  1688. int result = PASS;
  1689. int MeterSMId;
  1690. // Initial ShmSysConfigAndInfo
  1691. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  1692. {
  1693. DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
  1694. result = FAIL;
  1695. }
  1696. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  1697. {
  1698. DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
  1699. result = FAIL;
  1700. }
  1701. else
  1702. {}
  1703. // Initial ShmStatusCodeData
  1704. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  1705. {
  1706. DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
  1707. result = FAIL;
  1708. }
  1709. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  1710. {
  1711. DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
  1712. result = FAIL;
  1713. }
  1714. else
  1715. {}
  1716. // Initial ShmCharger
  1717. if ((MeterSMId = shmget(ShmChargerKey, sizeof(struct Charger), 0777)) < 0)
  1718. {
  1719. DEBUG_ERROR("shmget ShmChargerKey NG\n");
  1720. result = FAIL;
  1721. }
  1722. else if ((ShmCharger = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  1723. {
  1724. DEBUG_ERROR("shmat ShmChargerKey NG\n");
  1725. result = FAIL;
  1726. }
  1727. // Initial ShmOCPP16Data
  1728. if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data), 0777)) < 0)
  1729. {
  1730. DEBUG_ERROR("shmget ShmOCPP16Data NG\n");
  1731. result = FAIL;
  1732. }
  1733. else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  1734. {
  1735. DEBUG_ERROR("shmat ShmOCPP16Data NG\n");
  1736. result = FAIL;
  1737. }
  1738. // Initial ShmOCPP20Data
  1739. if ((MeterSMId = shmget(ShmOcpp20ModuleKey, sizeof(struct OCPP20Data), 0777)) < 0)
  1740. {
  1741. DEBUG_ERROR("shmget ShmOCPP20Data NG\n");
  1742. result = FAIL;
  1743. }
  1744. else if ((ShmOCPP20Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  1745. {
  1746. DEBUG_ERROR("shmat ShmOCPP20Data NG\n");
  1747. result = FAIL;
  1748. }
  1749. return result;
  1750. }
  1751. //=======================================
  1752. // Initial communication port
  1753. //=======================================
  1754. int InitComPort()
  1755. {
  1756. int fd;
  1757. struct termios tios;
  1758. fd = open("/dev/ttyS3", O_RDWR);
  1759. if(fd<=0)
  1760. {
  1761. DEBUG_ERROR("open /dev/ttyS3 NG\n");
  1762. return -1;
  1763. }
  1764. ioctl (fd, TCGETS, &tios);
  1765. tios.c_cflag = B115200| CS8 | CLOCAL | CREAD;
  1766. tios.c_lflag = 0;
  1767. tios.c_iflag = 0;
  1768. tios.c_oflag = 0;
  1769. tios.c_cc[VMIN]=0;
  1770. tios.c_cc[VTIME]=(unsigned char)5; // timeout 500ms
  1771. tios.c_lflag=0;
  1772. tcflush(fd, TCIFLUSH);
  1773. ioctl (fd, TCSETS, &tios);
  1774. return fd;
  1775. }
  1776. //=======================================
  1777. // Main process
  1778. //=======================================
  1779. int main(void)
  1780. {
  1781. uint8_t previousMode = 0xff;
  1782. if(InitShareMemory() == FAIL)
  1783. {
  1784. #ifdef SystemLogMessage
  1785. DEBUG_ERROR("InitShareMemory NG\n");
  1786. #endif
  1787. if(ShmStatusCodeData!=NULL)
  1788. {
  1789. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory = 1;
  1790. }
  1791. sleep(5);
  1792. return FAIL;
  1793. }
  1794. Uart1Fd=InitComPort();
  1795. if(Uart1Fd<0)
  1796. {
  1797. #ifdef SystemLogMessage
  1798. DEBUG_ERROR("InitComPort NG\n");
  1799. #endif
  1800. if(ShmStatusCodeData!=NULL)
  1801. {
  1802. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed = 1;
  1803. }
  1804. sleep(5);
  1805. return FAIL;
  1806. }
  1807. else
  1808. {}
  1809. DEBUG_INFO("Initial completed\n");
  1810. DEBUG_INFO("Latest Firmware Version : [%s] \n", FIRMWARE_UPDATE_IMAGE[0]);
  1811. DEBUG_INFO("Latest Upgrade Date : [%s]. \n", FIRMWARE_UPDATE_IMAGE[1]);
  1812. DEBUG_INFO("Latest Image Version : [%s]. \n", FIRMWARE_UPDATE_IMAGE[2]);
  1813. for(;;)
  1814. {
  1815. if(previousMode != ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus)
  1816. {
  1817. previousMode = ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus;
  1818. }
  1819. switch(ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus)
  1820. {
  1821. case SYS_MODE_BOOTING:
  1822. page_booting();
  1823. break;
  1824. case SYS_MODE_IDLE:
  1825. page_idle(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
  1826. break;
  1827. case SYS_MODE_AUTHORIZING:
  1828. page_authorizing(ShmCharger->gun_selectd);
  1829. break;
  1830. case SYS_MODE_PREPARING:
  1831. page_preparing(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
  1832. break;
  1833. case SYS_MODE_CHARGING:
  1834. page_charging(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
  1835. break;
  1836. case SYS_MODE_TERMINATING:
  1837. page_terminating(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
  1838. break;
  1839. case SYS_MODE_COMPLETE:
  1840. page_complete(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
  1841. break;
  1842. case SYS_MODE_ALARM:
  1843. page_alarm();
  1844. break;
  1845. case SYS_MODE_FAULT:
  1846. page_fault();
  1847. break;
  1848. case SYS_MODE_MAINTAIN:
  1849. page_maintain();
  1850. break;
  1851. case SYS_MODE_UPDATE:
  1852. page_update();
  1853. break;
  1854. case SYS_MODE_RESERVATION:
  1855. page_reservation();
  1856. break;
  1857. case SYS_MODE_BOOKING:
  1858. page_booking();
  1859. break;
  1860. case SYS_MODE_DEBUG:
  1861. page_debug();
  1862. break;
  1863. default:
  1864. page_unknown();
  1865. break;
  1866. }
  1867. page_header(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
  1868. usleep(100000);
  1869. }
  1870. return FAIL;
  1871. }