Browse Source

2022-08-29 / Simon Xue

Action:
1. [Add] ReadCmdline add led function.
2. [Modify] RFID reader 8 bytes and endian little or endian big.
3. [Modify] Merge master

Files
As the following commit history files

Image Version: T1.23.XX.XXXX.XX
Simon Xue 2 years ago
parent
commit
3ea40a160b
30 changed files with 513 additions and 68 deletions
  1. 82 0
      EVSE/Projects/DD360/Apps/CSU/RFID.c
  2. 2 2
      EVSE/Projects/DD360/Apps/CSU/main.c
  3. 7 0
      EVSE/Projects/DD360/Apps/Config.h
  4. 56 32
      EVSE/Projects/DD360/Apps/Define/define.h
  5. 8 0
      EVSE/Projects/DD360/Apps/ModuleInternalComm/RelayBoard.c
  6. 86 0
      EVSE/Projects/DD360/Apps/ReadCmdline.c
  7. BIN
      EVSE/Projects/DD360/Apps/UnsafetyOutputTask
  8. BIN
      EVSE/Projects/DD360/Images/ramdisk.gz
  9. BIN
      EVSE/Projects/DD360/output/FactoryConfig
  10. BIN
      EVSE/Projects/DD360/output/Module_ChkSysTask
  11. BIN
      EVSE/Projects/DD360/output/Module_DoComm
  12. BIN
      EVSE/Projects/DD360/output/Module_EvComm
  13. BIN
      EVSE/Projects/DD360/output/Module_EventLogging
  14. BIN
      EVSE/Projects/DD360/output/Module_InternalComm
  15. BIN
      EVSE/Projects/DD360/output/Module_LcmControl
  16. BIN
      EVSE/Projects/DD360/output/Module_PrimaryComm
  17. BIN
      EVSE/Projects/DD360/output/Module_UpdateFW
  18. BIN
      EVSE/Projects/DD360/output/ReadCmdline
  19. BIN
      EVSE/Projects/DD360/output/UnsafetyOutputTask
  20. BIN
      EVSE/Projects/DD360/output/main
  21. 82 0
      EVSE/Projects/DD360Audi/Apps/CSU/RFID.c
  22. 2 2
      EVSE/Projects/DD360Audi/Apps/CSU/main.c
  23. 7 0
      EVSE/Projects/DD360Audi/Apps/Config.h
  24. 56 32
      EVSE/Projects/DD360Audi/Apps/Define/define.h
  25. 8 0
      EVSE/Projects/DD360Audi/Apps/ModuleInternalComm/RelayBoard.c
  26. 86 0
      EVSE/Projects/DD360Audi/Apps/ReadCmdline.c
  27. BIN
      EVSE/rootfs/root/Module_Payment_Bazel8
  28. BIN
      EVSE/rootfs/root/Module_Payment_Enegate
  29. BIN
      EVSE/rootfs/root/Module_PowerSharing
  30. 31 0
      build_rootfs_copy.sh

+ 82 - 0
EVSE/Projects/DD360/Apps/CSU/RFID.c

@@ -395,6 +395,7 @@ void CreateRfidFork(void)
 
             if (pSysConfig->RfidCardNumEndian == RFID_ENDIAN_LITTLE) {
                 switch (rfid.snType) {
+#ifdef DD360Audi
                 case RFID_SN_TYPE_6BYTE:
                     sprintf((char *) pSysConfig->UserId,
                             "%02X%02X%02X%02X%02X%02X",
@@ -425,9 +426,50 @@ void CreateRfidFork(void)
                             rfid.currentCard[0], rfid.currentCard[1],
                             rfid.currentCard[2], rfid.currentCard[3]);
                     break;
+#else
+                case RFID_SN_TYPE_6BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X%02X%02X",
+                        rfid.currentCard[5], rfid.currentCard[4],
+                        rfid.currentCard[3], rfid.currentCard[2],
+                        rfid.currentCard[1], rfid.currentCard[0]);
+                    break;
+                case RFID_SN_TYPE_7BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X%02X%02X%02X",
+                        rfid.currentCard[6], rfid.currentCard[5],
+                        rfid.currentCard[4], rfid.currentCard[3],
+                        rfid.currentCard[2], rfid.currentCard[1],
+                        rfid.currentCard[0]);
+                    break;
+                case RFID_SN_TYPE_8BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X%02X%02X%02X%02X",
+                        rfid.currentCard[7], rfid.currentCard[6],
+                        rfid.currentCard[5], rfid.currentCard[4],
+                        rfid.currentCard[3], rfid.currentCard[2],
+                        rfid.currentCard[1], rfid.currentCard[0]);
+                    break;
+                case RFID_SN_TYPE_10BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
+                        rfid.currentCard[9], rfid.currentCard[8],
+                        rfid.currentCard[7], rfid.currentCard[6],
+                        rfid.currentCard[5], rfid.currentCard[4],
+                        rfid.currentCard[3], rfid.currentCard[2],
+                        rfid.currentCard[1], rfid.currentCard[0]);
+                    break;
+                case RFID_SN_TYPE_4BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X",
+                        rfid.currentCard[3], rfid.currentCard[2],
+                        rfid.currentCard[1], rfid.currentCard[0]);
+                    break;
+#endif
                 }
             } else if (pSysConfig->RfidCardNumEndian == RFID_ENDIAN_BIG) {
                 switch (rfid.snType) {
+#ifdef DD360Audi
                 case RFID_SN_TYPE_6BYTE:
                     sprintf((char *) pSysConfig->UserId,
                             "%02X%02X%02X%02X%02X%02X",
@@ -458,6 +500,46 @@ void CreateRfidFork(void)
                             rfid.currentCard[3], rfid.currentCard[2],
                             rfid.currentCard[1], rfid.currentCard[0]);
                     break;
+#else
+                case RFID_SN_TYPE_6BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X%02X%02X",
+                        rfid.currentCard[0], rfid.currentCard[1],
+                        rfid.currentCard[2], rfid.currentCard[3],
+                        rfid.currentCard[4], rfid.currentCard[5]);
+                    break;
+                case RFID_SN_TYPE_7BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X%02X%02X%02X",
+                        rfid.currentCard[0], rfid.currentCard[1],
+                        rfid.currentCard[2], rfid.currentCard[3],
+                        rfid.currentCard[4], rfid.currentCard[5],
+                        rfid.currentCard[6]);
+                    break;
+                case RFID_SN_TYPE_8BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X%02X%02X%02X%02X",
+                        rfid.currentCard[0], rfid.currentCard[1],
+                        rfid.currentCard[2], rfid.currentCard[3],
+                        rfid.currentCard[4], rfid.currentCard[5],
+                        rfid.currentCard[6], rfid.currentCard[7]);
+                    break;
+                case RFID_SN_TYPE_10BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
+                        rfid.currentCard[0], rfid.currentCard[1],
+                        rfid.currentCard[2], rfid.currentCard[3],
+                        rfid.currentCard[4], rfid.currentCard[5],
+                        rfid.currentCard[6], rfid.currentCard[7],
+                        rfid.currentCard[8], rfid.currentCard[9]);
+                    break;
+                case RFID_SN_TYPE_4BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X",
+                        rfid.currentCard[0], rfid.currentCard[1],
+                        rfid.currentCard[2], rfid.currentCard[3]);
+                    break;
+#endif
                 }
             }
             log_info("card number = %s", pSysConfig->UserId);

+ 2 - 2
EVSE/Projects/DD360/Apps/CSU/main.c

@@ -85,8 +85,8 @@ uint8_t bd0_2_status = 0;
 uint8_t bd1_1_status = 0;
 uint8_t bd1_2_status = 0;
 
