Browse Source

2022-06-04 / Wendell

Actions
1. [add] dispenser power consumption
2. [add] SessionTarget function
3. [add] Ocpp Start & Stop Transaction Timestamp
4. [add] InProgress flag
5. [add] set AcContactor On when system status is idle and gun is plug in
6. [add] maintain server start & stop transaction request, transaction idTag
7. [mod] align timing and meter value of stop charging
8. [mod] CheckUpdateProcess logic
9. [mod] RunningCost and FinalCost logic
10.[mod] IsConnectorWholeIdle logic
11.[mod] timing of database initialization
12.[mod] extend WAIT_REASSIGN_TIME to 40 seconds
13.[mod] authorize pass when idtag is 「AutoStartCharging」 and backend is offline
14.[fix] no data transfer of unplug after charging completed
15.[fix] charging in reservation mode: start & stop transaction without idtag, ReservationId is -1

Files
1. As follow commit history

Image version : V2.02.XX.XXXX.XX
Wendell 2 năm trước cách đây
mục cha
commit
9dc2f5b7d8

+ 99 - 45
EVSE/Projects/DO360/Apps/Config.h

@@ -48,6 +48,7 @@ typedef unsigned char               byte;
 
 #define uSEC_VAL                    1000000
 #define mSEC_VAL                    1000
+#define MAX_DISPENSER_QUANTITY      4
 #define MAX_GUN_QUANTITY            4
 #define MAX_GROUP_QUANTITY          4
 #define MAX_PSU_MODULE_QUANTITY     62
@@ -97,6 +98,28 @@ typedef unsigned char               byte;
 #define STR_LITTLE_ENDIAN           "Little Endian"
 #define STR_BIG_ENDIAN              "Big Endian"
 
+#define STR_MODE_BOOT               "Booting"
+#define STR_MODE_IDLE               "Idle"
+#define STR_MODE_AUTHORIZING        "Authorizing"
+#define STR_MODE_REASSIGN_CHECK     "ReassignCheck"
+#define STR_MODE_REASSIGN           "Reassign"
+#define STR_MODE_PREPARNING         "Preparing"
+#define STR_MODE_PREPARING_EV       "PreparnForEV"
+#define STR_MODE_PREPARING_EVSE     "PrepareForEVSE"
+#define STR_MODE_CHARGING           "Charging"
+#define STR_MODE_TERMINATING        "Terminating"
+#define STR_MODE_COMPLETE           "Completed"
+#define STR_MODE_ALARM              "Alarm"
+#define STR_MODE_FAULT              "Fault"
+#define STR_MODE_RESERVATION        "Reservation"
+#define STR_MODE_BOOKING            "Booking"
+#define STR_MODE_MAINTAIN           "Maintain"
+#define STR_MODE_DEBUG              "Debug"
+#define STR_MODE_CCS_ST0            "CCS_ST0"
+#define STR_MODE_CCS_ST1            "CCS_ST1"
+#define STR_MODE_UPDATE             "Update"
+#define STR_MODE_NONE               "None"
+
 enum _SYSTEM_STATUS
 {
 	S_BOOTING =                         0,
@@ -427,49 +450,50 @@ typedef union
     struct
     {
         // DebugVal[0]
-        unsigned int Reg_All:1;
-        unsigned int Reg_ModelName:1;
-        unsigned int Reg_ConnectorID:1;
-        unsigned int Reg_PowerCabinetStatus:1;
-        unsigned int Reg_DispenserStatus:1;
-        unsigned int Reg_ChargingCapability:1;
-        unsigned int Reg_ChargingTarget:1;
-        unsigned int Reg_SoftwareUpdate:1;
-        unsigned int Reg_PlugInStatus:1;
-        unsigned int Reg_ConnectorState:1;
-        unsigned int Reg_UserID:1;
-        unsigned int Reg_Charging_Permission:1;
-        unsigned int Reg_MiscControl:1;
-        unsigned int Reg_DispenserCsuVersion:1;
-        unsigned int Reg_DispenserOtherVersion:1;
-        unsigned int Reg_ChargingInfo:1;
-        unsigned int Reg_QRCodeDate:1;
-        unsigned int Reg_WaitPlugIn:1;
-        unsigned int Reg_GroundFaultDetection:1;
-        unsigned int Reg_Cabinet_CSU_Version:1;
-        unsigned int Reg_Cabinet_Other_Version:1;
-        unsigned int Reg_PsuQuantity:1;
-        unsigned int Reg_PsuVersion:1;
-        unsigned int Reg_Reservation:1;
-        unsigned int Reg_Dispenser_Request:1;
-        unsigned int Reg_RemoteStartNoIDState:1;
-        unsigned int Reg_RefundAmount:1;
-        unsigned int Reg_PrepaymentInfo:1;
-        unsigned int Reg_PaymentFailReason:1;
-        unsigned int Reg_ConnectorQRCode:1;
-        unsigned int Reg_StationInfo:1;
-        unsigned int Reg_DeductResult:1;
+        unsigned int RegDbg_All:1;
+        unsigned int RegDbg_ModelName:1;
+        unsigned int RegDbg_ConnectorID:1;
+        unsigned int RegDbg_PowerCabinetStatus:1;
+        unsigned int RegDbg_DispenserStatus:1;
+        unsigned int RegDbg_ChargingCapability:1;
+        unsigned int RegDbg_ChargingTarget:1;
+        unsigned int RegDbg_SoftwareUpdate:1;
+        unsigned int RegDbg_PlugInStatus:1;
+        unsigned int RegDbg_ConnectorState:1;
+        unsigned int RegDbg_UserID:1;
+        unsigned int RegDbg_Charging_Permission:1;
+        unsigned int RegDbg_MiscControl:1;
+        unsigned int RegDbg_DispenserCsuVersion:1;
+        unsigned int RegDbg_DispenserOtherVersion:1;
+        unsigned int RegDbg_ChargingInfo:1;
+        unsigned int RegDbg_QRCodeDate:1;
+        unsigned int RegDbg_WaitPlugIn:1;
+        unsigned int RegDbg_GroundFaultDetection:1;
+        unsigned int RegDbg_Cabinet_CSU_Version:1;
+        unsigned int RegDbg_Cabinet_Other_Version:1;
+        unsigned int RegDbg_PsuQuantity:1;
+        unsigned int RegDbg_PsuVersion:1;
+        unsigned int RegDbg_Reservation:1;
+        unsigned int RegDbg_Dispenser_Request:1;
+        unsigned int RegDbg_RemoteStartNoIDState:1;
+        unsigned int RegDbg_RefundAmount:1;
+        unsigned int RegDbg_PrepaymentInfo:1;
+        unsigned int RegDbg_PaymentFailReason:1;
+        unsigned int RegDbg_ConnectorQRCode:1;
+        unsigned int RegDbg_StationInfo:1;
+        unsigned int RegDbg_DeductResult:1;
         // DebugVal[1]
-        unsigned int Reg_CabinetSystemID:1;
-        unsigned int Reg_DefaultPriceString:1;
-        unsigned int Reg_UserPriceString:1;
-        unsigned int Reg_Receipt:1;
-        unsigned int Reg_PowerConsumption:1;
-        unsigned int res:27;
+        unsigned int RegDbg_CabinetSystemID:1;
+        unsigned int RegDbg_DefaultPriceString:1;
+        unsigned int RegDbg_UserPriceString:1;
+        unsigned int RegDbg_Receipt:1;
+        unsigned int RegDbg_PowerConsumption:1;
+        unsigned int RegDbg_ChargingTimestamp:1;
+        unsigned int res:26;
         // DebugVal[2]
-        unsigned int DebugVal5:32;
+        unsigned int DebugVal2:32;
         // DebugVal[3]
-        unsigned int DebugVal6:32;
+        unsigned int DebugVal3:32;
     }bits;
 }DebugEvCommMsgFlag;
 
@@ -523,11 +547,10 @@ typedef union
     unsigned int AuthFlag;
     struct
     {
-        unsigned int AutoStartEnable:1;             // 0: disable,                  1: enable auto charging after plug in
         unsigned int APPEnable:1;                   // 0: disable,                  1: app auth enable
         unsigned int QRCodeEnable:1;                // 0: disable,                  1: qr code auth enable
         unsigned int RFIDEnable:1;                  // 0: disable,                  1: rfid auth enable
-        unsigned int res:24;
+        unsigned int res:29;
     }bits;
 }AuthModeInfo;
 
@@ -563,13 +586,15 @@ typedef union
         unsigned int SelfTestOK:1;                  // 0: self test not completed,  1: self test ok
         unsigned int NeedSelfTest:1;                // 0: no effect,                1: need execute self test
         unsigned int Paused:1;                      // 0: no effect,                1: relay paused
+        unsigned int AbnormalRelay:1;               // 0: no effect,                1: relay abnormal control enable
         unsigned int AcContactor:1;                 // 0: ac contactor off,         1: ac contactor on
         unsigned int AcContactorOffByPsu:1;         // 0: no effect,                1: ac contactor off
         unsigned int AcContactorOffByEmergency:1;   // 0: no effect,                1: ac contactor off
         unsigned int StandbyCountdown:1;            // 0: charger is using,         1: start countdown
         unsigned int AcInputDisable:1;              // 0: ac input enable,          1: ac input disable
         unsigned int DcInputEnable:1;               // 0: dc input disable,         1: dc input enable
