Jelajahi Sumber

2022-03-17 / Wendell

Actions
1. [add] reader status
2. [mod] improve ReportCreditDeductReq logic
3. modify subVersion to 04

Files
1. As follow commit history

Image version : V1.10.XX.XXXX.XX
Wendell 3 tahun lalu
induk
melakukan
f2aa5b11f1

+ 21 - 3
EVSE/Projects/DO360/Apps/Config.h

@@ -64,6 +64,8 @@ typedef unsigned char               byte;
 #define AUTHORIZE_COMPLETED_TIME    3
 #define STARTTRANSATION_IMMEDIATELY
 
+#define ENABLE_PCBA_TEST            0
+
 // **********  Audi ********** //
 // Model Name: DOYC182000D2AD
 // Model Name: DDYC182V0UE2AD
@@ -1019,14 +1021,16 @@ typedef union
 
 typedef struct
 {
+    unsigned char ConnectorId;              // Connector Id
     unsigned char DeductReq;                // 0: no request,       1: deduct request
-    unsigned char res;
+    unsigned char ReaderStatusReq;          // 0: no request,       1: reader status request
     int TransactionId;
-    unsigned char creditNo[64];
+    unsigned char creditNo[20];
     unsigned char DeductResult;             // DeductResult,        0: Fail, 1: Pass
     unsigned char IsDonateInvoice;          // IsDonateInvoice,     0: Do not donate, 1: Donate
     int DeductAmount;                       // DeductAmount,        unit = 0.01 dollar
-    char ApprovalNumber[12];                // ApprovalNumber
+    char ApprovalNumber[9];                 // ApprovalNumber
+    char VemData[64];                       // Vem Data
 }DeductResultInfoData;
 
 typedef struct
@@ -1076,6 +1080,19 @@ typedef struct
     float AccountBalance;                   // connector user's account balance, unit: 1 dollar
     float CostDiscount;                     // connector user's account balance, unit: 1 dollar
 }TransactionInfoData;
+
+enum DeductResult
+{
+    _Deduct_Fail    = 0x0,                  // deduct fail
+    _Deduct_Pass    = 0x1,                  // deduct pass
+    _Deduct_Cancel  = 0x2,                  // pre-auth cancel
+    _Deduct_PreAuth = 0x3,                  // pre-auth
+};
+
+#define STR_DEDUCT_FAIL             "Deduct Fail"
+#define STR_DEDUCT_PASS             "Deduct Pass"
+#define STR_DEDUCT_CANCEL           "PreAuth Cancel"
+#define STR_DEDUCT_PREAUTH          "PreAuth OK"
 // ************************************************************************************************* //
 
 typedef struct
@@ -1096,6 +1113,7 @@ typedef struct
     TransactionInfoData UserTransaction[MAX_GROUP_QUANTITY];
     DeductResultInfoData DeductResultReq[MAX_GROUP_QUANTITY];
     DeductResultInfoData ReDeductReq;
+    DeductResultInfoData ReaderStatus[MAX_GROUP_QUANTITY];
     LineApiStatusInfo LineApi;
 }ChargerInfoData;
 

+ 4 - 0
EVSE/Projects/DO360/Apps/FactoryConfig.c

@@ -210,7 +210,11 @@ int main(int argc,char *argv[])
 	strcpy((char *) SysConfig.Eth0Interface.EthSubmaskAddress, "255.255.255.0");
 	strcpy((char *) SysConfig.Eth0Interface.EthGatewayAddress, "192.168.1.254");
 	SysConfig.Eth1Interface.EthDhcpClient = 0;
+#if ENABLE_PCBA_TEST == 0
 	strcpy((char *) SysConfig.Eth1Interface.EthIpAddress, "192.168.100.1");
+#else
+	strcpy((char *) SysConfig.Eth1Interface.EthIpAddress, "192.168.0.10");
+#endif
 	strcpy((char *) SysConfig.Eth1Interface.EthSubmaskAddress, "255.255.255.0");
 	strcpy((char *) SysConfig.Eth1Interface.EthGatewayAddress, "192.168.100.254");
 	SysConfig.AthInterface.WifiMode = 0;

+ 17 - 0
EVSE/Projects/DO360/Apps/Module_ChargerSelfTest.c

@@ -300,6 +300,23 @@ int main(void)
             }
         }
 
