main.c 76 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361
  1. #include "define.h"
  2. #include "main.h"
  3. //==========================
  4. // System basic sample constant
  5. //==========================
  6. #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0]))
  7. #define PASS 1
  8. #define FAIL -1
  9. #define YES 1
  10. #define NO 0
  11. #define ON 1
  12. #define OFF 0
  13. #define BUFFER_SIZE 128
  14. //==========================
  15. // Timer interval
  16. //==========================
  17. #define TMR_IDX_HANDSHAKING 0
  18. #define TMR_IDX_AUTH 1
  19. #define TMR_IDX_2 2
  20. #define TMR_IDX_3 3
  21. #define TMR_IDX_4 4
  22. #define TMR_IDX_5 5
  23. #define TMR_IDX_6 6
  24. #define TMR_IDX_7 7
  25. #define TMR_IDX_8 8
  26. #define TMR_IDX_9 9
  27. #define TIMEOUT_SPEC_HANDSHAKING 180000
  28. #define TIMEOUT_SPEC_AUTH 30000
  29. #define TIMEOUT_SPEC_HANDSHAKING_LED 185000
  30. #define MtdBlockSize 0x600000
  31. //==========================
  32. // Declare method
  33. //==========================
  34. void trim(char *s);
  35. int mystrcmp(char *p1,char *p2);
  36. void substr(char *dest, const char* src, unsigned int start, unsigned int cnt);
  37. void split(char **arr, char *str, const char *del);
  38. int isReachableInternet();
  39. int InitRfidPort(void);
  40. int GetAlarmValue(void);
  41. int GetInfoValue(void);
  42. int GetFaultValue(void);
  43. int GetCardSerialNumber();
  44. void setLedMotion(unsigned char gun_index,unsigned char led_mode);
  45. void setRelay(unsigned char gun_index,unsigned char isOn);
  46. void setSpeaker(unsigned char isOn, unsigned char speaker_mode);
  47. //==========================
  48. // Declare RFID module type
  49. //==========================
  50. #define MODULE_EWT 0
  51. int wtdFd = -1;
  52. int rfidFd = -1;
  53. char* rfidPortName = "/dev/ttyS2";
  54. RFID rfid;
  55. char *valid_Internet[2] = {"8.8.8.8", "180.76.76.76"};
  56. //==========================
  57. // Declare share memory
  58. //==========================
  59. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  60. struct StatusCodeData *ShmStatusCodeData;
  61. struct PsuData *ShmPsuData;
  62. struct CHAdeMOData *ShmCHAdeMOData;
  63. struct CcsData *ShmCcsData;
  64. struct PrimaryMcuData *ShmPrimaryMcuData;
  65. struct FanModuleData *ShmFanModuleData;
  66. struct RelayModuleData *ShmRelayModuleData;
  67. struct OCPP16Data *ShmOCPP16Data;
  68. struct Charger *ShmCharger;
  69. struct timeb startTime[AC_QUANTITY][10];
  70. struct timeb startChargingTime[AC_QUANTITY];
  71. struct timeb endChargingTime[AC_QUANTITY];
  72. sqlite3 *localDb;
  73. //=================================
  74. // Common routine
  75. //=================================
  76. void trim(char *s)
  77. {
  78. int i=0, j, k, l=0;
  79. while((s[i]==' ')||(s[i]=='\t')||(s[i]=='\n'))
  80. i++;
  81. j = strlen(s)-1;
  82. while((s[j]==' ')||(s[j]=='\t')||(s[j]=='\n'))
  83. j--;
  84. if(i==0 && j==strlen(s)-1) { }
  85. else if(i==0) s[j+1] = '\0';
  86. else {
  87. for(k=i; k<=j; k++) s[l++] = s[k];
  88. s[l] = '\0';
  89. }
  90. }
  91. int mystrcmp(char *p1,char *p2)
  92. {
  93. while(*p1==*p2)
  94. {
  95. if(*p1=='\0' || *p2=='\0')
  96. break;
  97. p1++;
  98. p2++;
  99. }
  100. if(*p1=='\0' && *p2=='\0')
  101. return(PASS);
  102. else
  103. return(FAIL);
  104. }
  105. void substr(char *dest, const char* src, unsigned int start, unsigned int cnt)
  106. {
  107. strncpy(dest, src + start, cnt);
  108. dest[cnt] = 0;
  109. }
  110. void split(char **arr, char *str, const char *del)
  111. {
  112. char *s = strtok(str, del);
  113. while(s != NULL)
  114. {
  115. *arr++ = s;
  116. s = strtok(NULL, del);
  117. }
  118. }
  119. int StoreLogMsg(const char *fmt, ...)
  120. {
  121. char Buf[4096+256];
  122. char buffer[4096];
  123. time_t CurrentTime;
  124. struct tm *tm;
  125. va_list args;
  126. va_start(args, fmt);
  127. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  128. va_end(args);
  129. memset(Buf,0,sizeof(Buf));
  130. CurrentTime = time(NULL);
  131. tm=localtime(&CurrentTime);
  132. sprintf(Buf,"echo \"[%04d.%02d.%02d %02d:%02d:%02d] - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
  133. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,
  134. buffer,
  135. tm->tm_year+1900,tm->tm_mon+1);
  136. #ifdef SystemLogMessage
  137. system(Buf);
  138. #endif
  139. printf("[%04d.%02d.%02d %02d:%02d:%02d] - %s", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec, buffer);
  140. return rc;
  141. }
  142. int DiffTimebWithNow(struct timeb ST)
  143. {
  144. //return milli-second
  145. struct timeb ET;
  146. unsigned int StartTime,StopTime;
  147. ftime(&ET);
  148. StartTime=(unsigned int)ST.time;
  149. StopTime=(unsigned int)ET.time;
  150. return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  151. }
  152. int DiffTimeb(struct timeb ST, struct timeb ET)
  153. {
  154. //return milli-second
  155. unsigned int StartTime,StopTime;
  156. StartTime=(unsigned int)ST.time;
  157. StopTime=(unsigned int)ET.time;
  158. return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  159. }
  160. void getDateTimeString(char* result)
  161. {
  162. time_t CurrentTime;
  163. struct tm *tm;
  164. CurrentTime = time(NULL);
  165. tm=localtime(&CurrentTime);
  166. sprintf(result, "%04d.%02d.%02d %02d:%02d:%02d", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
  167. }
  168. //======================================================
  169. // Check interface status
  170. //======================================================
  171. int isInterfaceUp(const char *interface)
  172. {
  173. int result = FAIL;
  174. FILE *fp;
  175. char cmd[256];
  176. char buf[512];
  177. strcpy(cmd, "ifconfig");;
  178. fp = popen(cmd, "r");
  179. if(fp != NULL)
  180. {
  181. while(fgets(buf, sizeof(buf), fp) != NULL)
  182. {
  183. if(strstr(buf, interface) > 0)
  184. {
  185. result = PASS;
  186. }
  187. }
  188. }
  189. pclose(fp);
  190. return result;
  191. }
  192. //======================================================
  193. // Create all share memory
  194. //======================================================
  195. int CreatShareMemory()
  196. {
  197. int result = PASS;
  198. int MeterSMId;
  199. //creat ShmSysConfigAndInfo
  200. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
  201. {
  202. DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\r\n");
  203. result = FAIL;
  204. }
  205. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  206. {
  207. DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\r\n");
  208. result = FAIL;
  209. }
  210. memset(ShmSysConfigAndInfo,0,sizeof(struct SysConfigAndInfo));
  211. //creat ShmStatusCodeData
  212. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0)
  213. {
  214. DEBUG_ERROR("shmget ShmStatusCodeData NG\r\n");
  215. result = FAIL;
  216. }
  217. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  218. {
  219. DEBUG_ERROR("shmat ShmStatusCodeData NG\r\n");
  220. result = FAIL;
  221. }
  222. memset(ShmStatusCodeData, 0, sizeof(struct StatusCodeData));
  223. //creat ShmPsuData
  224. if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData), IPC_CREAT | 0777)) < 0)
  225. {
  226. DEBUG_ERROR("shmget ShmPsuData NG\r\n");
  227. result = FAIL;
  228. }
  229. else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  230. {
  231. DEBUG_ERROR("shmat ShmPsuData NG\r\n");
  232. result = FAIL;
  233. }
  234. memset(ShmPsuData,0,sizeof(struct PsuData));
  235. //creat ShmCHAdeMOData
  236. if ((MeterSMId = shmget(ShmCHAdeMOCommKey, sizeof(struct CHAdeMOData), IPC_CREAT | 0777)) < 0)
  237. {
  238. DEBUG_ERROR("shmget ShmCHAdeMOData NG1\r\n");
  239. result = FAIL;
  240. }
  241. else if ((ShmCHAdeMOData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  242. {
  243. DEBUG_ERROR("shmat ShmCHAdeMOData NG2\r\n");
  244. result = FAIL;
  245. }
  246. memset(ShmCHAdeMOData,0,sizeof(struct CHAdeMOData));
  247. //creat ShmCcsData
  248. if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0)
  249. {
  250. DEBUG_ERROR("shmget ShmCcsData NG\r\n");
  251. result = FAIL;
  252. }
  253. else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  254. {
  255. DEBUG_ERROR("shmat ShmCcsData NG\r\n");
  256. result = FAIL;
  257. }
  258. memset(ShmCcsData,0,sizeof(struct CcsData));
  259. //creat ShmPrimaryMcuData
  260. if ((MeterSMId = shmget(ShmPrimaryMcuKey, sizeof(struct PrimaryMcuData), IPC_CREAT | 0777)) < 0)
  261. {
  262. DEBUG_ERROR("shmget ShmPrimaryMcuData NG\r\n");
  263. result = FAIL;
  264. }
  265. else if ((ShmPrimaryMcuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  266. {
  267. DEBUG_ERROR("shmat ShmPrimaryMcuData NG\r\n");
  268. result = FAIL;
  269. }
  270. memset(ShmPrimaryMcuData,0,sizeof(struct PrimaryMcuData));
  271. /*
  272. //creat ShmFanModuleData
  273. if ((MeterSMId = shmget(ShmFanBdKey, sizeof(struct FanModuleData), IPC_CREAT | 0777)) < 0)
  274. {
  275. DEBUG_ERROR("shmget ShmFanModuleData NG\r\n");
  276. result = FAIL;
  277. }
  278. else if ((ShmFanModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  279. {
  280. DEBUG_ERROR("shmat ShmFanModuleData NG\r\n");
  281. result = FAIL;
  282. }
  283. memset(ShmFanModuleData,0,sizeof(struct FanModuleData));
  284. //creat ShmRelayModuleData
  285. if ((MeterSMId = shmget(ShmRelayBdKey, sizeof(struct RelayModuleData), IPC_CREAT | 0777)) < 0)
  286. {
  287. DEBUG_ERROR("shmget ShmRelayModuleData NG\r\n");
  288. result = FAIL;
  289. }
  290. else if ((ShmRelayModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  291. {
  292. DEBUG_ERROR("shmat ShmRelayModuleData NG\r\n");
  293. result = FAIL;
  294. }
  295. memset(ShmRelayModuleData,0,sizeof(struct RelayModuleData));*/
  296. //creat ShmOCPP16Data
  297. if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data), IPC_CREAT | 0777)) < 0)
  298. {
  299. DEBUG_ERROR("shmget ShmOCPP16Data NG\r\n");
  300. result = FAIL;
  301. }
  302. else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  303. {
  304. DEBUG_ERROR("shmat ShmOCPP16Data NG\r\n");
  305. result = FAIL;
  306. }
  307. memset(ShmOCPP16Data,0,sizeof(struct OCPP16Data));
  308. //creat ShmCharger
  309. if ((MeterSMId = shmget(ShmChargerKey, sizeof(struct Charger), IPC_CREAT | 0777)) < 0)
  310. {
  311. DEBUG_ERROR("shmget ShmCharger NG\r\n");
  312. result = FAIL;
  313. }
  314. else if ((ShmCharger = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  315. {
  316. DEBUG_ERROR("shmat ShmCharger NG\r\n");
  317. result = FAIL;
  318. }
  319. memset(ShmCharger,0,sizeof(struct Charger));
  320. return result;
  321. }
  322. //===============================================
  323. // SQLite3 related routine
  324. //===============================================
  325. int DB_Open(sqlite3 *db)
  326. {
  327. int result = PASS;
  328. char* errMsg = NULL;
  329. char* createSql="CREATE TABLE IF NOT EXISTS charging_record("
  330. "idx integer primary key AUTOINCREMENT, "
  331. "reservationId text, "
  332. "transactionId text, "
  333. "startMethod text, "
  334. "userId text, "
  335. "dateTimeStart text, "
  336. "dateTimeStop text,"
  337. "socStart text, "
  338. "socStop text, "
  339. "chargeEnergy text, "
  340. "stopReason text"
  341. ");";
  342. //sqlite3_config(SQLITE_CONFIG_URI, 1);
  343. if(sqlite3_open("/Storage/ChargeLog/localCgargingRecord.db", &db))
  344. {
  345. result = FAIL;
  346. DEBUG_INFO( "Can't open database: %s\r\n", sqlite3_errmsg(db));
  347. sqlite3_close(db);
  348. }
  349. else
  350. {
  351. DEBUG_INFO( "Local charging record database open successfully.\r\n");
  352. if (sqlite3_exec(db, createSql, 0, 0, &errMsg) != SQLITE_OK)
  353. {
  354. result = FAIL;
  355. DEBUG_INFO( "Create local charging record table error message: %s\n", errMsg);
  356. }
  357. else
  358. {
  359. DEBUG_INFO( "Opened local charging record table successfully\n");
  360. }
  361. sqlite3_close(db);
  362. }
  363. return result;
  364. }
  365. int DB_Insert_Record(sqlite3 *db, int gun_index)
  366. {
  367. int result = PASS;
  368. char* errMsg = NULL;
  369. char insertSql[1024];
  370. sprintf(insertSql, "insert into charging_record(reservationId, transactionId, startMethod, userId, dateTimeStart, dateTimeStop, socStart, socStop, chargeEnergy, stopReason) "
  371. "values('%d', '%d', '%d', '%s', '%s', '%s', '%d', '%d', '%f', '%s');",
  372. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].ReservationId,
  373. ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId,
  374. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod,
  375. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartUserId,
  376. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartDateTime,
  377. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StopDateTime,
  378. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc,
  379. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc,
  380. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedEnergy,
  381. ShmOCPP16Data->StopTransaction[gun_index].StopReason);
  382. if(sqlite3_open("/Storage/ChargeLog/localCgargingRecord.db", &db))
  383. {
  384. result = FAIL;
  385. DEBUG_INFO( "Can't open database: %s\r\n", sqlite3_errmsg(db));
  386. sqlite3_close(db);
  387. }
  388. else
  389. {
  390. DEBUG_INFO( "Local charging record database open successfully.\r\n");
  391. if (sqlite3_exec(db, insertSql, 0, 0, &errMsg) != SQLITE_OK)
  392. {
  393. result = FAIL;
  394. DEBUG_INFO( "Insert local charging record error message: %s\n", errMsg);
  395. }
  396. else
  397. {
  398. DEBUG_INFO( "Insert local charging record successfully\n");
  399. }
  400. sqlite3_close(db);
  401. }
  402. return result;
  403. }
  404. //======================================================
  405. // Peripheral initial
  406. //======================================================
  407. int InitWatchDog()
  408. {
  409. int fd;
  410. system("/usr/bin/fuser -k /dev/watchdog");
  411. sleep(1);
  412. system("echo V > /dev/watchdog");
  413. sleep(1);
  414. fd=open("/dev/watchdog", O_RDWR);
  415. if(fd<=0)
  416. {
  417. DEBUG_ERROR("System watch dog initial fail.\r\n");
  418. }
  419. return fd;
  420. }
  421. void InitGPIO()
  422. {
  423. /*****************0~3, 4 bank, bank x 32+ num*********************/
  424. /***************************************************************/
  425. /*************** INPUT PIN ***************************************/
  426. /***************************************************************/
  427. /***************************************************************/
  428. /*************** OUTPUT PIN ************************************/
  429. /***************************************************************/
  430. /*MCU request:GPIO3_20 => H:ON; L:OFF*/
  431. system("echo 116 > /sys/class/gpio/export");
  432. system("echo \"out\" > /sys/class/gpio/gpio116/direction");
  433. system("echo 0 > /sys/class/gpio/gpio116/value");
  434. /*Rfid:GPIO0_19 => Reset_PING H:ON; L:OFF*/
  435. system("echo 19 > /sys/class/gpio/export");
  436. system("echo \"out\" > /sys/class/gpio/gpio19/direction");
  437. system("echo 1 > /sys/class/gpio/gpio19/value");
  438. /*Speaker:GPIO2_1 => H:ON; L:OFF*/
  439. system("echo 65 > /sys/class/gpio/export");
  440. system("echo \"out\" > /sys/class/gpio/gpio65/direction");
  441. system("echo 0 > /sys/class/gpio/gpio65/value");
  442. DEBUG_INFO("Initial GPIO OK\r\n");
  443. }
  444. int LoadSysConfigAndInfo(struct SysConfigData *ptr)
  445. {
  446. int fd,wrd;
  447. unsigned char *buf;
  448. unsigned int ChkSum,ChkSumOrg;
  449. if((buf=malloc(MtdBlockSize))==NULL)
  450. {
  451. DEBUG_ERROR("malloc buffer NG,rebooting..\r\n");
  452. if(ShmStatusCodeData!=NULL)
  453. {
  454. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  455. }
  456. sleep(5);
  457. system("reboot -f");
  458. sleep(5);
  459. system("reboot -f");
  460. }
  461. memset(buf, 0, MtdBlockSize);
  462. //================================================
  463. // Load configuration from mtdblock10
  464. //================================================
  465. fd = open("/dev/mtdblock10", O_RDWR);
  466. if (fd < 0)
  467. {
  468. free(buf);
  469. DEBUG_ERROR("open mtdblock10 NG,rebooting..\r\n");
  470. if(ShmStatusCodeData!=NULL)
  471. {
  472. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  473. }
  474. sleep(5);
  475. system("reboot -f");
  476. sleep(5);
  477. system("reboot -f");
  478. }
  479. wrd=read(fd, buf, MtdBlockSize);
  480. close(fd);
  481. if(wrd<MtdBlockSize)
  482. {
  483. free(buf);
  484. DEBUG_ERROR("read SysConfigData data NG,rebooting..\r\n");
  485. if(ShmStatusCodeData!=NULL)
  486. {
  487. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  488. }
  489. sleep(5);
  490. system("reboot -f");
  491. sleep(5);
  492. system("reboot -f");
  493. }
  494. ChkSum=0;
  495. for(wrd=0;wrd<MtdBlockSize-4;wrd++)
  496. {
  497. ChkSum+=buf[wrd];
  498. }
  499. memcpy(&ChkSumOrg,buf+(MtdBlockSize-4),sizeof(ChkSumOrg));
  500. //================================================
  501. // Load configuration from mtdblock11
  502. //================================================
  503. if(ChkSum!=ChkSumOrg)
  504. {
  505. DEBUG_ERROR("Primary SysConfigData checksum NG, read backup\r\n");
  506. fd = open("/dev/mtdblock11", O_RDWR);
  507. if (fd < 0)
  508. {
  509. free(buf);
  510. DEBUG_ERROR("open mtdblock11 (backup) NG,rebooting..\r\n");
  511. if(ShmStatusCodeData!=NULL)
  512. {
  513. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  514. }
  515. sleep(5);
  516. system("reboot -f");
  517. sleep(5);
  518. system("reboot -f");
  519. }
  520. memset(buf, 0, MtdBlockSize);
  521. wrd=read(fd, buf,MtdBlockSize);
  522. close(fd);
  523. if(wrd<MtdBlockSize)
  524. {
  525. free(buf);
  526. DEBUG_ERROR("read backup SysConfigData data NG,rebooting..\r\n");
  527. if(ShmStatusCodeData!=NULL)
  528. {
  529. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  530. }
  531. sleep(5);
  532. system("reboot -f");
  533. sleep(5);
  534. system("reboot -f");
  535. }
  536. ChkSum=0;
  537. for(wrd=0;wrd<MtdBlockSize-4;wrd++)
  538. {
  539. ChkSum+=buf[wrd];
  540. }
  541. memcpy(&ChkSumOrg,buf+(MtdBlockSize-4),sizeof(ChkSumOrg));
  542. //================================================
  543. // Load configuration from mtdblock12 (Factory default)
  544. //================================================
  545. if(ChkSum!=ChkSumOrg)
  546. {
  547. DEBUG_WARN("backup SysConfigData checksum NG, read Factory default\r\n");
  548. fd = open("/dev/mtdblock12", O_RDWR);
  549. if (fd < 0)
  550. {
  551. free(buf);
  552. DEBUG_ERROR("open mtdblock12 (Factory default) NG,rebooting..\r\n");
  553. if(ShmStatusCodeData!=NULL)
  554. {
  555. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  556. }
  557. sleep(5);
  558. system("reboot -f");
  559. sleep(5);
  560. system("reboot -f");
  561. }
  562. memset(buf, 0, MtdBlockSize);
  563. wrd=read(fd, buf,MtdBlockSize);
  564. close(fd);
  565. if(wrd<MtdBlockSize)
  566. {
  567. free(buf);
  568. DEBUG_ERROR("read factory default SysConfigData data NG,rebooting..\r\n");
  569. if(ShmStatusCodeData!=NULL)
  570. {
  571. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
  572. }
  573. sleep(5);
  574. system("reboot -f");
  575. sleep(5);
  576. system("reboot -f");
  577. }
  578. ChkSum=0;
  579. for(wrd=0;wrd<MtdBlockSize-4;wrd++)
  580. {
  581. ChkSum+=buf[wrd];
  582. }
  583. memcpy(&ChkSumOrg,buf+(MtdBlockSize-4),sizeof(ChkSumOrg));
  584. if(ChkSum!=ChkSumOrg)
  585. {
  586. DEBUG_WARN("factory default SysConfigData checksum NG, restore factory default\r\n");
  587. free(buf);
  588. system("cd /root;./Module_FactoryConfig -m");
  589. system("sync");
  590. sleep(5);
  591. system("reboot -f");
  592. sleep(5);
  593. system("reboot -f");
  594. return FAIL;
  595. }
  596. }
  597. }
  598. //load OK
  599. memcpy((struct SysConfigData *)ptr,buf,sizeof(struct SysConfigData));
  600. free(buf);
  601. DEBUG_INFO("Load SysConfigData OK\r\n");
  602. return PASS;
  603. }
  604. void InitEthernet()
  605. {
  606. pid_t pid;
  607. uint8_t cnt_pingDNS_Fail;
  608. char tmpbuf[256];
  609. //unsigned int address;
  610. //Init Eth0 for internet
  611. if(isInterfaceUp("eth0")==PASS)
  612. {
  613. memset(tmpbuf,0,256);
  614. sprintf(tmpbuf,"/sbin/ifconfig eth0 %s netmask %s up",
  615. ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress,
  616. ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress);
  617. system(tmpbuf);
  618. memset(tmpbuf,0,256);
  619. sprintf(tmpbuf,"route add default gw %s eth0 ",
  620. ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthGatewayAddress);
  621. system(tmpbuf);
  622. system("/sbin/ifconfig eth0:1 192.168.201.201 netmask 255.255.255.248 up");
  623. }
  624. if(isInterfaceUp("eth1")==PASS)
  625. {
  626. //Init Eth1 for administrator tool
  627. memset(tmpbuf,0,256);
  628. sprintf(tmpbuf,"/sbin/ifconfig eth1 %s netmask %s up",
  629. ShmSysConfigAndInfo->SysConfig.Eth1Interface.EthIpAddress,
  630. ShmSysConfigAndInfo->SysConfig.Eth1Interface.EthSubmaskAddress);
  631. system(tmpbuf);
  632. }
  633. //Run DHCP client if enabled
  634. system("killall udhcpc");
  635. system("rm -rf /etc/resolv.conf");
  636. system("echo nameserver 8.8.8.8 > /etc/resolv.conf"); //Google DNS server
  637. system("echo nameserver 180.76.76.76 > /etc/resolv.conf"); //Baidu DNS server
  638. if(ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthDhcpClient==0)
  639. system("/sbin/udhcpc -i eth0 -s /root/dhcp_script/eth0.script > /dev/null &");
  640. //check internet status
  641. pid = fork();
  642. if(pid == 0)
  643. {
  644. for(;;)
  645. {
  646. if(isReachableInternet() == PASS)
  647. {
  648. ShmSysConfigAndInfo->SysInfo.InternetConn = ON;
  649. ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet=OFF;
  650. cnt_pingDNS_Fail = 0;
  651. }
  652. else
  653. {
  654. if(++cnt_pingDNS_Fail > 3)
  655. {
  656. ShmSysConfigAndInfo->SysInfo.InternetConn = OFF;
  657. ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet=ON;
  658. }
  659. }
  660. sleep(5);
  661. }
  662. }
  663. DEBUG_INFO("Initial Ethernet OK\r\n");
  664. }
  665. int SpawnTask()
  666. {
  667. system ("pkill Module_4g");
  668. system ("pkill Module_Wifi");
  669. system ("pkill Module_EventLogging");
  670. system ("pkill OcppBackend");
  671. system ("pkill Module_AlarmDetect");
  672. system ("pkill Module_InternalComm");
  673. system ("pkill Module_Speaker");
  674. system ("pkill Module_ProduceUtils");
  675. if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T')
  676. {
  677. system("/root/Module_4g &");
  678. }
  679. else if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W')
  680. {
  681. system("/root/Module_Wifi &");
  682. }
  683. system("/root/Module_EventLogging &");
  684. if(strcmp((char *)&ShmSysConfigAndInfo->SysConfig.OcppServerURL,"") != 0)
  685. {
  686. system("/root/OcppBackend &");
  687. }
  688. system ("/root/Module_AlarmDetect &");
  689. system ("/root/Module_InternalComm &");
  690. system ("/root/Module_Speaker &");
  691. system ("/root/Module_ProduceUtils &");
  692. return PASS;
  693. }
  694. int StoreUsrConfigData(struct SysConfigData *UsrData)
  695. {
  696. int result = PASS;
  697. int fd,wrd;
  698. unsigned int i,Chk;
  699. unsigned char *ptr, *BufTmp;
  700. Chk=0;
  701. ptr=(unsigned char *)UsrData;
  702. if((BufTmp=malloc(MtdBlockSize))!=NULL)
  703. {
  704. memset(BufTmp,0,MtdBlockSize);
  705. memcpy(BufTmp,ptr,sizeof(struct SysConfigData));
  706. for(i=0;i<MtdBlockSize-4;i++)
  707. Chk+=*(BufTmp+i);
  708. memcpy( BufTmp+MtdBlockSize-4,&Chk,4);
  709. fd = open("/dev/mtdblock10", O_RDWR);
  710. if (fd>0)
  711. {
  712. wrd=write(fd, BufTmp, MtdBlockSize);
  713. close(fd);
  714. if(wrd>=MtdBlockSize)
  715. {
  716. fd = open("/dev/mtdblock11", O_RDWR);
  717. if (fd>0)
  718. {
  719. wrd=write(fd, BufTmp, MtdBlockSize);
  720. close(fd);
  721. if(wrd<MtdBlockSize)
  722. {
  723. DEBUG_ERROR("write /dev/mtdblock11(backup) NG\r\n");
  724. result = FAIL;
  725. }
  726. }
  727. else
  728. {
  729. DEBUG_ERROR("open /dev/mtdblock11(backup) NG\r\n");
  730. result = FAIL;
  731. }
  732. }
  733. else
  734. {
  735. DEBUG_ERROR("write /dev/mtdblock10 NG\r\n");
  736. result = FAIL;
  737. }
  738. }
  739. else
  740. {
  741. DEBUG_ERROR("open /dev/mtdblock10 NG\r\n");
  742. result = FAIL;
  743. }
  744. }
  745. else
  746. {
  747. DEBUG_ERROR("alloc BlockSize NG\r\n");
  748. result = FAIL;
  749. }
  750. if(BufTmp!=NULL)
  751. free(BufTmp);
  752. return result;
  753. }
  754. int Initialization()
  755. {
  756. int result = PASS;
  757. LoadSysConfigAndInfo(&ShmSysConfigAndInfo->SysConfig);
  758. InitGPIO();
  759. InitEthernet();
  760. if(DB_Open(localDb) != PASS)
  761. result = FAIL;
  762. rfidFd = InitRfidPort();
  763. wtdFd = InitWatchDog();
  764. if((wtdFd < 0) || (rfidFd < 0))
  765. result = FAIL;
  766. if(result == PASS)
  767. DEBUG_INFO("Initialization OK.\r\n");
  768. else
  769. DEBUG_INFO("Initialization Fail.\r\n");
  770. return result;
  771. }
  772. //=====================================================
  773. // Common routine
  774. //=====================================================
  775. char* getSystemModeName(unsigned char mode)
  776. {
  777. char* result;
  778. switch(mode)
  779. {
  780. case SYS_MODE_BOOTING:
  781. result = "booting";
  782. break;
  783. case SYS_MODE_IDLE:
  784. result = "idle";
  785. break;
  786. case SYS_MODE_AUTHORIZING:
  787. result = "authorizing";
  788. break;
  789. case SYS_MODE_PREPARING:
  790. result = "preparing";
  791. break;
  792. case SYS_MODE_CHARGING:
  793. result = "charging";
  794. break;
  795. case SYS_MODE_TERMINATING:
  796. result = "terminating";
  797. break;
  798. case SYS_MODE_ALARM:
  799. result = "alarm";
  800. break;
  801. case SYS_MODE_FAULT:
  802. result = "fault";
  803. break;
  804. case SYS_MODE_MAINTAIN:
  805. result = "maintain";
  806. break;
  807. case SYS_MODE_RESERVATION:
  808. result = "reservation";
  809. break;
  810. case SYS_MODE_BOOKING:
  811. result = "booking";
  812. break;
  813. case SYS_MODE_DEBUG:
  814. result = "debug";
  815. break;
  816. case SYS_MODE_UPDATE:
  817. result = "upgrade";
  818. break;
  819. default:
  820. result = "unknown";
  821. break;
  822. }
  823. return result;
  824. }
  825. void setChargerMode(unsigned char gun_index, unsigned char mode)
  826. {
  827. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PreviousSystemStatus = ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus;
  828. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus = mode;
  829. DEBUG_INFO("Gun-%02d mode switch from %s to %s\r\n", gun_index, getSystemModeName(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PreviousSystemStatus), getSystemModeName(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus));
  830. }
  831. unsigned char isMode(unsigned char gun_index, unsigned char mode)
  832. {
  833. return ((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus == mode)?YES:NO);
  834. }
  835. unsigned char isModeChange(unsigned char gun_index)
  836. {
  837. unsigned char result = NO;
  838. if(!isMode(gun_index, ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PreviousSystemStatus))
  839. {
  840. result = YES;
  841. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PreviousSystemStatus = ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus;
  842. }
  843. return result;
  844. }
  845. //===============================================
  846. // Get firmware version
  847. //===============================================
  848. void get_firmware_version(unsigned char gun_index)
  849. {
  850. FILE *fp;
  851. char cmd[512];
  852. char buf[512];
  853. // Get CSU hardware version
  854. sprintf((char*)ShmSysConfigAndInfo->SysInfo.CsuHwRev, "REV.XXXXXXX");
  855. // Get CSU boot loader version
  856. memcpy(ShmSysConfigAndInfo->SysInfo.CsuBootLoadFwRev, ShmSysConfigAndInfo->SysConfig.CsuBootLoadFwRev, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.CsuBootLoadFwRev));
  857. // Get CSU kernel version
  858. sprintf(cmd, "/bin/uname -r");
  859. fp = popen(cmd, "r");
  860. if(fp == NULL)
  861. sprintf((char*)ShmSysConfigAndInfo->SysInfo.CsuKernelFwRev, "Unknown version");
  862. else
  863. {
  864. while(fgets(buf, sizeof(buf), fp) != NULL)
  865. {
  866. strcpy((char*)ShmSysConfigAndInfo->SysInfo.CsuKernelFwRev, buf);
  867. }
  868. }
  869. // Get CSU root file system version
  870. sprintf((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev, "D0.05.60.6007.BT");
  871. // Get MCU firmware version
  872. strcpy((char*)ShmSysConfigAndInfo->SysInfo.CsuPrimFwRev, ShmCharger->gun_info[gun_index].ver.Version_FW);
  873. DEBUG_INFO("CSU hardware version: %s\r\n", ShmSysConfigAndInfo->SysInfo.CsuHwRev);
  874. DEBUG_INFO("CSU boot loader version: %s\r\n", ShmSysConfigAndInfo->SysInfo.CsuBootLoadFwRev);
  875. DEBUG_INFO("CSU kernel version: %s\r\n", ShmSysConfigAndInfo->SysInfo.CsuKernelFwRev);
  876. DEBUG_INFO("CSU root file system version: %s\r\n", ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev);
  877. DEBUG_INFO("CSU MCU-%2d firmware version: %s\r\n", gun_index, ShmCharger->gun_info[gun_index].ver.Version_FW);
  878. }
  879. //===============================================
  880. // Upgrade firmware
  881. //===============================================
  882. int upgrade_check()
  883. {
  884. int result = PASS;
  885. int fd;
  886. DIR *dir;
  887. struct dirent *file;
  888. char cmd[512];
  889. long int MaxLen=48*1024*1024;
  890. if ((dir = opendir ("/mnt")) != NULL)
  891. {
  892. /* print all the files and directories within directory */
  893. while ((file = readdir (dir)) != NULL)
  894. {
  895. if(strlen(file->d_name)>2)
  896. {
  897. memset(&ShmCharger->fwUpgradeInfo, 0xFF, sizeof(Fw_Upgrade_Info));
  898. DEBUG_INFO("New firmware file: %s\n", file->d_name);
  899. sprintf(ShmCharger->fwUpgradeInfo.location, "/mnt/%s", file->d_name);
  900. if((fd=open(ShmCharger->fwUpgradeInfo.location, O_RDONLY)) >= 0)
  901. {
  902. unsigned char *ptr = malloc(MaxLen); //-48 is take out the header
  903. memset(ptr, 0xFF, MaxLen); //-48 is take out the header
  904. read(fd, ptr, MaxLen);
  905. close(fd);
  906. ShmCharger->fwUpgradeInfo.fwType = ((ptr[0x13]<<0) | (ptr[0x12]<<8) | (ptr[0x11]<<16) | (ptr[0x10]<<24));
  907. substr(ShmCharger->fwUpgradeInfo.modelName, (char *)ptr, 0, 0x10);
  908. DEBUG_INFO("New firmware type: %X\r\n", ShmCharger->fwUpgradeInfo.fwType);
  909. DEBUG_INFO("New firmware model name: %s, %s\r\n", ShmCharger->fwUpgradeInfo.modelName, ShmSysConfigAndInfo->SysConfig.ModelName);
  910. if((strcmp(ShmCharger->fwUpgradeInfo.modelName, (char*)ShmSysConfigAndInfo->SysConfig.ModelName)==0) && (ShmCharger->fwUpgradeInfo.fwType>0))
  911. {
  912. switch(ShmCharger->fwUpgradeInfo.fwType)
  913. {
  914. case CSU_BOOTLOADER:
  915. case CSU_KERNEL_CONFIGURATION:
  916. case CSU_KERNEL_IMAGE:
  917. case CSU_ROOT_FILE_SYSTEM:
  918. case CSU_USER_CONFIGURATION:
  919. case CSU_PRIMARY_CONTROLLER:
  920. if(Upgrade_Flash(ShmCharger->fwUpgradeInfo.fwType, ShmCharger->fwUpgradeInfo.location, ShmCharger->fwUpgradeInfo.modelName) != PASS)
  921. result = FAIL;
  922. sprintf(cmd, "yes|rm %s", ShmCharger->fwUpgradeInfo.location);
  923. system(cmd);
  924. break;
  925. case AC_WALLMOUNT_CONTROLLER:
  926. for(int gun_index = 0;gun_index<AC_QUANTITY;gun_index++)
  927. ShmCharger->gun_info[gun_index].mcuFlag.isMcuUpgradeReq = ON;
  928. break;
  929. default:
  930. result = FAIL;
  931. DEBUG_WARN("Image file is unknown type.\r\n");
  932. sprintf(cmd, "yes|rm %s", ShmCharger->fwUpgradeInfo.location);
  933. system(cmd);
  934. break;
  935. }
  936. }
  937. free(ptr);
  938. }
  939. else
  940. {
  941. // File open error
  942. DEBUG_ERROR("New firmware open error.\r\n");
  943. }
  944. }
  945. }
  946. closedir (dir);
  947. }
  948. else
  949. {
  950. DEBUG_ERROR("/mnt does not valid.\r\n");
  951. }
  952. return result;
  953. }
  954. //===============================================
  955. // Check RFID is match with start user
  956. //===============================================
  957. int isMatchStartUser(unsigned char gun_index)
  958. {
  959. uint8_t tmpUser[32];
  960. if(ShmSysConfigAndInfo->SysConfig.RfidCardNumEndian)
  961. {
  962. // Big endian
  963. switch(rfid.snType)
  964. {
  965. case RFID_SN_TYPE_6BYTE:
  966. sprintf((char*)tmpUser, "%02X%02X%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3], rfid.currentCard[4], rfid.currentCard[5]);
  967. break;
  968. case RFID_SN_TYPE_7BYTE:
  969. sprintf((char*)tmpUser, "%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3], rfid.currentCard[4], rfid.currentCard[5], rfid.currentCard[6]);
  970. break;
  971. case RFID_SN_TYPE_10BYTE:
  972. sprintf((char*)tmpUser, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3], rfid.currentCard[4], rfid.currentCard[5], rfid.currentCard[6], rfid.currentCard[7], rfid.currentCard[8], rfid.currentCard[9]);
  973. break;
  974. case RFID_SN_TYPE_4BYTE:
  975. default:
  976. sprintf((char*)tmpUser, "%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3]);
  977. break;
  978. }
  979. }
  980. else
  981. {
  982. // Little endian
  983. switch(rfid.snType)
  984. {
  985. case RFID_SN_TYPE_6BYTE:
  986. sprintf((char*)tmpUser, "%02X%02X%02X%02X%02X%02X", rfid.currentCard[5], rfid.currentCard[4], rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
  987. break;
  988. case RFID_SN_TYPE_7BYTE:
  989. sprintf((char*)tmpUser, "%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[6], rfid.currentCard[5], rfid.currentCard[4], rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
  990. break;
  991. case RFID_SN_TYPE_10BYTE:
  992. sprintf((char*)tmpUser, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[9], rfid.currentCard[8], rfid.currentCard[7], rfid.currentCard[6], rfid.currentCard[5], rfid.currentCard[4], rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
  993. break;
  994. case RFID_SN_TYPE_4BYTE:
  995. default:
  996. sprintf((char*)tmpUser, "%02X%02X%02X%02X", rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
  997. break;
  998. }
  999. }
  1000. return ((strcmp((char*)tmpUser, (char*)ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartUserId)==0)?YES:NO);
  1001. }
  1002. //===============================================
  1003. // Read RFID Serial Number
  1004. //===============================================
  1005. int GetCardSerialNumber()
  1006. {
  1007. int isSuccess = FAIL;
  1008. int module_type = MODULE_EWT;
  1009. if(getRequestCardSN(rfidFd,module_type,&rfid))
  1010. {
  1011. if(rfid.cardType == ISO14443A)
  1012. {
  1013. if(rfid.snType == RFID_SN_TYPE_4BYTE)
  1014. {
  1015. isSuccess = PASS;
  1016. }
  1017. else if (rfid.snType == RFID_SN_TYPE_7BYTE)
  1018. {
  1019. isSuccess = PASS;
  1020. }
  1021. }
  1022. else if(rfid.cardType == IS014443B)
  1023. {
  1024. isSuccess = PASS;
  1025. }
  1026. else if(rfid.cardType == FELICA)
  1027. {
  1028. isSuccess = PASS;
  1029. }
  1030. else
  1031. {}
  1032. }
  1033. else
  1034. {}
  1035. return isSuccess;
  1036. }
  1037. //===============================================
  1038. // Alarm value check
  1039. //===============================================
  1040. int GetAlarmValue()
  1041. {
  1042. int result = PASS;
  1043. if( (ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[0] > 0) || (ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[1] > 0) || (ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[2] > 0) ||
  1044. (ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[3] > 0) || (ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[4] > 0) || (ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[5] > 0) ||
  1045. (ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[6] > 0) || (ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[7] > 0))
  1046. {
  1047. result = FAIL;
  1048. }
  1049. return result;
  1050. }
  1051. //===============================================
  1052. // Info value check
  1053. //===============================================
  1054. int GetInfoValue()
  1055. {
  1056. int result = PASS;
  1057. if( (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[0] > 0) || (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[1] > 0) || (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[2] > 0) ||
  1058. (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[3] > 0) || (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[4] > 0) || (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[5] > 0) ||
  1059. (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[6] > 0) || (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[7] > 0) || (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[8] > 0) ||
  1060. (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[9] > 0))
  1061. {
  1062. result = FAIL;
  1063. }
  1064. return result;
  1065. }
  1066. //===============================================
  1067. // Fault value check
  1068. //===============================================
  1069. int GetFaultValue()
  1070. {
  1071. int result = PASS;
  1072. if( (ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[0] > 0) ||
  1073. (ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[1] > 0) ||
  1074. (ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[2] > 0) ||
  1075. (ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[3] > 0))
  1076. {
  1077. result = FAIL;
  1078. }
  1079. return result;
  1080. }
  1081. //===============================================
  1082. // Set led motion
  1083. //===============================================
  1084. void setLedMotion(unsigned char gun_index,unsigned char led_mode)
  1085. {
  1086. switch(led_mode)
  1087. {
  1088. case LED_ACTION_INIT:
  1089. ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_INIT;
  1090. break;
  1091. case LED_ACTION_IDLE:
  1092. ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_IDLE;
  1093. break;
  1094. case LED_ACTION_AUTHED:
  1095. ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_AUTHED;
  1096. break;
  1097. case LED_ACTION_CONNECTED:
  1098. ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_CONNECTED;
  1099. break;
  1100. case LED_ACTION_CHARGING:
  1101. ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_CHARGING;
  1102. break;
  1103. case LED_ACTION_STOP:
  1104. ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_STOP;
  1105. break;
  1106. case LED_ACTION_ALARM:
  1107. ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_ALARM;
  1108. break;
  1109. case LED_ACTION_MAINTAIN:
  1110. ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_MAINTAIN;
  1111. break;
  1112. case LED_ACTION_RFID_PASS:
  1113. ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_RFID_PASS;
  1114. break;
  1115. case LED_ACTION_RFID_FAIL:
  1116. ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_RFID_FAIL;
  1117. break;
  1118. case LED_ACTION_BLE_CONNECT:
  1119. ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_BLE_CONNECT;
  1120. break;
  1121. case LED_ACTION_BLE_DISABLE:
  1122. ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_BLE_DISABLE;
  1123. break;
  1124. case LED_ACTION_DEBUG:
  1125. ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_DEBUG;
  1126. break;
  1127. case LED_ACTION_ALL_OFF:
  1128. ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_ALL_OFF;
  1129. break;
  1130. case LED_RELAY_ON:
  1131. ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_RELAY_ON;
  1132. break;
  1133. case LED_RELAY_OFF:
  1134. ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_RELAY_OFF;
  1135. break;
  1136. case LED_ACTION_HANDSHAKE_FAIL:
  1137. ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_HANDSHAKE_FAIL;
  1138. break;
  1139. case LED_ACTION_INTERNET_DISCONNECT:
  1140. ShmCharger->gun_info[gun_index].primaryMcuLed.mode = LED_ACTION_INTERNET_DISCONNECT;
  1141. break;
  1142. }
  1143. }
  1144. //===============================================
  1145. // Relay on/off request set
  1146. //===============================================
  1147. void setRelay(unsigned char gun_index,unsigned char isOn)
  1148. {
  1149. if(isOn == ON)
  1150. {
  1151. if(ShmCharger->gun_info[gun_index].legacyRequest.isLegacyRequest == OFF)
  1152. {
  1153. ShmCharger->gun_info[gun_index].legacyRequest.isLegacyRequest = ON;
  1154. DEBUG_INFO("Gun-%d Output relay sts: ON \r\n",gun_index);
  1155. }
  1156. }
  1157. else
  1158. {
  1159. if(ShmCharger->gun_info[gun_index].legacyRequest.isLegacyRequest == ON)
  1160. {
  1161. ShmCharger->gun_info[gun_index].legacyRequest.isLegacyRequest = OFF;
  1162. DEBUG_INFO("Gun-%d Output relay sts: OFF \r\n",gun_index);
  1163. }
  1164. }
  1165. }
  1166. //===============================================
  1167. // Relay on/off request get
  1168. //===============================================
  1169. int getRelay(unsigned char gun_index)
  1170. {
  1171. return ShmCharger->gun_info[gun_index].legacyRequest.isLegacyRequest;
  1172. }
  1173. //===============================================
  1174. // Set speaker on/off request
  1175. //===============================================
  1176. void setSpeaker(unsigned char isOn, unsigned char speaker_mode)
  1177. {
  1178. if(isOn == ON)
  1179. {
  1180. ShmCharger->isSpeakerOn = ON;
  1181. ShmCharger->speaker_type = speaker_mode;
  1182. }
  1183. }
  1184. //===============================================
  1185. // Initialization RFID communication port
  1186. //===============================================
  1187. int InitRfidPort()
  1188. {
  1189. int uartO2 = open(rfidPortName, O_RDWR);
  1190. struct termios tios;
  1191. if (uartO2 != FAIL)
  1192. {
  1193. ioctl (uartO2, TCGETS, &tios);
  1194. tios.c_cflag = B19200 | CS8 | CLOCAL | CREAD;
  1195. tios.c_lflag = 0;
  1196. tios.c_iflag = 0;
  1197. tios.c_oflag = 0;
  1198. tios.c_cc[VMIN] = 0;
  1199. tios.c_cc[VTIME] = (unsigned char) 1;
  1200. tios.c_lflag = 0;
  1201. tcflush(uartO2, TCIFLUSH);
  1202. ioctl(uartO2, TCSETS, &tios);
  1203. }
  1204. if (uartO2 < 0)
  1205. {
  1206. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RfidModuleCommFail = 1;
  1207. }
  1208. return uartO2;
  1209. }
  1210. //===============================================
  1211. // Check internet access status
  1212. //===============================================
  1213. int isReachableInternet()
  1214. {
  1215. int result = FAIL;
  1216. FILE *fp;
  1217. char cmd[256];
  1218. char buf[512];
  1219. //char tmp[512];
  1220. for(int idx=0;idx<ARRAY_SIZE(valid_Internet);idx++)
  1221. {
  1222. strcpy(cmd, "ping -c 1 -w 3 ");
  1223. strcat(cmd, valid_Internet[idx]);
  1224. fp = popen(cmd, "r");
  1225. if(fp != NULL)
  1226. {
  1227. while(fgets(buf, sizeof(buf), fp) != NULL)
  1228. {
  1229. if(strstr(buf, "transmitted") > 0)
  1230. {
  1231. //sscanf(buf, "%*s%*s%*s%*s%*s%*s%s", tmp);
  1232. if(strstr(buf,"100%") != NULL)
  1233. {
  1234. }
  1235. else
  1236. {
  1237. result = PASS;
  1238. }
  1239. //DEBUG_INFO("%s",buf);
  1240. //DEBUG_INFO("%s\n",tmp);
  1241. }
  1242. }
  1243. }
  1244. pclose(fp);
  1245. }
  1246. return result;
  1247. }
  1248. //===============================================
  1249. // Check reservation date is expired
  1250. //===============================================
  1251. int isReservationExpired(unsigned char gun_index)
  1252. {
  1253. int result = NO;
  1254. struct tm expiredDate;
  1255. struct timeb expiredTime;
  1256. if(sscanf((char*)ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate, "%4d-%2d-%2dT%2d:%2d:%2d", &expiredDate.tm_year, &expiredDate.tm_mon, &expiredDate.tm_mday, &expiredDate.tm_hour, &expiredDate.tm_min, &expiredDate.tm_sec) == 6)
  1257. {
  1258. expiredDate.tm_year -= 1900;
  1259. expiredDate.tm_mon -= 1;
  1260. expiredTime.time = mktime(&expiredDate);
  1261. if(DiffTimebWithNow(expiredTime) >= 0)
  1262. {
  1263. result = YES;
  1264. }
  1265. }
  1266. else
  1267. {
  1268. DEBUG_WARN("Expired date parsing error...\r\n");
  1269. DEBUG_INFO("Date expired...\r\n");
  1270. result = YES;
  1271. }
  1272. return result;
  1273. }
  1274. //===============================================
  1275. // Valid from local white list
  1276. //===============================================
  1277. int isValidLocalWhiteCard()
  1278. {
  1279. uint8_t result = FAIL;
  1280. for(uint8_t idx=0;idx<ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.LocalWhiteCard);idx++)
  1281. {
  1282. if(strcmp((char*)ShmSysConfigAndInfo->SysConfig.UserId, (char*)ShmSysConfigAndInfo->SysConfig.LocalWhiteCard[idx]) == 0)
  1283. {
  1284. result = PASS;
  1285. }
  1286. }
  1287. return result;
  1288. }
  1289. //===============================================
  1290. // Main process
  1291. //===============================================
  1292. int main(void)
  1293. {
  1294. //Create all share memory
  1295. if(CreatShareMemory()==0)
  1296. {
  1297. DEBUG_ERROR("CreatShareMemory NG\r\n");
  1298. if(ShmStatusCodeData!=NULL)
  1299. {
  1300. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
  1301. }
  1302. sleep(5);
  1303. system("reboot -f");
  1304. sleep(5);
  1305. system("reboot -f");
  1306. }
  1307. else
  1308. {
  1309. DEBUG_INFO("CreatShareMemory OK\r\n");
  1310. }
  1311. for(int gun_index = 0;gun_index<AC_QUANTITY;gun_index++)
  1312. {
  1313. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PreviousSystemStatus = 0xff;
  1314. ShmCharger->gun_info[gun_index].primaryMcuState.rotatory_switch = 0xff;
  1315. ShmCharger->gun_info[gun_index].mcuResetRequest.isMcuResetRequest = ON;
  1316. }
  1317. // Main loop
  1318. for(;;)
  1319. {
  1320. //==========================================
  1321. // Synchronize share memory from OCPP struct
  1322. //==========================================
  1323. ShmSysConfigAndInfo->SysInfo.OcppConnStatus = ShmOCPP16Data->OcppConnStatus;
  1324. //==========================================
  1325. // Something need run in Idle mode
  1326. //==========================================
  1327. if((ShmSysConfigAndInfo->SysInfo.AcChargingData[0].SystemStatus==SYS_MODE_IDLE) &&
  1328. (AC_QUANTITY>1?(ShmSysConfigAndInfo->SysInfo.AcChargingData[1].SystemStatus==SYS_MODE_IDLE):true))
  1329. {
  1330. //======================================
  1331. // Check restore factory setting request
  1332. //======================================
  1333. if(ShmSysConfigAndInfo->SysInfo.FactoryConfiguration)
  1334. {
  1335. system("cd /root;./Module_FactoryConfig -m");
  1336. system("sync");
  1337. sleep(5);
  1338. system("reboot -f");
  1339. sleep(5);
  1340. system("reboot -f");
  1341. }
  1342. //======================================
  1343. // Check upgrade firmware request
  1344. //======================================
  1345. if(ShmSysConfigAndInfo->SysInfo.FirmwareUpdate ||
  1346. ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq)
  1347. {
  1348. ShmCharger->isUpdateSuccess = FAIL;
  1349. for(int gun_index = 0;gun_index<AC_QUANTITY;gun_index++)
  1350. setChargerMode(gun_index, SYS_MODE_UPDATE);
  1351. }
  1352. }
  1353. //==========================================
  1354. // Check remote reset request
  1355. //==========================================
  1356. if(ShmOCPP16Data->MsMsg.bits.ResetReq)
  1357. {
  1358. if((!isMode(0, SYS_MODE_CHARGING) && !isMode(0, SYS_MODE_TERMINATING)) &&
  1359. (AC_QUANTITY>1?(!isMode(1, SYS_MODE_CHARGING) && !isMode(1, SYS_MODE_TERMINATING)):true))
  1360. {
  1361. ShmOCPP16Data->MsMsg.bits.ResetReq = OFF;
  1362. if(strcmp((char*)ShmOCPP16Data->Reset.Type, "Hard") == 0)
  1363. {
  1364. system("sync");
  1365. sleep(5);
  1366. system("reboot -f");
  1367. sleep(5);
  1368. system("reboot -f");
  1369. }
  1370. else
  1371. {
  1372. system("/usr/bin/run_evse_restart.sh");
  1373. }
  1374. }
  1375. }
  1376. //==========================================
  1377. // Check RFID
  1378. //==========================================
  1379. if(!ShmCharger->gun_info[ShmCharger->gun_selectd].rfidReq)
  1380. {
  1381. if(GetCardSerialNumber()!= FAIL)
  1382. {
  1383. ShmCharger->gun_info[ShmCharger->gun_selectd].rfidReq = ON;
  1384. }
  1385. }
  1386. //==========================================
  1387. // Connector loop
  1388. //==========================================
  1389. for(int gun_index = 0;gun_index<AC_QUANTITY;gun_index++)
  1390. {
  1391. // Synchronize current rating value from MCU
  1392. ShmSysConfigAndInfo->SysConfig.RatingCurrent = ShmCharger->gun_info[gun_index].primaryMcuState.rating_current;
  1393. // Assign connector location index for OCPP
  1394. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].Index = gun_index;
  1395. // Alarm event check
  1396. if((ShmCharger->gun_info[gun_index].primaryMcuAlarm.InputAlarmCode>0))
  1397. {
  1398. if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus != SYS_MODE_ALARM)
  1399. {
  1400. setChargerMode(gun_index, SYS_MODE_ALARM);
  1401. }
  1402. }
  1403. else
  1404. {
  1405. if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus == SYS_MODE_ALARM)
  1406. {
  1407. }
  1408. else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus == 0XFF)
  1409. {
  1410. setChargerMode(gun_index, SYS_MODE_BOOTING);
  1411. }
  1412. }
  1413. // Reservation request check
  1414. if(ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowReq)
  1415. {
  1416. ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowReq = OFF;
  1417. if(isMode(gun_index, SYS_MODE_IDLE) && !isReservationExpired(gun_index))
  1418. {
  1419. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].ReservationId = ShmOCPP16Data->ReserveNow[gun_index].ReservationId;
  1420. setChargerMode(gun_index, SYS_MODE_RESERVATION);
  1421. }
  1422. DEBUG_INFO("Reservation request on connector-%d.\r\n", gun_index);
  1423. ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowConf = ON;
  1424. }
  1425. // Change availability check
  1426. if(ShmOCPP16Data->CsMsg.bits[gun_index].ChangeAvailabilityReq)
  1427. {
  1428. if(strcmp((char*)ShmOCPP16Data->ChangeAvailability[gun_index].Type, "Operative") == 0)
  1429. {
  1430. if(isMode(gun_index, SYS_MODE_MAINTAIN))
  1431. {
  1432. setChargerMode(gun_index, SYS_MODE_IDLE);
  1433. ShmOCPP16Data->CsMsg.bits[gun_index].ChangeAvailabilityReq = OFF;
  1434. }
  1435. }
  1436. else
  1437. {
  1438. if(isMode(gun_index, SYS_MODE_IDLE))
  1439. {
  1440. setChargerMode(gun_index, SYS_MODE_MAINTAIN);
  1441. ShmOCPP16Data->CsMsg.bits[gun_index].ChangeAvailabilityReq = OFF;
  1442. }
  1443. }
  1444. }
  1445. // Connector process
  1446. switch(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus)
  1447. {
  1448. case SYS_MODE_BOOTING:
  1449. if(isModeChange(gun_index))
  1450. {
  1451. setLedMotion(gun_index,LED_ACTION_INIT);
  1452. //CSU Initialization & task spawn
  1453. if((Initialization() != PASS) ||
  1454. (SpawnTask() != PASS) )
  1455. {
  1456. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed = ON;
  1457. }
  1458. }
  1459. if(ShmCharger->gun_info[gun_index].mcuFlag.isReadFwVerPass &&
  1460. ShmCharger->gun_info[gun_index].mcuFlag.isSetModelNamePass &&
  1461. ShmCharger->gun_info[gun_index].mcuFlag.isSetSerialNumberPass)
  1462. {
  1463. ShmCharger->gun_selectd = 0;
  1464. // Firmware version
  1465. get_firmware_version(gun_index);
  1466. // OCPP BootNotification info set
  1467. memcpy((char*)ShmOCPP16Data->OcppServerURL, (char*)ShmSysConfigAndInfo->SysConfig.OcppServerURL, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.OcppServerURL));
  1468. memcpy((char*)ShmOCPP16Data->ChargeBoxId, (char*)ShmSysConfigAndInfo->SysConfig.ChargeBoxId, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.ChargeBoxId));
  1469. sprintf((char*)ShmSysConfigAndInfo->SysConfig.chargePointVendor, "Phihong Technology");
  1470. sprintf((char*)ShmOCPP16Data->BootNotification.CpFwVersion, (char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev);
  1471. sprintf((char*)ShmOCPP16Data->BootNotification.CpMeterSerialNumber, "N/A");
  1472. sprintf((char*)ShmOCPP16Data->BootNotification.CpMeterType, "AC");
  1473. DEBUG_INFO("Wifi mode: %d\r\n", ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode);
  1474. DEBUG_INFO("Wifi SSID: %s\r\n", ShmSysConfigAndInfo->SysConfig.AthInterface.WifiSsid);
  1475. DEBUG_INFO("Wifi password: %s\r\n", ShmSysConfigAndInfo->SysConfig.AthInterface.WifiPassword);
  1476. if(ShmCharger->gun_info[gun_index].primaryMcuState.rotatory_switch == 0)
  1477. setChargerMode(gun_index, SYS_MODE_DEBUG);
  1478. else
  1479. setChargerMode(gun_index, SYS_MODE_IDLE);
  1480. }
  1481. break;
  1482. case SYS_MODE_IDLE:
  1483. if(isModeChange(gun_index))
  1484. {
  1485. setLedMotion(gun_index,LED_ACTION_IDLE);
  1486. setRelay(gun_index,OFF);
  1487. ShmCharger->gun_info[gun_index].rfidReq = OFF;
  1488. ShmCharger->gun_info[gun_index].bleConfigData.isRequestStart = OFF;
  1489. ShmCharger->gun_info[gun_index].bleConfigData.isRequestStop = OFF;
  1490. ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStartTransactionReq = OFF;
  1491. ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStopTransactionReq = OFF;
  1492. ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode = 0x00;
  1493. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedDuration = 0;
  1494. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedEnergy = 0;
  1495. ShmCharger->gun_info[gun_index].targetCurrent = ShmCharger->gun_info[gun_index].primaryMcuState.rating_current;
  1496. }
  1497. if(((ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_FREE) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_B)) ||
  1498. (ShmCharger->gun_info[gun_index].rfidReq == ON) ||
  1499. (ShmCharger->gun_info[gun_index].bleConfigData.isRequestStart == ON) ||
  1500. (ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStartTransactionReq == ON))
  1501. {
  1502. // Clean User id & Card Number
  1503. memset(ShmSysConfigAndInfo->SysConfig.UserId, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.UserId));
  1504. if((ShmCharger->gun_info[gun_index].rfidReq == ON))
  1505. {
  1506. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod = START_METHOD_RFID;
  1507. DEBUG_INFO("Start Method : RFID...\r\n");
  1508. if(ShmSysConfigAndInfo->SysConfig.RfidCardNumEndian)
  1509. {
  1510. // Big endian
  1511. switch(rfid.snType)
  1512. {
  1513. case RFID_SN_TYPE_6BYTE:
  1514. sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3], rfid.currentCard[4], rfid.currentCard[5]);
  1515. break;
  1516. case RFID_SN_TYPE_7BYTE:
  1517. sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3], rfid.currentCard[4], rfid.currentCard[5], rfid.currentCard[6]);
  1518. break;
  1519. case RFID_SN_TYPE_10BYTE:
  1520. sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3], rfid.currentCard[4], rfid.currentCard[5], rfid.currentCard[6], rfid.currentCard[7], rfid.currentCard[8], rfid.currentCard[9]);
  1521. break;
  1522. case RFID_SN_TYPE_4BYTE:
  1523. default:
  1524. sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3]);
  1525. break;
  1526. }
  1527. }
  1528. else
  1529. {
  1530. // Little endian
  1531. switch(rfid.snType)
  1532. {
  1533. case RFID_SN_TYPE_6BYTE:
  1534. sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X", rfid.currentCard[5], rfid.currentCard[4], rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
  1535. break;
  1536. case RFID_SN_TYPE_7BYTE:
  1537. sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[6], rfid.currentCard[5], rfid.currentCard[4], rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
  1538. break;
  1539. case RFID_SN_TYPE_10BYTE:
  1540. sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[9], rfid.currentCard[8], rfid.currentCard[7], rfid.currentCard[6], rfid.currentCard[5], rfid.currentCard[4], rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
  1541. break;
  1542. case RFID_SN_TYPE_4BYTE:
  1543. default:
  1544. sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X", rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
  1545. break;
  1546. }
  1547. }
  1548. DEBUG_INFO("Start request User Id : %s\r\n", ShmSysConfigAndInfo->SysConfig.UserId);
  1549. }
  1550. else if(ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStartTransactionReq)
  1551. {
  1552. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod = START_METHOD_BACKEND;
  1553. memcpy(ShmSysConfigAndInfo->SysConfig.UserId, ShmOCPP16Data->RemoteStartTransaction[gun_index].IdTag, ARRAY_SIZE(ShmOCPP16Data->RemoteStartTransaction[gun_index].IdTag));
  1554. DEBUG_INFO("Start Method : BACKEND...\r\n");
  1555. }
  1556. else if(ShmCharger->gun_info[gun_index].bleConfigData.isRequestStart == ON)
  1557. {
  1558. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod = START_METHOD_BLE;
  1559. memcpy(ShmSysConfigAndInfo->SysConfig.UserId, ShmCharger->gun_info[gun_index].bleLoginCentralId.id, ARRAY_SIZE(ShmCharger->gun_info[gun_index].bleLoginCentralId.id));
  1560. DEBUG_INFO("Start Method : BLE...\r\n");
  1561. }
  1562. else
  1563. {
  1564. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod = START_METHOD_FREE;
  1565. DEBUG_INFO("Start Method : FREE..\r\n");
  1566. }
  1567. ShmCharger->gun_info[gun_index].rfidReq = OFF;
  1568. ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStartTransactionReq = OFF;
  1569. ShmCharger->gun_info[gun_index].bleConfigData.isRequestStart = OFF;
  1570. setChargerMode(gun_index, SYS_MODE_AUTHORIZING);
  1571. }
  1572. else
  1573. {}
  1574. break;
  1575. case SYS_MODE_AUTHORIZING:
  1576. if(isModeChange(gun_index))
  1577. {
  1578. setLedMotion(gun_index,LED_ACTION_AUTHED);
  1579. ftime(&startTime[gun_index][TMR_IDX_AUTH]);
  1580. if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod == START_METHOD_RFID)
  1581. {
  1582. switch(ShmSysConfigAndInfo->SysConfig.AuthorisationMode)
  1583. {
  1584. case AUTH_MODE_BACKEND_OCPP:
  1585. if(ShmOCPP16Data->OcppConnStatus)
  1586. {
  1587. // On line
  1588. ShmOCPP16Data->SpMsg.bits.AuthorizeReq = ON;
  1589. }
  1590. else
  1591. {
  1592. // Off line
  1593. switch(ShmSysConfigAndInfo->SysConfig.OfflinePolicy)
  1594. {
  1595. case OFF_POLICY_LOCALLIST:
  1596. ShmOCPP16Data->SpMsg.bits.AuthorizeReq = ON;
  1597. break;
  1598. case OFF_POLICY_PH_RFID:
  1599. break;
  1600. case OFF_POLICY_FREE:
  1601. break;
  1602. case OFF_POLICY_NOCHARGE:
  1603. default:
  1604. break;
  1605. }
  1606. }
  1607. break;
  1608. case AUTH_MODE_FREE:
  1609. default:
  1610. break;
  1611. }
  1612. }
  1613. }
  1614. if(DiffTimebWithNow(startTime[gun_index][TMR_IDX_AUTH]) > TIMEOUT_SPEC_AUTH)
  1615. {
  1616. // Authorization timeout process.
  1617. ShmCharger->gun_info[gun_index].rfidReq = OFF;
  1618. setChargerMode(gun_index, SYS_MODE_IDLE);
  1619. DEBUG_WARN("Authorize timeout!\r\n");
  1620. }
  1621. else
  1622. {
  1623. switch(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod)
  1624. {
  1625. case START_METHOD_RFID:
  1626. if(ShmOCPP16Data->SpMsg.bits.AuthorizeConf ||
  1627. (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_FREE) ||
  1628. !ShmOCPP16Data->OcppConnStatus ||
  1629. ((isValidLocalWhiteCard() == PASS) && (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_LOCALLIST)))
  1630. {
  1631. if((strcmp((char*)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, "Accepted")==0) ||
  1632. (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_FREE) ||
  1633. (!ShmOCPP16Data->OcppConnStatus&&(ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_FREE)) ||
  1634. ((isValidLocalWhiteCard() == PASS) && (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_LOCALLIST)))
  1635. {
  1636. DEBUG_INFO("Authorize pass.\r\n");
  1637. setSpeaker(ON,SPEAKER_SHORT);
  1638. setChargerMode(gun_index, SYS_MODE_PREPARING);
  1639. }
  1640. else
  1641. {
  1642. DEBUG_INFO("Authorize fail.\r\n");
  1643. setSpeaker(ON,SPEAKER_INTERVAL_3COUNT);
  1644. setChargerMode(gun_index, SYS_MODE_IDLE);
  1645. }
  1646. ShmCharger->gun_info[gun_index].rfidReq = OFF;
  1647. ShmOCPP16Data->SpMsg.bits.AuthorizeConf = OFF;
  1648. }
  1649. break;
  1650. case START_METHOD_BACKEND:
  1651. case START_METHOD_BLE:
  1652. case START_METHOD_FREE:
  1653. default:
  1654. setSpeaker(ON,SPEAKER_SHORT);
  1655. setChargerMode(gun_index, SYS_MODE_PREPARING);
  1656. break;
  1657. }
  1658. }
  1659. break;
  1660. case SYS_MODE_PREPARING:
  1661. if(isModeChange(gun_index))
  1662. {
  1663. ftime(&startTime[gun_index][TMR_IDX_HANDSHAKING]);
  1664. setRelay(gun_index, ON);
  1665. }
  1666. // If control pilot detect Bx, skip watch dog time out.
  1667. if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_B)
  1668. {
  1669. ftime(&startTime[gun_index][TMR_IDX_HANDSHAKING]);
  1670. }
  1671. if(DiffTimebWithNow(startTime[gun_index][TMR_IDX_HANDSHAKING]) > TIMEOUT_SPEC_HANDSHAKING)
  1672. {
  1673. setLedMotion(gun_index, LED_ACTION_HANDSHAKE_FAIL);
  1674. if(DiffTimebWithNow(startTime[gun_index][TMR_IDX_HANDSHAKING]) > TIMEOUT_SPEC_HANDSHAKING_LED)
  1675. {
  1676. DEBUG_INFO("HANDSHAKINNG TIMEOUT...");
  1677. setChargerMode(gun_index, SYS_MODE_IDLE);
  1678. }
  1679. }
  1680. else if((ShmCharger->gun_info[gun_index].primaryMcuState.relay_state == ON))
  1681. {
  1682. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].OutputEnergy = 0;
  1683. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedEnergy = 0;
  1684. getDateTimeString((char*)ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartDateTime);
  1685. ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmCharger->gun_info[gun_index].powerConsumption.power_consumption;
  1686. memcpy((char*)ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartUserId, ShmSysConfigAndInfo->SysConfig.UserId, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.UserId));
  1687. memcpy((char*)ShmOCPP16Data->StartTransaction[gun_index].IdTag, (char*)ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartUserId, ARRAY_SIZE(ShmOCPP16Data->StartTransaction[gun_index].IdTag));
  1688. ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq = ON;
  1689. setChargerMode(gun_index, SYS_MODE_CHARGING);
  1690. }
  1691. else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_B))
  1692. {
  1693. setLedMotion(gun_index,LED_ACTION_CONNECTED);
  1694. }
  1695. break;
  1696. case SYS_MODE_CHARGING:
  1697. if(isModeChange(gun_index))
  1698. {
  1699. ShmCharger->gun_info[gun_index].rfidReq = OFF;
  1700. ftime(&startChargingTime[gun_index]);
  1701. }
  1702. if((ShmCharger->gun_info[gun_index].rfidReq == ON) ||
  1703. (ShmCharger->gun_info[gun_index].bleConfigData.isRequestStop == ON) ||
  1704. (ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStopTransactionReq == ON)||
  1705. (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState != CP_STATE_C) ||
  1706. ShmOCPP16Data->MsMsg.bits.ResetReq)
  1707. {
  1708. setChargerMode(gun_index, SYS_MODE_TERMINATING);
  1709. }
  1710. else
  1711. {
  1712. setLedMotion(gun_index,LED_ACTION_CHARGING);
  1713. ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ((float)ShmCharger->gun_info[gun_index].powerConsumption.power_consumption/100.0) - ShmOCPP16Data->StartTransaction[gun_index].MeterStart;
  1714. ftime(&endChargingTime[gun_index]);
  1715. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedDuration = DiffTimeb(startChargingTime[gun_index], endChargingTime[gun_index])/1000;
  1716. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedEnergy = (ShmCharger->gun_info[gun_index].powerConsumption.power_consumption - ShmOCPP16Data->StartTransaction[gun_index].MeterStart)/100.0;
  1717. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].OutputEnergy = (ShmCharger->gun_info[gun_index].powerConsumption.power_consumption - ShmOCPP16Data->StartTransaction[gun_index].MeterStart)/100.0;
  1718. /*
  1719. * TODO:
  1720. * 1. Query target current from charging profile
  1721. */
  1722. // Checking charging profile target current
  1723. // Determine max charging current to MCU
  1724. if(ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent == 0)
  1725. {
  1726. ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = ((ShmCharger->gun_info[gun_index].targetCurrent>ShmCharger->gun_info[gun_index].primaryMcuState.rating_current)?ShmCharger->gun_info[gun_index].primaryMcuState.rating_current:ShmCharger->gun_info[gun_index].targetCurrent);
  1727. }
  1728. else
  1729. {
  1730. ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = ((ShmCharger->gun_info[gun_index].targetCurrent>ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent)?ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent:ShmCharger->gun_info[gun_index].targetCurrent);
  1731. }
  1732. DEBUG_INFO("ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent: %d \r\n", ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent);
  1733. DEBUG_INFO("ShmCharger->gun_info[%d].primaryMcuCp_Pwn_Duty.max_current: %d\r\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current);
  1734. DEBUG_INFO("ShmCharger->gun_info[%d].targetCurrent: %d\r\n", gun_index, ShmCharger->gun_info[gun_index].targetCurrent);
  1735. if((ShmSysConfigAndInfo->SysConfig.MaxChargingDuration > 0) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedDuration >= (ShmSysConfigAndInfo->SysConfig.MaxChargingDuration*60)) )
  1736. {
  1737. setChargerMode(gun_index, SYS_MODE_TERMINATING);
  1738. DEBUG_INFO("Connector-%d charging duration(%d) already over max duration(%d) in second.\r\n", gun_index, ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedDuration, (ShmSysConfigAndInfo->SysConfig.MaxChargingDuration*60));
  1739. }
  1740. else if((ShmSysConfigAndInfo->SysConfig.MaxChargingEnergy > 0) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedEnergy >= (ShmSysConfigAndInfo->SysConfig.MaxChargingEnergy/10.0)))
  1741. {
  1742. setChargerMode(gun_index, SYS_MODE_TERMINATING);
  1743. DEBUG_INFO("Connector-%d charging energy(%.2f) already over max energy(%.2f) in KWH.\r\n", gun_index, ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedEnergy, (ShmSysConfigAndInfo->SysConfig.MaxChargingEnergy/10.0));
  1744. }
  1745. else
  1746. {
  1747. setRelay(gun_index, ON);
  1748. }
  1749. }
  1750. break;
  1751. case SYS_MODE_TERMINATING:
  1752. if(isModeChange(gun_index))
  1753. {
  1754. if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedDuration != 0)
  1755. {
  1756. ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedDuration = DiffTimeb(startChargingTime[gun_index], endChargingTime[gun_index])/1000;
  1757. }
  1758. setLedMotion(gun_index, LED_ACTION_STOP);
  1759. setRelay(gun_index, OFF);
  1760. getDateTimeString((char*)ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StopDateTime);
  1761. }
  1762. // If RFID SN different with start user, it need to authorize ID
  1763. if((ShmCharger->gun_info[gun_index].rfidReq == ON) && !isMatchStartUser(gun_index))
  1764. {
  1765. if((DiffTimebWithNow(startTime[gun_index][TMR_IDX_AUTH]) > TIMEOUT_SPEC_AUTH) && !ShmOCPP16Data->SpMsg.bits.AuthorizeReq)
  1766. {
  1767. // Request authorization
  1768. ftime(&startTime[gun_index][TMR_IDX_AUTH]);
  1769. memset(ShmSysConfigAndInfo->SysConfig.UserId, 0x00, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.UserId));
  1770. if(ShmSysConfigAndInfo->SysConfig.RfidCardNumEndian)
  1771. {
  1772. // Big endian
  1773. switch(rfid.snType)
  1774. {
  1775. case RFID_SN_TYPE_6BYTE:
  1776. sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3], rfid.currentCard[4], rfid.currentCard[5]);
  1777. break;
  1778. case RFID_SN_TYPE_7BYTE:
  1779. sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3], rfid.currentCard[4], rfid.currentCard[5], rfid.currentCard[6]);
  1780. break;
  1781. case RFID_SN_TYPE_10BYTE:
  1782. sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3], rfid.currentCard[4], rfid.currentCard[5], rfid.currentCard[6], rfid.currentCard[7], rfid.currentCard[8], rfid.currentCard[9]);
  1783. break;
  1784. case RFID_SN_TYPE_4BYTE:
  1785. default:
  1786. sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3]);
  1787. break;
  1788. }
  1789. }
  1790. else
  1791. {
  1792. // Little endian
  1793. switch(rfid.snType)
  1794. {
  1795. case RFID_SN_TYPE_6BYTE:
  1796. sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X", rfid.currentCard[5], rfid.currentCard[4], rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
  1797. break;
  1798. case RFID_SN_TYPE_7BYTE:
  1799. sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[6], rfid.currentCard[5], rfid.currentCard[4], rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
  1800. break;
  1801. case RFID_SN_TYPE_10BYTE:
  1802. sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", rfid.currentCard[9], rfid.currentCard[8], rfid.currentCard[7], rfid.currentCard[6], rfid.currentCard[5], rfid.currentCard[4], rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
  1803. break;
  1804. case RFID_SN_TYPE_4BYTE:
  1805. default:
  1806. sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X", rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]);
  1807. break;
  1808. }
  1809. }
  1810. DEBUG_INFO("End request User Id : %s\r\n", ShmSysConfigAndInfo->SysConfig.UserId);
  1811. if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod == START_METHOD_RFID)
  1812. {
  1813. switch(ShmSysConfigAndInfo->SysConfig.AuthorisationMode)
  1814. {
  1815. case AUTH_MODE_BACKEND_OCPP:
  1816. if(ShmOCPP16Data->OcppConnStatus)
  1817. {
  1818. // On line
  1819. ShmOCPP16Data->SpMsg.bits.AuthorizeReq = ON;
  1820. }
  1821. else
  1822. {
  1823. // Off line
  1824. switch(ShmSysConfigAndInfo->SysConfig.OfflinePolicy)
  1825. {
  1826. case OFF_POLICY_LOCALLIST:
  1827. ShmOCPP16Data->SpMsg.bits.AuthorizeReq = ON;
  1828. break;
  1829. case OFF_POLICY_PH_RFID:
  1830. break;
  1831. case OFF_POLICY_FREE:
  1832. break;
  1833. case OFF_POLICY_NOCHARGE:
  1834. default:
  1835. break;
  1836. }
  1837. }
  1838. break;
  1839. case AUTH_MODE_FREE:
  1840. default:
  1841. break;
  1842. }
  1843. }
  1844. }
  1845. else
  1846. {
  1847. if(ShmOCPP16Data->SpMsg.bits.AuthorizeConf ||
  1848. (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_FREE) ||
  1849. !ShmOCPP16Data->OcppConnStatus)
  1850. {
  1851. if((strcmp((char*)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, "Accepted")==0) ||
  1852. (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_FREE) ||
  1853. (!ShmOCPP16Data->OcppConnStatus&&(ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_FREE)))
  1854. {
  1855. ShmCharger->gun_info[gun_index].isAuthPassEnd = ON;
  1856. }
  1857. else
  1858. {
  1859. ShmCharger->gun_info[gun_index].rfidReq = OFF;
  1860. }
  1861. ShmOCPP16Data->SpMsg.bits.AuthorizeConf = OFF;
  1862. }
  1863. }
  1864. }
  1865. // End authorize pass
  1866. if(((ShmCharger->gun_info[gun_index].rfidReq == ON) && isMatchStartUser(gun_index)) ||
  1867. (ShmCharger->gun_info[gun_index].isAuthPassEnd) ||
  1868. (ShmCharger->gun_info[gun_index].bleConfigData.isRequestStop == ON) ||
  1869. (ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStopTransactionReq == ON) ||
  1870. (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_A) ||
  1871. ShmOCPP16Data->MsMsg.bits.ResetReq)
  1872. {
  1873. setSpeaker(ON,SPEAKER_SHORT);
  1874. sleep(5);
  1875. if(!ShmCharger->gun_info[gun_index].primaryMcuState.relay_state)
  1876. {
  1877. if(ShmOCPP16Data->MsMsg.bits.ResetReq)
  1878. {
  1879. if(strcmp((char*)ShmOCPP16Data->Reset.Type, "Hard")==0)
  1880. sprintf((char*)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "HardReset");
  1881. else
  1882. sprintf((char*)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "SoftReset");
  1883. }
  1884. else if(ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStopTransactionReq)
  1885. {
  1886. sprintf((char*)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "Remote");
  1887. }
  1888. else if(ShmCharger->gun_info[gun_index].rfidReq || ShmCharger->gun_info[gun_index].bleConfigData.isRequestStop)
  1889. {
  1890. sprintf((char*)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "Local");
  1891. }
  1892. else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_A)
  1893. {
  1894. sprintf((char*)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "EVDisconnected");
  1895. }
  1896. else
  1897. {
  1898. sprintf((char*)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "Other");
  1899. }
  1900. memcpy((char*)ShmOCPP16Data->StopTransaction[gun_index].IdTag, (char*)ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartUserId, ARRAY_SIZE(ShmOCPP16Data->StopTransaction[gun_index].IdTag));
  1901. ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmCharger->gun_info[gun_index].powerConsumption.power_consumption;
  1902. ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq = ON;
  1903. ShmCharger->gun_info[gun_index].rfidReq = OFF;
  1904. ShmCharger->gun_info[gun_index].isAuthPassEnd = OFF;
  1905. ShmCharger->gun_info[gun_index].bleConfigData.isRequestStop = OFF;
  1906. ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStopTransactionReq = OFF;
  1907. DB_Insert_Record(localDb, gun_index);
  1908. setChargerMode(gun_index, SYS_MODE_IDLE);
  1909. }
  1910. }
  1911. else
  1912. {
  1913. if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_C) &&
  1914. (ShmCharger->gun_info[gun_index].bleConfigData.isRequestStop != ON) &&
  1915. (ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStopTransactionReq != ON) &&
  1916. !ShmOCPP16Data->MsMsg.bits.ResetReq &&
  1917. !((ShmSysConfigAndInfo->SysConfig.MaxChargingDuration > 0) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedDuration >= (ShmSysConfigAndInfo->SysConfig.MaxChargingDuration*60))) &&
  1918. !((ShmSysConfigAndInfo->SysConfig.MaxChargingEnergy > 0) && (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedEnergy >= (ShmSysConfigAndInfo->SysConfig.MaxChargingEnergy/10.0))))
  1919. {
  1920. setChargerMode(gun_index, SYS_MODE_CHARGING);
  1921. }
  1922. }
  1923. break;
  1924. case SYS_MODE_ALARM:
  1925. if((ShmCharger->gun_info[gun_index].systemAlarmCode.SystemAlarmCode == 0))
  1926. {
  1927. if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PreviousSystemStatus == SYS_MODE_CHARGING) ||
  1928. (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PreviousSystemStatus == SYS_MODE_TERMINATING))
  1929. {
  1930. setChargerMode(gun_index, ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PreviousSystemStatus);
  1931. }
  1932. else
  1933. {
  1934. setChargerMode(gun_index, SYS_MODE_IDLE);
  1935. }
  1936. }
  1937. setLedMotion(gun_index,LED_ACTION_ALARM);
  1938. break;
  1939. case SYS_MODE_FAULT:
  1940. if(isModeChange(gun_index))
  1941. {
  1942. /*
  1943. * TODO:
  1944. * 1. LED control depend on relay status
  1945. * 2. Alarm latch & release logic
  1946. */
  1947. }
  1948. break;
  1949. case SYS_MODE_MAINTAIN:
  1950. if(isModeChange(gun_index))
  1951. {
  1952. /*
  1953. * TODO:
  1954. * 1. LED control depend on relay status
  1955. * 2. Wait maintenance release command
  1956. */
  1957. setLedMotion(gun_index,LED_ACTION_MAINTAIN);
  1958. }
  1959. break;
  1960. case SYS_MODE_UPDATE:
  1961. if(isModeChange(gun_index))
  1962. {
  1963. }
  1964. //======================================
  1965. // Check local upgrade firmware request
  1966. //======================================
  1967. if(ShmSysConfigAndInfo->SysInfo.FirmwareUpdate)
  1968. {
  1969. DEBUG_INFO("Firmware local upgrading...\r\n");
  1970. ShmSysConfigAndInfo->SysInfo.FirmwareUpdate = OFF;
  1971. if(upgrade_check())
  1972. {
  1973. ShmCharger->isUpdateSuccess = PASS;
  1974. }
  1975. else
  1976. {
  1977. ShmCharger->isUpdateSuccess = FAIL;
  1978. }
  1979. }
  1980. else if(ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq)
  1981. {
  1982. //======================================
  1983. // Check remote upgrade firmware request
  1984. //======================================
  1985. if(strcmp((char*)ShmOCPP16Data->FirmwareStatusNotification.Status, "DownloadFailed")==0)
  1986. {
  1987. DEBUG_INFO("Firmware remote upgraded fail...\r\n");
  1988. ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = OFF;
  1989. ShmCharger->isUpdateSuccess = FAIL;
  1990. }
  1991. else if(strcmp((char*)ShmOCPP16Data->FirmwareStatusNotification.Status, "Downloaded")==0)
  1992. {
  1993. DEBUG_INFO("Firmware remote upgrading...\r\n");
  1994. sprintf((char*)ShmOCPP16Data->FirmwareStatusNotification.Status, "Installing");
  1995. ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = ON;
  1996. ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = OFF;
  1997. if(upgrade_check())
  1998. {
  1999. ShmCharger->isUpdateSuccess = PASS;
  2000. }
  2001. else
  2002. {
  2003. ShmCharger->isUpdateSuccess = FAIL;
  2004. }
  2005. }
  2006. else
  2007. {}
  2008. }
  2009. else
  2010. {
  2011. //======================================
  2012. // Upgrade complete reboot system
  2013. //======================================
  2014. if(!ShmCharger->gun_info[gun_index].mcuFlag.isMcuUpgradeReq && ((AC_QUANTITY>1)?!ShmCharger->gun_info[gun_index^1].mcuFlag.isMcuUpgradeReq:YES))
  2015. {
  2016. if(ShmCharger->isUpdateSuccess == PASS)
  2017. {
  2018. sprintf((char*)ShmOCPP16Data->FirmwareStatusNotification.Status, "Installed");
  2019. ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = ON;
  2020. DEBUG_WARN("Firmware upgrade success.\r\n");
  2021. sleep(5);
  2022. DEBUG_INFO("Firmware upgraded, reboot...\r\n");
  2023. system("reboot -f");
  2024. sleep(5);
  2025. system("reboot -f");
  2026. }
  2027. else
  2028. {
  2029. sprintf((char*)ShmOCPP16Data->FirmwareStatusNotification.Status, "InstallationFailed");
  2030. ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = ON;
  2031. DEBUG_WARN("Firmware upgrade fail.\r\n");
  2032. system("/usr/bin/run_evse_restart.sh");
  2033. }
  2034. }
  2035. }
  2036. break;
  2037. case SYS_MODE_RESERVATION:
  2038. if(isModeChange(gun_index))
  2039. {
  2040. setLedMotion(gun_index,LED_ACTION_MAINTAIN);
  2041. }
  2042. if(isReservationExpired(gun_index))
  2043. {
  2044. DEBUG_INFO("Reservation: Time's up...\r\n");
  2045. setChargerMode(gun_index, SYS_MODE_IDLE);
  2046. }
  2047. else if(ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationReq)
  2048. {
  2049. DEBUG_INFO("Reservation: Cancel reservation...\r\n");
  2050. setChargerMode(gun_index, SYS_MODE_IDLE);
  2051. ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationReq = OFF;
  2052. ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationConf = ON;
  2053. }
  2054. break;
  2055. case SYS_MODE_BOOKING:
  2056. if(isModeChange(gun_index))
  2057. {
  2058. /*
  2059. * TODO:
  2060. * 1. LED control depend on relay status
  2061. * 2. Check booking start is on time?
  2062. */
  2063. }
  2064. break;
  2065. case SYS_MODE_DEBUG:
  2066. if(isModeChange(gun_index))
  2067. {
  2068. setLedMotion(gun_index,LED_ACTION_DEBUG);
  2069. }
  2070. break;
  2071. }
  2072. }
  2073. // System watch dog reset
  2074. write(wtdFd, "a", 1);
  2075. usleep(50000);
  2076. }
  2077. return FAIL;
  2078. }