|
@@ -31,7 +31,8 @@
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
static DoCommGblData gDoCommGblData = {0};
|
|
|
-static MoreInfoReq gMoreInfoReq = {0};
|
|
|
+static MoreInfoReq gMoreInfoReq[2] = {0};
|
|
|
+//static ChangePageReq gPageReq[2] = {0};
|
|
|
|
|
|
static struct SysConfigData *pSysConfig = NULL;
|
|
|
static struct SysInfoData *pSysInfo = NULL;
|
|
@@ -50,6 +51,11 @@ static struct WARNING_CODE_INFO gPreSysWarningInfo = {0};
|
|
|
|
|
|
// Hexdump
|
|
|
char old_Hexdump[10240];
|
|
|
+static uint8_t RemoteStartNoIDState = NO;
|
|
|
+static uint8_t ReservationState[2] = {0};
|
|
|
+static char ReservationIdTag[2][32];
|
|
|
+static uint8_t DeductResultReq[2] = {0};
|
|
|
+static int LineStatusCode[2] = {0};
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
static void removeFaultCodeToBuf(uint8_t *Code);
|
|
@@ -444,15 +450,15 @@ static int qrCodeUrlInfoHandle(uint8_t *data)
|
|
|
tm->tm_hour,
|
|
|
tm->tm_min);
|
|
|
|
|
|
-
|
|
|
-
|
|
|
//copy QR code string
|
|
|
if (strncmp((char *)localTime, (char *)&data[0], timeLen - 2) != 0) {
|
|
|
memset(pSysConfig->SystemId, '\0', sizeof(pSysConfig->SystemId));
|
|
|
//printf("data = %s", data);
|
|
|
//len =
|
|
|
+
|
|
|
string2ByteArray((char *)data, (uint8_t *)pSysConfig->SystemId);
|
|
|
//printf("SystemId = %s", pSysConfig->SystemId);
|
|
|
+ //log_info("SystemId:%s",pSysConfig->SystemId);
|
|
|
}
|
|
|
sprintf(ShmDcCommonData->PresentTime, "%04d/%02d/%02d",
|
|
|
tm->tm_year + 1900,
|
|
@@ -583,7 +589,7 @@ static int miscCommandHandle(uint8_t dataLen, uint8_t plugNum, uint8_t *data)
|
|
|
case MISC_CMD_DEFAULT_PRICES:
|
|
|
prices = transPricesUnit((int)value);
|
|
|
log_info("default prices = %.2f", prices);
|
|
|
-
|
|
|
+ ShmDcCommonData->ChargingRate = prices;
|
|
|
//pSysConfig->BillingData.isBilling = YES;
|
|
|
for (j = 0; j < 24; j++) {
|
|
|
pSysConfig->BillingData.Fee[j] = prices;
|
|
@@ -776,13 +782,55 @@ static int miscCommandHandle(uint8_t dataLen, uint8_t plugNum, uint8_t *data)
|
|
|
//clearMiscCommand();
|
|
|
break;
|
|
|
case MISC_CMD_RESERVATION:
|
|
|
+ if(value != YES)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ gMoreInfoReq[plugNum].bits.ReservationReq = YES;
|
|
|
break;
|
|
|
case MISC_CMD_CHANGE_LCM_PAGE:
|
|
|
+ if(value == LCM_PAGE_REMOTE_START_NO_ID)
|
|
|
+ {
|
|
|
+ gMoreInfoReq[plugNum].bits.RemoteStartNoID = YES;
|
|
|
+ }
|
|
|
+ /*
|
|
|
+ if(value == LCM_PAGE_JOIN_LINE)
|
|
|
+ {
|
|
|
+ if(!gPageReq[plugNum].bits.JoinLine)
|
|
|
+ {
|
|
|
+ log_info("Gun %d JoinLine page is trigger", plugNum);
|
|
|
+ }
|
|
|
+ gPageReq[plugNum].bits.JoinLine = YES;
|
|
|
+ }
|
|
|
+ if(value == LCM_PAGE_PAYMENT_SWITCH)
|
|
|
+ {
|
|
|
+ if(!gPageReq[plugNum].bits.PaymentSwitch)
|
|
|
+ {
|
|
|
+ log_info("Gun %d PaymentSwitch page is trigger", plugNum);
|
|
|
+ }
|
|
|
+ gPageReq[plugNum].bits.PaymentSwitch = YES;
|
|
|
+ }*/
|
|
|
break;
|
|
|
case MISC_CMD_QR_CODE_REQ:
|
|
|
break;
|
|
|
case MISC_CMD_STATION_INFO_REQ:
|
|
|
- gMoreInfoReq.bits.StationInfoReq = YES;
|
|
|
+ if(value != YES)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ gMoreInfoReq[plugNum].bits.StationInfoReq = YES;
|
|
|
+ break;
|
|
|
+ case MISC_CMD_FINAL_COST_REQ:
|
|
|
+ if(value != YES)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ gMoreInfoReq[plugNum].bits.FinalCostReq = YES;
|
|
|
+ break;
|
|
|
+ case MISC_CMD_LINE_STATUS_REQ:
|
|
|
+ LineStatusCode[plugNum] = value;
|
|
|
+ ShmDcCommonData->LineStatus[plugNum] = value;
|
|
|
+ log_info("Gun %d Line Status Code: %d", plugNum, LineStatusCode[plugNum]);
|
|
|
break;
|
|
|
|
|
|
default:
|
|
@@ -1074,6 +1122,9 @@ static int responsePackeHandle(int fd, uint8_t *pResult, uint8_t plugNum, uint8_
|
|
|
log_info("OK (Left connector ID = %d, Right connector ID = %d)",
|
|
|
pCsuResult->Data.Data[0],
|
|
|
pCsuResult->Data.Data[1]);
|
|
|
+ ShmDcCommonData->ConnectorID[0] = pCsuResult->Data.Data[0];
|
|
|
+ ShmDcCommonData->ConnectorID[1] = pCsuResult->Data.Data[1];
|
|
|
+
|
|
|
break;
|
|
|
|
|
|
case REG_POWER_CABINET_STATUS:
|
|
@@ -1187,6 +1238,39 @@ static int responsePackeHandle(int fd, uint8_t *pResult, uint8_t plugNum, uint8_
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
+ case REG_RESERVATION_IDTAG:
|
|
|
+ if (pCsuResult->Data.Result == COMMAND_RESULT_NG) {
|
|
|
+ return COMMAND_RESULT_NG;
|
|
|
+ }
|
|
|
+ uint8_t reservationState = pCsuResult->Data.Data[0] == YES ? YES : NO;
|
|
|
+ memset(&ReservationIdTag[plugNum][0], 0x00, 32);
|
|
|
+ if(reservationState)
|
|
|
+ {
|
|
|
+ strcpy(&ReservationIdTag[plugNum][0], (char *)&pCsuResult->Data.Data[1]);
|
|
|
+ }
|
|
|
+ if(reservationState != ReservationState[plugNum])
|
|
|
+ {
|
|
|
+ log_info("id = %d reservation is %s", pCsuResult->Head.ID, reservationState ? "trigger" : "expired");
|
|
|
+ if(reservationState)
|
|
|
+ {
|
|
|
+ log_info("id = %d reservation idTag: %s", pCsuResult->Head.ID, (char *)&ReservationIdTag[plugNum][0]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ReservationState[plugNum] = reservationState;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case REG_REMOTE_START_NO_ID:
|
|
|
+ if (pCsuResult->Data.Result == COMMAND_RESULT_NG) {
|
|
|
+ return COMMAND_RESULT_NG;
|
|
|
+ }
|
|
|
+ uint8_t remoteStartNoIdState = pCsuResult->Data.Data[0] == YES ? YES : NO;
|
|
|
+ if(remoteStartNoIdState != RemoteStartNoIDState)
|
|
|
+ {
|
|
|
+ log_info("RemoteStartNoID is %s", remoteStartNoIdState ? "trigger" : "expired");
|
|
|
+ }
|
|
|
+ RemoteStartNoIDState = remoteStartNoIdState;
|
|
|
+ break;
|
|
|
+
|
|
|
case REG_STATION_INFO:
|
|
|
if (pCsuResult->Data.Result == COMMAND_RESULT_NG) {
|
|
|
return COMMAND_RESULT_NG;
|
|
@@ -1194,28 +1278,35 @@ static int responsePackeHandle(int fd, uint8_t *pResult, uint8_t plugNum, uint8_
|
|
|
StationVar _stationInfo;
|
|
|
memset((char *)&_stationInfo, 0x00, sizeof(StationVar));
|
|
|
|
|
|
- memcpy(_stationInfo.StationName, (char *)&pCsuResult->Data.Data[0], 64);
|
|
|
- memcpy(_stationInfo.StationID, (char *)&pCsuResult->Data.Data[64], 16);
|
|
|
- _stationInfo.WeatherID |= (pCsuResult->Data.Data[80] << 24);
|
|
|
- _stationInfo.WeatherID |= (pCsuResult->Data.Data[81] << 16);
|
|
|
- _stationInfo.WeatherID |= (pCsuResult->Data.Data[82] << 8);
|
|
|
- _stationInfo.WeatherID |= pCsuResult->Data.Data[83];
|
|
|
+ _stationInfo.StationID = (pCsuResult->Data.Data[0] << 24) +
|
|
|
+ (pCsuResult->Data.Data[1] << 16) +
|
|
|
+ (pCsuResult->Data.Data[2] << 8) +
|
|
|
+ pCsuResult->Data.Data[3];
|
|
|
+ memcpy(_stationInfo.StationName, (char *)&pCsuResult->Data.Data[4], 64);
|
|
|
+ _stationInfo.WeatherID |= (pCsuResult->Data.Data[68] << 24);
|
|
|
+ _stationInfo.WeatherID |= (pCsuResult->Data.Data[69] << 16);
|
|
|
+ _stationInfo.WeatherID |= (pCsuResult->Data.Data[70] << 8);
|
|
|
+ _stationInfo.WeatherID |= pCsuResult->Data.Data[71];
|
|
|
uint8_t *pFloat = (uint8_t *)&_stationInfo.Temperature;
|
|
|
- *(pFloat + 3) = pCsuResult->Data.Data[84];
|
|
|
- *(pFloat + 2) = pCsuResult->Data.Data[85];
|
|
|
- *(pFloat + 1) = pCsuResult->Data.Data[86];
|
|
|
- *(pFloat) = pCsuResult->Data.Data[87];
|
|
|
+ *(pFloat + 3) = pCsuResult->Data.Data[72];
|
|
|
+ *(pFloat + 2) = pCsuResult->Data.Data[73];
|
|
|
+ *(pFloat + 1) = pCsuResult->Data.Data[74];
|
|
|
+ *(pFloat) = pCsuResult->Data.Data[75];
|
|
|
|
|
|
ShmDcCommonData->WeatherID = _stationInfo.WeatherID;
|
|
|
ShmDcCommonData->Temperature = _stationInfo.Temperature;
|
|
|
+ ShmDcCommonData->Location = atoi(_stationInfo.StationName);
|
|
|
|
|
|
- log_info("Station Name: %s, ID: %s, Weather: %d, Temperature: %.1f",
|
|
|
+ log_info("Station Name: %s, ID: %d, Weather: %d, Temperature: %.1f",
|
|
|
_stationInfo.StationName,
|
|
|
_stationInfo.StationID,
|
|
|
_stationInfo.WeatherID,
|
|
|
_stationInfo.Temperature);
|
|
|
break;
|
|
|
|
|
|
+ case REG_DEDUCT_INFO:
|
|
|
+ break;
|
|
|
+
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
@@ -1287,6 +1378,38 @@ static int composeSocketData(int fd,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static int readReservationState(int fd, uint8_t id)
|
|
|
+{
|
|
|
+ int ret = PASS;
|
|
|
+
|
|
|
+ if ((ret = composeSocketData(fd,
|
|
|
+ id,
|
|
|
+ OP_READ_DATA,
|
|
|
+ REG_RESERVATION_IDTAG,
|
|
|
+ 0,
|
|
|
+ NULL)) == FAIL) {
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+static int readRemoteStartNoIDState(int fd)
|
|
|
+{
|
|
|
+ int ret = PASS;
|
|
|
+
|
|
|
+ if ((ret = composeSocketData(fd,
|
|
|
+ ID_REGISTER,
|
|
|
+ OP_READ_DATA,
|
|
|
+ REG_REMOTE_START_NO_ID,
|
|
|
+ 0,
|
|
|
+ NULL)) == FAIL) {
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
static int readChargerStationInfo(int fd)
|
|
|
{
|
|
|
int ret = PASS;
|
|
@@ -1303,6 +1426,37 @@ static int readChargerStationInfo(int fd)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static int writeDeductInfo(int fd, uint8_t id,uint8_t gunIndex)
|
|
|
+{
|
|
|
+ int ret = PASS;
|
|
|
+ uint8_t dataBuf[6] = {0};
|
|
|
+ DeductInfoVar DeductInfo;
|
|
|
+
|
|
|
+ DeductInfo.Amount = ShmDcCommonData->finalcost[gunIndex];
|
|
|
+ DeductInfo.DeductResult = ShmDcCommonData->PayPass_flag[gunIndex];
|
|
|
+ DeductInfo.IsDonateInvoice = ShmDcCommonData->donate_flag[gunIndex];
|
|
|
+
|
|
|
+ dataBuf[0] = DeductInfo.DeductResult;
|
|
|
+ dataBuf[1] = DeductInfo.IsDonateInvoice;
|
|
|
+ dataBuf[2] = (DeductInfo.Amount >> 24) & 0xFF;
|
|
|
+ dataBuf[3] = (DeductInfo.Amount >> 16) & 0xFF;
|
|
|
+ dataBuf[4] = (DeductInfo.Amount >> 8) & 0xFF;
|
|
|
+ dataBuf[5] = (DeductInfo.Amount & 0xFF);
|
|
|
+
|
|
|
+ // copy deduct result to dataBuf here
|
|
|
+
|
|
|
+ if ((ret = composeSocketData(fd,
|
|
|
+ id,
|
|
|
+ OP_WRITE_DATA,
|
|
|
+ REG_DEDUCT_INFO,
|
|
|
+ 6,
|
|
|
+ &dataBuf[0])) == FAIL) {
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
static int writeWaitPlugItState(int fd, uint8_t id)
|
|
|
{
|
|
|
int ret = PASS;
|
|
@@ -1866,12 +2020,21 @@ static int messageTrigger(int fd, uint8_t plugNum, uint8_t gunID, uint8_t curReg
|
|
|
writeDispenserStatus(fd, gunID);
|
|
|
ftime(&gRegTimeUp[plugNum][curReg]);
|
|
|
}
|
|
|
- curReg = REG_PLUG_IN_STATE;
|
|
|
+ curReg = REG_CHARGING_CAP;
|
|
|
break;
|
|
|
|
|
|
- //case REG_CHARGING_CAP:
|
|
|
- // readChargingCapability(fd, plugNum, gunID);
|
|
|
- // break;
|
|
|
+ case REG_CHARGING_CAP:
|
|
|
+ if(gMoreInfoReq[plugNum].bits.FinalCostReq)
|
|
|
+ {
|
|
|
+ readChargingCapability(fd, gunID);
|
|
|
+ gMoreInfoReq[plugNum].bits.FinalCostReq = false;
|
|
|
+ pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(plugNum);
|
|
|
+ ShmDcCommonData->finalcost[plugNum] = (int)pDcChargingInfo->ChargingFee;
|
|
|
+ ShmDcCommonData->finalcost_flag[plugNum] = TRUE;
|
|
|
+ log_info("Gun %d get final cost", plugNum);
|
|
|
+ }
|
|
|
+ curReg = REG_PLUG_IN_STATE;
|
|
|
+ break;
|
|
|
|
|
|
//case REG_CHARGING_TARGET:
|
|
|
// writeChargingTarget(fd, plugNum, gunID);
|
|
@@ -1923,19 +2086,15 @@ static int messageTrigger(int fd, uint8_t plugNum, uint8_t gunID, uint8_t curReg
|
|
|
// break;
|
|
|
|
|
|
case REG_MISC_CONTROL:
|
|
|
- gMoreInfoReq.Value = 0;
|
|
|
readMiscCommand(fd, gunID);
|
|
|
|
|
|
- if(gMoreInfoReq.Value == 0)
|
|
|
+ if(gMoreInfoReq[plugNum].Value == 0)
|
|
|
{
|
|
|
isContinue = 0;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- if(gMoreInfoReq.bits.StationInfoReq)
|
|
|
- {
|
|
|
- curReg = REG_STATION_INFO;
|
|
|
- }
|
|
|
+ curReg = REG_RESERVATION_IDTAG;
|
|
|
}
|
|
|
break;
|
|
|
|
|
@@ -1977,8 +2136,8 @@ static int messageTrigger(int fd, uint8_t plugNum, uint8_t gunID, uint8_t curReg
|
|
|
log_error("misc command failed = %x", gDoCommGblData.MiscCmd);
|
|
|
}
|
|
|
curReg = gDoCommGblData.MiscCmd;
|
|
|
- } else if(gMoreInfoReq.bits.StationInfoReq) {
|
|
|
- curReg = REG_STATION_INFO;
|
|
|
+ } else if (gMoreInfoReq[plugNum].Value != 0) {
|
|
|
+ curReg = REG_RESERVATION_IDTAG;
|
|
|
} else {
|
|
|
isContinue = 0;
|
|
|
}
|
|
@@ -2006,30 +2165,66 @@ static int messageTrigger(int fd, uint8_t plugNum, uint8_t gunID, uint8_t curReg
|
|
|
// break;
|
|
|
|
|
|
case REG_RESERVATION_IDTAG:
|
|
|
+ if(gMoreInfoReq[plugNum].bits.ReservationReq)
|
|
|
+ {
|
|
|
+ if (DiffTimeb(gRegTimeUp[plugNum][curReg], NowTime) > LOOP_RETRY_TIME ||
|
|
|
+ DiffTimeb(gRegTimeUp[plugNum][curReg], NowTime) < 0) {
|
|
|
+ if(readReservationState(fd, gunID) == PASS)
|
|
|
+ {
|
|
|
+ gMoreInfoReq[plugNum].bits.ReservationReq = ReservationState[plugNum] == NO ? NO : YES;
|
|
|
+ }
|
|
|
+ ftime(&gRegTimeUp[plugNum][curReg]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ curReg = REG_REMOTE_START_NO_ID;
|
|
|
break;
|
|
|
|
|
|
//case REG_DISPENSER_REQUEST:
|
|
|
// break;
|
|
|
|
|
|
case REG_REMOTE_START_NO_ID:
|
|
|
+ if(gMoreInfoReq[plugNum].bits.RemoteStartNoID)
|
|
|
+ {
|
|
|
+ if (DiffTimeb(gRegTimeUp[plugNum][curReg], NowTime) > LOOP_RETRY_TIME ||
|
|
|
+ DiffTimeb(gRegTimeUp[plugNum][curReg], NowTime) < 0) {
|
|
|
+ if(readRemoteStartNoIDState(fd) == PASS)
|
|
|
+ {
|
|
|
+ gMoreInfoReq[plugNum].bits.RemoteStartNoID = RemoteStartNoIDState == NO ? NO : YES;
|
|
|
+ }
|
|
|
+ ftime(&gRegTimeUp[plugNum][curReg]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ curReg = REG_REFUND_AMOUNT;
|
|
|
break;
|
|
|
|
|
|
case REG_REFUND_AMOUNT:
|
|
|
+ curReg = REG_PREPAYMENT_INFO;
|
|
|
break;
|
|
|
|
|
|
case REG_PREPAYMENT_INFO:
|
|
|
+ curReg = REG_PAYMENT_FAIL_REASON;
|
|
|
break;
|
|
|
|
|
|
case REG_PAYMENT_FAIL_REASON:
|
|
|
+ curReg = REG_CONNECTOR_QR_CODE;
|
|
|
break;
|
|
|
|
|
|
case REG_CONNECTOR_QR_CODE:
|
|
|
+ curReg = REG_STATION_INFO;
|
|
|
break;
|
|
|
|
|
|
case REG_STATION_INFO:
|
|
|
- if(readChargerStationInfo(fd) == PASS)
|
|
|
+ if(gMoreInfoReq[plugNum].bits.StationInfoReq)
|
|
|
{
|
|
|
- gMoreInfoReq.bits.StationInfoReq = NO;
|
|
|
+ if (DiffTimeb(gRegTimeUp[plugNum][curReg], NowTime) > LOOP_RETRY_TIME ||
|
|
|
+ DiffTimeb(gRegTimeUp[plugNum][curReg], NowTime) < 0) {
|
|
|
+
|
|
|
+ if(readChargerStationInfo(fd) == PASS)
|
|
|
+ {
|
|
|
+ gMoreInfoReq[plugNum].bits.StationInfoReq = NO;
|
|
|
+ }
|
|
|
+ ftime(&gRegTimeUp[plugNum][curReg]);
|
|
|
+ }
|
|
|
}
|
|
|
isContinue = 0;
|
|
|
break;
|
|
@@ -2071,6 +2266,10 @@ static void systemStatusProcess(int fd, uint8_t totalGun, uint8_t plugNum, uint8
|
|
|
case S_MAINTAIN:
|
|
|
case S_ALARM:
|
|
|
case S_AUTHORIZING:
|
|
|
+ if(pDcChargingInfo->SystemStatus != S_ALARM)
|
|
|
+ {
|
|
|
+ DeductResultReq[plugNum] = NO;
|
|
|
+ }
|
|
|
checkAuthorProcess(fd, plugNum);
|
|
|
|
|
|
//authorization complete, write wait plug it state
|
|
@@ -2094,7 +2293,6 @@ static void systemStatusProcess(int fd, uint8_t totalGun, uint8_t plugNum, uint8
|
|
|
ftime(&gRegTimeUp[plugNum][REG_MISC_CONTROL]);
|
|
|
}
|
|
|
*/
|
|
|
-
|
|
|
ftime(&AuthNowTime);
|
|
|
if (DiffTimeb(gRegTimeUp[plugNum][REG_CHARGING_CAP], AuthNowTime) > LOOP_RETRY_TIME ||
|
|
|
DiffTimeb(gRegTimeUp[plugNum][REG_CHARGING_CAP], AuthNowTime) < 0
|
|
@@ -2104,6 +2302,14 @@ static void systemStatusProcess(int fd, uint8_t totalGun, uint8_t plugNum, uint8
|
|
|
writeGroundFaultDetection(fd, 0, gunID);
|
|
|
ftime(&gRegTimeUp[plugNum][REG_CHARGING_CAP]);
|
|
|
}
|
|
|
+ if(!DeductResultReq[plugNum] && pDcChargingInfo->SystemStatus == S_ALARM &&
|
|
|
+ ShmDcCommonData->finalcost_flag[plugNum] == TRUE)
|
|
|
+ {
|
|
|
+ DeductResultReq[plugNum] = YES;
|
|
|
+ log_info("Write Gun %d Deduct Result", plugNum);
|
|
|
+ writeDeductInfo(fd, gunID,plugNum);
|
|
|
+ ShmDcCommonData->finalcost_flag[plugNum] = FALSE;
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
case S_PREPARNING: //get permission
|
|
@@ -2268,6 +2474,16 @@ static void systemStatusProcess(int fd, uint8_t totalGun, uint8_t plugNum, uint8
|
|
|
writeGroundFaultDetection(fd, 0, gunID);
|
|
|
ftime(&gRegTimeUp[plugNum][REG_CHARGING_CAP]);
|
|
|
}
|
|
|
+ if(!DeductResultReq[plugNum] &&
|
|
|
+ (pDcChargingInfo->SystemStatus == S_COMPLETE ||
|
|
|
+ pDcChargingInfo->SystemStatus == S_TERMINATING) &&
|
|
|
+ ShmDcCommonData->finalcost_flag[plugNum] == TRUE)
|
|
|
+ {
|
|
|
+ DeductResultReq[plugNum] = YES;
|
|
|
+ log_info("Write Gun %d Deduct Result", plugNum);
|
|
|
+ writeDeductInfo(fd, gunID,plugNum);
|
|
|
+ ShmDcCommonData->finalcost_flag[plugNum] = FALSE;
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
default:
|