+        if(ShmChargerInfo->Control.TestCtrl.bits.ChargingSimulation)
+        {
+            if(ShmSysConfigAndInfo->SysInfo.SelfTestSeq != _STEST_COMPLETE)
+            {
+                ShmSysConfigAndInfo->SysInfo.SelfTestSeq = _STEST_COMPLETE;
+                ShmSysConfigAndInfo->SysInfo.BootingStatus = BOOT_COMPLETE;
+
+                for(int i = 0; i < CONNECTOR_QUANTITY; i++)
+                {
+                    ShmChargerInfo->Control.GunAvailable[i] = YES;
+                }
+                LOG_INFO("Self Test Pass In Simulation Mode!");
+            }
+            sleep(1);
+            continue;
+        }
+
         _selfTest = ShmChargerInfo->Control.SelfTestStep;
 
         switch(_selfTest)

+ 88 - 27
EVSE/Projects/DO360/Apps/Module_EvComm.c

@@ -3489,13 +3489,24 @@ unsigned char WriteDeductResultHandler(struct PACKET_STRUCTURE *packet, int disp
     DeductResultInfoData deduct;
     bool done = false;
 
+    char appNo[10];
+    char vemData[65];
+    char cardNo[21];
+
+    char *str_ReaderStatus[] = {STR_DEDUCT_FAIL, STR_DEDUCT_PASS, STR_DEDUCT_CANCEL, STR_DEDUCT_PREAUTH};
+
+    memset(appNo, 0x00, sizeof(appNo));
+    memset(vemData, 0x00, sizeof(vemData));
+    memset(cardNo, 0x00, sizeof(cardNo));
+
     if(find || packet->Header.id == 0xFF)
     {
-        gun = packet->Header.id - 1;
-
         memset(&deduct, 0x00, sizeof(DeductResultInfoData));
 
-        deduct.DeductResult = packet->Payload.data[0] == YES ? YES : NO;
+        deduct.ConnectorId = packet->Header.id != 0xFF ?
+            packet->Header.id : ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].ConnectorID[0];
+        gun = packet->Header.id - 1;
+        deduct.DeductResult = packet->Payload.data[0];
         deduct.IsDonateInvoice = packet->Payload.data[1] == YES ? YES : NO;
         deduct.TransactionId = (packet->Payload.data[2] << 24) +
                                (packet->Payload.data[3] << 16) +
@@ -3506,44 +3517,94 @@ unsigned char WriteDeductResultHandler(struct PACKET_STRUCTURE *packet, int disp
                               (packet->Payload.data[8] << 8) +
                               packet->Payload.data[9];
         memcpy(deduct.ApprovalNumber, (char *)&packet->Payload.data[10], sizeof(deduct.ApprovalNumber));
+        memcpy(appNo, deduct.ApprovalNumber, sizeof(deduct.ApprovalNumber));
 
-        if(packet->Header.id != 0xFF)
+        if(packet->Header.len >= 84)
+        {
+            memcpy(deduct.VemData, (char *)&packet->Payload.data[19], sizeof(deduct.VemData));
+            memcpy(vemData, deduct.VemData, sizeof(deduct.VemData));
+        }
+        if(packet->Header.len >= 104)
         {
-            if(deduct.TransactionId == ShmChargerInfo->DeductResultReq[gun].TransactionId)
+            memcpy(deduct.creditNo, (char *)&packet->Payload.data[83], sizeof(deduct.creditNo));
+            memcpy(cardNo, deduct.creditNo, sizeof(deduct.creditNo));
+        }
+
+        if(deduct.DeductResult == _Deduct_Fail || deduct.DeductResult == _Deduct_Pass)
+        {
+            if(packet->Header.id != 0xFF)
             {
-                ShmChargerInfo->DeductResultReq[gun].DeductResult = deduct.DeductResult;
-                ShmChargerInfo->DeductResultReq[gun].IsDonateInvoice = deduct.IsDonateInvoice;
-                ShmChargerInfo->DeductResultReq[gun].DeductAmount = deduct.DeductAmount;
-                memcpy(ShmChargerInfo->DeductResultReq[gun].ApprovalNumber, deduct.ApprovalNumber, sizeof(deduct.ApprovalNumber));
-                ShmChargerInfo->DeductResultReq[gun].DeductReq = YES;
+                if(deduct.TransactionId == ShmChargerInfo->DeductResultReq[gun].TransactionId)
+                {
+                    if(!ShmChargerInfo->DeductResultReq[gun].DeductReq)
+                    {
+                        memcpy(&ShmChargerInfo->DeductResultReq[gun], &deduct, sizeof(DeductResultInfoData));
+                        ShmChargerInfo->DeductResultReq[gun].DeductReq = YES;
+                        done = true;
+                    }
+                    LOG_INFO("Gun %d [%s] %s", gun + 1, str_ReaderStatus[deduct.DeductResult], done ? "Done" : "Wait");
+                    LOG_INFO("Gun %d TxId: [%d], Card: [%s], [%s], Amount: [%d.%02d], Donate: [%s], ApprovalNo: [%s], VemData: [%s]",
+                            gun + 1,
+                            deduct.TransactionId,
+                            cardNo,
+                            str_ReaderStatus[deduct.DeductResult],
+                            (deduct.DeductAmount / 100), (deduct.DeductAmount % 100),
+                            deduct.IsDonateInvoice ? "Yes" : "No",
+                            appNo,
+                            vemData);
+                    return done;
+                }
+            }
 
-                LOG_INFO("Gun %d TxId: [%d], Deduct: [%s%s], Amount: [%d.%02d], Donate: [%s], ApprovalNo: [%s]",
+            if(!done)
+            {
+                if(!ShmChargerInfo->ReDeductReq.DeductReq)
+                {
+                    memcpy(&ShmChargerInfo->ReDeductReq, &deduct, sizeof(DeductResultInfoData));
+                    ShmChargerInfo->ReDeductReq.DeductReq = YES;
+                    done = true;
+                }
+                LOG_INFO("Gun %d%s ReDeduct %s",
+                    gun + 1, packet->Header.id != 0xFF ? "" : "(Default)", done ? "Done" : "Wait");
+                LOG_INFO("Gun %d ReDeduct TxId: [%d], Card: [%s], [%s], Amount: [%d.%02d], Donate: [%s], ApprovalNo: [%s], VemData: [%s]",
                         gun + 1,
                         deduct.TransactionId,
-                        deduct.DeductResult ? "OK" : "NG",
-                        packet->Payload.data[0] == 2 ? "(Cancel)" : "",
+                        cardNo,
+                        str_ReaderStatus[deduct.DeductResult],
                         (deduct.DeductAmount / 100), (deduct.DeductAmount % 100),
                         deduct.IsDonateInvoice ? "Yes" : "No",
-                        deduct.ApprovalNumber);
-                done = true;
+                        appNo,
+                        vemData);
+                return done;
             }
         }
-
-        if(!done)
+        else if(deduct.DeductResult == _Deduct_Cancel || deduct.DeductResult == _Deduct_PreAuth)
         {
-            if(!ShmChargerInfo->ReDeductReq.DeductReq)
+            if(packet->Header.id != 0xFF)
+            {
+                if(!ShmChargerInfo->ReaderStatus[gun].ReaderStatusReq)
+                {
+                    memcpy(&ShmChargerInfo->ReaderStatus[gun], &deduct, sizeof(DeductResultInfoData));
+                    ShmChargerInfo->ReaderStatus[gun].ReaderStatusReq = YES;
+                    done = true;
+                }
+                LOG_INFO("Gun %d [%s] %s", gun + 1, str_ReaderStatus[deduct.DeductResult], done ? "Done" : "Wait");
+                LOG_INFO("Gun %d %s, Card: [%s], ApprovalNo: [%s], VemData: [%s]",
+                        gun + 1,
+                        str_ReaderStatus[deduct.DeductResult],
+                        cardNo,
+                        appNo,
+                        vemData);
+                return done;
+            }
+            else
             {
-                memcpy(&ShmChargerInfo->ReDeductReq, &deduct, sizeof(DeductResultInfoData));
-                ShmChargerInfo->ReDeductReq.DeductReq = YES;
-                done = true;
                 find = true;
             }
-            LOG_INFO("Dispenser ReDeduct %s, TxId: [%d] Result: [%s], Amount: [%d.%02d], Donate: [%s]",
-                    done ? "OK" : "Wait",
-                    deduct.TransactionId,
-                    deduct.DeductResult ? "OK" : "NG",
-                    (deduct.DeductAmount / 100), (deduct.DeductAmount % 100),
-                    deduct.IsDonateInvoice ? "Yes" : "No");
+        }
+        else
+        {
+            find = true;
         }
     }
 

+ 209 - 50
EVSE/Projects/DO360/Apps/main.c

@@ -250,8 +250,9 @@ void Set_Ocpp_DonateInvoice(unsigned char donate);
 bool Is_Ocpp_ReportCreditDeductReq(void);
 void Set_Ocpp_ReportCreditDeductReq(void);
 void Clean_Ocpp_TcciSerialNo(int gun_index);
-void Set_Ocpp_TcciReaderStatus(int gun_index, int status, char *cardNo);
+bool Set_Ocpp_TcciReaderStatus(int gun_index, DeductResultInfoData *ReaderStatus);
 void Set_Ocpp_TcciReaderStatusReq(int gun_index);
+bool Is_Ocpp_TcciReaderStatusReq(int gun_index);
 void Set_Ocpp_StartTransactionId(int gun_index, char *id);
 void Set_Ocpp_StartTransactionReq(int gun_index);
 bool Is_Ocpp_StartTransactionConf(int gun_index);
@@ -320,6 +321,9 @@ void Set_Deduct_TransactionId(int gunIndex, int transaction);
 void Clean_DeductInfo(int gunIndex);
 bool Is_DeductResultReq(int gunIndex);
 
+bool Is_ReaderStatusReq(int gunIndex);
+void Clean_ReaderStatusInfo(int gunIndex);
+
 void Set_UserTransactionId(int gunIndex, int transaction);
 void Set_UserPrice(int gunIndex, float price);
 void Set_UserTotalCost(int gunIndex, float cost);
@@ -365,7 +369,6 @@ float                           _lastProfileCurrent[CONNECTOR_QUANTITY];
 float                           _lastMaxProfilePower;
 
 struct StructStatusNotification _BackupStatusNotification[CONNECTOR_QUANTITY];
-DeductResultInfoData _BackupDeductResult[CONNECTOR_QUANTITY];
 
 bool _NeedReset4gWifi;
 struct timespec _4gWifiReset_time;
@@ -383,9 +386,13 @@ bool isModelNameMatch = true;
 
 //int rfidFd = -1;
 //char* rfidPortName = "/dev/ttyS2";
+#if ENABLE_PCBA_TEST == 0
 char* fwVersion = "V1.10.00.0000.00";
-char* subVersion = "03";
-
+char* subVersion = "04";
+#else
+char* fwVersion = "PCBA.00.04";
+char* subVersion = "00";
+#endif
 sqlite3 *localDb;
 bool isDb_ready;
 
@@ -1830,7 +1837,7 @@ void GetFirmwareVersion()
 {
 	// Get CSU root file system version
 	sprintf((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev, fwVersion);
-
+#if ENABLE_PCBA_TEST == 0
 	byte count = 0, chademo = 0, ccs = 0, gb = 0;
 	for(uint8_t idx=0;idx<3;idx++)
 	{
@@ -1906,6 +1913,7 @@ void GetFirmwareVersion()
 		ShmSysConfigAndInfo->SysInfo.ChargerType = _CHARGER_TYPE_IEC;
 	else if (strcmp(_buf, "WU") == EQUAL)
 		ShmSysConfigAndInfo->SysInfo.ChargerType = _CHARGER_TYPE_UL;
+#endif
 }
 
 void InitialShareMemoryInfo()
@@ -2021,7 +2029,6 @@ void InitialShareMemoryInfo()
     for(int i = 0; i < CONNECTOR_QUANTITY; i++)
     {
         memset((char *)&_BackupStatusNotification[i], 0, sizeof(struct StructStatusNotification));
-        memset((char *)&_BackupDeductResult[i], 0, sizeof(DeductResultInfoData));
     }
 }
 
@@ -3808,22 +3815,24 @@ void Set_Ocpp_DonateInvoice(unsigned char donate)
     }
 }
 