-        unsigned int res:23;
+        unsigned int AutoTest:1;                    // 0: no effect,                1: relay auto test enable
+        unsigned int res:21;
     }bits;
 }RelayControl;
 
@@ -581,7 +606,8 @@ typedef union
         unsigned int SelfTestOK:1;                  // 0: self test not completed,  1: self test ok
         unsigned int NeedSelfTest:1;                // 0: no effect,                1: need execute self test
         unsigned int Paused:1;                      // 0: no effect,                1: fan paused
-        unsigned int res:29;
+        unsigned int AbnormalFan:1;                 // 0: no effect,                1: fan abnormal control enable
+        unsigned int res:28;
     }bits;
 }FanControl;
 
@@ -1072,6 +1098,7 @@ typedef union
 #define MISC_CONN_LINE_STATUS               0x00000100
 #define MISC_CONN_USER_PRICE_STRING         0x00000200
 #define MISC_CONN_RECEIPT                   0x00000400
+#define MISC_CONN_CHARGING_BILL             0x00000800
 
 typedef union
 {
@@ -1090,7 +1117,8 @@ typedef union
         unsigned int LineStatusRequest:1;               // msic: 0x010B,    0: no request,  1: Line Status request
         unsigned int UserPriceStringRequest:1;          // msic: 0x010D,    0: no request,  1: User Price String request
         unsigned int ReceiptRequest:1;                  // msic: 0x010E,    0: no request,  1: Receipt request
-        unsigned int res:21;
+        unsigned int ChargingBillRequest:1;             // msic: 0x010F,    0: no request,  1: charging bill request
+        unsigned int res:20;
     }bits;
 }ConnectorMiscControl;
 
@@ -1241,10 +1269,33 @@ typedef enum
 #define STR_ID_TYPE_MAC_ADDRESS         "MacAddress"
 #define STR_ID_TYPE_NO_AUTHORIZATION    "NoAuthorization"
 
+typedef struct
+{
+    float LocalConsumption;                             // power consumption store in cabinet
+    float GunConsumption;                               // power consumption store in dispenser
+}MeterValueInfoData;
+
+typedef struct
+{
+    char StartCharging[32];                             // start charging timestamp
+    char StopCharging[32];                              // stop charging timestamp
+}TimestampInfoData;
+
+typedef struct
+{
+    char MainVersion[32];
+    char SubVersion[32];
+}SysMiscInfoData;
+
+typedef struct
+{
+    unsigned char Status;
+}ConnectorConfigAndStatus;
 // ************************************************************************************************* //
 
 typedef struct
 {
+    SysMiscInfoData SysMisc;
     SystemAuthInfoData AuthInfo;
     SysControl Control;
     PsuPositionInfoData PsuPosition;
@@ -1263,7 +1314,10 @@ typedef struct
     DeductResultInfoData ReDeductReq;
     DeductResultInfoData ReaderStatus[MAX_GROUP_QUANTITY];
     LineApiStatusInfo LineApi;
+    ConnectorConfigAndStatus Connector[MAX_GUN_QUANTITY];
     PriceReceiptInfoData PriceAndReceiptInfo;
+    MeterValueInfoData MeterValue[MAX_GUN_QUANTITY];
+    TimestampInfoData Timestamp[MAX_GUN_QUANTITY];
 }ChargerInfoData;
 
 #endif /* CONFIG_H_ */

+ 25 - 22
EVSE/Projects/DO360/Apps/Module_Authorize.c

@@ -359,13 +359,20 @@ void SetAuthorize(AuthorizingInfoData *AuthInfo, unsigned char type)
 
         Get_Ocpp_EVCCID_Prefix(prefix);
         sprintf(evccid, "%s%s", prefix, (char *)&AuthInfo->AuthId);
-        AUTH_INFO("*********** EVCCID [%s] ***********", evccid);
+        strncpy((char *)&AuthInfo->AuthId, evccid, sizeof(AuthInfo->AuthId));
+        AUTH_INFO("*********** EVCCID [%s] ***********", AuthInfo->AuthId);
     }
     else if(strcmp((char *)&AuthInfo->AuthId, AUTO_START_CHARGING) == EQUAL)
     {
         Get_Ocpp_FreevendIdtag((char *)&AuthInfo->AuthId);
         _isAutoStart = true;
         AUTH_INFO("*********** FreevendId [%s] ***********", (char *)&AuthInfo->AuthId);
+
+        if(strlen((char *)&AuthInfo->AuthId) == 0)
+        {
+            sprintf((char*)&AuthInfo->AuthId, "%s", ShmSysConfigAndInfo->SysConfig.SerialNumber);
+            AUTH_INFO("*********** IdTag:SerialNumber [%s] ***********", (char *)&AuthInfo->AuthId);
+        }
     }
 
     memcpy(ShmSysConfigAndInfo->SysConfig.UserId, AuthInfo->AuthId, 32);
@@ -675,26 +682,17 @@ int main(void)
                 else if(ShmSysConfigAndInfo->SysInfo.AuthorizedType == _AuthType_RFID)
                 {
                     if(ShmSysConfigAndInfo->SysInfo.OcppConnStatus &&
-                        ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_ENABLE &&
-                        !ShmChargerInfo->AuthInfo.AuthMode.bits.AutoStartEnable)
+                        ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_ENABLE)
                     {
                         _needOcppAuthorize = true;
                     }
                     else
                     {
-                        if(_isAutoStart)
+                        if(_isAutoStart || ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_DISABLE)
                         {
-                            if(ShmChargerInfo->AuthInfo.AuthMode.bits.AutoStartEnable ||
-                                ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_DISABLE)
-                            {
-                                _authResult = _AuthResult_Valid;
-                                AUTH_INFO("******** [Auto Start Charging Enable] ********");
-                            }
-                            else
-                            {
-                                _authResult = _AuthResult_Invalid;
-                                AUTH_INFO("******** [Auto Start Charging Result Fail] ********");
-                            }
+                            _authResult = _AuthResult_Valid;
+                            AUTH_INFO("******** [Auto Start Charging Enable] ********");
+
                         }
                         else
                         {
@@ -811,14 +809,19 @@ int main(void)
                     {
                         _authResult = Is_Ocpp_ReserveNowIdTag(connector, (char *)ShmSysConfigAndInfo->SysInfo.ConnectorInfo[connector].AuthInfo.AuthId) ? _AuthResult_Valid : _AuthResult_Invalid;
 
-                        if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[connector].AuthInfo.AuthType == _AuthType_RFID)
-                        {
-                            AUTH_INFO("*********** Gun %d RFID Reserve Authorize %s ***********", connector + 1, _authResult == _AuthResult_Valid ? "OK" : "NG");
-                        }
-                        if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[connector].AuthInfo.AuthType == _AuthType_RemoteStart)
+                        if(_authResult == _AuthResult_Valid)
                         {
-                            AUTH_INFO("*********** Gun %d Reserve RemoteAuthorize %s ***********", connector + 1, _authResult == _AuthResult_Valid ? "OK" : "NG");
-                            Set_Connector_MiscCommand(connector, MISC_CONN_REMOTE_START);
+                            memcpy(chargingInfo[connector]->StartUserId, ShmSysConfigAndInfo->SysConfig.UserId, 32);
+
+                            if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[connector].AuthInfo.AuthType == _AuthType_RFID)
+                            {
+                                AUTH_INFO("*********** Gun %d RFID Reserve Authorize %s ***********", connector + 1, _authResult == _AuthResult_Valid ? "OK" : "NG");
+                            }
+                            if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[connector].AuthInfo.AuthType == _AuthType_RemoteStart)
+                            {
+                                AUTH_INFO("*********** Gun %d Reserve RemoteAuthorize %s ***********", connector + 1, _authResult == _AuthResult_Valid ? "OK" : "NG");
+                                Set_Connector_MiscCommand(connector, MISC_CONN_REMOTE_START);
+                            }
                         }
                     }
                     else if(chargingInfo[connector]->SystemStatus == S_AUTHORIZING && _authResult == _AuthResult_Valid)

+ 130 - 15
EVSE/Projects/DO360/Apps/Module_EvComm.c

@@ -54,6 +54,7 @@ PaymentFailResponse ConnectorPaymentFailReason[GENERAL_GUN_QUANTITY];
 char _ConnectorQRCode[GENERAL_GUN_QUANTITY][128];
 StationInfoData _stationInfo[GENERAL_GUN_QUANTITY];
 DeductResultInfoData _deductResult[GENERAL_GUN_QUANTITY];