-char *fwVersion = "V1.23.00.0000.00"; // "V0.16.00.0000.00";
-char* DebugVersion = "V1.23.1";
+char *fwVersion = "T1.23.00.0000.00"; // "V0.16.00.0000.00";
+char* DebugVersion = "T1.23.3";
 //sqlite3 *localDb;
 bool isDb_ready;
 

+ 7 - 0
EVSE/Projects/DD360/Apps/Config.h

@@ -463,6 +463,12 @@ typedef struct stRecordTransactionInfo
     unsigned char res;
 }RecordTransactionInfo;
 
+typedef struct stTestFlag
+{
+    uint8_t ledflag;
+}TestFlag;
+
+
 typedef struct StDcCommonInfo {
     uint8_t RebootCount;
     uint8_t CcsVersion;
@@ -496,6 +502,7 @@ typedef struct StDcCommonInfo {
     time_t FanOnTime;
     float TempVolt[4];
     char DebugVersion[32];
+    TestFlag pTest;
 } DcCommonInfo;
 
 #endif /* CONFIG_H_ */

+ 56 - 32
EVSE/Projects/DD360/Apps/Define/define.h

@@ -155,10 +155,10 @@ Storage							0x0A200000-0x7FFFFFFF		1886 MB
     #define ONE_CONNECTOR_USE       0
 #elif defined Emulator
     #define MAX_PSU_QUANTITY        62
-    #define CHAdeMO_QUANTITY        3
-    #define CCS_QUANTITY            3
-    #define GB_QUANTITY             3
-    #define AC_QUANTITY             3
+    #define CHAdeMO_QUANTITY        2
+    #define CCS_QUANTITY            2
+    #define GB_QUANTITY             2
+    #define AC_QUANTITY             2
     #define GENERAL_GUN_QUANTITY    0
     #define PSU_QUANTITY            2
     #define ONE_CONNECTOR_USE       0
@@ -344,6 +344,8 @@ enum CoreProfile {
      EVCCID_PREFIX,
      OffLineMaxChargingPower,
      ConfigurationVersion,
+	 CharingProfileRefreshInterval,
+	 OcppSoftwareVersion,
 	 _CoreProfile_CNT
 };
 
@@ -1082,6 +1084,7 @@ struct SysInfoData
     struct LCD_OVERRIDE     LcdOveride;                 // LCD override info (no use anymore)
     struct BAZEL8           bazel8;                     // Bazel8 payment used
     struct Enegate          enegate;                    // Enegate payment used
+    unsigned char           PsuLostQuantity;
 };
 
 struct SysConfigAndInfo
@@ -1641,7 +1644,7 @@ char InfoStatusCode[384][6]=
 	"013626",	//disconnected from APN through 3G/4G
 	"013627",	//WiFi disabled (separated charger only)
 	"013628",	//4G disabled (separated charger only)
-	"013629",	//Reserved
+	"013629",	//Psu Quantity Not Match
 	"013630",	//Reserved
 	"013631",	//Reserved
 	//Information comes from EV
@@ -1664,7 +1667,7 @@ char InfoStatusCode[384][6]=
 	"023716",	//CHAdeMO:  connector temperature sensor broken
 	"023717",	//CHAdeMO:  connector lock fail
 	"023718",	//CHAdeMO:	D1 ON No Receive
-	"023719",	//CHAdeMO:	BMS K to J Timeout
+	"023719",	//CHAdeMO:	Permission ON but charge sequence timeout
 	"023720",	//CHAdeMO:	BMS Charge Allow Timeout
 	"023721",	//CHAdeMO:	Wait GroundFault Timeout
 	"023722",	//CHAdeMO:	BMS EV Relay Timeout
@@ -1984,7 +1987,8 @@ struct InfoCodeData
 			unsigned char ApnDisconnectVia4Gi:1;					//bit 2
 			unsigned char WiFiDisable:1;                            //bit 3
 			unsigned char Telocom4GModuleDisable:1;                 //bit 4
-			unsigned char :3;										//bit 5~7 reserved
+			unsigned char PsuQuantityNotMatch:1;                    //bit 5
+			unsigned char :2;										//bit 6~7 reserved
 			 //InfoVal[4]
 			unsigned char ChademoEvCommFail:1;						//bit 0
 			unsigned char CcsEvCommFail:1;							//bit 1
@@ -2387,6 +2391,7 @@ struct PsuGroupData
 /*Following is the information for system all PSU*/
 struct PsuData
 {
+    unsigned char           SystemInitialPsuQuantity;       // psu quantity after ac/dc contactor on
 	unsigned char           SystemPresentPsuQuantity;
 	unsigned short          SystemAvailableCurrent;			//abcd=abc.d amp
 	unsigned int            SystemAvailablePower;			//Watt
@@ -2420,6 +2425,7 @@ struct DynamicReleaseCtrl
     unsigned char       ReleaseLoopStep;    // 0 : None, 1 : Limit Pwr, 2 : Pwr OFF, 3. RCB OFF, 4. Finish
     float               CheckOutPwrIsStable;// 0.1kw
     unsigned char       TargetRelay;        // 255 : None
+    unsigned char		AutoRelease;
 
     float               LimitCurCap;        // Inform 0.1A
     float               LimitPwrCap;        // Inform 0.1kw
@@ -4784,6 +4790,15 @@ struct StructTcciCustomData
     unsigned char ChargerInfoConf:1;
     unsigned char WeatherInfoReq:1;
     unsigned char WeatherInfoConf:1;
+    unsigned char :3;                  // bit 5-7 , reserved
+};
+
+struct OCMFData
+{
+	unsigned char SendOcmfDataReq:1;   // bit 0 , Flag to ask OCPP sending OCMF message to backend.
+	unsigned char :7;                  // bit 1-7 , reserved
+	unsigned char DataString[2048];    // Data got from meter.
+	unsigned char PublicKey[256];      // PublicKey with header got from meter.
 };
 
 struct OCPP16Data
@@ -4793,7 +4808,7 @@ struct OCPP16Data
     unsigned char                           OcppConnStatus;         //0: disconnected, 1: connected
     unsigned int                            Timeout_Secs;
     unsigned short                          Ping_Pong_Interval;
-    unsigned int                            procDogTime;            // Process watch dog refresh timer
+    long  int	                            procDogTime;            // Process watch dog refresh timer
     union
     {
         //Operations Initiated by Charge Point
@@ -4976,6 +4991,7 @@ struct OCPP16Data
     struct StructSignedFirmwareStatusNotification   SignedFirmwareStatusNotification;
     struct StructSessionTarget                      SessionTarget[CONNECTOR_QUANTITY];
     struct StructTcciCustomData                     TcciCustomData;
+    struct OCMFData                                 OcmfData[CONNECTOR_QUANTITY];
 };
 
 
@@ -5072,6 +5088,7 @@ enum OCPP20CtrlrVariable
 	OCPPCommCtrlr_PublicKeyWithSignedMeterValue,
     OCPPCommCtrlr_StatusNotificationPeriodically,
     OCPPCommCtrlr_StatusNotificationInterval,
+	OCPPCommCtrlr_CharingProfileRefreshInterval,
     OCPPCommCtrlr_VariableVersion,
 	ReservationCtrlr_Enabled,
 	ReservationCtrlr_Available,
@@ -5146,7 +5163,7 @@ struct DCChargingParametersType
 struct AdditionalInfoType
 {
 	unsigned char	additionalIdToken[37];						// Required. This field specifies the additional IdToken.
-	unsigned char	type[50];									// Required. This defines the type of the additionalIdToken. This is a custom type, so the implementation needs to be agreed upon by all involved parties.
+	unsigned char	type[51];									// Required. This defines the type of the additionalIdToken. This is a custom type, so the implementation needs to be agreed upon by all involved parties.
 };
 
 struct APNType