-void Set_Ocpp_DeductInfo(DeductResultInfoData *deductInfo)
+bool Set_Ocpp_DeductInfo(DeductResultInfoData *deductInfo)
 {
     if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
     {
         ShmOCPP16Data->TcciCustomData.DeductInfo.txId = deductInfo->TransactionId;
-        memcpy((char *)&ShmOCPP16Data->TcciCustomData.DeductInfo.creditNo, (char *)deductInfo->creditNo, strlen((char *)deductInfo->creditNo));
-        strcpy((char *)&ShmOCPP16Data->TcciCustomData.DeductInfo.vemData, "");
+        memcpy((char *)&ShmOCPP16Data->TcciCustomData.DeductInfo.creditNo, (char *)deductInfo->creditNo, sizeof(deductInfo->creditNo));
+        memcpy((char *)&ShmOCPP16Data->TcciCustomData.DeductInfo.vemData, deductInfo->VemData, sizeof(deductInfo->VemData));
         ShmOCPP16Data->TcciCustomData.DeductInfo.amount = ((double)deductInfo->DeductAmount / 100);
-        strcpy((char *)&ShmOCPP16Data->TcciCustomData.DeductInfo.approvalNo, deductInfo->ApprovalNumber);
+        memcpy((char *)&ShmOCPP16Data->TcciCustomData.DeductInfo.approvalNo, deductInfo->ApprovalNumber, sizeof(deductInfo->ApprovalNumber));
         ShmOCPP16Data->TcciCustomData.DeductInfo.deductResult = deductInfo->DeductResult;
         ShmOCPP16Data->TcciCustomData.DeductInfo.isDonateInvoice = deductInfo->IsDonateInvoice ? YES : NO;
+        return true;
     }
     if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20)
     {
 
     }