+unsigned char _GunSystemStatus[GENERAL_GUN_QUANTITY];
 
 void ShowSocketData(struct PACKET_STRUCTURE *packet)
 {
@@ -80,13 +81,13 @@ void CheckEvRxCommMsg(struct PACKET_STRUCTURE *packet)
         regValCnt = packet->Payload.reg / 32;
         regBitCnt = packet->Payload.reg % 32;
 
-        if(((ShmChargerInfo->Control.EvCommCtrl.MsgFlag.DebugVal[regValCnt] & (1 << regBitCnt)) || ShmChargerInfo->Control.EvCommCtrl.MsgFlag.bits.Reg_All) &&
+        if(((ShmChargerInfo->Control.EvCommCtrl.MsgFlag.DebugVal[regValCnt] & (1 << regBitCnt)) || ShmChargerInfo->Control.EvCommCtrl.MsgFlag.bits.RegDbg_All) &&
             ((ShmChargerInfo->Control.EvCommCtrl.IdFlag.DebugVal & (1 << packet->Header.id)) || ShmChargerInfo->Control.EvCommCtrl.IdFlag.DebugVal == 0))
         {
             int len = 0;
             char msg[1024];
 
-            sprintf(msg, "Rx: SE: %02X, ID: %02X, OP: %d, Len: %d, Reg: %02X",
+            sprintf(msg, "Rx: SE: %02X, ID: %02X, OP: %d, Len: %3d, Reg: %02X",
                 packet->Header.se, packet->Header.id, packet->Header.op, packet->Header.len, packet->Payload.reg);
 
             if(packet->Header.len > 1)
@@ -113,7 +114,7 @@ void CheckTvRxCommMsg(struct PACKET_STRUCTURE *packet)
         regValCnt = packet->Payload.reg / 32;
         regBitCnt = packet->Payload.reg % 32;
 
-        if(((ShmChargerInfo->Control.EvCommCtrl.MsgFlag.DebugVal[regValCnt] & (1 << regBitCnt)) || ShmChargerInfo->Control.EvCommCtrl.MsgFlag.bits.Reg_All) &&
+        if(((ShmChargerInfo->Control.EvCommCtrl.MsgFlag.DebugVal[regValCnt] & (1 << regBitCnt)) || ShmChargerInfo->Control.EvCommCtrl.MsgFlag.bits.RegDbg_All) &&
             ((ShmChargerInfo->Control.EvCommCtrl.IdFlag.DebugVal & (1 << packet->Header.id)) || ShmChargerInfo->Control.EvCommCtrl.IdFlag.DebugVal == 0))
         {
             int len = 0;
@@ -1179,10 +1180,10 @@ void ChargingCapabilityResponse(int socket, struct PACKET_STRUCTURE *packet)
 	struct PACKET_STRUCTURE sendBuffer;
 	unsigned short voltage = 0, current = 0, power = 0;
 	unsigned char currency = 0;
-	float fPrice = 0, fCost = 0, fBalance = 0, fDiscount = 0, fEnergyCost = 0, fParkingFee = 0;
+	float fPrice = 0, fCost = 0, fBalance = 0, fDiscount = 0, fEnergyCost = 0, fParkingFee = 0, fRemainAmount = 0;
 	unsigned int lPrice = 0, lCost = 0, lBalance = 0, lDiscount = 0;
 	int transaction = 0;
-	int energyCost = 0, parkingFee = 0;
+	int energyCost = 0, parkingFee = 0, remainAmount = 0;
 
 	memset(&sendBuffer, 0x00, sizeof(sendBuffer));
 	voltage = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].GeneralChargingData.MaximumChargingVoltage;
@@ -1203,6 +1204,7 @@ void ChargingCapabilityResponse(int socket, struct PACKET_STRUCTURE *packet)
 	fDiscount = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].CostDiscount;
     fEnergyCost = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].EnergyCost;
     fParkingFee = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].ParkingFee;
+    fRemainAmount = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].RemainAmount;
 
 	lPrice = (unsigned int)(fPrice * 100);
 	lCost = (unsigned int)(fCost * 100);
@@ -1210,6 +1212,7 @@ void ChargingCapabilityResponse(int socket, struct PACKET_STRUCTURE *packet)
 	lDiscount = (int)(fDiscount * 100);
 	energyCost = fEnergyCost >= 0 ? (int)(fEnergyCost * 100) : -1;
 	parkingFee = fParkingFee >= 0 ? (int)(fParkingFee * 100) : -1;
+	remainAmount = fRemainAmount >= 0 ? (int)(fRemainAmount * 100) : -1;
 
 	if((ConnectorCapability[packet->Header.id - 1].MaxOuputVoltage / 10) != (voltage / 10) ||
         (ConnectorCapability[packet->Header.id - 1].MaxOuputCurrent / 10) != (current / 10) ||
@@ -1245,10 +1248,11 @@ void ChargingCapabilityResponse(int socket, struct PACKET_STRUCTURE *packet)
 	}
 
     if(ConnectorCapability[packet->Header.id - 1].AccountBalance != lBalance ||
+        ConnectorCapability[packet->Header.id - 1].RemainAmount != remainAmount ||
         ConnectorCapability[packet->Header.id - 1].CostDiscount != lDiscount)
     {
-        LOG_INFO("Gun %d TxId: %d Account: %8.2f, Discount: %.2f [%s]",
-            packet->Header.id, transaction, fBalance, fDiscount, ConnectorCapability[packet->Header.id - 1].CurrencyString);
+        LOG_INFO("Gun %d TxId: %d Account: %8.2f, Remain: %8.2f, Discount: %.2f [%s]",
+            packet->Header.id, transaction, fBalance, fDiscount, fRemainAmount, ConnectorCapability[packet->Header.id - 1].CurrencyString);
     }
 
 	ConnectorCapability[packet->Header.id - 1].MaxOuputVoltage = voltage;
@@ -1262,6 +1266,7 @@ void ChargingCapabilityResponse(int socket, struct PACKET_STRUCTURE *packet)
 	ConnectorCapability[packet->Header.id - 1].TransactionId = transaction;
     ConnectorCapability[packet->Header.id - 1].EnergyCost = energyCost;
     ConnectorCapability[packet->Header.id - 1].ParkingFee = parkingFee;
+    ConnectorCapability[packet->Header.id - 1].RemainAmount = remainAmount;
 
     ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].CapabilityVoltage = voltage;
     ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].CapabilityCurrent = current;
@@ -1270,7 +1275,7 @@ void ChargingCapabilityResponse(int socket, struct PACKET_STRUCTURE *packet)
 	sendBuffer.Header.se = packet->Header.se;
 	sendBuffer.Header.id = packet->Header.id;
 	sendBuffer.Header.op = _Header_Response;
-	sendBuffer.Header.len = 37;
+	sendBuffer.Header.len = 41;
 	sendBuffer.Payload.reg = _Reg_Charging_Capability;
 	sendBuffer.Payload.data[0] = _R_OK;
 	sendBuffer.Payload.data[1] = ((voltage >> 8) & 0xFF);
@@ -1309,6 +1314,13 @@ void ChargingCapabilityResponse(int socket, struct PACKET_STRUCTURE *packet)
     sendBuffer.Payload.data[34] = ((parkingFee >> 8) & 0xFF);
     sendBuffer.Payload.data[35] = (parkingFee & 0xFF);
 
+    char temp[4];
+    memcpy(temp, (char *)&fRemainAmount, sizeof(fRemainAmount));
+    sendBuffer.Payload.data[36] = temp[3];
+    sendBuffer.Payload.data[37] = temp[2];
+    sendBuffer.Payload.data[38] = temp[1];
+    sendBuffer.Payload.data[39] = temp[0];
+
 	SendPacket(socket, &sendBuffer);
 }
 
@@ -2535,6 +2547,35 @@ void PowerConsumptionResponse(int socket, struct PACKET_STRUCTURE *packet, unsig
     SendPacket(socket, &sendBuffer);
 }
 
+void ChargingTimestampResponse(int socket, struct PACKET_STRUCTURE *packet, unsigned char result)
+{
+    int len = 0;
+    struct PACKET_STRUCTURE sendBuffer;
+
+    memset(&sendBuffer, 0x00, sizeof(sendBuffer));
+    sendBuffer.Header.se = packet->Header.se;
+    sendBuffer.Header.id = packet->Header.id;
+    sendBuffer.Header.op = _Header_Response;
+    sendBuffer.Header.len = 2;
+    sendBuffer.Payload.reg = _Reg_ChargingTimestamp;
+    sendBuffer.Payload.data[0] = result;
+    if(result == _R_OK)
+    {
+        // StartCharging Timestamp
+        strcpy((char *)&sendBuffer.Payload.data[sendBuffer.Header.len - 1], ShmChargerInfo->Timestamp[packet->Header.id - 1].StartCharging);
+        len = strlen(ShmChargerInfo->Timestamp[packet->Header.id - 1].StartCharging);
+        sendBuffer.Payload.data[sendBuffer.Header.len - 1 + len] = '\0';
+        sendBuffer.Header.len += (len + 1);
+
+        // StopCharging Timestamp
+        strcpy((char *)&sendBuffer.Payload.data[sendBuffer.Header.len - 1], ShmChargerInfo->Timestamp[packet->Header.id - 1].StopCharging);
+        len = strlen(ShmChargerInfo->Timestamp[packet->Header.id - 1].StopCharging);
+        sendBuffer.Payload.data[sendBuffer.Header.len - 1 + len] = '\0';
+        sendBuffer.Header.len += (len + 1);
+    }
+    SendPacket(socket, &sendBuffer);
+}
+
 BOOL FindConnectorID(unsigned char dispenserIndex, unsigned char id)
 {
 	BOOL find = false;
@@ -3004,6 +3045,28 @@ BOOL ConnectorStateHandler(struct PACKET_STRUCTURE *packet, unsigned char dispen
 	unsigned char ChillerTemp = 0;
 	unsigned char plugin = 0;
 	unsigned char noAlarm[6];
+    char *str_status[] = {
+        STR_MODE_BOOT,
+        STR_MODE_IDLE,
+        STR_MODE_AUTHORIZING,
+        STR_MODE_REASSIGN_CHECK,
+        STR_MODE_REASSIGN,
+        STR_MODE_PREPARNING,
+        STR_MODE_PREPARING_EV,
+        STR_MODE_PREPARING_EVSE,
+        STR_MODE_CHARGING,
+        STR_MODE_TERMINATING,
+        STR_MODE_COMPLETE,
+        STR_MODE_ALARM,
+        STR_MODE_FAULT,
+        STR_MODE_RESERVATION,
+        STR_MODE_BOOKING,
+        STR_MODE_MAINTAIN,
+        STR_MODE_DEBUG,
+        STR_MODE_CCS_ST0,
+        STR_MODE_CCS_ST1,
+        STR_MODE_UPDATE,
+        STR_MODE_NONE};
 
 	memset(noAlarm, 0x00, 6);
 
@@ -3026,6 +3089,29 @@ BOOL ConnectorStateHandler(struct PACKET_STRUCTURE *packet, unsigned char dispen
             }
             ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].GeneralChargingData.ConnectorPlugIn = plugin;
         }
