123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537 |
- #include <stdio.h> /*標準輸入輸出定義*/
- #include <stdlib.h> /*標準函數庫定義*/
- #include <string.h>
- #include <stdint.h>
- #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) {
- }
- }
- }
- }
|