+    return false;
 }
 
 bool Is_Ocpp_ReportCreditDeductReq(void)
@@ -3869,17 +3878,35 @@ void Clean_Ocpp_TcciSerialNo(int gun_index)
 //===============================================
 // Ocpp Tcci ReaderStatus
 //===============================================
-void Set_Ocpp_TcciReaderStatus(int gun_index, int status, char *cardNo)
+bool Set_Ocpp_TcciReaderStatus(int gun_index, DeductResultInfoData *ReaderStatus)
 {
     if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
     {
-        ShmOCPP16Data->TcciCustomData.ReaderStatus[gun_index].readerStatus = status;
-        strcpy((char *)&ShmOCPP16Data->TcciCustomData.ReaderStatus[gun_index].creditNo, cardNo);
+        if(ReaderStatus->DeductResult == _Deduct_Cancel || ReaderStatus->DeductResult == _Deduct_PreAuth || ReaderStatus->DeductResult == _Deduct_Pass)
+        {
+            switch(ReaderStatus->DeductResult)
+            {
+                case _Deduct_Pass:
+                    ShmOCPP16Data->TcciCustomData.ReaderStatus[gun_index].readerStatus = 1;
+                    break;
+                case _Deduct_Cancel:
+                    ShmOCPP16Data->TcciCustomData.ReaderStatus[gun_index].readerStatus = 2;
+                    break;
+                case _Deduct_PreAuth:
+                    ShmOCPP16Data->TcciCustomData.ReaderStatus[gun_index].readerStatus = 0;
+                    break;
+            }
+
+            memcpy((char *)&ShmOCPP16Data->TcciCustomData.ReaderStatus[gun_index].creditNo, ReaderStatus->creditNo, sizeof(ReaderStatus->creditNo));
+            memcpy((char *)&ShmOCPP16Data->TcciCustomData.VEMData[gun_index], ReaderStatus->VemData, sizeof(ReaderStatus->VemData));
+            return true;
+        }
     }
     if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20)
     {
 
     }
