RFID.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. #include <stdio.h> /*標準輸入輸出定義*/
  2. #include <stdlib.h> /*標準函數庫定義*/
  3. #include <string.h>
  4. #include <stdint.h>
  5. #include "../Config.h"
  6. #include "../Log/log.h"
  7. #include "../Define/define.h"
  8. #include "../ShareMemory/shmMem.h"
  9. //------------------------------------------------------------------------------
  10. static void UserScanFunction(void)
  11. {
  12. bool idleReq = false;
  13. uint8_t stopReq = 255;
  14. // 當前非驗證的狀態
  15. if (!IsAuthorizingMode()) {
  16. #if defined DD360Audi
  17. //當前沒有選槍
  18. if (getConfirmSelectedGun(ShmSysConfigAndInfo->SysInfo.CurGunSelected) == FAIL) { //Jerry add
  19. strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
  20. return;
  21. }
  22. #endif //defined DD360Audi
  23. // 先判斷現在是否可以提供刷卡
  24. // 1. 如果當前沒有槍是閒置狀態,則無提供刷卡功能
  25. // 2. 停止充電
  26. if (ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_FIX) {
  27. strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
  28. return;
  29. }
  30. for (uint8_t i = 0; i < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; i++) {
  31. if (chargingInfo[i]->SystemStatus == S_CHARGING) {
  32. stopReq = i;
  33. }
  34. if ((chargingInfo[i]->SystemStatus == S_IDLE &&
  35. chargingInfo[i]->IsAvailable) == YES ||
  36. (_acgunIndex > 0 && ac_chargingInfo[0]->SystemStatus ==
  37. S_IDLE && ac_chargingInfo[0]->IsAvailable)
  38. ) {
  39. idleReq = true;
  40. }
  41. }
  42. if (_acgunIndex > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == DEFAULT_AC_INDEX &&
  43. ac_chargingInfo[0]->SystemStatus == S_CHARGING) {
  44. stopReq = DEFAULT_AC_INDEX;
  45. }
  46. if (strlen((char *)ShmSysConfigAndInfo->SysConfig.UserId) > 0) {
  47. if (_acgunIndex > 0 && stopReq == DEFAULT_AC_INDEX &&
  48. ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == DEFAULT_AC_INDEX) {
  49. char value[32];
  50. log_info("ac stop charging \n");
  51. log_info("index = %d, card number = %s, UserId = %s \n", ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc,
  52. ac_chargingInfo[0]->StartUserId, ShmSysConfigAndInfo->SysConfig.UserId);
  53. memcpy(value, (uint8_t *)ac_chargingInfo[0]->StartUserId,
  54. ARRAY_SIZE(ac_chargingInfo[0]->StartUserId));
  55. if (strcmp((char *)ShmSysConfigAndInfo->SysConfig.UserId, value) == EQUAL) {
  56. AcChargingTerminalProcess();
  57. }
  58. strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
  59. } else if (stopReq < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount &&
  60. chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus == S_CHARGING &&
  61. (_acgunIndex <= 0 || (_acgunIndex > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == NO_DEFINE))) {
  62. char value[32];
  63. log_info("stop charging \n");
  64. log_info("index = %d, card number = %s, UserId = %s \n",
  65. ShmSysConfigAndInfo->SysInfo.CurGunSelected,
  66. chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->StartUserId,
  67. ShmSysConfigAndInfo->SysConfig.UserId);
  68. memcpy(value, (uint8_t *)chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->StartUserId,
  69. ARRAY_SIZE(chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->StartUserId));
  70. // 同一張卡直接停掉
  71. if (strcmp((char *)ShmSysConfigAndInfo->SysConfig.UserId, value) == EQUAL) {
  72. ChargingTerminalProcess(ShmSysConfigAndInfo->SysInfo.CurGunSelected);
  73. strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
  74. } else {
  75. // 進驗證
  76. if (_acgunIndex > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == DEFAULT_AC_INDEX) {
  77. _authorizeIndex = ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc;
  78. } else {
  79. _authorizeIndex = ShmSysConfigAndInfo->SysInfo.CurGunSelected;
  80. }
  81. #if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
  82. StartSystemTimeoutDet(Timeout_AuthorizingForStop);
  83. AuthorizingStart();
  84. #else
  85. strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
  86. #endif //!defined DD360 && !defined DD360Audi
  87. }
  88. } else if (idleReq) {
  89. if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount > 1 &&
  90. stopReq != 255 &&
  91. ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == YES) {
  92. idleReq = false;
  93. strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
  94. } else if ((_acgunIndex > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == DEFAULT_AC_INDEX) ||
  95. chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus == S_IDLE) {
  96. log_info("// LCM => Authorizing \n");
  97. #if defined DD360Audi
  98. setSelGunWaitToAuthor(ShmSysConfigAndInfo->SysInfo.CurGunSelected); //Jerry add
  99. #endif //defined DD360Audi
  100. // LCM => Authorizing
  101. ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_AUTHORIZING;
  102. // 進入確認卡號狀態
  103. AuthorizingStart();
  104. } else {
  105. strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
  106. }
  107. } else {
  108. strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
  109. }
  110. }
  111. } else {
  112. // 透過後臺停止充電的判斷
  113. if (isAuthorizedComplete()
  114. #if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
  115. || (ShmSysConfigAndInfo->SysInfo.OcppConnStatus == NO &&
  116. ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING)
  117. #endif //!defined DD360 && !defined DD360Audi
  118. ) {
  119. // 判斷後台回覆狀態
  120. if (canStartCharging()
  121. #if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
  122. || (ShmSysConfigAndInfo->SysInfo.OcppConnStatus == NO &&
  123. ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING)
  124. #endif //!defined DD360 && !defined DD360Audi
  125. ) {
  126. if (_authorizeIndex != NO_DEFINE) {
  127. // 先找 AC
  128. if (_authorizeIndex == DEFAULT_AC_INDEX) {
  129. if (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST &&
  130. strcmp((char *)chargingInfo[_authorizeIndex]->StartUserId, "") != EQUAL) {
  131. AcChargingTerminalProcess();
  132. }
  133. } else {
  134. if (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST &&
  135. strcmp((char *)chargingInfo[_authorizeIndex]->StartUserId, "") != EQUAL) {
  136. ChargingTerminalProcess(_authorizeIndex);
  137. }
  138. }
  139. strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
  140. _authorizeIndex = NO_DEFINE;
  141. }
  142. } else {
  143. strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
  144. }
  145. ClearAuthorizedFlag();
  146. } else if (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST) {
  147. // 白名單驗證
  148. for (int i = 0; i < 10; i++) {
  149. if (strcmp((char *)ShmSysConfigAndInfo->SysConfig.LocalWhiteCard[i], "") != EQUAL) {
  150. if (strcmp((char *)ShmSysConfigAndInfo->SysConfig.LocalWhiteCard[i], (char *)ShmSysConfigAndInfo->SysConfig.UserId) == EQUAL) {
  151. ChargingTerminalProcess(_authorizeIndex);
  152. strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
  153. ClearAuthorizedFlag();
  154. break;
  155. }
  156. }
  157. }
  158. }
  159. }
  160. }
  161. void ScannerCardProcess()
  162. {
  163. if (!isDetectPlugin() && !isCardScan && ShmSysConfigAndInfo->SysWarningInfo.Level != 2 &&
  164. ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_ENABLE) {
  165. isCardScan = true;
  166. // 處理刷卡及驗證卡號的動作
  167. UserScanFunction();
  168. }
  169. if (ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_AUTHORIZING) {
  170. StartSystemTimeoutDet(Timeout_Authorizing);
  171. // 確認驗證卡號完成沒
  172. if (isAuthorizedComplete()
  173. #if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
  174. || ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING
  175. #else
  176. && gAudiCustInfo->PricesInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected].Balance != FAIL_BALANCE_PRICES
  177. #endif //!defined DD360 && !defined DD360Audi
  178. ) {
  179. StopSystemTimeoutDet();
  180. // 判斷後台回覆狀態
  181. if (canStartCharging()
  182. #if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
  183. || ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING
  184. #endif //!defined DD360 && !defined DD360Audi
  185. ) {
  186. // LCM => Authorize complete
  187. ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_AUTHORIZ_COMP;
  188. } else {
  189. // LCM => Authorize fail
  190. ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_AUTHORIZ_FAIL;
  191. strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
  192. }
  193. ClearAuthorizedFlag();
  194. } else if (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST) {
  195. // 白名單驗證
  196. for (int i = 0; i < 10; i++) {
  197. if (strcmp((char *)ShmSysConfigAndInfo->SysConfig.LocalWhiteCard[i], "") != EQUAL) {
  198. if (strcmp((char *)ShmSysConfigAndInfo->SysConfig.LocalWhiteCard[i], (char *)ShmSysConfigAndInfo->SysConfig.UserId) == EQUAL) {
  199. ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_AUTHORIZ_COMP;
  200. ClearAuthorizedFlag();
  201. break;
  202. }
  203. }
  204. }
  205. }
  206. } else if (ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_AUTHORIZ_FAIL) {
  207. StartSystemTimeoutDet(Timeout_VerifyFail);
  208. isCardScan = false;
  209. } else if (ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_AUTHORIZ_COMP) {
  210. StartSystemTimeoutDet(Timeout_VerifyComp);
  211. } else if (ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_WAIT_FOR_PLUG) {
  212. StartSystemTimeoutDet(Timeout_WaitPlug);
  213. } else {
  214. isCardScan = false;
  215. }
  216. }
  217. void CreateRfidFork()
  218. {
  219. pid_t rfidRecPid;
  220. rfidRecPid = fork();
  221. log_info("CreateRfidFork = %d\r\n", rfidRecPid);
  222. if (rfidRecPid == 0) {
  223. while (true) {
  224. // 刷卡判斷
  225. RFID rfid;
  226. if (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_NO_CHARGING ||
  227. !ShmSysConfigAndInfo->SysConfig.isRFID)
  228. {}
  229. else if (getRequestCardSN(rfidFd, 0, &rfid)) {
  230. //log_info("Get Card..-%s- \n", ShmSysConfigAndInfo->SysConfig.UserId);
  231. if (strlen((char *)ShmSysConfigAndInfo->SysConfig.UserId) == 0) {
  232. if (ShmSysConfigAndInfo->SysConfig.RfidCardNumEndian == RFID_ENDIAN_LITTLE) {
  233. switch (rfid.snType) {
  234. case RFID_SN_TYPE_6BYTE:
  235. sprintf((char *) ShmSysConfigAndInfo->SysConfig.UserId,
  236. "%02X%02X%02X%02X%02X%02X",
  237. rfid.currentCard[0], rfid.currentCard[1],
  238. rfid.currentCard[2], rfid.currentCard[3],
  239. rfid.currentCard[4], rfid.currentCard[5]);
  240. break;
  241. case RFID_SN_TYPE_7BYTE:
  242. sprintf((char *) ShmSysConfigAndInfo->SysConfig.UserId,
  243. "%02X%02X%02X%02X%02X%02X%02X",
  244. rfid.currentCard[0], rfid.currentCard[1],
  245. rfid.currentCard[2], rfid.currentCard[3],
  246. rfid.currentCard[4], rfid.currentCard[5],
  247. rfid.currentCard[6]);
  248. break;
  249. case RFID_SN_TYPE_10BYTE:
  250. sprintf((char *) ShmSysConfigAndInfo->SysConfig.UserId,
  251. "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
  252. rfid.currentCard[0], rfid.currentCard[1],
  253. rfid.currentCard[2], rfid.currentCard[3],
  254. rfid.currentCard[4], rfid.currentCard[5],
  255. rfid.currentCard[6], rfid.currentCard[7],
  256. rfid.currentCard[8], rfid.currentCard[9]);
  257. break;
  258. case RFID_SN_TYPE_4BYTE:
  259. sprintf((char *) ShmSysConfigAndInfo->SysConfig.UserId,
  260. "%02X%02X%02X%02X",
  261. rfid.currentCard[0], rfid.currentCard[1],
  262. rfid.currentCard[2], rfid.currentCard[3]);
  263. break;
  264. }
  265. } else if (ShmSysConfigAndInfo->SysConfig.RfidCardNumEndian == RFID_ENDIAN_BIG) {
  266. switch (rfid.snType) {
  267. case RFID_SN_TYPE_6BYTE:
  268. sprintf((char *) ShmSysConfigAndInfo->SysConfig.UserId,
  269. "%02X%02X%02X%02X%02X%02X",
  270. rfid.currentCard[5], rfid.currentCard[4],
  271. rfid.currentCard[3], rfid.currentCard[2],
  272. rfid.currentCard[1], rfid.currentCard[0]);
  273. break;
  274. case RFID_SN_TYPE_7BYTE:
  275. sprintf((char *) ShmSysConfigAndInfo->SysConfig.UserId,
  276. "%02X%02X%02X%02X%02X%02X%02X",
  277. rfid.currentCard[6], rfid.currentCard[5],
  278. rfid.currentCard[4], rfid.currentCard[3],
  279. rfid.currentCard[2], rfid.currentCard[1],
  280. rfid.currentCard[0]);
  281. break;
  282. case RFID_SN_TYPE_10BYTE:
  283. sprintf((char *) ShmSysConfigAndInfo->SysConfig.UserId,
  284. "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
  285. rfid.currentCard[9], rfid.currentCard[8],
  286. rfid.currentCard[7], rfid.currentCard[6],
  287. rfid.currentCard[5], rfid.currentCard[4],
  288. rfid.currentCard[3], rfid.currentCard[2],
  289. rfid.currentCard[1], rfid.currentCard[0]);
  290. break;
  291. case RFID_SN_TYPE_4BYTE:
  292. sprintf((char *) ShmSysConfigAndInfo->SysConfig.UserId,
  293. "%02X%02X%02X%02X",
  294. rfid.currentCard[3], rfid.currentCard[2],
  295. rfid.currentCard[1], rfid.currentCard[0]);
  296. break;
  297. }
  298. }
  299. log_info("card number = %s\n", ShmSysConfigAndInfo->SysConfig.UserId);
  300. }
  301. }
  302. usleep(500000);
  303. }
  304. }
  305. }