@@ -5174,13 +5191,14 @@ struct GroupIdTokenType
 {
 	unsigned char idToken[37];									// Required. IdToken is case insensitive. Might hold the hidden id of an RFID tag, but can for example also contain a UUID.
 	unsigned char type[16];										// Required. Enumeration of possible idToken types.
+	//struct AdditionalInfoType additionalInfo[10];               // Optional. AdditionalInfo can be used to send extra information which can be validated by the CSMS in addition to the regular authorization with IdToken.
 };
 
 struct MessageContentType
 {
 	unsigned char format[8];									// Required. Format of the message.
-	unsigned char	language[8];								// Optional. Message language identifier. Contains a language code as defined in [RFC5646].
-	unsigned char content[512];									// Required. Message contents.
+	unsigned char	language[9];								// Optional. Message language identifier. Contains a language code as defined in [RFC5646].
+	unsigned char content[513];									// Required. Message contents.
 };
 
 struct IdTokenInfoType
@@ -5188,9 +5206,9 @@ struct IdTokenInfoType
 	unsigned char status[32];									// Required. Current status of the ID Token.
 	unsigned char cacheExpiryDateTime[28];						// Optional. Date and Time after which the token must be considered invalid.
 	short int	chargingPriority;								// Optional. Priority from a business point of view. Default priority is 0, The range is from -9 to 9. Higher values indicate a higher priority.
-	unsigned char language1[8];									// Optional. Preferred user interface language of identifier user. Contains a language code as defined in [RFC5646].
+	unsigned char language1[9];									// Optional. Preferred user interface language of identifier user. Contains a language code as defined in [RFC5646].
 	unsigned int evseId[100];									// Optional. Only used when the IdToken is only valid for one or more specific EVSEs, not for the entire Charging Station.
-	unsigned char language2[8];									// Optional. Second preferred user interface language of identifier user. Don’t use when language1 is omitted, has to be different from language1.
+	unsigned char language2[9];									// Optional. Second preferred user interface language of identifier user. Don’t use when language1 is omitted, has to be different from language1.
 	struct GroupIdTokenType groupIdToken;						// Optional. This contains the group identifier.
 	struct MessageContentType personalMessage;					// Optional. Personal message that can be shown to the EV Driver and can be used for tariff information, user greetings etc.
 };
@@ -5248,6 +5266,7 @@ struct CostTypeOCPP
 {
 	unsigned char costKind[36];									// Required. The kind of cost referred to in the message element amount
 	int amount;													// Required. The estimated or actual cost per kWh
+	int amountMultiplier;                                       // Optional. Values: -3..3, The amountMultiplier defines the exponent to base 10 (dec). The final value is determined by: amount * 10 ^ amountMultiplier
 };
 
 struct ConsumptionCostTypeOCPP
@@ -5487,10 +5506,10 @@ struct NetworkConnectionProfileType
 struct OCSPRequestDataType
 {
 	unsigned char hashAlgorithm[8];									// Required. Used algorithms for the hashes provided.
-	unsigned char issuerNameHash[128];								// Required. hashed value of the IssuerName.
-	unsigned char issuerKeyHash[128];								// Required. Hashed value of the issuers public key
-	unsigned char serialNumber[40];									// Required. The serial number of the certificate.
-	unsigned char responderURL[512];								// Required. This contains the responder URL (Case insensitive).
+	unsigned char issuerNameHash[129];								// Required. hashed value of the IssuerName.
+	unsigned char issuerKeyHash[129];								// Required. Hashed value of the issuers public key
+	unsigned char serialNumber[41];									// Required. The serial number of the certificate.
+	unsigned char responderURL[513];								// Required. This contains the responder URL (Case insensitive).
 };
 
 struct ReportDataType
@@ -5557,6 +5576,7 @@ struct StatusInfoType
  */
 struct Authorize_20
 {
+    unsigned char certificate[5601];                                // Optional. The X.509 certificated presented by EV for authorization.
 	struct IdTokenType idToken;										// Required. This contains the identifier that needs to be authorized.
 	struct OCSPRequestDataType iso15118CertificateHashData[4];		// Optional. Contains the information needed to verify the EV Contract Certificate via OCSP.
 	unsigned char Response_certificateStatus[32];					// Optional. Certificate status information. - if all certificates are valid: return 'Accepted'. - if one of the certificates was revoked, return 'CertificateRevoked'.
@@ -5674,11 +5694,11 @@ struct FirmwareStatusNotification_20
 
 struct Get15118EVCertificate_20
 {
-	unsigned char iso15118SchemaVersion[50];						// Required. Schema version currently used for the 15118 session between EV and Charging Station. Needed for parsing of the EXI stream by the CSMS.
+	unsigned char iso15118SchemaVersion[51];						// Required. Schema version currently used for the 15118 session between EV and Charging Station. Needed for parsing of the EXI stream by the CSMS.
 	unsigned char action[16];										// Required. Defines whether certificate needs to be installed or updated.
-	unsigned char exiRequest[5600];									// Required. Raw CertificateInstallationReq request from EV, Base64 encoded.
+	unsigned char exiRequest[5601];									// Required. Raw CertificateInstallationReq request from EV, Base64 encoded.
 	unsigned char Response_status[16];								// Required. Indicates whether the message was processed properly.
-	unsigned char Response_exiResponse[5600];						// Required. Raw CertificateInstallationRes response for the EV, Base64 encoded.
+	unsigned char Response_exiResponse[5601];						// Required. Raw CertificateInstallationRes response for the EV, Base64 encoded.
 };
 
 struct GetBaseReport_20
@@ -5839,6 +5859,7 @@ struct NotifyEVChargingNeeds_20
 	unsigned int evseId;											// Required. Defines the EVSE and connector to which the EV is connected. EvseId may not be 0.
 	struct ChargingNeedsType chargingNeeds;							// Required. The characteristics of the energy delivery required.
 	unsigned char Response_status[16];								// Required. Returns whether the CSMS has been able to process the message successfully. It does not imply that the evChargingNeeds can be met with the current charging profile.
+	struct StatusInfoType Response_statusInfo;                      // Optional. Detailed status information.
 };
 
 struct NotifyEVChargingSchedule_20
@@ -5847,6 +5868,7 @@ struct NotifyEVChargingSchedule_20
 	unsigned int evseId;											// Required. The charging schedule contained in this notification applies to an EVSE. EvseId must be > 0.
 	struct ChargingScheduleType chargingSchedule;					// Required. Planned energy consumption of the EV over time. Always relative to timeBase.
 	unsigned char Response_status[16];								// Required. Returns whether the CSMS has been able to process the message successfully. It does not imply any approval of the charging schedule.
+	struct StatusInfoType Response_statusInfo;                      // Optional. Detailed status information.
 };
 
 struct NotifyEvent_20
@@ -5969,6 +5991,7 @@ struct SetChargingProfile_20
 	struct ChargingProfileType chargingProfile;						// Required. The charging profile to be set at the Charging Station.
 	unsigned char Response_status[16];								// Required. Returns whether the Charging Station has been able to process the message successfully. This does not guarantee the schedule will be followed to the letter. There might be other constraints the Charging Station may need to take into account.
 	unsigned char guid[37];											// Save guid from server request
+	struct StatusInfoType Response_statusInfo;                      // Optional. Detailed status information.
 };
 
 struct SetDisplayMessage_20
@@ -6097,7 +6120,7 @@ struct OCPP20Data
 	unsigned char 							OcppConnStatus;			//0: disconnected, 1: connected
 	unsigned int 							Timeout_Secs;
 	unsigned short 							Ping_Pong_Interval;
-	unsigned int                            procDogTime;            // Process watch dog refresh timer
+	long int 							procDogTime;            // Process watch dog refresh timer
 	struct ReportDataType                   ControllerComponentVariable[CtrlrVariable_CNT];
 	struct NetworkConnectionProfile_20      NetworkConnectionProfile[10];
 