+    return false;
 }
 
 void Set_Ocpp_TcciReaderStatusReq(int gun_index)
@@ -3894,6 +3921,19 @@ void Set_Ocpp_TcciReaderStatusReq(int gun_index)
     }
 }
 
+bool Is_Ocpp_TcciReaderStatusReq(int gun_index)
+{
+    if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
+    {
+        return ShmOCPP16Data->TcciCustomData.ReaderStatus[gun_index].ReportReaderStatusReq ? true : false;
+    }
+    if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20)
+    {
+        return false;
+    }
+    return false;
+}
+
 //===============================================
 // Ocpp Start Transaction
 //===============================================
@@ -4832,6 +4872,19 @@ bool Is_DeductResultReq(int gunIndex)
     return ShmChargerInfo->DeductResultReq[gunIndex].DeductReq ? true : false;
 }
 
+//===============================================
+// ReaderStatus
+//===============================================
+bool Is_ReaderStatusReq(int gunIndex)
+{
+    return ShmChargerInfo->ReaderStatus[gunIndex].ReaderStatusReq ? true : false;
+}
+
+void Clean_ReaderStatusInfo(int gunIndex)
+{
+    memset(&ShmChargerInfo->ReaderStatus[gunIndex], 0x00, sizeof(DeductResultInfoData));
+}
+
 //===============================================
 // TransactionInfoData
 //===============================================