+        if(packet->Header.len >= 15)
+        {
+            float meterValue = 0;
+            char *ptr = (char *)&meterValue;
+            *(ptr + 0) = packet->Payload.data[13];
+            *(ptr + 1) = packet->Payload.data[12];
+            *(ptr + 2) = packet->Payload.data[11];
+            *(ptr + 3) = packet->Payload.data[10];
+            ShmChargerInfo->MeterValue[packet->Header.id - 1].GunConsumption = meterValue;
+        }
+        if(packet->Header.len >= 16)
+        {
+            if(packet->Payload.data[14] >= S_NONE)
+            {
+                packet->Payload.data[14] = S_NONE;
+            }
+
+            if(ShmChargerInfo->Connector[packet->Header.id - 1].Status != packet->Payload.data[14])
+            {
+                LOG_INFO("Gun %d SystemStatus [%s]", packet->Header.id, str_status[packet->Payload.data[14]]);
+            }
+            ShmChargerInfo->Connector[packet->Header.id - 1].Status = packet->Payload.data[14];
+        }
 
 		if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].RemoteStatus != ConnectionState)
 		{
@@ -3040,16 +3126,28 @@ BOOL ConnectorStateHandler(struct PACKET_STRUCTURE *packet, unsigned char dispen
                     {
                         if(chargingInfo[packet->Header.id - 1]->SystemStatus != S_IDLE)
                         {
-                            LOG_INFO("*********** Connector id %d Set Normal Stop Flag ***********\n", packet->Header.id);
+                            LOG_INFO("*********** Connector %d Set Normal Stop Flag ***********\n", packet->Header.id);
                             ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].Parameter.bits.NormalStopRequest = true;
                         }
                     }
-                    if(ConnectionState == _CRS_Terminating && ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].RemoteStatus == _CRS_Idle)
+                    else if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].RemoteStatus == _CRS_Idle)
                     {
-                        if(chargingInfo[packet->Header.id - 1]->SystemStatus == S_RESERVATION)
+                        if(ConnectionState == _CRS_Terminating)
+                        {
+                            if(chargingInfo[packet->Header.id - 1]->SystemStatus == S_RESERVATION)
+                            {
+                                chargingInfo[packet->Header.id - 1]->ReservationId = -1;
+                                LOG_INFO("*********** Connector %d Clean ReservationId ***********\n", packet->Header.id);
+                            }
+                        }
+                        else if(chargingInfo[packet->Header.id - 1]->SystemStatus == S_AUTHORIZING)
                         {
-                            chargingInfo[packet->Header.id - 1]->ReservationId = -1;
-                            LOG_INFO("*********** Connector id %d Clean ReservationId ***********\n", packet->Header.id);
+                            if(_GunSystemStatus[packet->Header.id - 1] != ShmChargerInfo->Connector[packet->Header.id - 1].Status &&
+                                ShmChargerInfo->Connector[packet->Header.id - 1].Status == S_IDLE)
+                            {
+                                ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].Parameter.bits.NeedCleanAuthorizeInfo = true;
+                                LOG_INFO("Connector %d Return Idle, Need Clean Authorize Info", packet->Header.id);
+                            }
                         }
                     }
                     break;
@@ -3078,6 +3176,7 @@ BOOL ConnectorStateHandler(struct PACKET_STRUCTURE *packet, unsigned char dispen
 			}
 		}
 		ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].RemoteStatus = ConnectionState;
+		_GunSystemStatus[packet->Header.id - 1] = ShmChargerInfo->Connector[packet->Header.id - 1].Status;
 	}
 	else
 	{
@@ -3985,6 +4084,13 @@ unsigned char ReadPowerConsumptionHandler(struct PACKET_STRUCTURE *packet, int d
     return find;
 }
 
+unsigned char ReadChargingTimestampHandler(struct PACKET_STRUCTURE *packet, int dispenserIndex)
+{
+    BOOL find = FindConnectorID(dispenserIndex, packet->Header.id);
+
+    return find;
+}
+
 void DisableConnector(unsigned char dispenserIndex)
 {
 	for(int i = 0; i < ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].ConnectorQuantity; i++)
@@ -4464,6 +4570,16 @@ void DispenserSocketProcess(int socketFd, struct sockaddr_in clientInfo, unsigne
                         }
                         PowerConsumptionResponse(socketFd, &receiveBuffer, ackResult);
                     }
+
+                    // Reg: 0x25, Read Charging Timestamp
+                    if(receiveBuffer.Header.op == _Header_Read && receiveBuffer.Payload.reg == _Reg_ChargingTimestamp)
+                    {
+                        if(ReadChargingTimestampHandler(&receiveBuffer, dispenserIndex))
+                        {
+                            ackResult = _R_OK;
+                        }
+                        ChargingTimestampResponse(socketFd, &receiveBuffer, ackResult);
+                    }
 				}
 
 				// clean timeout
@@ -4797,8 +4913,6 @@ void InitialConnector(void)
         chargingInfo[i] = &ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].GeneralChargingData;
     }
 
-
-
     for(int i = 0; i < GENERAL_GUN_QUANTITY; i++)
     {
         memset(&ConnectorCapability[i], 0x00, sizeof(ChargingCapabilityResponseInfo));
@@ -4809,6 +4923,7 @@ void InitialConnector(void)
         memset(&_ConnectorQRCode[i][0], 0x00, 128);
         memset(&_stationInfo[i], 0x00, sizeof(StationInfoData));
         memset(&_deductResult[i], 0x00, sizeof(DeductResultInfoData));
+        _GunSystemStatus[i] = 0;
     }
 }
 

+ 4 - 0
EVSE/Projects/DO360/Apps/Module_EvComm.h

@@ -92,6 +92,8 @@ enum PAYLOAD_REGISTER
     _Reg_UserPriceString            = 0x22,
     _Reg_Receipt                    = 0x23,
     _Reg_PowerConsumption           = 0x24,
+    _Reg_ChargingTimestamp          = 0x25,
+    _Reg_None                       = 0x26,
 };
 
 enum Response_Result
@@ -222,6 +224,7 @@ enum MiscCommand
     _MiscCmd_DefaultPriceString = 0x010C,
     _MiscCmd_UserPriceString    = 0x010D,
     _MiscCmd_Receipt            = 0x010E,
+    _MiscCmd_ChargingBill       = 0x010F,
 };
 
 enum DispenserMisc_Request
@@ -244,6 +247,7 @@ typedef struct
     int            TransactionId;           // unit = 0.01 dollar
     int            EnergyCost;              // unit = 0.01 dollar
     int            ParkingFee;              // unit = 0.01 dollar
+    int            RemainAmount;            // unit = 0.01 dollar
     char           CurrencyString[4];
 }ChargingCapabilityResponseInfo;
 

+ 10 - 0
EVSE/Projects/DO360/Apps/Module_InternalComm.c