@@ -6141,8 +6164,8 @@ struct OCPP20Data
 			unsigned char NotifyDisplayMessagesReq :1;
 			unsigned char NotifyDisplayMessagesConf :1;
 
-			unsigned char NotifyEVChargingScheduleReq :1;
-			unsigned char NotifyEVChargingScheduleConf :1;
+			unsigned char NotifyCustomerInformationReq :1;
+			unsigned char NotifyCustomerInformationConf :1;
 			unsigned char NotifyEventReq :1;
 			unsigned char NotifyEventConf :1;
 			unsigned char NotifyMonitoringReportReq :1;
@@ -6156,8 +6179,8 @@ struct OCPP20Data
 			unsigned char SecurityEventNotificationConf :1;
 			unsigned char SignCertificateReq :1;
 			unsigned char SignCertificateConf :1;
-            unsigned char NotifyCustomerInformationReq :1;  //bit 6
-            unsigned char NotifyCustomerInformationConf :1; //bit 7
+            unsigned char :1; //bit 6
+            unsigned char :1; //bit 7
 
 		} bits;
 	} SpMsg;
@@ -6283,13 +6306,14 @@ struct OCPP20Data
 		struct
 		{
 			//CSUMsgValue[0]
-			unsigned char ChargingProfileReq:1;	//bit 0,
-			unsigned char ChargingProfileConf:1;	//bit 0,
-            unsigned char ClearedChargingLimitReq :1;
-            unsigned char ClearedChargingLimitConf :1;
-            unsigned char NotifyEVChargingNeedsReq :1;
-            unsigned char NotifyEVChargingNeedsConf :1;
-            unsigned char :2;   //bit 1,2,3,4,5,6,7 , reserved
+            unsigned char ChargingProfileReq:1;	            //bit 0
+            unsigned char ChargingProfileConf:1;	        //bit 1
+            unsigned char ClearedChargingLimitReq :1;       //bit 2
+            unsigned char ClearedChargingLimitConf :1;      //bit 3
+            unsigned char NotifyEVChargingNeedsReq :1;      //bit 4
+            unsigned char NotifyEVChargingNeedsConf :1;     //bit 5
+            unsigned char NotifyEVChargingScheduleReq:1;    //bit 6
+            unsigned char NotifyEVChargingScheduleConf:1;   //bit 7
 		} bits[CONNECTOR_QUANTITY];
 	}CSUMsg;
 

+ 8 - 0
EVSE/Projects/DD360/Apps/ModuleInternalComm/RelayBoard.c

@@ -1657,6 +1657,14 @@ static void SetLedColor(void)
 
         }
     }
+    if (ShmDcCommonData->pTest.ledflag) {
+        led_color.Connect_1_Red = pSysConfig->LedInfo.Red[0];
+        led_color.Connect_1_Green = pSysConfig->LedInfo.Green[0];
+        led_color.Connect_1_Blue = pSysConfig->LedInfo.Blue[0];
+        led_color.Connect_2_Red = pSysConfig->LedInfo.Red[0];
+        led_color.Connect_2_Green = pSysConfig->LedInfo.Green[0];
+        led_color.Connect_2_Blue = pSysConfig->LedInfo.Blue[0];
+    }
     if (_checkLedChanged > 0) {
         if (Config_Led_Color(Uart5Fd, ADDR_LED, &led_color) == PASS) {
             _checkLedChanged--;

+ 86 - 0
EVSE/Projects/DD360/Apps/ReadCmdline.c

@@ -1466,6 +1466,89 @@ static void writeGunAndChillerTemp(void)
     }//while
 }
 