@@ -6605,61 +6658,166 @@ void CheckWeatherInfo(void)
     }
 }
 
+bool _WriteDeductBusy[CONNECTOR_QUANTITY] = {0};
 void CheckDeductResultRequest(void)
 {
+    char *str_ReaderStatus[] = {STR_DEDUCT_FAIL, STR_DEDUCT_PASS, STR_DEDUCT_CANCEL, STR_DEDUCT_PREAUTH};
+    char cardNo[21];
+    char appNo[10];
+
     for(int i = 0; i < CONNECTOR_QUANTITY; i++)
     {
         if(Is_DeductResultReq(i))
         {
-            LOG_INFO("Gun %d Need to Report Deduct Info", i + 1);
-            memcpy((char *)&_BackupDeductResult[i], (char *)&ShmChargerInfo->DeductResultReq[i], sizeof(DeductResultInfoData));
-
-            Clean_DeductInfo(i);
+            if(!_WriteDeductBusy[i])
+            {
+                if(!Is_Ocpp_ReportCreditDeductReq() && ShmSysConfigAndInfo->SysInfo.OcppConnStatus)
+                {
+                    _WriteDeductBusy[i] = true;
+                    //Set_Ocpp_DeductTransaction(_BackupDeductResult[i].TransactionId);
+                    //Set_Ocpp_DeductCreditNo((char *)&_BackupDeductResult[i].creditNo);
+                    //Set_Ocpp_DeductVemData("");
+                    //Set_Ocpp_DeductAmount(((double)_BackupDeductResult[i].DeductAmount / 100));
+                    //Set_Ocpp_DeductResult(_BackupDeductResult[i].DeductResult);
+                    //Set_Ocpp_DonateInvoice(_BackupDeductResult[i].IsDonateInvoice);
+                    if(Set_Ocpp_DeductInfo(&ShmChargerInfo->DeductResultReq[i]))
+                    {
+                        memset(cardNo, 0x00, sizeof(cardNo));
+                        memcpy(cardNo, (char *)&ShmChargerInfo->DeductResultReq[i].creditNo[0], sizeof(ShmChargerInfo->DeductResultReq[i].creditNo));
+                        memset(appNo, 0x00, sizeof(appNo));
+                        memcpy(appNo, (char *)&ShmChargerInfo->DeductResultReq[i].ApprovalNumber[0], sizeof(ShmChargerInfo->DeductResultReq[i].ApprovalNumber));
+
+                        Set_Ocpp_ReportCreditDeductReq();
+                        LOG_INFO("DeductReport Gun %d TxId: %d, UserId: %s, ApprovalNo: [%s], Amount: %d.%02d, [%s], Donate: %s",
+                            i + 1,
+                            ShmChargerInfo->DeductResultReq[i].TransactionId,
+                            cardNo,
+                            appNo,
+                            (ShmChargerInfo->DeductResultReq[i].DeductAmount / 100),
+                            (ShmChargerInfo->DeductResultReq[i].DeductAmount % 100),
+                            str_ReaderStatus[ShmChargerInfo->DeductResultReq[i].DeductResult],
+                            ShmChargerInfo->DeductResultReq[i].IsDonateInvoice ? "Yes" : "No");
+
+                        if(ShmChargerInfo->DeductResultReq[i].DeductResult == _Deduct_Pass)
+                        {
+                            memcpy(&ShmChargerInfo->ReaderStatus[i], &ShmChargerInfo->DeductResultReq[i], sizeof(DeductResultInfoData));
+                            ShmChargerInfo->ReaderStatus[i].ReaderStatusReq = YES;
+                        }
+                    }
+                }
+            }
+            else
+            {
+                if(!Is_Ocpp_ReportCreditDeductReq())
+                {
+                    Clean_DeductInfo(i);
+                    _WriteDeductBusy[i] = false;
+                }
+            }
+        }
+        else
+        {
+            _WriteDeductBusy[i] = false;
         }
+    }
+}
 
