#include /*標準輸入輸出定義*/ #include /*標準函數庫定義*/ #include #include #include "../Config.h" #include "../Log/log.h" #include "../Define/define.h" #include "../ShareMemory/shmMem.h" //------------------------------------------------------------------------------ static void UserScanFunction(void) { bool idleReq = false; uint8_t stopReq = 255; // 當前非驗證的狀態 if (!IsAuthorizingMode()) { #if defined DD360Audi //當前沒有選槍 if (getConfirmSelectedGun(ShmSysConfigAndInfo->SysInfo.CurGunSelected) == FAIL) { //Jerry add strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, ""); return; } #endif //defined DD360Audi // 先判斷現在是否可以提供刷卡 // 1. 如果當前沒有槍是閒置狀態,則無提供刷卡功能 // 2. 停止充電 if (ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_FIX) { strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, ""); return; } for (uint8_t i = 0; i < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; i++) { if (chargingInfo[i]->SystemStatus == S_CHARGING) { stopReq = i; } if ((chargingInfo[i]->SystemStatus == S_IDLE && chargingInfo[i]->IsAvailable) == YES || (_acgunIndex > 0 && ac_chargingInfo[0]->SystemStatus == S_IDLE && ac_chargingInfo[0]->IsAvailable) ) { idleReq = true; } } if (_acgunIndex > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == DEFAULT_AC_INDEX && ac_chargingInfo[0]->SystemStatus == S_CHARGING) { stopReq = DEFAULT_AC_INDEX; } if (strlen((char *)ShmSysConfigAndInfo->SysConfig.UserId) > 0) { if (_acgunIndex > 0 && stopReq == DEFAULT_AC_INDEX && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == DEFAULT_AC_INDEX) { char value[32]; log_info("ac stop charging \n"); log_info("index = %d, card number = %s, UserId = %s \n", ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc, ac_chargingInfo[0]->StartUserId, ShmSysConfigAndInfo->SysConfig.UserId); memcpy(value, (uint8_t *)ac_chargingInfo[0]->StartUserId, ARRAY_SIZE(ac_chargingInfo[0]->StartUserId)); if (strcmp((char *)ShmSysConfigAndInfo->SysConfig.UserId, value) == EQUAL) { AcChargingTerminalProcess(); } strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, ""); } else if (stopReq < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount && chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus == S_CHARGING && (_acgunIndex <= 0 || (_acgunIndex > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == NO_DEFINE))) { char value[32]; log_info("stop charging \n"); log_info("index = %d, card number = %s, UserId = %s \n", ShmSysConfigAndInfo->SysInfo.CurGunSelected, chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->StartUserId, ShmSysConfigAndInfo->SysConfig.UserId); memcpy(value, (uint8_t *)chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->StartUserId, ARRAY_SIZE(chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->StartUserId)); // 同一張卡直接停掉 if (strcmp((char *)ShmSysConfigAndInfo->SysConfig.UserId, value) == EQUAL) { ChargingTerminalProcess(ShmSysConfigAndInfo->SysInfo.CurGunSelected); strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, ""); } else { // 進驗證 if (_acgunIndex > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == DEFAULT_AC_INDEX) { _authorizeIndex = ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc; } else { _authorizeIndex = ShmSysConfigAndInfo->SysInfo.CurGunSelected; } #if !defined DD360 && !defined DD360Audi && !defined DD360ComBox StartSystemTimeoutDet(Timeout_AuthorizingForStop); AuthorizingStart(); #else strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, ""); #endif //!defined DD360 && !defined DD360Audi } } else if (idleReq) { if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount > 1 && stopReq != 255 && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == YES) { idleReq = false; strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, ""); } else if ((_acgunIndex > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == DEFAULT_AC_INDEX) || chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus == S_IDLE) { log_info("// LCM => Authorizing \n"); #if defined DD360Audi setSelGunWaitToAuthor(ShmSysConfigAndInfo->SysInfo.CurGunSelected); //Jerry add #endif //defined DD360Audi // LCM => Authorizing ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_AUTHORIZING; // 進入確認卡號狀態 AuthorizingStart(); } else { strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, ""); } } else { strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, ""); } } } else { // 透過後臺停止充電的判斷 if (isAuthorizedComplete() #if !defined DD360 && !defined DD360Audi && !defined DD360ComBox || (ShmSysConfigAndInfo->SysInfo.OcppConnStatus == NO && ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING) #endif //!defined DD360 && !defined DD360Audi ) { // 判斷後台回覆狀態 if (canStartCharging() #if !defined DD360 && !defined DD360Audi && !defined DD360ComBox || (ShmSysConfigAndInfo->SysInfo.OcppConnStatus == NO && ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING) #endif //!defined DD360 && !defined DD360Audi ) { if (_authorizeIndex != NO_DEFINE) { // 先找 AC if (_authorizeIndex == DEFAULT_AC_INDEX) { if (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST && strcmp((char *)chargingInfo[_authorizeIndex]->StartUserId, "") != EQUAL) { AcChargingTerminalProcess(); } } else { if (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST && strcmp((char *)chargingInfo[_authorizeIndex]->StartUserId, "") != EQUAL) { ChargingTerminalProcess(_authorizeIndex); } } strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, ""); _authorizeIndex = NO_DEFINE; } } else { strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, ""); } ClearAuthorizedFlag(); } else if (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST) { // 白名單驗證 for (int i = 0; i < 10; i++) { if (strcmp((char *)ShmSysConfigAndInfo->SysConfig.LocalWhiteCard[i], "") != EQUAL) { if (strcmp((char *)ShmSysConfigAndInfo->SysConfig.LocalWhiteCard[i], (char *)ShmSysConfigAndInfo->SysConfig.UserId) == EQUAL) { ChargingTerminalProcess(_authorizeIndex); strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, ""); ClearAuthorizedFlag(); break; } } } } } } void ScannerCardProcess() { if (!isDetectPlugin() && !isCardScan && ShmSysConfigAndInfo->SysWarningInfo.Level != 2 && ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_ENABLE) { isCardScan = true; // 處理刷卡及驗證卡號的動作 UserScanFunction(); } if (ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_AUTHORIZING) { StartSystemTimeoutDet(Timeout_Authorizing); // 確認驗證卡號完成沒 if (isAuthorizedComplete() #if !defined DD360 && !defined DD360Audi && !defined DD360ComBox || ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING #else && gAudiCustInfo->PricesInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected].Balance != FAIL_BALANCE_PRICES #endif //!defined DD360 && !defined DD360Audi ) { StopSystemTimeoutDet(); // 判斷後台回覆狀態 if (canStartCharging() #if !defined DD360 && !defined DD360Audi && !defined DD360ComBox || ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING #endif //!defined DD360 && !defined DD360Audi ) { // LCM => Authorize complete ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_AUTHORIZ_COMP; } else { // LCM => Authorize fail ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_AUTHORIZ_FAIL; strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, ""); } ClearAuthorizedFlag(); } else if (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST) { // 白名單驗證 for (int i = 0; i < 10; i++) { if (strcmp((char *)ShmSysConfigAndInfo->SysConfig.LocalWhiteCard[i], "") != EQUAL) { if (strcmp((char *)ShmSysConfigAndInfo->SysConfig.LocalWhiteCard[i], (char *)ShmSysConfigAndInfo->SysConfig.UserId) == EQUAL) { ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_AUTHORIZ_COMP; ClearAuthorizedFlag(); break; } } } } } else if (ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_AUTHORIZ_FAIL) { StartSystemTimeoutDet(Timeout_VerifyFail); isCardScan = false; } else if (ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_AUTHORIZ_COMP) { StartSystemTimeoutDet(Timeout_VerifyComp); } else if (ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_WAIT_FOR_PLUG) { StartSystemTimeoutDet(Timeout_WaitPlug); } else { isCardScan = false; } } void CreateRfidFork() { pid_t rfidRecPid; rfidRecPid = fork(); log_info("CreateRfidFork = %d\r\n", rfidRecPid); if (rfidRecPid == 0) { while (true) { // 刷卡判斷 RFID rfid; if (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_NO_CHARGING || !ShmSysConfigAndInfo->SysConfig.isRFID) {} else if (getRequestCardSN(rfidFd, 0, &rfid)) { //log_info("Get Card..-%s- \n", ShmSysConfigAndInfo->SysConfig.UserId); if (strlen((char *)ShmSysConfigAndInfo->SysConfig.UserId) == 0) { if (ShmSysConfigAndInfo->SysConfig.RfidCardNumEndian == RFID_ENDIAN_LITTLE) { switch (rfid.snType) { case RFID_SN_TYPE_6BYTE: 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]); break; case RFID_SN_TYPE_7BYTE: 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]); break; case RFID_SN_TYPE_10BYTE: 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]); break; case RFID_SN_TYPE_4BYTE: sprintf((char *) ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3]); break; } } else if (ShmSysConfigAndInfo->SysConfig.RfidCardNumEndian == RFID_ENDIAN_BIG) { switch (rfid.snType) { case RFID_SN_TYPE_6BYTE: 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]); break; case RFID_SN_TYPE_7BYTE: 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]); break; case RFID_SN_TYPE_10BYTE: 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]); break; case RFID_SN_TYPE_4BYTE: sprintf((char *) ShmSysConfigAndInfo->SysConfig.UserId, "%02X%02X%02X%02X", rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]); break; } } log_info("card number = %s\n", ShmSysConfigAndInfo->SysConfig.UserId); } } usleep(500000); } } }