+void setledcolor(int on_off)
+{
+    if (on_off)
+        ShmDcCommonData->pTest.ledflag = TRUE;
+    else {
+        ShmDcCommonData->pTest.ledflag = FALSE;
+        return;
+    }
+
+    int isContinue = 1;
+    uint32_t sleepTime = 500000;
+    uint32_t color_value;
+    char* usageMsg = "Usage:\n"
+        "       r	0~100\n"
+        "       g	0~100\n"
+        "       b	0~100\n"
+        "       exit | c | C\n"
+        "       help | ? | h\n"
+        "\r\n";
+
+    while (isContinue) {
+        if (readCmdKey(CMD_KEY_WAIT) == NO) {
+            sleep(sleepTime);
+            continue;
+        }
+
+        if (helpCmd() == YES) {
+            printf("%s\n", usageMsg);
+            continue;
+        } else if (exitCmd() == YES) {
+            ShmDcCommonData->pTest.ledflag = FALSE;
+            return;
+        }
+
+        if ((strcmp(newString[0], "r") != 0) &&
+            (strcmp(newString[1], "-1") == 0 ||
+                strcmp(newString[1], "") == 0)
+            ) {
+            printf("argc 1 is error parameter\r\n");
+            continue;
+        }
+        if ((strcmp(newString[0], "g") != 0) &&
+            (strcmp(newString[1], "-1") == 0 ||
+                strcmp(newString[1], "") == 0)
+            ) {
+            printf("argc 1 is error parameter\r\n");
+            continue;
+        }
+        if ((strcmp(newString[0], "b") != 0) &&
+            (strcmp(newString[1], "-1") == 0 ||
+                strcmp(newString[1], "") == 0)
+            ) {
+            printf("argc 1 is error parameter\r\n");
+            continue;
+        }
+        if (atoi(newString[1]) < 0 || atoi(newString[1]) > 100) {
+            printf("argc 1 is error parameter range is 0~100\r\n");
+            continue;
+        }
+        if (strcmp(newString[0], "r") == EQUAL &&
+            atoi(newString[1]) >= 0 && atoi(newString[1]) <= 100) {
+            pSysConfig->LedInfo.Red[0] = atoi(newString[1]);
+        } else {
+
+        }
+        if (strcmp(newString[0], "g") == EQUAL &&
+            atoi(newString[1]) >= 0 && atoi(newString[1]) <= 100) {
+            pSysConfig->LedInfo.Green[0] = atoi(newString[1]);
+        }
+        if (strcmp(newString[0], "b") == EQUAL &&
+            atoi(newString[1]) >= 0 && atoi(newString[1]) <= 100) {
+            pSysConfig->LedInfo.Blue[0] = atoi(newString[1]);
+        }
+        printf("Color set red[%d] green[%d] blue[%d]\n", pSysConfig->LedInfo.Red[0], pSysConfig->LedInfo.Green[0], pSysConfig->LedInfo.Blue[0]);
+
+        usleep(sleepTime);
+    }//while
+
+
+
+    ShmDcCommonData->pTest.ledflag = FALSE;
+}
+
 void ShowPowerConsumption(char* v1)
 {
     printf("Dispenser Gun0 PowerConsumption:%.4f\n", ShmDcCommonData->pGunInfo[0].PowerConsumption);
@@ -1504,6 +1587,7 @@ int main(void)
                      "       netdump                           : show network package\r\n"
                      "       candump                           : show can package\r\n"
                      "       powerconsumption                  : Show Power Consumption\n"
+                     "       led                               : set led color\n"
                      "\r\n";
 
     if (CreateAllCsuShareMemory() == FAIL) {
@@ -1684,6 +1768,8 @@ int main(void)
             setSystemTime(newString[1], newString[2]);
         } else if (strcmp(newString[0], "powerconsumption") == 0) { // Power Consumption
             ShowPowerConsumption(newString[1]);
+        } else if (strcmp(newString[0], "led") == 0) {              // LED
+            setledcolor(newString[1]);
         } else {
             printf("%s\n", usageMsg);
         }

BIN
EVSE/Projects/DD360/Apps/UnsafetyOutputTask


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


BIN
EVSE/Projects/DD360/output/FactoryConfig


BIN
EVSE/Projects/DD360/output/Module_ChkSysTask


BIN
EVSE/Projects/DD360/output/Module_DoComm


BIN
EVSE/Projects/DD360/output/Module_EvComm


BIN
EVSE/Projects/DD360/output/Module_EventLogging


BIN
EVSE/Projects/DD360/output/Module_InternalComm


BIN
EVSE/Projects/DD360/output/Module_LcmControl


BIN
EVSE/Projects/DD360/output/Module_PrimaryComm


BIN
EVSE/Projects/DD360/output/Module_UpdateFW


BIN
EVSE/Projects/DD360/output/ReadCmdline


BIN
EVSE/Projects/DD360/output/UnsafetyOutputTask


BIN
EVSE/Projects/DD360/output/main


+ 82 - 0
EVSE/Projects/DD360Audi/Apps/CSU/RFID.c

@@ -395,6 +395,7 @@ void CreateRfidFork(void)
 
             if (pSysConfig->RfidCardNumEndian == RFID_ENDIAN_LITTLE) {
                 switch (rfid.snType) {
+#ifdef DD360Audi
                 case RFID_SN_TYPE_6BYTE:
                     sprintf((char *) pSysConfig->UserId,
                             "%02X%02X%02X%02X%02X%02X",
@@ -425,9 +426,50 @@ void CreateRfidFork(void)
                             rfid.currentCard[0], rfid.currentCard[1],
                             rfid.currentCard[2], rfid.currentCard[3]);
                     break;
+#else
+                case RFID_SN_TYPE_6BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X%02X%02X",
+                        rfid.currentCard[5], rfid.currentCard[4],
+                        rfid.currentCard[3], rfid.currentCard[2],
+                        rfid.currentCard[1], rfid.currentCard[0]);
+                    break;
+                case RFID_SN_TYPE_7BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X%02X%02X%02X",
+                        rfid.currentCard[6], rfid.currentCard[5],
+                        rfid.currentCard[4], rfid.currentCard[3],
+                        rfid.currentCard[2], rfid.currentCard[1],
+                        rfid.currentCard[0]);
+                    break;
+                case RFID_SN_TYPE_8BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X%02X%02X%02X%02X",
+                        rfid.currentCard[7], rfid.currentCard[6],
+                        rfid.currentCard[5], rfid.currentCard[4],
+                        rfid.currentCard[3], rfid.currentCard[2],
+                        rfid.currentCard[1], rfid.currentCard[0]);
+                    break;
+                case RFID_SN_TYPE_10BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
+                        rfid.currentCard[9], rfid.currentCard[8],
+                        rfid.currentCard[7], rfid.currentCard[6],
+                        rfid.currentCard[5], rfid.currentCard[4],
+                        rfid.currentCard[3], rfid.currentCard[2],
+                        rfid.currentCard[1], rfid.currentCard[0]);
+                    break;
+                case RFID_SN_TYPE_4BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X",
+                        rfid.currentCard[3], rfid.currentCard[2],
+                        rfid.currentCard[1], rfid.currentCard[0]);
+                    break;
+#endif
                 }
             } else if (pSysConfig->RfidCardNumEndian == RFID_ENDIAN_BIG) {
                 switch (rfid.snType) {
+#ifdef DD360Audi
                 case RFID_SN_TYPE_6BYTE:
                     sprintf((char *) pSysConfig->UserId,
                             "%02X%02X%02X%02X%02X%02X",
@@ -458,6 +500,46 @@ void CreateRfidFork(void)
                             rfid.currentCard[3], rfid.currentCard[2],
                             rfid.currentCard[1], rfid.currentCard[0]);
                     break;
+#else
+                case RFID_SN_TYPE_6BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X%02X%02X",
+                        rfid.currentCard[0], rfid.currentCard[1],
+                        rfid.currentCard[2], rfid.currentCard[3],
+                        rfid.currentCard[4], rfid.currentCard[5]);
+                    break;
+                case RFID_SN_TYPE_7BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X%02X%02X%02X",
+                        rfid.currentCard[0], rfid.currentCard[1],
+                        rfid.currentCard[2], rfid.currentCard[3],
+                        rfid.currentCard[4], rfid.currentCard[5],
+                        rfid.currentCard[6]);
+                    break;
+                case RFID_SN_TYPE_8BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X%02X%02X%02X%02X",
+                        rfid.currentCard[0], rfid.currentCard[1],
+                        rfid.currentCard[2], rfid.currentCard[3],
+                        rfid.currentCard[4], rfid.currentCard[5],
+                        rfid.currentCard[6], rfid.currentCard[7]);
+                    break;
+                case RFID_SN_TYPE_10BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
+                        rfid.currentCard[0], rfid.currentCard[1],
+                        rfid.currentCard[2], rfid.currentCard[3],
+                        rfid.currentCard[4], rfid.currentCard[5],
+                        rfid.currentCard[6], rfid.currentCard[7],
+                        rfid.currentCard[8], rfid.currentCard[9]);
+                    break;
+                case RFID_SN_TYPE_4BYTE:
+                    sprintf((char*)pSysConfig->UserId,
+                        "%02X%02X%02X%02X",
+                        rfid.currentCard[0], rfid.currentCard[1],
+                        rfid.currentCard[2], rfid.currentCard[3]);
+                    break;
+#endif
                 }
             }
             log_info("card number = %s", pSysConfig->UserId);

+ 2 - 2
EVSE/Projects/DD360Audi/Apps/CSU/main.c

@@ -85,8 +85,8 @@ uint8_t bd0_2_status = 0;
 uint8_t bd1_1_status = 0;
 uint8_t bd1_2_status = 0;
 
-char *fwVersion = "V1.23.00.0000.00"; // "V0.16.00.0000.00";
-char* DebugVersion = "V1.23.1";
+char *fwVersion = "T1.23.00.0000.00"; // "V0.16.00.0000.00";
+char* DebugVersion = "T1.23.3";
 //sqlite3 *localDb;
 bool isDb_ready;
 

+ 7 - 0
EVSE/Projects/DD360Audi/Apps/Config.h

@@ -463,6 +463,12 @@ typedef struct stRecordTransactionInfo
     unsigned char res;
 }RecordTransactionInfo;
 
+typedef struct stTestFlag
+{
+    uint8_t ledflag;
+}TestFlag;
+
+
 typedef struct StDcCommonInfo {
     uint8_t RebootCount;
     uint8_t CcsVersion;
@@ -496,6 +502,7 @@ typedef struct StDcCommonInfo {
     time_t FanOnTime;
     float TempVolt[4];
     char DebugVersion[32];
+    TestFlag pTest;
 } DcCommonInfo;
 
 #endif /* CONFIG_H_ */

+ 56 - 32
EVSE/Projects/DD360Audi/Apps/Define/define.h

@@ -155,10 +155,10 @@ Storage							0x0A200000-0x7FFFFFFF		1886 MB
     #define ONE_CONNECTOR_USE       0
 #elif defined Emulator
     #define MAX_PSU_QUANTITY        62
-    #define CHAdeMO_QUANTITY        3
-    #define CCS_QUANTITY            3
-    #define GB_QUANTITY             3
-    #define AC_QUANTITY             3
+    #define CHAdeMO_QUANTITY        2
+    #define CCS_QUANTITY            2
+    #define GB_QUANTITY             2
+    #define AC_QUANTITY             2
     #define GENERAL_GUN_QUANTITY    0
     #define PSU_QUANTITY            2
     #define ONE_CONNECTOR_USE       0
@@ -344,6 +344,8 @@ enum CoreProfile {
      EVCCID_PREFIX,
      OffLineMaxChargingPower,
      ConfigurationVersion,
+	 CharingProfileRefreshInterval,
+	 OcppSoftwareVersion,
 	 _CoreProfile_CNT
 };
 
@@ -1082,6 +1084,7 @@ struct SysInfoData
     struct LCD_OVERRIDE     LcdOveride;                 // LCD override info (no use anymore)
     struct BAZEL8           bazel8;                     // Bazel8 payment used
     struct Enegate          enegate;                    // Enegate payment used
+    unsigned char           PsuLostQuantity;
 };
 
 struct SysConfigAndInfo
