#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" #include "../common.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) { 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(); } } 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(); ShmDcCommonData = (DcCommonInfo*)GetShmDcCommonData(); // 當前非驗證的狀態 if (IsAuthorizingMode()) { isAutorCompleteHandle(&_authorizeIndex); } //當前沒有選槍 if (CheckDispenserGeneration() == _DISPENSER_GENERATION_3_5) { if (getConfirmSelectedGun(pSysInfo->CurGunSelected) == FAIL) { strcpy((char *)pSysConfig->UserId, ""); 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 (IntoChargeProcess(pDcChargingInfo->SystemStatus)) { stopReq = i; } if (((pDcChargingInfo->SystemStatus == S_IDLE || pDcChargingInfo->SystemStatus == S_RESERVATION) && pDcChargingInfo->IsAvailable == YES)) { idleReq = true; } } if (strlen((char *)pSysConfig->UserId) <= 0) { return; } pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(pSysInfo->CurGunSelected); if (stopReq < pSysConfig->TotalConnectorCount && IntoChargeProcess(pDcChargingInfo->SystemStatus)) { 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 (CheckDispenserGeneration() == _DISPENSER_GENERATION_3_5 ) { if (strcmp((char *)pSysConfig->UserId, (char *)ShmDcCommonData->pGunInfo[pSysInfo->CurGunSelected].StartUserId) == EQUAL ) { ChargingTerminalProcess(pSysInfo->CurGunSelected); strcpy((char *)pSysConfig->UserId, ""); return; } } else { if (strcmp((char *)pSysConfig->UserId, (char *)pDcChargingInfo->StartUserId) == 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; } strcpy((char *)pSysConfig->UserId, ""); return; } else if (idleReq) { if (CheckDispenserGeneration() >= _DISPENSER_GENERATION_3_5) { if (pDcChargingInfo->SystemStatus == S_IDLE || pDcChargingInfo->SystemStatus == S_RESERVATION) { log_info("// LCM => Authorizing ID:%s",(char *)pSysConfig->UserId); ShmDcCommonData->pGunInfo[pSysInfo->CurGunSelected].WaitForPlugit = FALSE; setSelGunWaitToAuthor(pSysInfo->CurGunSelected); // LCM => Authorizing pSysInfo->SystemPage = _LCM_AUTHORIZING; // 進入確認卡號狀態 AuthorizingStart(); } else { strcpy((char *)pSysConfig->UserId, ""); } } else { log_info("// LCM => Authorizing ID:%s",(char *)pSysConfig->UserId); for (i = 0; i < pSysConfig->TotalConnectorCount; i++) { pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(i); if (((pDcChargingInfo->SystemStatus == S_IDLE || pDcChargingInfo->SystemStatus == S_RESERVATION) && pDcChargingInfo->IsAvailable == YES)) { ShmDcCommonData->pGunInfo[i].WaitForPlugit = FALSE; setSelGunWaitToAuthor(i); } } // LCM => Authorizing pSysInfo->SystemPage = _LCM_AUTHORIZING; // 進入確認卡號狀態 AuthorizingStart(); } } else { strcpy((char *)pSysConfig->UserId, ""); } return; } bool GetIsCardScan(void) { return isCardScan; } void SetIsCardScan(bool value) { isCardScan = value; } void ScannerCardProcess(void) { 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(); struct ChargingInfoData *pDcChargingInfo = NULL; if (CheckDispenserGeneration() == _DISPENSER_GENERATION_3_5) { if (!isDetectPlugin(pSysInfo->CurGunSelected) && (ShmDcCommonData->LcmPage == _PAGE_SELECT_PAY || ShmDcCommonData->LcmPage == _PAGE_RFID_STOP || ShmDcCommonData->LcmPage == _PAGE_CHARGING || ShmDcCommonData->LcmPage == _PAGE_PRECHARGE) && pSysWarning->Level != WARN_LV_ER) { isCardScan = true; // 處理刷卡及驗證卡號的動作 UserScanFunction(); } } else { if ((!isDetectPlugin(LEFT_GUN_NUM) || !isDetectPlugin(RIGHT_GUN_NUM)) &&!isCardScan && pSysWarning->Level != WARN_LV_ER ) { isCardScan = true; // 處理刷卡及驗證卡號的動作 UserScanFunction(); } } if (pSysInfo->SystemPage == _LCM_AUTHORIZING) { if(!isAuthorizedComplete()) { StartSystemTimeoutDet(Timeout_Authorizing); } else { //StopSystemTimeoutDet(); if (CheckCustomer() == _CUSTOM_AUDI) { StartSystemTimeoutDet(Timeout_WaitBalance); if (ShmSelectGunInfo->PricesInfo[pSysInfo->CurGunSelected].Balance != FAIL_BALANCE_PRICES) { StopSystemTimeoutDet(); // 判斷後台回覆狀態 if (canStartCharging()) { // LCM => Authorize complete pSysInfo->SystemPage = _LCM_AUTHORIZ_COMP; strcpy((char*)ShmDcCommonData->pGunInfo[pSysInfo->CurGunSelected].StartUserId,(char*)pSysConfig->UserId); } else { // LCM => Authorize fail pSysInfo->SystemPage = _LCM_AUTHORIZ_FAIL; strcpy((char *)pSysConfig->UserId, ""); ShmDcCommonData->AuthroizeType = IdTokenType_Central; } } } else { StopSystemTimeoutDet(); // 判斷後台回覆狀態 if (canStartCharging()) { // LCM => Authorize complete pSysInfo->SystemPage = _LCM_AUTHORIZ_COMP; strcpy((char*)ShmDcCommonData->pGunInfo[pSysInfo->CurGunSelected].StartUserId,(char*)pSysConfig->UserId); } else { // LCM => Authorize fail pSysInfo->SystemPage = _LCM_AUTHORIZ_FAIL; strcpy((char *)pSysConfig->UserId, ""); ShmDcCommonData->AuthroizeType = IdTokenType_Central; } } ClearAuthorizedFlag(); } } 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 (CheckCustomer() == _CUSTOM_AUDI) { // Audi RFID endian if (pSysConfig->RfidCardNumEndian == RFID_ENDIAN_LITTLE) { switch (rfid.snType) { 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 if (pSysConfig->RfidCardNumEndian == RFID_ENDIAN_BIG) { switch (rfid.snType) { 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 { if (pSysConfig->RfidCardNumEndian == RFID_ENDIAN_LITTLE) { // RFID Standard switch (rfid.snType) { 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; } } else if (pSysConfig->RfidCardNumEndian == RFID_ENDIAN_BIG) { switch (rfid.snType) { 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; } } } 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) { } } } }