-        if(_BackupDeductResult[i].DeductReq && ShmSysConfigAndInfo->SysInfo.OcppConnStatus)
+bool _WriteReDeductBusy = false;
+void CheckReDeductRequest(void)
+{
+    char *str_ReaderStatus[] = {STR_DEDUCT_FAIL, STR_DEDUCT_PASS, STR_DEDUCT_CANCEL, STR_DEDUCT_PREAUTH};
+    char cardNo[21];
+    char appNo[10];
+
+    if(ShmChargerInfo->ReDeductReq.DeductReq)
+    {
+        if(!_WriteReDeductBusy)
+        {
+            if(!Is_Ocpp_ReportCreditDeductReq() && ShmSysConfigAndInfo->SysInfo.OcppConnStatus)
+            {
+                _WriteReDeductBusy = true;
+                if(Set_Ocpp_DeductInfo(&ShmChargerInfo->ReDeductReq))
+                {
+                    memset(cardNo, 0x00, sizeof(cardNo));
+                    memcpy(cardNo, (char *)&ShmChargerInfo->ReDeductReq.creditNo[0], sizeof(ShmChargerInfo->ReDeductReq.creditNo));
+                    memset(appNo, 0x00, sizeof(appNo));
+                    memcpy(appNo, (char *)&ShmChargerInfo->ReDeductReq.ApprovalNumber[0], sizeof(ShmChargerInfo->ReDeductReq.ApprovalNumber));
+
+                    Set_Ocpp_ReportCreditDeductReq();
+                    LOG_INFO("ReDeductReport TxId: %d, UserId: %s, ApprovalNo: [%s], Amount: %d.%02d, [%s], Donate: %s",
+                        ShmChargerInfo->ReDeductReq.TransactionId,
+                        cardNo,
+                        appNo,
+                        (ShmChargerInfo->ReDeductReq.DeductAmount / 100),
+                        (ShmChargerInfo->ReDeductReq.DeductAmount % 100),
+                        str_ReaderStatus[ShmChargerInfo->ReDeductReq.DeductResult],
+                        ShmChargerInfo->ReDeductReq.IsDonateInvoice ? "Yes" : "No");
+
+                    if(ShmChargerInfo->ReDeductReq.DeductResult == _Deduct_Pass && ShmChargerInfo->ReDeductReq.ConnectorId != 0xFF)
+                    {
+                        int gunIndex = ShmChargerInfo->ReDeductReq.ConnectorId - 1;
+                        memcpy(&ShmChargerInfo->ReaderStatus[gunIndex], &ShmChargerInfo->ReDeductReq, sizeof(DeductResultInfoData));
+                        ShmChargerInfo->ReaderStatus[gunIndex].ReaderStatusReq = YES;
+                    }
+                }
+            }
+        }
+        else
         {
             if(!Is_Ocpp_ReportCreditDeductReq())
             {
-                //Set_Ocpp_DeductTransaction(_BackupDeductResult[i].TransactionId);
-                //Set_Ocpp_DeductCreditNo((char *)&_BackupDeductResult[i].creditNo);
-                //Set_Ocpp_DeductVemData("");
-                //Set_Ocpp_DeductAmount(((double)_BackupDeductResult[i].DeductAmount / 100));
-                //Set_Ocpp_DeductResult(_BackupDeductResult[i].DeductResult);
-                //Set_Ocpp_DonateInvoice(_BackupDeductResult[i].IsDonateInvoice);
-                Set_Ocpp_DeductInfo(&_BackupDeductResult[i]);
-                Set_Ocpp_ReportCreditDeductReq();
-                LOG_INFO("Gun %d Report Deduct Info: Transaction: %d, UserId: %s, Amount: %d.%02d, Result: %s, Donate: %s",
-                    i + 1,
-                    _BackupDeductResult[i].TransactionId,
-                    (char *)&_BackupDeductResult[i].creditNo,
-                    (_BackupDeductResult[i].DeductAmount / 100),
-                    (_BackupDeductResult[i].DeductAmount % 100),
-                    _BackupDeductResult[i].DeductResult ? "Pass" : "Fail",
-                    _BackupDeductResult[i].IsDonateInvoice ? "Yes" : "No");
-
-                memset((char *)&_BackupDeductResult[i], 0, sizeof(DeductResultInfoData));
+                memset(&ShmChargerInfo->ReDeductReq, 0x00, sizeof(DeductResultInfoData));
+                _WriteReDeductBusy = false;
             }
         }
     }
+    else
+    {
+        _WriteReDeductBusy = false;
+    }
 }
 