@@ -1641,7 +1644,7 @@ char InfoStatusCode[384][6]=
 	"013626",	//disconnected from APN through 3G/4G
 	"013627",	//WiFi disabled (separated charger only)
 	"013628",	//4G disabled (separated charger only)
-	"013629",	//Reserved
+	"013629",	//Psu Quantity Not Match
 	"013630",	//Reserved
 	"013631",	//Reserved
 	//Information comes from EV
@@ -1664,7 +1667,7 @@ char InfoStatusCode[384][6]=
 	"023716",	//CHAdeMO:  connector temperature sensor broken
 	"023717",	//CHAdeMO:  connector lock fail
 	"023718",	//CHAdeMO:	D1 ON No Receive
-	"023719",	//CHAdeMO:	BMS K to J Timeout
+	"023719",	//CHAdeMO:	Permission ON but charge sequence timeout
 	"023720",	//CHAdeMO:	BMS Charge Allow Timeout
 	"023721",	//CHAdeMO:	Wait GroundFault Timeout
 	"023722",	//CHAdeMO:	BMS EV Relay Timeout
@@ -1984,7 +1987,8 @@ struct InfoCodeData
 			unsigned char ApnDisconnectVia4Gi:1;					//bit 2
 			unsigned char WiFiDisable:1;                            //bit 3
 			unsigned char Telocom4GModuleDisable:1;                 //bit 4
-			unsigned char :3;										//bit 5~7 reserved
+			unsigned char PsuQuantityNotMatch:1;                    //bit 5
+			unsigned char :2;										//bit 6~7 reserved
 			 //InfoVal[4]
 			unsigned char ChademoEvCommFail:1;						//bit 0
 			unsigned char CcsEvCommFail:1;							//bit 1
@@ -2387,6 +2391,7 @@ struct PsuGroupData
 /*Following is the information for system all PSU*/
 struct PsuData
 {
+    unsigned char           SystemInitialPsuQuantity;       // psu quantity after ac/dc contactor on
 	unsigned char           SystemPresentPsuQuantity;
 	unsigned short          SystemAvailableCurrent;			//abcd=abc.d amp
 	unsigned int            SystemAvailablePower;			//Watt
@@ -2420,6 +2425,7 @@ struct DynamicReleaseCtrl
     unsigned char       ReleaseLoopStep;    // 0 : None, 1 : Limit Pwr, 2 : Pwr OFF, 3. RCB OFF, 4. Finish
     float               CheckOutPwrIsStable;// 0.1kw
     unsigned char       TargetRelay;        // 255 : None
+    unsigned char		AutoRelease;
 
     float               LimitCurCap;        // Inform 0.1A
     float               LimitPwrCap;        // Inform 0.1kw
@@ -4784,6 +4790,15 @@ struct StructTcciCustomData
     unsigned char ChargerInfoConf:1;
     unsigned char WeatherInfoReq:1;
     unsigned char WeatherInfoConf:1;
+    unsigned char :3;                  // bit 5-7 , reserved
+};
+
+struct OCMFData
+{
+	unsigned char SendOcmfDataReq:1;   // bit 0 , Flag to ask OCPP sending OCMF message to backend.
+	unsigned char :7;                  // bit 1-7 , reserved
+	unsigned char DataString[2048];    // Data got from meter.
+	unsigned char PublicKey[256];      // PublicKey with header got from meter.
 };
 
 struct OCPP16Data
@@ -4793,7 +4808,7 @@ struct OCPP16Data
     unsigned char                           OcppConnStatus;         //0: disconnected, 1: connected
     unsigned int                            Timeout_Secs;
     unsigned short                          Ping_Pong_Interval;
-    unsigned int                            procDogTime;            // Process watch dog refresh timer
+    long  int	                            procDogTime;            // Process watch dog refresh timer
     union
     {
         //Operations Initiated by Charge Point
@@ -4976,6 +4991,7 @@ struct OCPP16Data
     struct StructSignedFirmwareStatusNotification   SignedFirmwareStatusNotification;
     struct StructSessionTarget                      SessionTarget[CONNECTOR_QUANTITY];
     struct StructTcciCustomData                     TcciCustomData;
+    struct OCMFData                                 OcmfData[CONNECTOR_QUANTITY];
 };
 
 
@@ -5072,6 +5088,7 @@ enum OCPP20CtrlrVariable
 	OCPPCommCtrlr_PublicKeyWithSignedMeterValue,
     OCPPCommCtrlr_StatusNotificationPeriodically,
     OCPPCommCtrlr_StatusNotificationInterval,
+	OCPPCommCtrlr_CharingProfileRefreshInterval,
     OCPPCommCtrlr_VariableVersion,
 	ReservationCtrlr_Enabled,
 	ReservationCtrlr_Available,
@@ -5146,7 +5163,7 @@ struct DCChargingParametersType
 struct AdditionalInfoType
 {
 	unsigned char	additionalIdToken[37];						// Required. This field specifies the additional IdToken.
-	unsigned char	type[50];									// Required. This defines the type of the additionalIdToken. This is a custom type, so the implementation needs to be agreed upon by all involved parties.
+	unsigned char	type[51];									// Required. This defines the type of the additionalIdToken. This is a custom type, so the implementation needs to be agreed upon by all involved parties.
 };
 
 struct APNType
@@ -5174,13 +5191,14 @@ struct GroupIdTokenType
 {
 	unsigned char idToken[37];									// Required. IdToken is case insensitive. Might hold the hidden id of an RFID tag, but can for example also contain a UUID.
 	unsigned char type[16];										// Required. Enumeration of possible idToken types.
+	//struct AdditionalInfoType additionalInfo[10];               // Optional. AdditionalInfo can be used to send extra information which can be validated by the CSMS in addition to the regular authorization with IdToken.
 };
 
 struct MessageContentType
 {
 	unsigned char format[8];									// Required. Format of the message.
-	unsigned char	language[8];								// Optional. Message language identifier. Contains a language code as defined in [RFC5646].
-	unsigned char content[512];									// Required. Message contents.
+	unsigned char	language[9];								// Optional. Message language identifier. Contains a language code as defined in [RFC5646].
+	unsigned char content[513];									// Required. Message contents.
 };
 
 struct IdTokenInfoType
@@ -5188,9 +5206,9 @@ struct IdTokenInfoType
 	unsigned char status[32];									// Required. Current status of the ID Token.
 	unsigned char cacheExpiryDateTime[28];						// Optional. Date and Time after which the token must be considered invalid.
 	short int	chargingPriority;								// Optional. Priority from a business point of view. Default priority is 0, The range is from -9 to 9. Higher values indicate a higher priority.
-	unsigned char language1[8];									// Optional. Preferred user interface language of identifier user. Contains a language code as defined in [RFC5646].
+	unsigned char language1[9];									// Optional. Preferred user interface language of identifier user. Contains a language code as defined in [RFC5646].
 	unsigned int evseId[100];									// Optional. Only used when the IdToken is only valid for one or more specific EVSEs, not for the entire Charging Station.
-	unsigned char language2[8];									// Optional. Second preferred user interface language of identifier user. Don’t use when language1 is omitted, has to be different from language1.
+	unsigned char language2[9];									// Optional. Second preferred user interface language of identifier user. Don’t use when language1 is omitted, has to be different from language1.
 	struct GroupIdTokenType groupIdToken;						// Optional. This contains the group identifier.
 	struct MessageContentType personalMessage;					// Optional. Personal message that can be shown to the EV Driver and can be used for tariff information, user greetings etc.
 };
