Module_Authorize.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  1. /*
  2. * Module_Authorize.c
  3. *
  4. * Created on: 2021年11月16日
  5. * Author: 7978
  6. */
  7. #include <sys/time.h>
  8. #include <sys/timeb.h>
  9. #include <sys/types.h>
  10. #include <sys/stat.h>
  11. #include <sys/types.h>
  12. #include <sys/ioctl.h>
  13. #include <sys/socket.h>
  14. #include <sys/ipc.h>
  15. #include <sys/shm.h>
  16. #include <sys/shm.h>
  17. #include <sys/mman.h>
  18. #include <linux/can.h>
  19. #include <linux/can/raw.h>
  20. #include <linux/wireless.h>
  21. #include <arpa/inet.h>
  22. #include <netinet/in.h>
  23. #include <unistd.h>
  24. #include <stdarg.h>
  25. #include <stdio.h> /*標準輸入輸出定義*/
  26. #include <stdlib.h> /*標準函數庫定義*/
  27. #include <unistd.h> /*Unix 標準函數定義*/
  28. #include <fcntl.h> /*檔控制定義*/
  29. #include <termios.h> /*PPSIX 終端控制定義*/
  30. #include <errno.h> /*錯誤號定義*/
  31. #include <errno.h>
  32. #include <string.h>
  33. #include <time.h>
  34. #include <ctype.h>
  35. #include <ifaddrs.h>
  36. #include <signal.h>
  37. #include <net/if_arp.h>
  38. #include "../../define.h"
  39. #include "Module_Authorize.h"
  40. #include "Module_EvComm.h"
  41. #include "Config.h"
  42. #include "Common.h"
  43. #define AUTHORIZE_INTERVAL 100000 // unit: 1us
  44. #define AUTHORIZE_WAIT_OCPP_TIMEOUT 30 // unit: 1s
  45. #define SYS_AUTHORIZE_COMP_TIMEOUT 1 // unit: 1s
  46. #define AUTH_TIME_OFFSET_TIME 3 // unit: 1s
  47. #define AUTO_START_CHARGING "AutoStartCharging"
  48. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  49. ChargerInfoData *ShmChargerInfo;
  50. struct ChargingInfoData *chargingInfo[GENERAL_GUN_QUANTITY];
  51. struct OCPP16Data *ShmOCPP16Data;
  52. struct OCPP20Data *ShmOCPP20Data;
  53. struct timespec _SysAuth_Time;
  54. struct timespec _GunAuth_Time[GENERAL_GUN_QUANTITY];
  55. struct timespec _DispenserAuth_Time[GENERAL_GUN_QUANTITY];
  56. unsigned char _preSysAuthStatus = 0;
  57. unsigned char _preGunAuthStatus[GENERAL_GUN_QUANTITY];
  58. unsigned char _preDispenserAuthStatus[GENERAL_GUN_QUANTITY];
  59. //==========================================
  60. // Init all share memory
  61. //==========================================
  62. int InitShareMemory(void)
  63. {
  64. int result = PASS;
  65. int MeterSMId;
  66. //creat ShmSysConfigAndInfo
  67. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  68. {
  69. #ifdef SystemLogMessage
  70. LOG_ERROR("shmget ShmSysConfigAndInfo NG");
  71. #endif
  72. result = FAIL;
  73. }
  74. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  75. {
  76. #ifdef SystemLogMessage
  77. LOG_ERROR("shmat ShmSysConfigAndInfo NG");
  78. #endif
  79. result = FAIL;
  80. }
  81. else
  82. {
  83. }
  84. if ((MeterSMId = shmget(SM_ChargerInfoKey, sizeof(ChargerInfoData), 0777)) < 0)
  85. {
  86. #ifdef SystemLogMessage
  87. LOG_ERROR("shmat ChargerInfoData NG");
  88. #endif
  89. result = FAIL;
  90. }
  91. else if ((ShmChargerInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  92. {
  93. #ifdef SystemLogMessage
  94. LOG_ERROR("shmat ChargerInfoData NG");
  95. #endif
  96. result = FAIL;
  97. }
  98. if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data), 0777)) < 0)
  99. {
  100. #ifdef SystemLogMessage
  101. LOG_ERROR("shmat ShmOCPP16Data NG");
  102. #endif
  103. result = FAIL;
  104. }
  105. else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  106. {
  107. LOG_ERROR("shmat ShmOCPP16Data NG");
  108. result = FAIL;
  109. }
  110. if ((MeterSMId = shmget(ShmOcpp20ModuleKey, sizeof(struct OCPP20Data), 0777)) < 0)
  111. {
  112. LOG_ERROR("[main]CreatShareMemory:shmget OCPP20Data NG\n");
  113. result = FAIL;
  114. }
  115. else if ((ShmOCPP20Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  116. {
  117. LOG_ERROR("[main]CreatShareMemory:shmat OCPP20Data NG\n");
  118. result = FAIL;
  119. }
  120. return result;
  121. }
  122. void InitialConnector(void)
  123. {
  124. for(int i = 0; i < CONNECTOR_QUANTITY; i++)
  125. {
  126. chargingInfo[i] = &ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].GeneralChargingData;
  127. }
  128. }
  129. void Set_Connector_MiscCommand(int connector, int misc_cmd)
  130. {
  131. ShmChargerInfo->ConnectorMiscReq[connector].CtrlValue |= misc_cmd;
  132. }
  133. //===============================================
  134. // Ocpp Remote Start
  135. //===============================================
  136. bool Is_Ocpp_RemoteStartReq(int gun_index)
  137. {
  138. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
  139. {
  140. return ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStartTransactionReq == YES ? true : false;
  141. }
  142. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20)
  143. {
  144. return ShmOCPP20Data->CsMsg.bits[gun_index].RequestStartTransactionReq == YES ? true : false;
  145. }
  146. return false;
  147. }
  148. void Clean_Ocpp_RemoteStartReq(int gun_index)
  149. {
  150. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
  151. {
  152. ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStartTransactionReq = false;
  153. return;
  154. }
  155. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20)
  156. {
  157. ShmOCPP20Data->CsMsg.bits[gun_index].RequestStartTransactionReq = false;
  158. return;
  159. }
  160. }
  161. void Get_Ocpp_RemoteStartIdTag(int gun_index, char *idTag)
  162. {
  163. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
  164. {
  165. strcpy(idTag, (char *)&ShmOCPP16Data->RemoteStartTransaction[gun_index].IdTag[0]);
  166. return;
  167. }
  168. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20)
  169. {
  170. strcpy(idTag, (char *)&ShmOCPP20Data->RequestStartTransaction[gun_index].idToken.idToken[0]);
  171. return;
  172. }
  173. strcpy(idTag, "");
  174. }
  175. //===============================================
  176. // Ocpp AuthorizeRemoteTxRequests
  177. //===============================================
  178. bool Is_Ocpp_AuthorizeRemoteTxRequests(void)
  179. {
  180. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
  181. {
  182. return strstr((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "TRUE") > 0 ? true : false;
  183. }
  184. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20)
  185. {
  186. return strstr((char *)ShmOCPP20Data->ControllerComponentVariable[AuthCtrlr_AuthorizeRemoteStart].variableAttribute[0].value, "TRUE") > 0 ? true : false;
  187. }
  188. return false;
  189. }
  190. //===============================================
  191. // Ocpp AuthorizeReq
  192. //===============================================
  193. void Set_Ocpp_AuthorizeReq(void)
  194. {
  195. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
  196. {
  197. ShmOCPP16Data->SpMsg.bits.AuthorizeConf = false;
  198. ShmOCPP16Data->SpMsg.bits.AuthorizeReq = true;
  199. return;
  200. }
  201. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20)
  202. {
  203. ShmOCPP20Data->SpMsg.bits.AuthorizeConf = false;
  204. ShmOCPP20Data->SpMsg.bits.AuthorizeReq = true;
  205. return;
  206. }
  207. }
  208. bool Is_Ocpp_AuthorizeConf(void)
  209. {
  210. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
  211. {
  212. return ShmOCPP16Data->SpMsg.bits.AuthorizeConf == YES ? true : false;
  213. }
  214. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20)
  215. {
  216. return ShmOCPP20Data->SpMsg.bits.AuthorizeConf == YES ? true : false;
  217. }
  218. return false;
  219. }
  220. bool Is_Ocpp_Authorize_Status(char *status)
  221. {
  222. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
  223. {
  224. return strcmp((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, status) == EQUAL ? true : false;
  225. }
  226. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20)
  227. {
  228. return strcmp((char *)ShmOCPP20Data->Authorize.Response_idTokenInfo.status, status) == EQUAL ? true : false;
  229. }
  230. return false;
  231. }
  232. //===============================================
  233. // Ocpp Reserve Now
  234. //===============================================
  235. void Get_Ocpp_ReserveNowIdTag(int gun_index, char *idTag)
  236. {
  237. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
  238. {
  239. strcpy(idTag, (char *)ShmOCPP16Data->ReserveNow[gun_index].IdTag);
  240. return;
  241. }
  242. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20)
  243. {
  244. strcpy(idTag, (char *)ShmOCPP20Data->ReserveNow[gun_index].idToken.idToken);
  245. return;
  246. }
  247. strcpy(idTag, "");
  248. return;
  249. }
  250. bool Is_Ocpp_ReserveNowIdTag(uint8_t gun_index, char *authIdTag)
  251. {
  252. char ReserveIdTag[32];
  253. Get_Ocpp_ReserveNowIdTag(gun_index, ReserveIdTag);
  254. return strcmp(ReserveIdTag, authIdTag) == EQUAL ? true : false;
  255. }
  256. void SetAuthorize(AuthorizingInfoData *AuthInfo, unsigned char type)
  257. {
  258. memcpy(ShmSysConfigAndInfo->SysConfig.UserId, AuthInfo->AuthId, 32);
  259. AuthInfo->AuthStatus = _AuthorizeStatus_Busy;
  260. AuthInfo->AuthType = type;
  261. ShmSysConfigAndInfo->SysInfo.AuthorizedTarget = AuthInfo->AuthTarget;
  262. ShmSysConfigAndInfo->SysInfo.AuthorizedType = type;
  263. }
  264. bool IsRemoteStartRequest(int *connector)
  265. {
  266. AuthorizingInfoData *AuthInfo;
  267. // remote start check
  268. for(int index = 0; index < GENERAL_GUN_QUANTITY; index++)
  269. {
  270. if(Is_Ocpp_RemoteStartReq(index))
  271. {
  272. AuthInfo = &ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].AuthInfo;
  273. AuthInfo->AuthTarget = index + 1;
  274. Get_Ocpp_RemoteStartIdTag(index, (char *)AuthInfo->AuthId);
  275. SetAuthorize(AuthInfo, _AuthType_RemoteStart);
  276. Clean_Ocpp_RemoteStartReq(index);
  277. AuthInfo->AuthRequest = NO;
  278. *connector = index;
  279. return true;
  280. }
  281. }
  282. return false;
  283. }
  284. bool IsAuthorizingRequest(int *connector)
  285. {
  286. AuthorizingInfoData *AuthInfo;
  287. // connector authorize check
  288. for(int index = 0; index < GENERAL_GUN_QUANTITY; index++)
  289. {
  290. AuthInfo = &ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].AuthInfo;
  291. if(AuthInfo->AuthStatus == _AuthorizeStatus_Idle && AuthInfo->AuthRequest == YES)
  292. {
  293. if(strlen((char *)AuthInfo->AuthId) > 0)
  294. {
  295. SetAuthorize(AuthInfo, _AuthType_RFID);
  296. AuthInfo->AuthRequest = NO;
  297. *connector = index;
  298. return true;
  299. }
  300. }
  301. }
  302. return false;
  303. }
  304. bool IsDispenserAuthorizingRequest(int *dispenser)
  305. {
  306. AuthorizingInfoData *AuthInfo;
  307. // AUTO_GUN_SELECTION authorize check
  308. for(int index = 0; index < GENERAL_GUN_QUANTITY; index++)
  309. {
  310. AuthInfo = &ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[index].AuthInfo;
  311. if(AuthInfo->AuthStatus == _AuthorizeStatus_Idle && AuthInfo->AuthRequest == YES)
  312. {
  313. if(strlen((char *)AuthInfo->AuthId) > 0)
  314. {
  315. SetAuthorize(AuthInfo, _AuthType_RFID);
  316. AuthInfo->AuthRequest = NO;
  317. *dispenser = index;
  318. return true;
  319. }
  320. }
  321. }
  322. return false;
  323. }
  324. unsigned char Chk_OfflinePolicy(char *idTag)
  325. {
  326. if(ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_NO_CHARGING)
  327. {
  328. AUTH_INFO("*********** Offline Policy [No Charging] ***********");
  329. return _AuthResult_Invalid;
  330. }
  331. else if(ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING)
  332. {
  333. // set authorize pass when offline policy is free charge
  334. AUTH_INFO("*********** Offline Policy [Free Charging] ***********");
  335. return _AuthResult_Valid;
  336. }
  337. else if(ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST)
  338. {
  339. BOOL find = false;
  340. // check white list
  341. for(int i = 0; i < 10; i++)
  342. {
  343. if(strcmp((char *)ShmSysConfigAndInfo->SysConfig.LocalWhiteCard[i], "") != EQUAL)
  344. {
  345. if(strcmp((char *)ShmSysConfigAndInfo->SysConfig.LocalWhiteCard[i], idTag) == EQUAL)
  346. {
  347. find = true;
  348. AUTH_INFO("*********** [White Card OK] ***********");
  349. break;
  350. }
  351. }
  352. }
  353. if(find == false)
  354. {
  355. if((ShmChargerInfo->AuthInfo.AuthMode.bits.AutoStartEnable || ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_DISABLE) &&
  356. strcmp((char *)ShmSysConfigAndInfo->SysConfig.UserId, AUTO_START_CHARGING) == EQUAL)
  357. {
  358. find = true;
  359. AUTH_INFO("******** [Auto Start Charging] ********");
  360. }
  361. }
  362. AUTH_INFO("*********** Local Authorization %s ***********", find ? "OK" : "NG");
  363. if(find)
  364. {
  365. return _AuthResult_Valid;
  366. }
  367. else
  368. {
  369. return _AuthResult_Invalid;
  370. }
  371. }
  372. else
  373. {
  374. AUTH_INFO("*********** [Invalid Policy] ***********");
  375. return _AuthResult_Invalid;
  376. }
  377. return _AuthResult_Invalid;
  378. }
  379. void SysAuthInitial(void)
  380. {
  381. memset(ShmSysConfigAndInfo->SysConfig.UserId, 0x00, 32);
  382. ShmSysConfigAndInfo->SysInfo.AuthorizedDispenser = 0;
  383. ShmSysConfigAndInfo->SysInfo.AuthorizedTarget = 0;
  384. ShmSysConfigAndInfo->SysInfo.AuthorizedType = _AuthResult_None;
  385. ShmSysConfigAndInfo->SysInfo.AuthorizedStatus = _AuthorizeStatus_Idle;
  386. }
  387. void AuthTimeoutProcess(void)
  388. {
  389. int timeout = 0;
  390. for(int index = 0; index < GENERAL_GUN_QUANTITY; index++)
  391. {
  392. if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].AuthInfo.AuthStatus == _AuthorizeStatus_End)
  393. {
  394. if(_preGunAuthStatus[index] != ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].AuthInfo.AuthStatus)
  395. {
  396. GetClockTime(&_GunAuth_Time[index]);
  397. }
  398. timeout = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].AuthInfo.AuthStatus == _AuthResult_Valid ?
  399. ShmChargerInfo->CabinetMiscValue.ConnectionTimeout : AUTHORIZE_COMPLETED_TIME;
  400. timeout += AUTH_TIME_OFFSET_TIME;
  401. if(GetTimeoutValue(_GunAuth_Time[index]) / uSEC_VAL >= timeout)
  402. {
  403. AUTH_INFO("*********** Gun %d Authorizing Initial ***********", index + 1);
  404. memset(&ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].AuthInfo, 0x00, sizeof(AuthorizingInfoData));
  405. }
  406. }
  407. _preGunAuthStatus[index] = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].AuthInfo.AuthStatus;
  408. }
  409. for(int index = 0; index < GENERAL_GUN_QUANTITY; index++)
  410. {
  411. if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[index].AuthInfo.AuthStatus == _AuthorizeStatus_End)
  412. {
  413. if(_preDispenserAuthStatus[index] != ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[index].AuthInfo.AuthStatus)
  414. {
  415. GetClockTime(&_DispenserAuth_Time[index]);
  416. }
  417. timeout = ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[index].AuthInfo.AuthResult == _AuthResult_Valid ?
  418. ShmChargerInfo->CabinetMiscValue.ConnectionTimeout : AUTHORIZE_COMPLETED_TIME;
  419. timeout += AUTH_TIME_OFFSET_TIME;
  420. if(GetTimeoutValue(_DispenserAuth_Time[index]) / uSEC_VAL >= timeout)
  421. {
  422. AUTH_INFO("*********** Dispenser %d Authorizing Initial ***********", index + 1);
  423. memset(&ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[index].AuthInfo, 0x00, sizeof(AuthorizingInfoData));
  424. }
  425. }
  426. _preDispenserAuthStatus[index] = ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[index].AuthInfo.AuthStatus;
  427. }
  428. }
  429. int main(void)
  430. {
  431. int _dispenser = 0, _connector = 0;
  432. unsigned char _authResult = _AuthResult_None;
  433. bool _autoSelection = false;
  434. bool _needOcppAuthorize = false;
  435. bool _keepRun = false;
  436. if(InitShareMemory() == FAIL)
  437. {
  438. #ifdef SystemLogMessage
  439. LOG_ERROR("InitShareMemory NG");
  440. #endif
  441. sleep(5);
  442. return 0;
  443. }
  444. InitialConnector();
  445. while(1)
  446. {
  447. _keepRun = false;
  448. AuthTimeoutProcess();
  449. switch(ShmSysConfigAndInfo->SysInfo.AuthorizedStatus)
  450. {
  451. case _AuthorizeStatus_Idle:
  452. if(_preSysAuthStatus != ShmSysConfigAndInfo->SysInfo.AuthorizedStatus)
  453. {
  454. AUTH_INFO("[SysAuthStatus Idle]");
  455. _preSysAuthStatus = ShmSysConfigAndInfo->SysInfo.AuthorizedStatus;
  456. _authResult = _AuthResult_None;
  457. _autoSelection = false;
  458. }
  459. if(IsRemoteStartRequest(&_connector))
  460. {
  461. ShmSysConfigAndInfo->SysInfo.AuthorizedStatus = _AuthorizeStatus_Wait;
  462. _keepRun = true;
  463. AUTH_INFO("Gun %d Remote Start Authorize", _connector + 1);
  464. break;
  465. }
  466. if(IsAuthorizingRequest(&_connector))
  467. {
  468. ShmSysConfigAndInfo->SysInfo.AuthorizedStatus = _AuthorizeStatus_Wait;
  469. _keepRun = true;
  470. AUTH_INFO("Gun %d RFID Authorize", _connector + 1);
  471. break;
  472. }
  473. if(IsDispenserAuthorizingRequest(&_dispenser))
  474. {
  475. _autoSelection = true;
  476. ShmSysConfigAndInfo->SysInfo.AuthorizedStatus = _AuthorizeStatus_Wait;
  477. _keepRun = true;
  478. AUTH_INFO("Dispenser %d AutoSelection Authorize", _dispenser + 1);
  479. break;
  480. }
  481. break;
  482. case _AuthorizeStatus_Wait:
  483. if(_preSysAuthStatus != ShmSysConfigAndInfo->SysInfo.AuthorizedStatus)
  484. {
  485. AUTH_INFO("[SysAuthStatus Wait]");
  486. _preSysAuthStatus = ShmSysConfigAndInfo->SysInfo.AuthorizedStatus;
  487. }
  488. _needOcppAuthorize = false;
  489. if(ShmSysConfigAndInfo->SysInfo.AuthorizedType == _AuthType_RemoteStart)
  490. {
  491. if(Is_Ocpp_AuthorizeRemoteTxRequests())
  492. {
  493. _needOcppAuthorize = true;
  494. }
  495. else
  496. {
  497. AUTH_INFO("*********** Gun %d Remote Start Authorizing Bypass ***********",
  498. ShmSysConfigAndInfo->SysInfo.AuthorizedTarget);
  499. _authResult = _AuthResult_Valid;
  500. ShmSysConfigAndInfo->SysInfo.AuthorizedStatus = _AuthorizeStatus_Done;
  501. _keepRun = true;
  502. break;
  503. }
  504. }
  505. else if(ShmSysConfigAndInfo->SysInfo.AuthorizedType == _AuthType_RFID)
  506. {
  507. if(ShmSysConfigAndInfo->SysInfo.OcppConnStatus &&
  508. ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_ENABLE &&
  509. !ShmChargerInfo->AuthInfo.AuthMode.bits.AutoStartEnable)
  510. {
  511. _needOcppAuthorize = true;
  512. }
  513. else
  514. {
  515. _authResult = Chk_OfflinePolicy((char *)ShmSysConfigAndInfo->SysConfig.UserId);
  516. ShmSysConfigAndInfo->SysInfo.AuthorizedStatus = _AuthorizeStatus_Done;
  517. _keepRun = true;
  518. break;
  519. }
  520. }
  521. if(_needOcppAuthorize)
  522. {
  523. Set_Ocpp_AuthorizeReq();
  524. AUTH_INFO("*********** Set OPCC AuthorizeReq ***********");
  525. ShmSysConfigAndInfo->SysInfo.AuthorizedStatus = _AuthorizeStatus_Busy;
  526. }
  527. break;
  528. case _AuthorizeStatus_Busy:
  529. if(_preSysAuthStatus != ShmSysConfigAndInfo->SysInfo.AuthorizedStatus)
  530. {
  531. AUTH_INFO("[SysAuthStatus Busy]");
  532. _preSysAuthStatus = ShmSysConfigAndInfo->SysInfo.AuthorizedStatus;
  533. GetClockTime(&_SysAuth_Time);
  534. }
  535. if(GetTimeoutValue(_SysAuth_Time) / uSEC_VAL >= AUTHORIZE_WAIT_OCPP_TIMEOUT)
  536. {
  537. AUTH_INFO("*********** Ocpp Authorizing Timeout ***********");
  538. _authResult = _AuthResult_Invalid;
  539. ShmSysConfigAndInfo->SysInfo.AuthorizedStatus = _AuthorizeStatus_Done;
  540. _keepRun = true;
  541. break;
  542. }
  543. else
  544. {
  545. if(ShmSysConfigAndInfo->SysInfo.OcppConnStatus)
  546. {
  547. if(Is_Ocpp_AuthorizeConf())
  548. {
  549. BOOL accept = false;
  550. if(Is_Ocpp_Authorize_Status("Accepted"))
  551. {
  552. accept = true;
  553. }
  554. AUTH_INFO("*********** OCPP Authorize %s ***********", accept ? "OK" : "NG");
  555. _authResult = accept ? _AuthResult_Valid : _AuthResult_Invalid;
  556. ShmSysConfigAndInfo->SysInfo.AuthorizedStatus = _AuthorizeStatus_Done;
  557. _keepRun = true;
  558. break;
  559. }
  560. }
  561. else
  562. {
  563. AUTH_INFO("*********** OCPP Authorize Disconnected ***********");
  564. _authResult = Chk_OfflinePolicy((char *)ShmSysConfigAndInfo->SysConfig.UserId);
  565. ShmSysConfigAndInfo->SysInfo.AuthorizedStatus = _AuthorizeStatus_Done;
  566. _keepRun = true;
  567. break;
  568. }
  569. }
  570. break;
  571. case _AuthorizeStatus_Done:
  572. if(_preSysAuthStatus != ShmSysConfigAndInfo->SysInfo.AuthorizedStatus)
  573. {
  574. AUTH_INFO("[SysAuthStatus Done]");
  575. _preSysAuthStatus = ShmSysConfigAndInfo->SysInfo.AuthorizedStatus;
  576. GetClockTime(&_SysAuth_Time);
  577. }
  578. if(_autoSelection)
  579. {
  580. AUTH_INFO("*********** Dispense %d RFID Authorize %s ***********", _dispenser + 1, _authResult == _AuthResult_Valid ? "OK" : "NG");
  581. if(_authResult == _AuthResult_Valid)
  582. {
  583. if(strcmp((char *)ShmSysConfigAndInfo->SysConfig.UserId, AUTO_START_CHARGING) == EQUAL)
  584. {
  585. sprintf((char*)ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[_dispenser].AuthInfo.AuthId, "%s",
  586. ShmSysConfigAndInfo->SysConfig.SerialNumber);
  587. }
  588. }
  589. ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[_dispenser].AuthInfo.AuthResult = _authResult;
  590. ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[_dispenser].AuthInfo.AuthStatus = _AuthorizeStatus_End;
  591. }
  592. else
  593. {
  594. unsigned char connector = 0;
  595. connector = ShmSysConfigAndInfo->SysInfo.AuthorizedTarget - 1;
  596. if(chargingInfo[connector]->SystemStatus == S_IDLE && _authResult == _AuthResult_Valid)
  597. {
  598. if(strcmp((char *)ShmSysConfigAndInfo->SysConfig.UserId, AUTO_START_CHARGING) == EQUAL)
  599. {
  600. sprintf((char*)ShmSysConfigAndInfo->SysConfig.UserId, "%s%s",
  601. ShmSysConfigAndInfo->SysConfig.ModelName, ShmSysConfigAndInfo->SysConfig.SerialNumber);
  602. }
  603. memcpy(chargingInfo[connector]->StartUserId, ShmSysConfigAndInfo->SysConfig.UserId, 32);
  604. if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[connector].AuthInfo.AuthType == _AuthType_RFID)
  605. {
  606. AUTH_INFO("*********** Gun %d RFID Authorize %s ***********", connector + 1, _authResult == _AuthResult_Valid ? "OK" : "NG");
  607. }
  608. if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[connector].AuthInfo.AuthType == _AuthType_RemoteStart)
  609. {
  610. AUTH_INFO("*********** Gun %d RemoteAuthorize %s ***********", connector + 1, _authResult == _AuthResult_Valid ? "OK" : "NG");
  611. Set_Connector_MiscCommand(connector, MISC_CONN_REMOTE_START);
  612. }
  613. }
  614. else if(chargingInfo[connector]->SystemStatus == S_RESERVATION && _authResult == _AuthResult_Valid)
  615. {
  616. _authResult = Is_Ocpp_ReserveNowIdTag(connector, (char *)ShmSysConfigAndInfo->SysInfo.ConnectorInfo[connector].AuthInfo.AuthId) ? _AuthResult_Valid : _AuthResult_Invalid;
  617. if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[connector].AuthInfo.AuthType == _AuthType_RFID)
  618. {
  619. AUTH_INFO("*********** Gun %d RFID Reserve Authorize %s ***********", connector + 1, _authResult == _AuthResult_Valid ? "OK" : "NG");
  620. }
  621. if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[connector].AuthInfo.AuthType == _AuthType_RemoteStart)
  622. {
  623. AUTH_INFO("*********** Gun %d Reserve RemoteAuthorize %s ***********", connector + 1, _authResult == _AuthResult_Valid ? "OK" : "NG");
  624. Set_Connector_MiscCommand(connector, MISC_CONN_REMOTE_START);
  625. }
  626. }
  627. else
  628. {
  629. AUTH_INFO("*********** Gun %d Authorize OK But Status Fail (%d) ***********", connector + 1, chargingInfo[connector]->SystemStatus);
  630. _authResult = _AuthResult_Invalid;
  631. }
  632. ShmSysConfigAndInfo->SysInfo.ConnectorInfo[connector].AuthInfo.AuthResult = _authResult;
  633. ShmSysConfigAndInfo->SysInfo.ConnectorInfo[connector].AuthInfo.AuthStatus = _AuthorizeStatus_End;
  634. }
  635. ShmSysConfigAndInfo->SysInfo.AuthorizedStatus = _AuthorizeStatus_End;
  636. break;
  637. case _AuthorizeStatus_End:
  638. if(_preSysAuthStatus != ShmSysConfigAndInfo->SysInfo.AuthorizedStatus)
  639. {
  640. AUTH_INFO("[SysAuthStatus End]");
  641. _preSysAuthStatus = ShmSysConfigAndInfo->SysInfo.AuthorizedStatus;
  642. GetClockTime(&_SysAuth_Time);
  643. }
  644. if(GetTimeoutValue(_SysAuth_Time) / uSEC_VAL >= SYS_AUTHORIZE_COMP_TIMEOUT)
  645. {
  646. AUTH_INFO("*********** PowerCabinet Authorize Completed ***********");
  647. SysAuthInitial();
  648. }
  649. break;
  650. default:
  651. if(_preSysAuthStatus != ShmSysConfigAndInfo->SysInfo.AuthorizedStatus)
  652. {
  653. AUTH_INFO("[SysAuthStatus Unknown]");
  654. _preSysAuthStatus = ShmSysConfigAndInfo->SysInfo.AuthorizedStatus;
  655. }
  656. ShmSysConfigAndInfo->SysInfo.AuthorizedStatus = _AuthorizeStatus_End;
  657. break;
  658. }
  659. if(!_keepRun)
  660. {
  661. usleep(AUTHORIZE_INTERVAL);
  662. }
  663. }
  664. return 0;
  665. }