#include /*標準輸入輸出定義*/ #include /*標準函數庫定義*/ #include #include #include "../Config.h" #include "../Log/log.h" #include "../Define/define.h" #include "../ShareMemory/shmMem.h" #include "../SelectGun/SelectGun.h" #include "main.h" #include "../timeout.h" //------------------------------------------------------------------------------ static char *rfidPortName = "/dev/ttyS2"; static bool isCardScan = false; static DcCommonInfo* ShmDcCommonData = NULL; //------------------------------------------------------------------------------ static bool canStartCharging(void) { uint8_t index = 0; char buf2[16] = ""; memset(buf2, 0, ARRAY_SIZE(buf2)); struct OCPP16Data *ShmOCPP16Data = (struct OCPP16Data *)GetShmOCPP16Data(); for (index = 0; index < strlen((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status); index++) { sprintf(buf2 + (index - 1) * 2, "%02X", ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status[index]); } sprintf(buf2, "%s", ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status); // 因為無法得知實際的長度,所以只能用搜尋的方式 if (strcmp(buf2, "Accepted") == EQUAL) { return true; } return false; } static void isAutorCompleteHandle(uint8_t *authorizeIndex) { uint8_t i = 0; struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData(); struct ChargingInfoData *pDcChargingInfo = NULL; // 透過後臺停止充電的判斷 if (isAuthorizedComplete() #if !defined DD360 && !defined DD360Audi && !defined DD360ComBox || (pSysInfo->OcppConnStatus == NO && pSysConfig->OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING) #endif //!defined DD360 && !defined DD360Audi ) { // 判斷後台回覆狀態 if (canStartCharging() == false) { strcpy((char *)pSysConfig->UserId, ""); ClearAuthorizedFlag(); return; } if (*(authorizeIndex) != NO_DEFINE) { pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(*(authorizeIndex)); if (pSysConfig->OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST && strcmp((char *)pDcChargingInfo->StartUserId, "") != EQUAL) { // 先找 AC if (*(authorizeIndex) == DEFAULT_AC_INDEX) { AcChargingTerminalProcess(); } else { ChargingTerminalProcess(*(authorizeIndex)); } } strcpy((char *)pSysConfig->UserId, ""); *(authorizeIndex) = NO_DEFINE; } ClearAuthorizedFlag(); } else if (pSysConfig->OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST) { // 白名單驗證 for (i = 0; i < 10; i++) { if (strcmp((char *)pSysConfig->LocalWhiteCard[i], "") == EQUAL) { continue; } if (strcmp((char *)pSysConfig->LocalWhiteCard[i], (char *)pSysConfig->UserId) == EQUAL) { ChargingTerminalProcess(*(authorizeIndex)); strcpy((char *)pSysConfig->UserId, ""); ClearAuthorizedFlag(); break; } } } } static void UserScanFunction(void) { bool idleReq = false; uint8_t i = 0; uint8_t stopReq = NO_DEFINE; char value[32] = {0}; static uint8_t _authorizeIndex = NO_DEFINE; struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData(); struct SysInfoData *pSysInfo = (struct SysInfoData *)GetShmSysInfoData(); struct ChargingInfoData *pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(0); struct ChargingInfoData *pDcChargingInfo = NULL; GunIndexInfo *pGunIndexInfo = (GunIndexInfo *)GetGunIndexInfo(); // 當前非驗證的狀態 if (IsAuthorizingMode()) { isAutorCompleteHandle(&_authorizeIndex); } //當前沒有選槍 if (getConfirmSelectedGun(pSysInfo->CurGunSelected) == FAIL) { strcpy((char *)pSysConfig->UserId, ""); return; } /* if (pSysConfig->EVCCID_Authorize) { pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(pSysInfo->CurGunSelected); if (strcmp( (char *)pSysConfig->UserId, (char *) pDcChargingInfo->EVCCID) != EQUAL ) return; }*/ // 先判斷現在是否可以提供刷卡 // 1. 如果當前沒有槍是閒置狀態,則無提供刷卡功能 // 2. 停止充電 if (pSysInfo->PageIndex == _LCM_FIX) { strcpy((char *)pSysConfig->UserId, ""); return; } for (i = 0; i < pSysConfig->TotalConnectorCount; i++) { pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(i); if (pDcChargingInfo->SystemStatus == S_CHARGING) { stopReq = i; } if (((pDcChargingInfo->SystemStatus == S_IDLE || pDcChargingInfo->SystemStatus == S_RESERVATION) && pDcChargingInfo->IsAvailable == YES) || (pGunIndexInfo->AcGunIndex > 0 && pAcChargingInfo->SystemStatus == S_IDLE && pAcChargingInfo->IsAvailable) ) { idleReq = true; } } if (pGunIndexInfo->AcGunIndex > 0 && pSysInfo->CurGunSelectedByAc == DEFAULT_AC_INDEX && pAcChargingInfo->SystemStatus == S_CHARGING) { stopReq = DEFAULT_AC_INDEX; } if (strlen((char *)pSysConfig->UserId) <= 0) { return; } pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(pSysInfo->CurGunSelected); if (pGunIndexInfo->AcGunIndex > 0 && stopReq == DEFAULT_AC_INDEX && pSysInfo->CurGunSelectedByAc == DEFAULT_AC_INDEX) { log_info("ac stop charging "); log_info("index = %d, card number = %s, UserId = %s ", pSysInfo->CurGunSelectedByAc, pAcChargingInfo->StartUserId, pSysConfig->UserId); memset(value, 0, sizeof(value)); memcpy(value, (uint8_t *)pAcChargingInfo->StartUserId, ARRAY_SIZE(pAcChargingInfo->StartUserId)); if (strcmp((char *)pSysConfig->UserId, value) == EQUAL) { AcChargingTerminalProcess(); } strcpy((char *)pSysConfig->UserId, ""); } else if (stopReq < pSysConfig->TotalConnectorCount && pDcChargingInfo->SystemStatus == S_CHARGING && (pGunIndexInfo->AcGunIndex <= 0 || (pGunIndexInfo->AcGunIndex > 0 && pSysInfo->CurGunSelectedByAc == NO_DEFINE)) ) { log_info("stop charging "); log_info("index = %d, card number = %s, UserId = %s ", pSysInfo->CurGunSelected, pDcChargingInfo->StartUserId, pSysConfig->UserId); memset(value, 0, sizeof(value)); memcpy(value, (uint8_t *)pDcChargingInfo->StartUserId, ARRAY_SIZE(pDcChargingInfo->StartUserId)); // 同一張卡直接停掉 if (strcmp((char *)pSysConfig->UserId, value) == EQUAL) { ChargingTerminalProcess(pSysInfo->CurGunSelected); strcpy((char *)pSysConfig->UserId, ""); return; } // 進驗證 if (pGunIndexInfo->AcGunIndex > 0 && pSysInfo->CurGunSelectedByAc == DEFAULT_AC_INDEX) { _authorizeIndex = pSysInfo->CurGunSelectedByAc; } else { _authorizeIndex = pSysInfo->CurGunSelected; } #if defined DD360 || defined DD360Audi || defined DD360ComBox strcpy((char *)pSysConfig->UserId, ""); return; #endif //defined DD360 || defined DD360Audi || defined DD360ComBox StartSystemTimeoutDet(Timeout_AuthorizingForStop); AuthorizingStart(); } else if (idleReq) { if (pSysConfig->TotalConnectorCount > 1 && stopReq != 255 && pSysInfo->IsAlternatvieConf == YES) { idleReq = false; strcpy((char *)pSysConfig->UserId, ""); } else if ((pGunIndexInfo->AcGunIndex > 0 && pSysInfo->CurGunSelectedByAc == DEFAULT_AC_INDEX) || pDcChargingInfo->SystemStatus == S_IDLE || pDcChargingInfo->SystemStatus == S_RESERVATION) { log_info("// LCM => Authorizing ID:%s",(char *)pSysConfig->UserId); setSelGunWaitToAuthor(pSysInfo->CurGunSelected); // LCM => Authorizing pSysInfo->SystemPage = _LCM_AUTHORIZING; // 進入確認卡號狀態 AuthorizingStart(); } else { strcpy((char *)pSysConfig->UserId, ""); } } else { strcpy((char *)pSysConfig->UserId, ""); } return; } bool GetIsCardScan(void) { return isCardScan; } void SetIsCardScan(bool value) { isCardScan = value; } void ScannerCardProcess(void) { int i = 0; struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData(); struct SysInfoData *pSysInfo = (struct SysInfoData *)GetShmSysInfoData(); struct WARNING_CODE_INFO *pSysWarning = (struct WARNING_CODE_INFO *)GetShmSysWarningInfo(); SelectGunInfo *ShmSelectGunInfo = (SelectGunInfo *)GetShmSelectGunInfo(); ShmDcCommonData = (DcCommonInfo*)GetShmDcCommonData(); #if defined DD360Audi if (!isDetectPlugin(pSysInfo->CurGunSelected) && #else if ((!isDetectPlugin(LEFT_GUN_NUM) || !isDetectPlugin(RIGHT_GUN_NUM)) && #endif !isCardScan && pSysWarning->Level != WARN_LV_ER /*&& pSysConfig->AuthorisationMode == AUTH_MODE_ENABLE*/) { isCardScan = true; // 處理刷卡及驗證卡號的動作 UserScanFunction(); } if (pSysInfo->SystemPage == _LCM_AUTHORIZING) { if(!isAuthorizedComplete()) StartSystemTimeoutDet(Timeout_Authorizing); //printf("isAuthorizedComplete = %d, %f", isAuthorizedComplete(), ShmSelectGunInfo->PricesInfo[pSysInfo->CurGunSelected].Balance); // 確認驗證卡號完成沒 if (isAuthorizedComplete() /* #if !defined DD360 && !defined DD360Audi && !defined DD360ComBox || pSysConfig->OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING #endif //!defined DD360 && !defined DD360Audi && !defined DD360ComBox */ ) { //StopSystemTimeoutDet(); StartSystemTimeoutDet(Timeout_WaitBalance); if (ShmSelectGunInfo->PricesInfo[pSysInfo->CurGunSelected].Balance != FAIL_BALANCE_PRICES) { StopSystemTimeoutDet(); // 判斷後台回覆狀態 if (canStartCharging()) { // LCM => Authorize complete pSysInfo->SystemPage = _LCM_AUTHORIZ_COMP; } else { // LCM => Authorize fail pSysInfo->SystemPage = _LCM_AUTHORIZ_FAIL; strcpy((char *)pSysConfig->UserId, ""); ShmDcCommonData->AuthroizeType = IdTokenType_Central; } } ClearAuthorizedFlag(); } /*else if (pSysConfig->OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST) { // 白名單驗證 for (i = 0; i < 10; i++) { if (strcmp((char *)pSysConfig->LocalWhiteCard[i], "") == EQUAL) { continue; } if (strcmp((char *)pSysConfig->LocalWhiteCard[i], (char *)pSysConfig->UserId) == EQUAL) { log_info("Local White Card [%d]:%s", i, pSysConfig->LocalWhiteCard[i]); pSysInfo->SystemPage = _LCM_AUTHORIZ_COMP; ClearAuthorizedFlag(); break; } } }*/ } else if (pSysInfo->SystemPage == _LCM_AUTHORIZ_FAIL) { StartSystemTimeoutDet(Timeout_VerifyFail); isCardScan = false; } else if (pSysInfo->SystemPage == _LCM_AUTHORIZ_COMP) { StartSystemTimeoutDet(Timeout_VerifyComp); } else if (pSysInfo->SystemPage == _LCM_WAIT_FOR_PLUG) { //StartGunInfoTimeoutDet(pSysInfo->CurGunSelected, Timeout_WaitPlug); } else { isCardScan = false; } } static int InitialRfidPort(void) { int fd = open(rfidPortName, O_RDWR); struct termios tios; struct AlarmCodeData *pAlarmCode = (struct AlarmCodeData *)GetShmAlarmCodeData(); if (fd != FAIL) { ioctl (fd, TCGETS, &tios); tios.c_cflag = B19200 | CS8 | CLOCAL | CREAD; tios.c_lflag = 0; tios.c_iflag = 0; tios.c_oflag = 0; tios.c_cc[VMIN] = 0; tios.c_cc[VTIME] = (uint8_t) 1; tios.c_lflag = 0; tcflush(fd, TCIFLUSH); ioctl(fd, TCSETS, &tios); } if (fd < 0) { pAlarmCode->AlarmEvents.bits.RfidModuleCommFail = 1; } return fd; } void CreateRfidFork(void) { pid_t rfidRecPid; rfidRecPid = fork(); if (rfidRecPid == 0) { int fd = -1; int isContinue = 1; RFID rfid = {0}; int module_type = MODULE_EWT; fd = InitialRfidPort(); struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData(); ShmDcCommonData = (DcCommonInfo*)GetShmDcCommonData(); //log_info("RFID fork Child's PID is %d", getpid()); while (isContinue) { usleep(500000); // 刷卡判斷 if (pSysConfig->OfflinePolicy == _OFFLINE_POLICY_NO_CHARGING || !pSysConfig->isRFID) { continue; } if (getRequestCardSN(fd, module_type, &rfid) == false) { continue; } //log_info("Get Card..-%s- ", pSysConfig->UserId); if (strlen((char *)pSysConfig->UserId) != 0) { continue; } if (pSysConfig->RfidCardNumEndian == RFID_ENDIAN_LITTLE) { switch (rfid.snType) { #if defined DD360Audi case RFID_SN_TYPE_6BYTE: sprintf((char *) pSysConfig->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 *) pSysConfig->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 *) pSysConfig->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 *) pSysConfig->UserId, "%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3]); break; #else case RFID_SN_TYPE_6BYTE: sprintf((char*)pSysConfig->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*)pSysConfig->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_8BYTE: sprintf((char*)pSysConfig->UserId, "%02X%02X%02X%02X%02X%02X%02X%02X", 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_10BYTE: sprintf((char*)pSysConfig->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*)pSysConfig->UserId, "%02X%02X%02X%02X", rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]); break; #endif } } else if (pSysConfig->RfidCardNumEndian == RFID_ENDIAN_BIG) { switch (rfid.snType) { #if defined DD360Audi case RFID_SN_TYPE_6BYTE: sprintf((char *) pSysConfig->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 *) pSysConfig->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 *) pSysConfig->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 *) pSysConfig->UserId, "%02X%02X%02X%02X", rfid.currentCard[3], rfid.currentCard[2], rfid.currentCard[1], rfid.currentCard[0]); break; #else case RFID_SN_TYPE_6BYTE: sprintf((char*)pSysConfig->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*)pSysConfig->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_8BYTE: sprintf((char*)pSysConfig->UserId, "%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]); break; case RFID_SN_TYPE_10BYTE: sprintf((char*)pSysConfig->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*)pSysConfig->UserId, "%02X%02X%02X%02X", rfid.currentCard[0], rfid.currentCard[1], rfid.currentCard[2], rfid.currentCard[3]); break; #endif } } log_info("card number = %s", pSysConfig->UserId); if (strlen((char*)pSysConfig->UserId) != 0) { ShmDcCommonData->AuthroizeType = IdTokenType_ISO14443; } if (rfid.cardType == ISO14443A) { sethaltCard(fd, module_type); } else if (rfid.cardType == IS014443B) { } else if (rfid.cardType == FELICA) { } } } }