@@ -5248,6 +5266,7 @@ struct CostTypeOCPP
 {
 	unsigned char costKind[36];									// Required. The kind of cost referred to in the message element amount
 	int amount;													// Required. The estimated or actual cost per kWh
+	int amountMultiplier;                                       // Optional. Values: -3..3, The amountMultiplier defines the exponent to base 10 (dec). The final value is determined by: amount * 10 ^ amountMultiplier
 };
 
 struct ConsumptionCostTypeOCPP
@@ -5487,10 +5506,10 @@ struct NetworkConnectionProfileType
 struct OCSPRequestDataType
 {
 	unsigned char hashAlgorithm[8];									// Required. Used algorithms for the hashes provided.
-	unsigned char issuerNameHash[128];								// Required. hashed value of the IssuerName.
-	unsigned char issuerKeyHash[128];								// Required. Hashed value of the issuers public key
-	unsigned char serialNumber[40];									// Required. The serial number of the certificate.
-	unsigned char responderURL[512];								// Required. This contains the responder URL (Case insensitive).
+	unsigned char issuerNameHash[129];								// Required. hashed value of the IssuerName.
+	unsigned char issuerKeyHash[129];								// Required. Hashed value of the issuers public key
+	unsigned char serialNumber[41];									// Required. The serial number of the certificate.
+	unsigned char responderURL[513];								// Required. This contains the responder URL (Case insensitive).
 };
 
 struct ReportDataType
@@ -5557,6 +5576,7 @@ struct StatusInfoType
  */
 struct Authorize_20
 {
+    unsigned char certificate[5601];                                // Optional. The X.509 certificated presented by EV for authorization.
 	struct IdTokenType idToken;										// Required. This contains the identifier that needs to be authorized.
 	struct OCSPRequestDataType iso15118CertificateHashData[4];		// Optional. Contains the information needed to verify the EV Contract Certificate via OCSP.
 	unsigned char Response_certificateStatus[32];					// Optional. Certificate status information. - if all certificates are valid: return 'Accepted'. - if one of the certificates was revoked, return 'CertificateRevoked'.
@@ -5674,11 +5694,11 @@ struct FirmwareStatusNotification_20
 
 struct Get15118EVCertificate_20
 {
-	unsigned char iso15118SchemaVersion[50];						// Required. Schema version currently used for the 15118 session between EV and Charging Station. Needed for parsing of the EXI stream by the CSMS.
+	unsigned char iso15118SchemaVersion[51];						// Required. Schema version currently used for the 15118 session between EV and Charging Station. Needed for parsing of the EXI stream by the CSMS.
 	unsigned char action[16];										// Required. Defines whether certificate needs to be installed or updated.
-	unsigned char exiRequest[5600];									// Required. Raw CertificateInstallationReq request from EV, Base64 encoded.
+	unsigned char exiRequest[5601];									// Required. Raw CertificateInstallationReq request from EV, Base64 encoded.
 	unsigned char Response_status[16];								// Required. Indicates whether the message was processed properly.
-	unsigned char Response_exiResponse[5600];						// Required. Raw CertificateInstallationRes response for the EV, Base64 encoded.
+	unsigned char Response_exiResponse[5601];						// Required. Raw CertificateInstallationRes response for the EV, Base64 encoded.
 };
 
 struct GetBaseReport_20
@@ -5839,6 +5859,7 @@ struct NotifyEVChargingNeeds_20
 	unsigned int evseId;											// Required. Defines the EVSE and connector to which the EV is connected. EvseId may not be 0.
 	struct ChargingNeedsType chargingNeeds;							// Required. The characteristics of the energy delivery required.
 	unsigned char Response_status[16];								// Required. Returns whether the CSMS has been able to process the message successfully. It does not imply that the evChargingNeeds can be met with the current charging profile.
+	struct StatusInfoType Response_statusInfo;                      // Optional. Detailed status information.
 };
 
 struct NotifyEVChargingSchedule_20
@@ -5847,6 +5868,7 @@ struct NotifyEVChargingSchedule_20
 	unsigned int evseId;											// Required. The charging schedule contained in this notification applies to an EVSE. EvseId must be > 0.
 	struct ChargingScheduleType chargingSchedule;					// Required. Planned energy consumption of the EV over time. Always relative to timeBase.
 	unsigned char Response_status[16];								// Required. Returns whether the CSMS has been able to process the message successfully. It does not imply any approval of the charging schedule.
+	struct StatusInfoType Response_statusInfo;                      // Optional. Detailed status information.
 };
 
 struct NotifyEvent_20
@@ -5969,6 +5991,7 @@ struct SetChargingProfile_20
 	struct ChargingProfileType chargingProfile;						// Required. The charging profile to be set at the Charging Station.
 	unsigned char Response_status[16];								// Required. Returns whether the Charging Station has been able to process the message successfully. This does not guarantee the schedule will be followed to the letter. There might be other constraints the Charging Station may need to take into account.
 	unsigned char guid[37];											// Save guid from server request
+	struct StatusInfoType Response_statusInfo;                      // Optional. Detailed status information.
 };
 
 struct SetDisplayMessage_20
@@ -6097,7 +6120,7 @@ struct OCPP20Data
 	unsigned char 							OcppConnStatus;			//0: disconnected, 1: connected
 	unsigned int 							Timeout_Secs;
 	unsigned short 							Ping_Pong_Interval;
-	unsigned int                            procDogTime;            // Process watch dog refresh timer
+	long int 							procDogTime;            // Process watch dog refresh timer
 	struct ReportDataType                   ControllerComponentVariable[CtrlrVariable_CNT];
 	struct NetworkConnectionProfile_20      NetworkConnectionProfile[10];
 
@@ -6141,8 +6164,8 @@ struct OCPP20Data
 			unsigned char NotifyDisplayMessagesReq :1;
 			unsigned char NotifyDisplayMessagesConf :1;
 
-			unsigned char NotifyEVChargingScheduleReq :1;
-			unsigned char NotifyEVChargingScheduleConf :1;
+			unsigned char NotifyCustomerInformationReq :1;
+			unsigned char NotifyCustomerInformationConf :1;
 			unsigned char NotifyEventReq :1;
 			unsigned char NotifyEventConf :1;
 			unsigned char NotifyMonitoringReportReq :1;
@@ -6156,8 +6179,8 @@ struct OCPP20Data
 			unsigned char SecurityEventNotificationConf :1;
 			unsigned char SignCertificateReq :1;
 			unsigned char SignCertificateConf :1;
-            unsigned char NotifyCustomerInformationReq :1;  //bit 6
-            unsigned char NotifyCustomerInformationConf :1; //bit 7
+            unsigned char :1; //bit 6
+            unsigned char :1; //bit 7
 
 		} bits;
 	} SpMsg;
@@ -6283,13 +6306,14 @@ struct OCPP20Data
 		struct
 		{
 			//CSUMsgValue[0]
-			unsigned char ChargingProfileReq:1;	//bit 0,
-			unsigned char ChargingProfileConf:1;	//bit 0,
-            unsigned char ClearedChargingLimitReq :1;
-            unsigned char ClearedChargingLimitConf :1;
-            unsigned char NotifyEVChargingNeedsReq :1;
-            unsigned char NotifyEVChargingNeedsConf :1;
-            unsigned char :2;   //bit 1,2,3,4,5,6,7 , reserved
+            unsigned char ChargingProfileReq:1;	            //bit 0
+            unsigned char ChargingProfileConf:1;	        //bit 1
+            unsigned char ClearedChargingLimitReq :1;       //bit 2
+            unsigned char ClearedChargingLimitConf :1;      //bit 3
+            unsigned char NotifyEVChargingNeedsReq :1;      //bit 4
+            unsigned char NotifyEVChargingNeedsConf :1;     //bit 5
+            unsigned char NotifyEVChargingScheduleReq:1;    //bit 6
+            unsigned char NotifyEVChargingScheduleConf:1;   //bit 7
 		} bits[CONNECTOR_QUANTITY];
 	}CSUMsg;
 

