RFID.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  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. #include "../SelectGun/SelectGun.h"
  10. #include "main.h"
  11. #include "../timeout.h"
  12. //------------------------------------------------------------------------------
  13. static char *rfidPortName = "/dev/ttyS2";
  14. static bool isCardScan = false;
  15. static DcCommonInfo* ShmDcCommonData = NULL;
  16. //------------------------------------------------------------------------------
  17. static bool canStartCharging(void)
  18. {
  19. uint8_t index = 0;
  20. char buf2[16] = "";
  21. memset(buf2, 0, ARRAY_SIZE(buf2));
  22. struct OCPP16Data *ShmOCPP16Data = (struct OCPP16Data *)GetShmOCPP16Data();
  23. for (index = 0; index < strlen((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status); index++) {
  24. sprintf(buf2 + (index - 1) * 2, "%02X", ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status[index]);
  25. }
  26. sprintf(buf2, "%s", ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status);
  27. // 因為無法得知實際的長度,所以只能用搜尋的方式
  28. if (strcmp(buf2, "Accepted") == EQUAL) {
  29. return true;
  30. }
  31. return false;
  32. }
  33. static void isAutorCompleteHandle(uint8_t *authorizeIndex)
  34. {
  35. uint8_t i = 0;
  36. struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
  37. struct ChargingInfoData *pDcChargingInfo = NULL;
  38. // 透過後臺停止充電的判斷
  39. if (isAuthorizedComplete()
  40. #if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
  41. || (pSysInfo->OcppConnStatus == NO &&
  42. pSysConfig->OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING)
  43. #endif //!defined DD360 && !defined DD360Audi
  44. ) {
  45. // 判斷後台回覆狀態
  46. if (canStartCharging() == false) {
  47. strcpy((char *)pSysConfig->UserId, "");
  48. ClearAuthorizedFlag();
  49. return;
  50. }
  51. if (*(authorizeIndex) != NO_DEFINE) {
  52. pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(*(authorizeIndex));
  53. if (pSysConfig->OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST &&
  54. strcmp((char *)pDcChargingInfo->StartUserId, "") != EQUAL) {
  55. // 先找 AC
  56. if (*(authorizeIndex) == DEFAULT_AC_INDEX) {
  57. AcChargingTerminalProcess();
  58. } else {
  59. ChargingTerminalProcess(*(authorizeIndex));
  60. }
  61. }
  62. strcpy((char *)pSysConfig->UserId, "");
  63. *(authorizeIndex) = NO_DEFINE;
  64. }
  65. ClearAuthorizedFlag();
  66. } else if (pSysConfig->OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST) {
  67. // 白名單驗證
  68. for (i = 0; i < 10; i++) {
  69. if (strcmp((char *)pSysConfig->LocalWhiteCard[i], "") == EQUAL) {
  70. continue;
  71. }
  72. if (strcmp((char *)pSysConfig->LocalWhiteCard[i], (char *)pSysConfig->UserId) == EQUAL) {
  73. ChargingTerminalProcess(*(authorizeIndex));
  74. strcpy((char *)pSysConfig->UserId, "");
  75. ClearAuthorizedFlag();
  76. break;
  77. }
  78. }
  79. }
  80. }
  81. static void UserScanFunction(void)
  82. {
  83. bool idleReq = false;
  84. uint8_t i = 0;
  85. uint8_t stopReq = NO_DEFINE;
  86. char value[32] = {0};
  87. static uint8_t _authorizeIndex = NO_DEFINE;
  88. struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
  89. struct SysInfoData *pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
  90. struct ChargingInfoData *pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(0);
  91. struct ChargingInfoData *pDcChargingInfo = NULL;
  92. GunIndexInfo *pGunIndexInfo = (GunIndexInfo *)GetGunIndexInfo();
  93. // 當前非驗證的狀態
  94. if (IsAuthorizingMode()) {
  95. isAutorCompleteHandle(&_authorizeIndex);
  96. }
  97. //當前沒有選槍
  98. if (getConfirmSelectedGun(pSysInfo->CurGunSelected) == FAIL) {
  99. strcpy((char *)pSysConfig->UserId, "");
  100. return;
  101. }
  102. /*
  103. if (pSysConfig->EVCCID_Authorize) {
  104. pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(pSysInfo->CurGunSelected);
  105. if (strcmp( (char *)pSysConfig->UserId, (char *) pDcChargingInfo->EVCCID) != EQUAL )
  106. return;
  107. }*/
  108. // 先判斷現在是否可以提供刷卡
  109. // 1. 如果當前沒有槍是閒置狀態,則無提供刷卡功能
  110. // 2. 停止充電
  111. if (pSysInfo->PageIndex == _LCM_FIX) {
  112. strcpy((char *)pSysConfig->UserId, "");
  113. return;
  114. }
  115. for (i = 0; i < pSysConfig->TotalConnectorCount; i++) {
  116. pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(i);
  117. if (pDcChargingInfo->SystemStatus == S_CHARGING) {
  118. stopReq = i;
  119. }
  120. if (((pDcChargingInfo->SystemStatus == S_IDLE ||
  121. pDcChargingInfo->SystemStatus == S_RESERVATION) &&
  122. pDcChargingInfo->IsAvailable == YES) ||
  123. (pGunIndexInfo->AcGunIndex > 0 &&
  124. pAcChargingInfo->SystemStatus == S_IDLE &&
  125. pAcChargingInfo->IsAvailable)
  126. ) {
  127. idleReq = true;
  128. }
  129. }
  130. if (pGunIndexInfo->AcGunIndex > 0 &&
  131. pSysInfo->CurGunSelectedByAc == DEFAULT_AC_INDEX &&
  132. pAcChargingInfo->SystemStatus == S_CHARGING) {
  133. stopReq = DEFAULT_AC_INDEX;
  134. }
  135. if (strlen((char *)pSysConfig->UserId) <= 0) {
  136. return;
  137. }
  138. pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(pSysInfo->CurGunSelected);
  139. if (pGunIndexInfo->AcGunIndex > 0 &&
  140. stopReq == DEFAULT_AC_INDEX &&
  141. pSysInfo->CurGunSelectedByAc == DEFAULT_AC_INDEX) {
  142. log_info("ac stop charging ");
  143. log_info("index = %d, card number = %s, UserId = %s ",
  144. pSysInfo->CurGunSelectedByAc,
  145. pAcChargingInfo->StartUserId,
  146. pSysConfig->UserId);
  147. memset(value, 0, sizeof(value));
  148. memcpy(value,
  149. (uint8_t *)pAcChargingInfo->StartUserId,
  150. ARRAY_SIZE(pAcChargingInfo->StartUserId));
  151. if (strcmp((char *)pSysConfig->UserId, value) == EQUAL) {
  152. AcChargingTerminalProcess();
  153. }
  154. strcpy((char *)pSysConfig->UserId, "");
  155. } else if (stopReq < pSysConfig->TotalConnectorCount &&
  156. pDcChargingInfo->SystemStatus == S_CHARGING &&
  157. (pGunIndexInfo->AcGunIndex <= 0 ||
  158. (pGunIndexInfo->AcGunIndex > 0 &&
  159. pSysInfo->CurGunSelectedByAc == NO_DEFINE))
  160. ) {
  161. log_info("stop charging ");
  162. log_info("index = %d, card number = %s, UserId = %s ",
  163. pSysInfo->CurGunSelected,
  164. pDcChargingInfo->StartUserId,
  165. pSysConfig->UserId);
  166. memset(value, 0, sizeof(value));
  167. memcpy(value,
  168. (uint8_t *)pDcChargingInfo->StartUserId,
  169. ARRAY_SIZE(pDcChargingInfo->StartUserId));
  170. // 同一張卡直接停掉
  171. if (strcmp((char *)pSysConfig->UserId, value) == EQUAL) {
  172. ChargingTerminalProcess(pSysInfo->CurGunSelected);
  173. strcpy((char *)pSysConfig->UserId, "");
  174. return;
  175. }
  176. // 進驗證
  177. if (pGunIndexInfo->AcGunIndex > 0 &&
  178. pSysInfo->CurGunSelectedByAc == DEFAULT_AC_INDEX) {
  179. _authorizeIndex = pSysInfo->CurGunSelectedByAc;
  180. } else {
  181. _authorizeIndex = pSysInfo->CurGunSelected;
  182. }
  183. #if defined DD360 || defined DD360Audi || defined DD360ComBox
  184. strcpy((char *)pSysConfig->UserId, "");
  185. return;
  186. #endif //defined DD360 || defined DD360Audi || defined DD360ComBox
  187. StartSystemTimeoutDet(Timeout_AuthorizingForStop);
  188. AuthorizingStart();
  189. } else if (idleReq) {
  190. if (pSysConfig->TotalConnectorCount > 1 &&
  191. stopReq != 255 &&
  192. pSysInfo->IsAlternatvieConf == YES) {
  193. idleReq = false;
  194. strcpy((char *)pSysConfig->UserId, "");
  195. } else if ((pGunIndexInfo->AcGunIndex > 0 &&
  196. pSysInfo->CurGunSelectedByAc == DEFAULT_AC_INDEX) ||
  197. pDcChargingInfo->SystemStatus == S_IDLE || pDcChargingInfo->SystemStatus == S_RESERVATION) {
  198. log_info("// LCM => Authorizing");
  199. setSelGunWaitToAuthor(pSysInfo->CurGunSelected);
  200. // LCM => Authorizing
  201. pSysInfo->SystemPage = _LCM_AUTHORIZING;
  202. // 進入確認卡號狀態
  203. AuthorizingStart();
  204. } else {
  205. strcpy((char *)pSysConfig->UserId, "");
  206. }
  207. } else {
  208. strcpy((char *)pSysConfig->UserId, "");
  209. }
  210. return;
  211. }
  212. bool GetIsCardScan(void)
  213. {
  214. return isCardScan;
  215. }
  216. void SetIsCardScan(bool value)
  217. {
  218. isCardScan = value;
  219. }
  220. void ScannerCardProcess(void)
  221. {
  222. int i = 0;
  223. struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
  224. struct SysInfoData *pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
  225. struct WARNING_CODE_INFO *pSysWarning = (struct WARNING_CODE_INFO *)GetShmSysWarningInfo();
  226. SelectGunInfo *ShmSelectGunInfo = (SelectGunInfo *)GetShmSelectGunInfo();
  227. ShmDcCommonData = (DcCommonInfo*)GetShmDcCommonData();
  228. if (!isDetectPlugin(pSysInfo->CurGunSelected) &&
  229. !isCardScan &&
  230. pSysWarning->Level != WARN_LV_ER /*&&
  231. pSysConfig->AuthorisationMode == AUTH_MODE_ENABLE*/) {
  232. isCardScan = true;
  233. // 處理刷卡及驗證卡號的動作
  234. UserScanFunction();
  235. }
  236. if (pSysInfo->SystemPage == _LCM_AUTHORIZING) {
  237. if(!isAuthorizedComplete())
  238. StartSystemTimeoutDet(Timeout_Authorizing);
  239. //printf("isAuthorizedComplete = %d, %f", isAuthorizedComplete(), ShmSelectGunInfo->PricesInfo[pSysInfo->CurGunSelected].Balance);
  240. // 確認驗證卡號完成沒
  241. if (isAuthorizedComplete()
  242. /*
  243. #if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
  244. || pSysConfig->OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING
  245. #endif //!defined DD360 && !defined DD360Audi && !defined DD360ComBox
  246. */
  247. ) {
  248. //StopSystemTimeoutDet();
  249. StartSystemTimeoutDet(Timeout_WaitBalance);
  250. if (ShmSelectGunInfo->PricesInfo[pSysInfo->CurGunSelected].Balance != FAIL_BALANCE_PRICES) {
  251. StopSystemTimeoutDet();
  252. // 判斷後台回覆狀態
  253. if (canStartCharging()) {
  254. // LCM => Authorize complete
  255. pSysInfo->SystemPage = _LCM_AUTHORIZ_COMP;
  256. } else {
  257. // LCM => Authorize fail
  258. pSysInfo->SystemPage = _LCM_AUTHORIZ_FAIL;
  259. strcpy((char *)pSysConfig->UserId, "");
  260. ShmDcCommonData->AuthroizeType = IdTokenType_Central;
  261. }
  262. } ClearAuthorizedFlag();
  263. } /*else if (pSysConfig->OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST) {
  264. // 白名單驗證
  265. for (i = 0; i < 10; i++) {
  266. if (strcmp((char *)pSysConfig->LocalWhiteCard[i], "") == EQUAL) {
  267. continue;
  268. }
  269. if (strcmp((char *)pSysConfig->LocalWhiteCard[i], (char *)pSysConfig->UserId) == EQUAL) {
  270. log_info("Local White Card [%d]:%s", i, pSysConfig->LocalWhiteCard[i]);
  271. pSysInfo->SystemPage = _LCM_AUTHORIZ_COMP;
  272. ClearAuthorizedFlag();
  273. break;
  274. }
  275. }
  276. }*/
  277. } else if (pSysInfo->SystemPage == _LCM_AUTHORIZ_FAIL) {
  278. StartSystemTimeoutDet(Timeout_VerifyFail);
  279. isCardScan = false;
  280. } else if (pSysInfo->SystemPage == _LCM_AUTHORIZ_COMP) {
  281. StartSystemTimeoutDet(Timeout_VerifyComp);
  282. } else if (pSysInfo->SystemPage == _LCM_WAIT_FOR_PLUG) {
  283. //StartGunInfoTimeoutDet(pSysInfo->CurGunSelected, Timeout_WaitPlug);
  284. } else {
  285. isCardScan = false;
  286. }
  287. }
  288. static int InitialRfidPort(void)
  289. {
  290. int fd = open(rfidPortName, O_RDWR);
  291. struct termios tios;
  292. struct AlarmCodeData *pAlarmCode = (struct AlarmCodeData *)GetShmAlarmCodeData();
  293. if (fd != FAIL) {
  294. ioctl (fd, TCGETS, &tios);
  295. tios.c_cflag = B19200 | CS8 | CLOCAL | CREAD;
  296. tios.c_lflag = 0;
  297. tios.c_iflag = 0;
  298. tios.c_oflag = 0;
  299. tios.c_cc[VMIN] = 0;
  300. tios.c_cc[VTIME] = (uint8_t) 1;
  301. tios.c_lflag = 0;
  302. tcflush(fd, TCIFLUSH);
  303. ioctl(fd, TCSETS, &tios);
  304. }
  305. if (fd < 0) {
  306. pAlarmCode->AlarmEvents.bits.RfidModuleCommFail = 1;
  307. }
  308. return fd;
  309. }
  310. void CreateRfidFork(void)
  311. {
  312. pid_t rfidRecPid;
  313. rfidRecPid = fork();
  314. if (rfidRecPid == 0) {
  315. int fd = -1;
  316. int isContinue = 1;
  317. RFID rfid = {0};
  318. int module_type = MODULE_EWT;
  319. fd = InitialRfidPort();
  320. struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
  321. ShmDcCommonData = (DcCommonInfo*)GetShmDcCommonData();
  322. //log_info("RFID fork Child's PID is %d", getpid());
  323. while (isContinue) {
  324. usleep(500000);
  325. // 刷卡判斷
  326. if (pSysConfig->OfflinePolicy == _OFFLINE_POLICY_NO_CHARGING ||
  327. !pSysConfig->isRFID) {
  328. continue;
  329. }
  330. if (getRequestCardSN(fd, module_type, &rfid) == false) {
  331. continue;
  332. }
  333. //log_info("Get Card..-%s- ", pSysConfig->UserId);
  334. if (strlen((char *)pSysConfig->UserId) != 0) {
  335. continue;
  336. }
  337. if (pSysConfig->RfidCardNumEndian == RFID_ENDIAN_LITTLE) {
  338. switch (rfid.snType) {
  339. #ifdef DD360Audi
  340. case RFID_SN_TYPE_6BYTE:
  341. sprintf((char *) pSysConfig->UserId,
  342. "%02X%02X%02X%02X%02X%02X",
  343. rfid.currentCard[0], rfid.currentCard[1],
  344. rfid.currentCard[2], rfid.currentCard[3],
  345. rfid.currentCard[4], rfid.currentCard[5]);
  346. break;
  347. case RFID_SN_TYPE_7BYTE:
  348. sprintf((char *) pSysConfig->UserId,
  349. "%02X%02X%02X%02X%02X%02X%02X",
  350. rfid.currentCard[0], rfid.currentCard[1],
  351. rfid.currentCard[2], rfid.currentCard[3],
  352. rfid.currentCard[4], rfid.currentCard[5],
  353. rfid.currentCard[6]);
  354. break;
  355. case RFID_SN_TYPE_10BYTE:
  356. sprintf((char *) pSysConfig->UserId,
  357. "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
  358. rfid.currentCard[0], rfid.currentCard[1],
  359. rfid.currentCard[2], rfid.currentCard[3],
  360. rfid.currentCard[4], rfid.currentCard[5],
  361. rfid.currentCard[6], rfid.currentCard[7],
  362. rfid.currentCard[8], rfid.currentCard[9]);
  363. break;
  364. case RFID_SN_TYPE_4BYTE:
  365. sprintf((char *) pSysConfig->UserId,
  366. "%02X%02X%02X%02X",
  367. rfid.currentCard[0], rfid.currentCard[1],
  368. rfid.currentCard[2], rfid.currentCard[3]);
  369. break;
  370. #else
  371. case RFID_SN_TYPE_6BYTE:
  372. sprintf((char*)pSysConfig->UserId,
  373. "%02X%02X%02X%02X%02X%02X",
  374. rfid.currentCard[5], rfid.currentCard[4],
  375. rfid.currentCard[3], rfid.currentCard[2],
  376. rfid.currentCard[1], rfid.currentCard[0]);
  377. break;
  378. case RFID_SN_TYPE_7BYTE:
  379. sprintf((char*)pSysConfig->UserId,
  380. "%02X%02X%02X%02X%02X%02X%02X",
  381. rfid.currentCard[6], rfid.currentCard[5],
  382. rfid.currentCard[4], rfid.currentCard[3],
  383. rfid.currentCard[2], rfid.currentCard[1],
  384. rfid.currentCard[0]);
  385. break;
  386. case RFID_SN_TYPE_8BYTE:
  387. sprintf((char*)pSysConfig->UserId,
  388. "%02X%02X%02X%02X%02X%02X%02X%02X",
  389. rfid.currentCard[7], rfid.currentCard[6],
  390. rfid.currentCard[5], rfid.currentCard[4],
  391. rfid.currentCard[3], rfid.currentCard[2],
  392. rfid.currentCard[1], rfid.currentCard[0]);
  393. break;
  394. case RFID_SN_TYPE_10BYTE:
  395. sprintf((char*)pSysConfig->UserId,
  396. "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
  397. rfid.currentCard[9], rfid.currentCard[8],
  398. rfid.currentCard[7], rfid.currentCard[6],
  399. rfid.currentCard[5], rfid.currentCard[4],
  400. rfid.currentCard[3], rfid.currentCard[2],
  401. rfid.currentCard[1], rfid.currentCard[0]);
  402. break;
  403. case RFID_SN_TYPE_4BYTE:
  404. sprintf((char*)pSysConfig->UserId,
  405. "%02X%02X%02X%02X",
  406. rfid.currentCard[3], rfid.currentCard[2],
  407. rfid.currentCard[1], rfid.currentCard[0]);
  408. break;
  409. #endif
  410. }
  411. } else if (pSysConfig->RfidCardNumEndian == RFID_ENDIAN_BIG) {
  412. switch (rfid.snType) {
  413. #ifdef DD360Audi
  414. case RFID_SN_TYPE_6BYTE:
  415. sprintf((char *) pSysConfig->UserId,
  416. "%02X%02X%02X%02X%02X%02X",
  417. rfid.currentCard[5], rfid.currentCard[4],
  418. rfid.currentCard[3], rfid.currentCard[2],
  419. rfid.currentCard[1], rfid.currentCard[0]);
  420. break;
  421. case RFID_SN_TYPE_7BYTE:
  422. sprintf((char *) pSysConfig->UserId,
  423. "%02X%02X%02X%02X%02X%02X%02X",
  424. rfid.currentCard[6], rfid.currentCard[5],
  425. rfid.currentCard[4], rfid.currentCard[3],
  426. rfid.currentCard[2], rfid.currentCard[1],
  427. rfid.currentCard[0]);
  428. break;
  429. case RFID_SN_TYPE_10BYTE:
  430. sprintf((char *) pSysConfig->UserId,
  431. "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
  432. rfid.currentCard[9], rfid.currentCard[8],
  433. rfid.currentCard[7], rfid.currentCard[6],
  434. rfid.currentCard[5], rfid.currentCard[4],
  435. rfid.currentCard[3], rfid.currentCard[2],
  436. rfid.currentCard[1], rfid.currentCard[0]);
  437. break;
  438. case RFID_SN_TYPE_4BYTE:
  439. sprintf((char *) pSysConfig->UserId,
  440. "%02X%02X%02X%02X",
  441. rfid.currentCard[3], rfid.currentCard[2],
  442. rfid.currentCard[1], rfid.currentCard[0]);
  443. break;
  444. #else
  445. case RFID_SN_TYPE_6BYTE:
  446. sprintf((char*)pSysConfig->UserId,
  447. "%02X%02X%02X%02X%02X%02X",
  448. rfid.currentCard[0], rfid.currentCard[1],
  449. rfid.currentCard[2], rfid.currentCard[3],
  450. rfid.currentCard[4], rfid.currentCard[5]);
  451. break;
  452. case RFID_SN_TYPE_7BYTE:
  453. sprintf((char*)pSysConfig->UserId,
  454. "%02X%02X%02X%02X%02X%02X%02X",
  455. rfid.currentCard[0], rfid.currentCard[1],
  456. rfid.currentCard[2], rfid.currentCard[3],
  457. rfid.currentCard[4], rfid.currentCard[5],
  458. rfid.currentCard[6]);
  459. break;
  460. case RFID_SN_TYPE_8BYTE:
  461. sprintf((char*)pSysConfig->UserId,
  462. "%02X%02X%02X%02X%02X%02X%02X%02X",
  463. rfid.currentCard[0], rfid.currentCard[1],
  464. rfid.currentCard[2], rfid.currentCard[3],
  465. rfid.currentCard[4], rfid.currentCard[5],
  466. rfid.currentCard[6], rfid.currentCard[7]);
  467. break;
  468. case RFID_SN_TYPE_10BYTE:
  469. sprintf((char*)pSysConfig->UserId,
  470. "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
  471. rfid.currentCard[0], rfid.currentCard[1],
  472. rfid.currentCard[2], rfid.currentCard[3],
  473. rfid.currentCard[4], rfid.currentCard[5],
  474. rfid.currentCard[6], rfid.currentCard[7],
  475. rfid.currentCard[8], rfid.currentCard[9]);
  476. break;
  477. case RFID_SN_TYPE_4BYTE:
  478. sprintf((char*)pSysConfig->UserId,
  479. "%02X%02X%02X%02X",
  480. rfid.currentCard[0], rfid.currentCard[1],
  481. rfid.currentCard[2], rfid.currentCard[3]);
  482. break;
  483. #endif
  484. }
  485. }
  486. log_info("card number = %s", pSysConfig->UserId);
  487. if (strlen((char*)pSysConfig->UserId) != 0) {
  488. ShmDcCommonData->AuthroizeType = IdTokenType_ISO14443;
  489. }
  490. if (rfid.cardType == ISO14443A) {
  491. sethaltCard(fd, module_type);
  492. } else if (rfid.cardType == IS014443B) {
  493. } else if (rfid.cardType == FELICA) {
  494. }
  495. }
  496. }
  497. }