@@ -1044,6 +1044,11 @@ void SetPCabinetOutputRelayOff(byte index)
 
 void SetMCabinetOutputRelay(byte index)
 {
+    if(ShmChargerInfo->Control.RelayCtrl.bits.AbnormalRelay)
+    {
+        return;
+    }
+
     if ((_chargingData[index]->SystemStatus >= S_PREPARING_FOR_EVSE &&
             _chargingData[index]->SystemStatus <= S_CHARGING))
     {
@@ -1161,6 +1166,11 @@ void SetMCabinetOutputRelay(byte index)
 
 void SetSCabinetOutputRelay(byte index)
 {
+    if(ShmChargerInfo->Control.RelayCtrl.bits.AbnormalRelay)
+    {
+        return;
+    }
+
     ShmOutputRelayConfig[index]->bits.Output_N = ShmChargerInfo->SCabinetControl.SOutputRelay[index] > 0 ? true : false;
     ShmOutputRelayConfig[index]->bits.Output_P = ShmChargerInfo->SCabinetControl.SOutputRelay[index] > 0 ? true : false;
 }

+ 531 - 43
EVSE/Projects/DO360/Apps/ReadCmdline.c

@@ -334,7 +334,7 @@ int ParsingCmd(char *inputString, char *outputString)
         }
         else
         {
-            if(inputString[i] == ' ' || inputString[i] == '\0' || inputString[i] == '\r' || inputString[i] == '\n' || len >= 32)
+            if(inputString[i] == ' ' || inputString[i] == '\0' || inputString[i] == '\r' || inputString[i] == '\n' || len >= MAX_SUB_CMD_LENGTH)
             {
                 done = true;
                 break;
@@ -471,8 +471,8 @@ int GetCommandSring(char *outputCmdString)
         {
             cmdLen = ParsingCmd(&word[start], &outputCmdString[totalLen]);
 
-            char newCmd[32];
-            memset(newCmd, 0x00, 32);
+            char newCmd[MAX_SUB_CMD_LENGTH];
+            memset(newCmd, 0x00, MAX_SUB_CMD_LENGTH);
             memcpy(newCmd, &outputCmdString[totalLen], cmdLen);
 
             cnt = cmdLen > 0 ? cnt + 1 : cnt;
@@ -568,7 +568,7 @@ void RunStatusProc(char *v1, char *v2)
 	}
 
 	int _index = atoi(v1);
-	if (_index <= 1)
+	if (_index <= 3)
 	{
 		if (!FindChargingInfoData(_index, &_chargingData[0]))
 		{
@@ -717,7 +717,7 @@ void ShowFwVer(void)
             printf("%c", ShmSysConfigAndInfo->SysInfo.CsuKernelFwRev[i]);
         }
     }
-    printf("\r\n   Csu Root Fs: %s", ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev);
+    printf("\r\n   Csu Root Fs: %s [%s]", ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev, ShmChargerInfo->SysMisc.SubVersion);
     printf("\r\n   Csu Primary: %s", ShmSysConfigAndInfo->SysInfo.CsuPrimFwRev);
     printf("\r\n    Fan Module: %s", ShmSysConfigAndInfo->SysInfo.FanModuleFwRev);
     printf("\r\n Relay1 Module: %s", ShmSysConfigAndInfo->SysInfo.RelayModuleFwRev);
@@ -909,6 +909,7 @@ void GetSystemInfo(void)
 	printf (" -ModelName: [%s], SerialNumber: [%s]\r\n",
         (char *)&ShmSysConfigAndInfo->SysConfig.ModelName,
         (char *)&ShmSysConfigAndInfo->SysConfig.SerialNumber);
+    printf (" -CSURootFs: %s [%s]\r\n", ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev, ShmChargerInfo->SysMisc.SubVersion);
 }
 
 bool SetModelName(char *modelName);
@@ -2397,9 +2398,11 @@ void ConnectionInfo(void)
 
 void GunEnableInfo(int gunIndex)
 {
-    printf(" Gun %d Index: %2X, Status = %2d , %7s, PowerConsumption: %.4f\r\n", gunIndex + 1, _chargingData[gunIndex]->Index, _chargingData[gunIndex]->SystemStatus,
+    printf(" Gun %d Index: %2X, Status = %2d , %7s, MeterValue: %10.4f, Local: : %10.4f, Gun: : %10.4f\r\n", gunIndex + 1, _chargingData[gunIndex]->Index, _chargingData[gunIndex]->SystemStatus,
         ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gunIndex].Enable ? "Enable" : "Disable",
-        _chargingData[gunIndex]->PowerConsumption);
+        _chargingData[gunIndex]->PowerConsumption,
+        ShmChargerInfo->MeterValue[gunIndex].LocalConsumption,
+        ShmChargerInfo->MeterValue[gunIndex].GunConsumption);
 }
 
 int FindDispenserIpAddress(int dispenser)
@@ -3623,15 +3626,18 @@ void ShowWebInfo(char *inputCmd, unsigned int opt)
     printf("\r\n");
 }
 
-// Gun 1 (  CCS  )   Soc:   XXX %,  Energy:   XXXXX.X kWh, IdTag [XXXXXXXXXXXXXXXX] Transaction [0]
-// Gun 1 (  CCS  ) IdTag: XXXXXXXXXXXXXXXX,   Soc:  XXX %, Energy: XXXX.X kWh
-//  (XX)    (X)   Target:  XXXX V,  XXXX A,   Cap: XXXX A, XXXX kW
-//                Output:  XXXX V,  XXXX A, Limit: XXXX A, XXXX kW
+// Gun 1 (  CCS  )               Soc:   XXX %,          Energy: XXXXXXX.XXX kWh, IdTag: [XXXXXXXXXX]
+//  (XX)    (X)               Target:  XXXX V,  XXXX A,    Cap: XXXX A, XXXX kW,  TxId: [XXXXXXXXXX]
+//                               PSU:  XXXX V,  XXXX A,  Limit: XXXX A, XXXX kW, Local: XXXXXXX.XXX kWh
+//  Start: [0000-00-00 00:00:00] PSU:  XXXX V,  XXXX A,  Limit: XXXX A, XXXX kW, Local: XXXXXXX.XXX kWh
+//                               Gun:  XXXX V,  XXXX A, Remote: XXXXXXX.XXX kWh, Meter: XXXXXXX.XXX kWh
+//   Stop: [0000-00-00 00:00:00] Gun:  XXXX V,  XXXX A, Remote: XXXXXXX.XXX kWh, Meter: XXXXXXX.XXX kWh
 void ShowGunInfo(int gun)
 {
     char *str_gun_type[] = {"CHAdeMO", "  CCS  ", "  GBT  "};
 
-    printf(" Gun %d (%s)   Soc:   %3d %s,  Energy:   %7.1f kWh, IdTag [%16s] Transaction [%d], TotalCost: %.2f\r\n",
+#if 0
+    printf(" Gun %d (%s)   Soc:   %3d %s, Energy: %10.3f kWh, IdTag [%20s] Transaction [%d], TotalCost: %.2f\r\n",
         gun + 1,
         ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun].Enable ? str_gun_type[_chargingData[gun]->Type] : "Disable",
         _chargingData[gun]->EvBatterySoc, "%",
@@ -3639,24 +3645,63 @@ void ShowGunInfo(int gun)
         _chargingData[gun]->StartUserId,
         ShmChargerInfo->UserTransaction[gun].TransactionId,
         ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun].TotalCost);
-    //printf(" Gun %d (%s) IdTag [%16s]    Soc:  %3d %s, Energy: %4.1f kWh\r\n",
-    //    i + 1,
-    //    ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].Enable ? str_gun_type[_chargingData[i]->Type] : "Disable",
-    //    _chargingData[i]->StartUserId,
-    //    _chargingData[i]->EvBatterySoc, "%",
-    //    _chargingData[i]->PresentChargedEnergy);
-    printf("  (%2d)    (%s)   Target:  %4d V,  %4d A,   Cap: %4d A, %4d kW\r\n",
+#endif
+    //************************************************************************************************
+    printf(" Gun %d (%s)               Soc:   %3d %s,          Energy: %11.3f kWh",
+        gun + 1,
+        ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun].Enable ? str_gun_type[_chargingData[gun]->Type] : "Disable",
+        _chargingData[gun]->EvBatterySoc, "%",
+        _chargingData[gun]->PresentChargedEnergy);
+    if(strlen((char *)_chargingData[gun]->StartUserId) > 0)
+    {
+        printf(", IdTag: [%s]", _chargingData[gun]->StartUserId);
+    }
+    printf("\r\n");
+    //************************************************************************************************
+    printf("  (%2d)    (%s)               Target:  %4d V,  %4d A,    Cap: %4d A, %4d kW",
         _chargingData[gun]->SystemStatus,
         _chargingData[gun]->ConnectorPlugIn ? "O" : "X",
         (int)_chargingData[gun]->EvBatterytargetVoltage,
         (int)_chargingData[gun]->EvBatterytargetCurrent,
         (int)(_chargingData[gun]->AvailableChargingCurrent / 10),
         (int)(_chargingData[gun]->AvailableChargingPower / 10));
-    printf("                Output:  %4d V,  %4d A, Limit: %4d A, %4d kW\r\n",
+    if(ShmChargerInfo->UserTransaction[gun].TransactionId > 0)
+    {
+        printf(",  TxId: [%d]", ShmChargerInfo->UserTransaction[gun].TransactionId);
+    }
+    if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun].TotalCost > 0)
+    {
+        printf(", $: %.2f", ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun].TotalCost);
+    }
+    printf("\r\n");
+    //************************************************************************************************
+    if(strlen(ShmChargerInfo->Timestamp[gun].StartCharging) > 0)
+    {
+        printf("  Start: [%s] ", ShmChargerInfo->Timestamp[gun].StartCharging);
+    }
+    else
+    {
+        printf("                               ");
+    }
+    printf("PSU:  %4d V,  %4d A,  Limit: %4d A, %4d kW, Local: %11.3f kWh\r\n",
         (int)(_chargingData[gun]->PresentChargingVoltage),
         (int)(_chargingData[gun]->PresentChargingCurrent),
         (int)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun].CapabilityCurrent / 10),
-        (int)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun].CapabilityPower / 10));
+        (int)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun].CapabilityPower / 10),
+        ShmChargerInfo->MeterValue[gun].LocalConsumption);
+    //************************************************************************************************
+    if(strlen(ShmChargerInfo->Timestamp[gun].StopCharging) > 0)
+    {
+        printf("   Stop: [%s] ", ShmChargerInfo->Timestamp[gun].StopCharging);
+    }
+    else
+    {
+        printf("                               ");
+    }
+    printf("Gun:  %4d V,  %4d A, Remote: %11.3f kWh, Meter: %11.3f kWh\r\n",
+        (int)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun].RemoteChargingVoltage / 10),
+        (int)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun].RemoteChargingCurrent / 10),
+        ShmChargerInfo->MeterValue[gun].GunConsumption, _chargingData[gun]->PowerConsumption);
 }
 
 void ShowInfo(char *inputCmd, unsigned int opt)