+ 8 - 0
EVSE/Projects/DD360Audi/Apps/ModuleInternalComm/RelayBoard.c

@@ -1657,6 +1657,14 @@ static void SetLedColor(void)
 
         }
     }
+    if (ShmDcCommonData->pTest.ledflag) {
+        led_color.Connect_1_Red = pSysConfig->LedInfo.Red[0];
+        led_color.Connect_1_Green = pSysConfig->LedInfo.Green[0];
+        led_color.Connect_1_Blue = pSysConfig->LedInfo.Blue[0];
+        led_color.Connect_2_Red = pSysConfig->LedInfo.Red[0];
+        led_color.Connect_2_Green = pSysConfig->LedInfo.Green[0];
+        led_color.Connect_2_Blue = pSysConfig->LedInfo.Blue[0];
+    }
     if (_checkLedChanged > 0) {
         if (Config_Led_Color(Uart5Fd, ADDR_LED, &led_color) == PASS) {
             _checkLedChanged--;

+ 86 - 0
EVSE/Projects/DD360Audi/Apps/ReadCmdline.c

@@ -1466,6 +1466,89 @@ static void writeGunAndChillerTemp(void)
     }//while
 }
 
+void setledcolor(int on_off)
+{
+    if (on_off)
+        ShmDcCommonData->pTest.ledflag = TRUE;
+    else {
+        ShmDcCommonData->pTest.ledflag = FALSE;
+        return;
+    }
+
+    int isContinue = 1;
+    uint32_t sleepTime = 500000;
+    uint32_t color_value;
+    char* usageMsg = "Usage:\n"
+        "       r	0~100\n"
+        "       g	0~100\n"
+        "       b	0~100\n"
+        "       exit | c | C\n"
+        "       help | ? | h\n"
+        "\r\n";
+
+    while (isContinue) {
+        if (readCmdKey(CMD_KEY_WAIT) == NO) {
+            sleep(sleepTime);
+            continue;
+        }
+
+        if (helpCmd() == YES) {
+            printf("%s\n", usageMsg);
+            continue;
+        } else if (exitCmd() == YES) {
+            ShmDcCommonData->pTest.ledflag = FALSE;
+            return;
+        }
+
+        if ((strcmp(newString[0], "r") != 0) &&
+            (strcmp(newString[1], "-1") == 0 ||
+                strcmp(newString[1], "") == 0)
+            ) {
+            printf("argc 1 is error parameter\r\n");
+            continue;
+        }
+        if ((strcmp(newString[0], "g") != 0) &&
+            (strcmp(newString[1], "-1") == 0 ||
+                strcmp(newString[1], "") == 0)
+            ) {
+            printf("argc 1 is error parameter\r\n");
+            continue;
+        }
+        if ((strcmp(newString[0], "b") != 0) &&
+            (strcmp(newString[1], "-1") == 0 ||
+                strcmp(newString[1], "") == 0)
+            ) {
+            printf("argc 1 is error parameter\r\n");
+            continue;
+        }
+        if (atoi(newString[1]) < 0 || atoi(newString[1]) > 100) {
+            printf("argc 1 is error parameter range is 0~100\r\n");
+            continue;
+        }
+        if (strcmp(newString[0], "r") == EQUAL &&
+            atoi(newString[1]) >= 0 && atoi(newString[1]) <= 100) {
+            pSysConfig->LedInfo.Red[0] = atoi(newString[1]);
+        } else {
+
+        }
+        if (strcmp(newString[0], "g") == EQUAL &&
+            atoi(newString[1]) >= 0 && atoi(newString[1]) <= 100) {
+            pSysConfig->LedInfo.Green[0] = atoi(newString[1]);
+        }
+        if (strcmp(newString[0], "b") == EQUAL &&
+            atoi(newString[1]) >= 0 && atoi(newString[1]) <= 100) {
+            pSysConfig->LedInfo.Blue[0] = atoi(newString[1]);
+        }
+        printf("Color set red[%d] green[%d] blue[%d]\n", pSysConfig->LedInfo.Red[0], pSysConfig->LedInfo.Green[0], pSysConfig->LedInfo.Blue[0]);
+
+        usleep(sleepTime);
+    }//while
+
+
+
+    ShmDcCommonData->pTest.ledflag = FALSE;
+}
+
 void ShowPowerConsumption(char* v1)
 {
     printf("Dispenser Gun0 PowerConsumption:%.4f\n", ShmDcCommonData->pGunInfo[0].PowerConsumption);
@@ -1504,6 +1587,7 @@ int main(void)
                      "       netdump                           : show network package\r\n"
                      "       candump                           : show can package\r\n"
                      "       powerconsumption                  : Show Power Consumption\n"
+                     "       led                               : set led color\n"
                      "\r\n";
 
     if (CreateAllCsuShareMemory() == FAIL) {
@@ -1684,6 +1768,8 @@ int main(void)
             setSystemTime(newString[1], newString[2]);
         } else if (strcmp(newString[0], "powerconsumption") == 0) { // Power Consumption
             ShowPowerConsumption(newString[1]);
+        } else if (strcmp(newString[0], "led") == 0) {              // LED
+            setledcolor(newString[1]);
         } else {
             printf("%s\n", usageMsg);
         }

BIN
EVSE/rootfs/root/Module_Payment_Bazel8


BIN
EVSE/rootfs/root/Module_Payment_Enegate


BIN
EVSE/rootfs/root/Module_PowerSharing


+ 31 - 0
build_rootfs_copy.sh

@@ -0,0 +1,31 @@
+#!/bin/bash
+# Absolute path to this script, e.g. /home/user/bin/foo.sh
+SCRIPT=$(readlink -f "$0")
+
+# Absolute path this script is in, thus /home/user/bin
+SCRIPTPATH=$(dirname "$SCRIPT")
+echo $SCRIPTPATH
+
+ProjectPath="/opt/ti-processor-sdk-linux-am335x-evm-04.02.00.09/EVSE/Projects"
+
+
+sudo rm /dev/ram*
+sleep 3
+sudo cp -r /mnt/d/Phihong/Project/DD360Audi/Apps/* $ProjectPath/DD360Audi/Apps/
+rm -rf $ProjectPath/DD360/Apps/;
+cp -r $ProjectPath/DD360Audi/Apps/ $ProjectPath/DD360/Apps;
+cp -r $ProjectPath/DD360Audi/ModelNameList.txt  $ProjectPath/DD360/ModelNameList.txt;
+
+#rm -rf $ProjectPath/DD360ComBox/Apps/;
+#cp -r $ProjectPath/DD360Audi/Apps/ $ProjectPath/DD360ComBox/Apps;
+#cp -r $ProjectPath/DD360Audi/ModelNameList.txt $ProjectPath/DD360ComBox/ModelNameList.txt;
+#sudo cp -r /mnt/d/Phihong/Project/DD360Tcci/Apps/* $ProjectPath/DD360Tcci/Apps/
+sudo make DD360-rootfs
+#cp /opt/ti-processor-sdk-linux-am335x-evm-04.02.00.09/EVSE/Projects/DD360Audi/Images/* /mnt/e/Image/DD360Audi/
+#sudo make DD360Tcci-rootfs
+#cp $ProjectPath/DD360Tcci/Images/* /mnt/d/Image/DD360Tcc/
+#sudo make DD360ComBox-rootfs
+#cp /opt/ti-processor-sdk-linux-am335x-evm-04.02.00.09/EVSE/Projects/DD360ComBox/Images/* /mnt/e/Image/DD360ComBox/
+#sudo make DD360UCar-rootfs
+#cp /opt/ti-processor-sdk-linux-am335x-evm-04.02.00.09/EVSE/Projects/DD360UCar/Images/* /mnt/d/Image/DD360UCar/
+