123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- #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"
- //------------------------------------------------------------------------------
- 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);
- }
- }
- }
|