@@ -3678,7 +3723,7 @@ void ShowInfo(char *inputCmd, unsigned int opt)
         {
             if(reflash)
             {
-                ConsoleReflash(CONNECTOR_QUANTITY, 4);
+                ConsoleReflash(CONNECTOR_QUANTITY, 5);
             }
 
             for(int i = 0; i < GENERAL_GUN_QUANTITY; i++)
@@ -4073,7 +4118,7 @@ void EvCommMsgDebug(char *inputCmd, unsigned int opt)
         return;
     }
 
-    if(reg >= _Reg_Dispenser_Model_Name && reg <= _Reg_PowerConsumption)
+    if(reg >= _Reg_Dispenser_Model_Name && reg < _Reg_None)
     {
         find = true;
 
@@ -4094,7 +4139,7 @@ void EvCommMsgDebug(char *inputCmd, unsigned int opt)
         {
             find = true;
 
-            ShmChargerInfo->Control.EvCommCtrl.MsgFlag.bits.Reg_All = enable;
+            ShmChargerInfo->Control.EvCommCtrl.MsgFlag.bits.RegDbg_All = enable;
             printf("%s EvComm All Msg Flag\r\n", enable ? "Enable" : "Disable");
         }
     }
@@ -4218,6 +4263,13 @@ bool SetSystemID(char *systemId)
     return true;
 }
 
+bool CleanSystemID(void)
+{
+    memset((char *)&ShmSysConfigAndInfo->SysConfig.SystemId, 0x00, sizeof(ShmSysConfigAndInfo->SysConfig.SystemId));
+    printf("Clean System ID OK\r\n");
+    return true;
+}
+
 bool SetAuthorisationMode(char *mode)
 {
     bool disable = false;
@@ -4311,6 +4363,13 @@ bool SetQRCodeContent(char *content)
     return true;
 }
 
+bool CleanQRCodeContent(void)
+{
+    memset((char *)&ShmSysConfigAndInfo->SysConfig.QRCodeContent, 0x00, sizeof(ShmSysConfigAndInfo->SysConfig.QRCodeContent));
+    printf("Clean QRCode Content OK\r\n");
+    return true;
+}
+
 bool SetLEDIntensity(char *intensity)
 {
     int ledIntensity = _LED_INTENSITY_DARKEST;
@@ -4398,6 +4457,13 @@ bool SetOcppServerURL(char *url)
     return true;
 }
 
+bool CleanOcppServerURL(void)
+{
+    memset((char *)&ShmSysConfigAndInfo->SysConfig.OcppServerURL, 0x00, sizeof(ShmSysConfigAndInfo->SysConfig.OcppServerURL));
+    printf("Clean Ocpp Server URL OK\r\n");
+    return true;
+}
+
 bool SetChargeBoxId(char *boxId)
 {
     if(strlen(boxId) >= sizeof(ShmSysConfigAndInfo->SysConfig.ChargeBoxId))
@@ -4412,6 +4478,13 @@ bool SetChargeBoxId(char *boxId)
     return true;
 }
 
+bool CleanChargeBoxId(void)
+{
+    memset((char *)&ShmSysConfigAndInfo->SysConfig.ChargeBoxId, 0x00, sizeof(ShmSysConfigAndInfo->SysConfig.ChargeBoxId));
+    printf("Clean Charge Box Id OK\r\n");
+    return true;
+}
+
 bool SetChargePointVendor(char *vendor)
 {
     if(strlen(vendor) >= sizeof(ShmSysConfigAndInfo->SysConfig.chargePointVendor))
@@ -4426,6 +4499,13 @@ bool SetChargePointVendor(char *vendor)
     return true;
 }
 
+bool CleanChargePointVendor(void)
+{
+    memset((char *)&ShmSysConfigAndInfo->SysConfig.chargePointVendor, 0x00, sizeof(ShmSysConfigAndInfo->SysConfig.chargePointVendor));
+    printf("Clean Charge Point Vendor OK\r\n");
+    return true;
+}
+
 bool SetOcppReceiptrURL(char *receipt)
 {
     if(strlen(receipt) >= sizeof(ShmSysConfigAndInfo->SysConfig.OcppReceiptrURL))
@@ -4440,6 +4520,13 @@ bool SetOcppReceiptrURL(char *receipt)
     return true;
 }
 
+bool CleanOcppReceiptrURL(void)
+{
+    memset((char *)&ShmSysConfigAndInfo->SysConfig.OcppReceiptrURL, 0x00, sizeof(ShmSysConfigAndInfo->SysConfig.OcppReceiptrURL));
+    printf("Clean Ocpp Receiptr URL OK\r\n");
+    return true;
+}
+
 bool SetMaintainServerURL(char *url)
 {
     if(strlen(url) >= sizeof(ShmSysConfigAndInfo->SysConfig.MaintainServerURL))
@@ -4454,34 +4541,34 @@ bool SetMaintainServerURL(char *url)
     return true;
 }
 
+bool CleanMaintainServerURL(void)
+{
+    memset((char *)&ShmSysConfigAndInfo->SysConfig.MaintainServerURL, 0x00, sizeof(ShmSysConfigAndInfo->SysConfig.MaintainServerURL));
+    printf("Clean Maintain Server URL OK\r\n");
+    return true;
+}
+
 void FlashSetCmd(char *inputCmd, unsigned int opt)
 {
-    char subMain[64];
-    char subSub[64];
+    char subMain[MAX_SUB_CMD_LENGTH];
+    char subSub[MAX_SUB_CMD_LENGTH];
 
     memset(subMain, 0x00, sizeof(subMain));
     memset(subSub, 0x00, sizeof(subSub));
 
     bool find = false;
     int actIndex = 0;
-    int maxLen = 10;
-    char strWriteItem[32][32] = {
-        "model", "sn", "sysid", "auth", "evccid", "qrmode", "qrcontent", "led",
-        "stopbtn", "policy"};
-    bool (*writeFlashList[32])(char *) = {
-        &SetModelName, &SetSerialNumber, &SetSystemID, &SetAuthorisationMode,
-        &SetAuthrizeByEVCCID, &SetQRCodeMadeMode, &SetQRCodeContent, &SetLEDIntensity,
-        &SetStopChargingByButton, &SetOfflinePolicy};
-#if 0
+
+    int maxLen = 15;
     char strWriteItem[32][32] = {
-        "model", "sn", "sysid", "auth", "evccid", "qrmode", "qrcontent", "led",
+        "model", "sn", "sysid", "auth", "evccid", "qrmode", "qrcode", "led",
         "stopbtn", "policy", "backend", "boxid", "vendor", "receipt", "maintain"};
     bool (*writeFlashList[32])(char *) = {
         &SetModelName, &SetSerialNumber, &SetSystemID, &SetAuthorisationMode,
         &SetAuthrizeByEVCCID, &SetQRCodeMadeMode, &SetQRCodeContent, &SetLEDIntensity,
         &SetStopChargingByButton, &SetOfflinePolicy, &SetOcppServerURL, &SetChargeBoxId,
         &SetChargePointVendor, &SetOcppReceiptrURL, &SetMaintainServerURL};
-#endif
+
     bool (*WriteFlashAct)(char *);
 
     if(MainAndSubCommandParsing(inputCmd, subMain, subSub) == 2)
@@ -4513,6 +4600,54 @@ void FlashSetCmd(char *inputCmd, unsigned int opt)
     printf("\r\n\r\n");
 }
 