-void CheckReDeductRequest(void)
+bool _WriteReaderStatusBusy[CONNECTOR_QUANTITY] = {0};
+void CheckReaderStatusRequest(void)
 {
-    if(ShmChargerInfo->ReDeductReq.DeductReq)
+    char *str_ReaderStatus[] = {STR_DEDUCT_FAIL, STR_DEDUCT_PASS, STR_DEDUCT_CANCEL, STR_DEDUCT_PREAUTH};
+    char cardNo[21];
+    char appNo[10];
+
+    for(int i = 0; i < CONNECTOR_QUANTITY; i++)
     {
-        if(!Is_Ocpp_ReportCreditDeductReq() && ShmSysConfigAndInfo->SysInfo.OcppConnStatus)
+        if(Is_ReaderStatusReq(i))
+        {
+            if(!_WriteReaderStatusBusy[i])
+            {
+                if(!Is_Ocpp_TcciReaderStatusReq(i) && ShmSysConfigAndInfo->SysInfo.OcppConnStatus)
+                {
+                    _WriteReaderStatusBusy[i] = true;
+                    if(Set_Ocpp_TcciReaderStatus(i, &ShmChargerInfo->ReaderStatus[i]))
+                    {
+                        memset(cardNo, 0x00, sizeof(cardNo));
+                        memcpy(cardNo, (char *)&ShmChargerInfo->ReaderStatus[i].creditNo[0], sizeof(ShmChargerInfo->ReaderStatus[i].creditNo));
+                        memset(appNo, 0x00, sizeof(appNo));
+                        memcpy(appNo, (char *)&ShmChargerInfo->ReaderStatus[i].ApprovalNumber[0], sizeof(ShmChargerInfo->ReaderStatus[i].ApprovalNumber));
+
+                        Set_Ocpp_TcciReaderStatusReq(i);
+                        LOG_INFO("StatusReport Gun %d: [%s], CreditNo: [%s], ApprovalNo: [%s]",
+                            i + 1, str_ReaderStatus[ShmChargerInfo->ReaderStatus[i].DeductResult], cardNo, appNo);
+                    }
+                }
+            }
+            else
+            {
+                if(!Is_Ocpp_TcciReaderStatusReq(i))
+                {
+                    Clean_ReaderStatusInfo(i);
+                    _WriteReaderStatusBusy[i] = false;
+                }
+            }
+        }
+        else
         {
-            Set_Ocpp_DeductInfo(&ShmChargerInfo->ReDeductReq);
-            Set_Ocpp_ReportCreditDeductReq();
-            LOG_INFO("Dispenser Report ReDeduct Info: Transaction: %d, UserId: %s, Amount: %d.%02d, Result: %s, Donate: %s",
-                ShmChargerInfo->ReDeductReq.TransactionId,
-                (char *)&ShmChargerInfo->ReDeductReq.creditNo,
-                (ShmChargerInfo->ReDeductReq.DeductAmount / 100),
-                (ShmChargerInfo->ReDeductReq.DeductAmount % 100),
-                ShmChargerInfo->ReDeductReq.DeductResult ? "Pass" : "Fail",
-                ShmChargerInfo->ReDeductReq.IsDonateInvoice ? "Yes" : "No");
-            memset(&ShmChargerInfo->ReDeductReq, 0x00, sizeof(DeductResultInfoData));
+            _WriteReaderStatusBusy[i] = false;
         }
     }
 }
@@ -6756,6 +6914,7 @@ void CheckOcppStatus()
 	CheckWeatherInfo();
 	CheckDeductResultRequest();
 	CheckReDeductRequest();
+	CheckReaderStatusRequest();
 }
 
 void CheckoutStartChargingSoc(byte gunIndex, bool force)
@@ -6776,7 +6935,7 @@ void OcppStartTransaction(byte gunIndex)
     // clean deduct info
     Clean_DeductInfo(gunIndex);
     // set deduct user id
-    Set_Deduct_UserId(gunIndex, (char *)&chargingInfo[gunIndex]->StartUserId);
+    //Set_Deduct_UserId(gunIndex, (char *)&chargingInfo[gunIndex]->StartUserId);
 
 	Set_Ocpp_StartTransactionId(gunIndex, (char *)chargingInfo[gunIndex]->StartUserId);
 

TEMPAT SAMPAH
EVSE/Projects/DO360/Images/FactoryDefaultConfig.bin


TEMPAT SAMPAH
EVSE/Projects/DO360/Images/ramdisk.gz