+void FlashCleanCmd(char *inputCmd, unsigned int opt)
+{
+    char subMain[MAX_SUB_CMD_LENGTH];
+    char subSub[MAX_SUB_CMD_LENGTH];
+
+    memset(subMain, 0x00, sizeof(subMain));
+    memset(subSub, 0x00, sizeof(subSub));
+
+    bool find = false;
+    int actIndex = 0;
+
+    int maxLen = 7;
+    char strCleanItem[32][32] = {
+        "sysid", "qrcode", "backend", "boxid", "vendor", "receipt", "maintain"};
+    bool (*cleanFlashList[32])() = {
+        &CleanSystemID, &CleanQRCodeContent, &CleanOcppServerURL, &CleanChargeBoxId,
+        &CleanChargePointVendor, &CleanOcppReceiptrURL, &CleanMaintainServerURL};
+    bool (*CleanFlashAct)();
+
+    if(MainAndSubCommandParsing(inputCmd, subMain, subSub) == 1)
+    {
+        for(actIndex = 0; actIndex < maxLen; actIndex++)
+        {
+            if(strcmp((char *)&strCleanItem[actIndex][0], subMain) == 0)
+            {
+                find = true;
+                break;
+            }
+        }
+        if(find)
+        {
+            printf("\r\n");
+            CleanFlashAct = cleanFlashList[actIndex];
+            CleanFlashAct();
+            printf("\r\n");
+            return;
+        }
+    }
+    printf("\r\n");
+    printf("Input cmd fail ------  model [clean] [cmd]\r\n");
+    printf(" [cmd]");
+    for(actIndex = 0; actIndex < maxLen; actIndex++)
+    {
+        printf("%s%s", actIndex == 0 ? " " : " | ", &strCleanItem[actIndex][0]);
+    }
+    printf("\r\n\r\n");
+}
+
 void FlashWriteCmd(char *inputCmd, unsigned int opt)
 {
     if(strcmp(inputCmd, "now") == EQUAL)
@@ -4531,8 +4666,8 @@ void FlashWriteCmd(char *inputCmd, unsigned int opt)
 
 void FlashCmd(char *inputCmd, unsigned int opt)
 {
-    char subMain[64];
-    char subSub[64];
+    char subMain[MAX_SUB_CMD_LENGTH];
+    char subSub[MAX_SUB_CMD_LENGTH];
 
     memset(subMain, 0x00, sizeof(subMain));
     memset(subSub, 0x00, sizeof(subSub));
@@ -4550,15 +4685,364 @@ void FlashCmd(char *inputCmd, unsigned int opt)
             FlashWriteCmd(subSub, opt);
             return;
         }
+
+        if(strcmp(subMain, "clean") == EQUAL)
+        {
+            FlashCleanCmd(subSub, opt);
+            return;
+        }
+    }
+    printf("\r\n");
+    printf("Input cmd fail ------  flash [set | write | clean] [cmd] [...]\r\n\r\n");
+}
+
+void EnableAbnormalRelay(void)
+{
+    ShmChargerInfo->Control.RelayCtrl.bits.AbnormalRelay = true;
+    printf("\r\n");
+    printf("Enable Abnormal Relay Cmd\r\n\r\n");
+}
+
+void DisableAbnormalRelay(void)
+{
+    ShmChargerInfo->Control.RelayCtrl.bits.AbnormalRelay = NO;
+    printf("\r\n");
+    printf("Disable Abnormal Relay Cmd\r\n\r\n");
+}
+
+void RelayWriteOutputCmd(char *inputCmd)
+{
+    char subMain[MAX_SUB_CMD_LENGTH];
+    char subSub[MAX_SUB_CMD_LENGTH];
+
+    memset(subMain, 0x00, sizeof(subMain));
+    memset(subSub, 0x00, sizeof(subSub));
+
+    if(MainAndSubCommandParsing(inputCmd, subMain, subSub) == 2)
+    {
+		int value = 0;
+		value = atoi(&subMain[0]);
+
+		if(value > 0 && value <= MAX_GUN_QUANTITY && (strcmp(subSub, "on") == 0 || strcmp(subSub, "off") == 0))
+		{
+			int OnOff = 0;
+
+            if(!ShmChargerInfo->Control.RelayCtrl.bits.AbnormalRelay)
+            {
+                EnableAbnormalRelay();
+            }
+
+			OnOff = strcmp(subSub, "on") == 0 ? YES : NO;
+			ShmChargerInfo->PsuGrouping.OutputRelayConfig[value - 1].bits.Output_N = OnOff;
+			ShmChargerInfo->PsuGrouping.OutputRelayConfig[value - 1].bits.Output_P = OnOff;
+			printf("\r\n");
+			printf("Write Gun %d OutputRelay %s\r\n\r\n", value, subSub);
+			return;
+		}
+    }
+    printf("\r\n");
+    printf("Input cmd fail ------  relay [write] [output] [value 1-4] [on | off]\r\n\r\n");
+}
+
+void RelayWriteParallelCmd(char *inputCmd)
+{
+    char subMain[MAX_SUB_CMD_LENGTH];
+    char subSub[MAX_SUB_CMD_LENGTH];
+
+    memset(subMain, 0x00, sizeof(subMain));
+    memset(subSub, 0x00, sizeof(subSub));
+
+    if(MainAndSubCommandParsing(inputCmd, subMain, subSub) == 2)
+    {
+		int value = 0;
+		value = atoi(&subMain[0]);
+
+		if(value > 0 && value <= PARALLEL_RELAY_COUNT && (strcmp(subSub, "on") == 0 || strcmp(subSub, "off") == 0))
+		{
+			int OnOff = 0;
+
+            if(!ShmChargerInfo->Control.RelayCtrl.bits.AbnormalRelay)
+            {
+                EnableAbnormalRelay();
+            }
+
+			OnOff = strcmp(subSub, "on") == 0 ? YES : NO;
+			if(OnOff)
+			{
+				ShmChargerInfo->PsuGrouping.ParallelRelayConfig.CtrlValue |= 1 << (value - 1);
+			}
+			else
+			{
+				ShmChargerInfo->PsuGrouping.ParallelRelayConfig.CtrlValue &= ~(1 << (value - 1));
+			}
+			printf("\r\n");
+			printf("Write ParallelRelay %d %s\r\n\r\n", value, subSub);
+			return;
+		}
+    }
+    printf("\r\n");
+    printf("Input cmd fail ------  relay [write] [parallel] [value 1-6] [on | off]\r\n\r\n");
+}
+
+void AbnormalRelayCmd(char *inputCmd, unsigned int opt)
+{
+    char subMain[MAX_SUB_CMD_LENGTH];
+    char subSub[MAX_SUB_CMD_LENGTH];
+
+    memset(subMain, 0x00, sizeof(subMain));
+    memset(subSub, 0x00, sizeof(subSub));
+
+    if(MainAndSubCommandParsing(inputCmd, subMain, subSub) == 1)
+    {
+        if(strcmp(subMain, "enable") == 0)
+        {
+            EnableAbnormalRelay();
+            return;
+        }
+
+        if(strcmp(subMain, "disable") == 0)
+        {
+            DisableAbnormalRelay();
+            return;
+        }
+    }
+    printf("\r\n");
+    printf("Input cmd fail ------  relay [abnormal] [enable | disable]\r\n\r\n");
+}
+
+void RelayWriteCmd(char *inputCmd, unsigned int opt)
+{
+    char subMain[MAX_SUB_CMD_LENGTH];
+    char subSub[MAX_SUB_CMD_LENGTH];
+
+    memset(subMain, 0x00, sizeof(subMain));
+    memset(subSub, 0x00, sizeof(subSub));
+
+    if(MainAndSubCommandParsing(inputCmd, subMain, subSub) == 2)
+    {
+		if(strcmp(subMain, "output") == 0)
+		{
+			RelayWriteOutputCmd(subSub);
+			return;
+		}
+
+		if(strcmp(subMain, "parallel") == 0)
+		{
+			RelayWriteParallelCmd(subSub);
+			return;
+		}
+    }
+    printf("\r\n");
+    printf("Input cmd fail ------  relay [write] [output | parallel] [value] [on | off]\r\n\r\n");
+}
+
+void RelayReadCmd(char *inputCmd, unsigned int opt)
+{
+
+}
+
+void OutputRelayAutoTest(void)
+{
+    int MaxGunCount = 0;
+    struct timespec _Loop_time;
+    int time = 0;
+
+    MaxGunCount = MAX_GUN_QUANTITY;
+
+    for(int i = 0; i < MaxGunCount; i++)
+    {
+        ShmChargerInfo->PsuGrouping.OutputRelayConfig[i].bits.Output_N = YES;
+        GetClockTime(&_Loop_time);
+        while(1)
+        {
+            time = GetTimeoutValue(_Loop_time) / mSEC_VAL;
+
+            if(ShmChargerInfo->PsuGrouping.OutputRelayConfig[i].bits.Output_N == ShmChargerInfo->PsuGrouping.OutputRelayConfirmed[i].bits.Output_N)
+            {
+                printf("Gun %d Output Relay N Driving Check OK\r\n", i + 1);
+                break;
+            }
+            if(time >= 3000)
+            {
+                printf("Gun %d Output Relay N Driving Check Fault\r\n", i + 1);
+                break;
+            }
+            usleep(10000);
+        }
+
+        ShmChargerInfo->PsuGrouping.OutputRelayConfig[i].bits.Output_P = YES;
+        GetClockTime(&_Loop_time);
+        while(1)
+        {
+            time = GetTimeoutValue(_Loop_time) / mSEC_VAL;
+
+            if(ShmChargerInfo->PsuGrouping.OutputRelayConfig[i].bits.Output_P == ShmChargerInfo->PsuGrouping.OutputRelayConfirmed[i].bits.Output_P)
+            {
+                printf("Gun %d Output Relay P Driving Check OK\r\n", i + 1);
+                break;
+            }
+            if(time >= 3000)
+            {
+                printf("Gun %d Output Relay P Driving Check Fault\r\n", i + 1);
+                break;
+            }
+            usleep(10000);
+        }
+
+        ShmChargerInfo->PsuGrouping.OutputRelayConfig[i].bits.Output_N = NO;
+        GetClockTime(&_Loop_time);
+        while(1)
+        {
+            time = GetTimeoutValue(_Loop_time) / mSEC_VAL;
+
+            if(ShmChargerInfo->PsuGrouping.OutputRelayConfig[i].bits.Output_N == ShmChargerInfo->PsuGrouping.OutputRelayConfirmed[i].bits.Output_N)
+            {
+                printf("Gun %d Output Relay N Welding Check OK\r\n", i + 1);
+                break;
+            }
+            if(time >= 3000)
+            {
+                printf("Gun %d Output Relay N Welding Check Fault\r\n", i + 1);
+                break;
+            }
+            usleep(10000);
+        }
+
+        ShmChargerInfo->PsuGrouping.OutputRelayConfig[i].bits.Output_P = NO;
+        GetClockTime(&_Loop_time);
+        while(1)
+        {
+            time = GetTimeoutValue(_Loop_time) / mSEC_VAL;
+
+            if(ShmChargerInfo->PsuGrouping.OutputRelayConfig[i].bits.Output_P == ShmChargerInfo->PsuGrouping.OutputRelayConfirmed[i].bits.Output_P)
+            {
+                printf("Gun %d Output Relay P Welding Check OK\r\n", i + 1);
+                break;
+            }
+            if(time >= 3000)
+            {
+                printf("Gun %d Output Relay P Welding Check Fault\r\n", i + 1);
+                break;
+            }
+            usleep(10000);
+        }
+    }
+}
+
+void ParallelRelayAutoTest(void)
+{
+    int ParallelRelayCount = 0;
+    struct timespec _Loop_time;
+    int time = 0;
+
+    ParallelRelayCount = PARALLEL_RELAY_COUNT;
+
+    for(int i = 0; i < ParallelRelayCount; i++)
+    {
+        ShmChargerInfo->PsuGrouping.ParallelRelayConfig.CtrlValue |= 1 << i;
+        GetClockTime(&_Loop_time);
+        while(1)
+        {
+            time = GetTimeoutValue(_Loop_time) / mSEC_VAL;
+
+            if(ShmChargerInfo->PsuGrouping.ParallelRelayConfig.CtrlValue == ShmChargerInfo->PsuGrouping.ParallelRelayConfirmed.CtrlValue)
+            {
+                printf("Location %d Parallel Relay Driving Check OK\r\n", i + 1);
+                break;
+            }
+            if(time >= 3000)
+            {
+                printf("Location %d Parallel Relay Driving Check Fault\r\n", i + 1);
+                break;
+            }
+            usleep(10000);
+        }
+
+        ShmChargerInfo->PsuGrouping.ParallelRelayConfig.CtrlValue &= ~(1 << i);
+        GetClockTime(&_Loop_time);
+        while(1)
+        {
+            time = GetTimeoutValue(_Loop_time) / mSEC_VAL;
+
+            if(ShmChargerInfo->PsuGrouping.ParallelRelayConfig.CtrlValue == ShmChargerInfo->PsuGrouping.ParallelRelayConfirmed.CtrlValue)
+            {
+                printf("Location %d Parallel Relay Welding Check OK\r\n", i + 1);
+                break;
+            }
+            if(time >= 3000)
+            {
+                printf("Location %d Parallel Relay Welding Check Fault\r\n", i + 1);
+                break;
+            }
+            usleep(10000);
+        }
+    }
+}
+
+void RelayAutoTest(char *inputCmd)
+{
+    if(strcmp(inputCmd, "now") != EQUAL)
+    {
+        printf("\r\n");
+        printf("Input cmd fail ------  relay [autotest] [now]\r\n\r\n");
+        return;
+    }
+
+    if(!ShmChargerInfo->Control.RelayCtrl.bits.AbnormalRelay)
+    {
+        EnableAbnormalRelay();
+    }
+
+    OutputRelayAutoTest();
+    ParallelRelayAutoTest();
+    printf("Relay Auto Test Completed\r\n");
+
+    DisableAbnormalRelay();
+}
+
+void RelayCmd(char *inputCmd, unsigned int opt)
+{
+    char subMain[MAX_SUB_CMD_LENGTH];
+    char subSub[MAX_SUB_CMD_LENGTH];
+
+    memset(subMain, 0x00, sizeof(subMain));
+    memset(subSub, 0x00, sizeof(subSub));
+
+    if(MainAndSubCommandParsing(inputCmd, subMain, subSub) >= 2)
+    {
+        if(strcmp(subMain, "abnormal") == EQUAL)
+        {
+            AbnormalRelayCmd(subSub, opt);
+            return;
+        }
+
+        if(strcmp(subMain, "write") == EQUAL)
+        {
+        	RelayWriteCmd(subSub, opt);
+            return;
+        }
+
+        if(strcmp(subMain, "read") == EQUAL)
+        {
+        	RelayReadCmd(subSub, opt);
+            return;
+        }
+
+        if(strcmp(subMain, "autotest") == EQUAL)
+        {
+            RelayAutoTest(subSub);
+            return;
+        }
     }
     printf("\r\n");
-    printf("Input cmd fail ------  flash [set] [cmd] [...]\r\n\r\n");
+    printf("Input cmd fail ------  relay [abnormal | write | read | autotest] [...]\r\n\r\n");
 }
 
 int main(void)
 {
-    char newString[32][32];
-    char inputString[128], normalCmd[128], mainCmd[128], subCmd[128], multiCmd[128];
+    char newString[32][MAX_SUB_CMD_LENGTH];
+    char inputString[MAX_SUB_CMD_LENGTH], normalCmd[MAX_SUB_CMD_LENGTH];
+    char mainCmd[MAX_SUB_CMD_LENGTH], subCmd[MAX_SUB_CMD_LENGTH], multiCmd[MAX_SUB_CMD_LENGTH];
     int cmdCnt = 0, parseCnt = 0;
     unsigned int option = 0;
 
@@ -4603,7 +5087,7 @@ int main(void)
             memset(subCmd, 0x00, sizeof(subCmd));
             for(int i = 0; i < 32; i++)
             {
-                memset(&newString[i], 0x00, 32);
+                memset(&newString[i], 0x00, MAX_SUB_CMD_LENGTH);
             }
 
             //printf("CmdCnt: %d\r\n", cmdCnt);
@@ -4979,6 +5463,10 @@ int main(void)
         else if(strcmp(mainCmd, "flash") == 0)
         {
             FlashCmd(subCmd, option);
+        }
+        else if(strcmp(mainCmd, "relay") == 0)
+        {
+        	RelayCmd(subCmd, option);
         }
 		else
 		{

+ 86 - 0
EVSE/Projects/DO360/Apps/internalComm.c

@@ -37,6 +37,8 @@
 
 #define PASS                1
 #define FAIL                -1
+#define RS485_RAW_DATA      0
+#define RS485_INFO(format, args...) StoreInternalCommLog("[%s:%4d][%s][EvMsg] "format, (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__), __LINE__, __FUNCTION__, ##args)
 
 struct Address Addr = {
     AUX_ADD,
@@ -85,6 +87,32 @@ struct Command Cmd = {
     MSGID_S_FW_FINISH
 };
 
+int StoreInternalCommLog(const char *fmt, ...)
+{
+    char Buf[4096+256];
+    char buffer[4096];
+    va_list args;
+    struct timeb  SeqEndTime;
+    struct tm *tm;
+
+    va_start(args, fmt);
+    int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
+    va_end(args);
+
+    memset(Buf,0,sizeof(Buf));
+    ftime(&SeqEndTime);
+    SeqEndTime.time = time(NULL);
+    tm=localtime(&SeqEndTime.time);
+
+    sprintf(Buf,"echo \'%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\' >> /Storage/SystemLog/[%04d.%02d]InternalCommLog",
+        tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
+        buffer,
+        tm->tm_year+1900,tm->tm_mon+1);
+    system(Buf);
+
+    return rc;
+}
+
 int tranceiveRelDelayTime(int fd, unsigned char* cmd, unsigned char cmd_len, unsigned char* rx, unsigned short _delay)
 {
 	int len;
@@ -93,8 +121,37 @@ int tranceiveRelDelayTime(int fd, unsigned char* cmd, unsigned char cmd_len, uns
 
 	if(write(fd, cmd, cmd_len) >= cmd_len)
 	{
+#if RS485_RAW_DATA
+        char buffer[1024];
+        char temp[32];
+        memset(buffer, 0x00, sizeof(buffer));
+        sprintf(buffer, "Tx->");
+        for(int i = 0; i < cmd_len; i++)
+        {
+            sprintf(temp, " %02X", cmd[i]);
+            strcat(buffer, temp);
+        }
+        RS485_INFO("%s", buffer);
+#endif
 		usleep(_delay * 1000);
 		len = read(fd, rx, 512);
+#if RS485_RAW_DATA
+        memset(buffer, 0x00, sizeof(buffer));
+        sprintf(buffer, "Rx<-");
+        if(len > 0)
+        {
+            for(int i = 0; i < len; i++)
+            {
+                sprintf(temp, " %02X", rx[i]);
+                strcat(buffer, temp);
+            }
+        }
+        else
+        {
+            strcat(buffer, " No Data!");
+        }
+        RS485_INFO("%s", buffer);
+#endif
 	}
 	else
 	{
@@ -114,8 +171,37 @@ int tranceive(int fd, unsigned char* cmd, unsigned char cmd_len, unsigned char*
 
 	if(write(fd, cmd, cmd_len) >= cmd_len)
 	{
+#if RS485_RAW_DATA
+	    char buffer[1024];
+	    char temp[32];
+	    memset(buffer, 0x00, sizeof(buffer));
+	    sprintf(buffer, "Tx->");
+	    for(int i = 0; i < cmd_len; i++)
+	    {
+	        sprintf(temp, " %02X", cmd[i]);
+	        strcat(buffer, temp);
+	    }
+	    RS485_INFO("%s", buffer);
+#endif
 		usleep(15000);
 		len = read(fd, rx, 512);
+#if RS485_RAW_DATA
+        memset(buffer, 0x00, sizeof(buffer));
+        sprintf(buffer, "Rx<-");
+        if(len > 0)
+        {
+            for(int i = 0; i < len; i++)
+            {
+                sprintf(temp, " %02X", rx[i]);
+                strcat(buffer, temp);
+            }
+        }
+        else
+        {
+            strcat(buffer, " No Data!");
+        }
+        RS485_INFO("%s", buffer);
+#endif
 	}
 	else
 	{

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 551 - 186
EVSE/Projects/DO360/Apps/main.c


BIN
EVSE/Projects/DO360/Images/FactoryDefaultConfig.bin


BIN
EVSE/Projects/DO360/Images/ramdisk.gz


BIN
EVSE/rootfs/root/Module_PowerSharing


Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác