Răsfoiți Sursa

2021-08-02/Alston Lin
Actions
1. Set connector type (ccs1 / ccs2) to CCS module
2. Support the blind charging and output simultaneously
3. Record the network connection status in the database
4. Add a function to prevent the situation where config is not installed
5. DC charger supports AC connector module
6. Modify the OVP function, increase to inspect the maximum output voltage of the module
7. Fix the configuration issue
8. Support communication with DC meter
9. Optimize switching charging mode (Average <=> Max)
10. Add the vincode to charging record
11. Fix white card authorization problem
12. System Optimization

Files
As follow commit history

Alston 3 ani în urmă
părinte
comite
88b7290c2a

+ 47 - 7
EVSE/Projects/DS60-120/Apps/Config.h

@@ -80,17 +80,24 @@ enum _AC_SYSTEM_STATUS
 	AC_SYS_B,
 	AC_SYS_C,
 	AC_SYS_D,
-	AC_SYS_E
+	AC_SYS_E,
+	AC_SYS_F
 };
 
 enum _GUN_TYPE
 {
 	_Type_Chademo = 		0,
-	_Type_CCS_2,
+	_Type_CCS,
 	_Type_GB,
 	_Type_AC,
 };
 
+enum _CCS_TYPE
+{
+	_CCS_TYPE_CCS1 = 	0,
+	_CCS_TYPE_CCS2 = 	1,
+};
+
 enum _LCM_INDEX
 {
 	_LCM_INIT = 			0x00,
@@ -208,6 +215,13 @@ enum _PRIMARY_CHECK_TAG
 	_PRIMARY_CHECK_TAG_MAIN_BREAKER		= 1,
 };
 
+enum _ALARM_LEVEL_TAG
+{
+	_ALARM_LEVEL_NORMAL 		= 0,
+	_ALARM_LEVEL_WARNING		= 1,
+	_ALARM_LEVEL_CRITICAL		= 2
+};
+
 struct StructMeter
 {
 	float curMeterValue;
@@ -253,12 +267,17 @@ enum START_TRANSATION_STATUS
 	START_TRANSATION_STATUS_FAIL = 0x02,
 };
 
+enum CHARGER_TYPE
+{
+	CHARGER_TYPE_STANDARD 	= 0x00,
+	CHARGER_TYPE_SIMPLE 	= 0X01,
+};
+
 typedef union
 {
     unsigned int GunErrMessage;
     struct
     {
-    	// Chademo
         unsigned char ChaGfdTrip:1;
         unsigned char ChaUvpFail:1;
         unsigned char ChaConnectOTP:1;
@@ -268,7 +287,6 @@ typedef union
         unsigned char ChaRelayDrivingFault:1;
         unsigned char ChaConnectTempSensorFail:1;
 
-        // CCS
         unsigned char CCSGfdTrip :1;
 		unsigned char CCSUvpFail :1;
 		unsigned char CCSConnectOTP :1;
@@ -278,7 +296,6 @@ typedef union
 		unsigned char CCSRelayDrivingFault :1;
 		unsigned char CCSConnectTempSensorFail :1;
 
-		// GBT
 		unsigned char GBTGfdTrip :1;
 		unsigned char GBTUvpFail :1;
 		unsigned char GBTConnectOTP :1;
@@ -287,12 +304,21 @@ typedef union
 		unsigned char GBTRelayWeldingFault :1;
 		unsigned char GBTRelayDrivingFault :1;
 		unsigned char GBTConnectTempSensorFail :1;
+
+		unsigned char ChaConnectUCP :1;
+		unsigned char CCSConnectUCP :1;
+		unsigned char GBTConnectUCP :1;
+		unsigned char :5;
     }GunBits;
 }GunErr;
 
 struct DcCommonInformation
 {
-	unsigned char rebootCount;
+	byte rebootCount;
+	// charger type (standard、simple)
+	byte chargerType;
+	// minimun output current limit
+	float minOutputCur;
 	// check if the guns are of the same type
 	byte SysGunAreSameType;
 	// to check the ccs version
@@ -306,14 +332,28 @@ struct DcCommonInformation
 	// to check the ac contact status with psu communication
 	byte acContactSwitch;
 	byte psuKeepCommunication;
-	byte startTransationFlag[2];
+	byte startTransactionFlag[2];
 
 	GunErr ConnectErrList[2];
+	byte CcsTypeSaved[2];
 
 	// Plugit Rack180 : for checking start/stop charging flag
 	byte StartToChargingFlag[2]; // 0 : Stop, 1 : Start by modbus
 	unsigned short LcmFwVersion;
 	byte ShowLogoFlag;
+
+	// ocpp offline policy
+	byte _isAllowChargingOnDisconnect;
+
+	// Billing Data extend
+	byte _hour_index;			//0 ~ 23
+	float energy_time_period[2][24];
+
+	// for OCPP Reserved
+	byte _reserved_UserId[2][32];
+
+	// auto run flag
+	byte _isAutoRunTest;
 };
 
 #endif /* CONFIG_H_ */

+ 134 - 31
EVSE/Projects/DS60-120/Apps/Ev_Comm.c

@@ -14,17 +14,16 @@
 // CANBUS send cmd
 //================================================
 //================================================
-
 int PackageIdCmd(int cmd)
 {
 	return cmd | 0x80000000;
 }
 
-void SendCmdToEvboard(int cmd, byte *data, byte dataLen)
+void SendCmdToEvboard(EvFrame cmd, byte *data, byte dataLen)
 {
     struct can_frame frame;
 
-    frame.can_id = cmd;
+    frame.can_id = cmd.EvMessage;
     frame.can_dlc = dataLen;
     memcpy(frame.data, data, sizeof(frame.data));
 
@@ -33,9 +32,12 @@ void SendCmdToEvboard(int cmd, byte *data, byte dataLen)
 
 void SetTargetAddr(byte *target_number, byte index)
 {
-	int id = PackageIdCmd(Ev_Cmd.address_assignment + index);
-	//printf("intCmd = %x \n", cmd & CAN_EFF_MASK);
-	//cmd = cmd & CAN_EFF_MASK;
+	EvFrame EvFrameMsg;
+
+	EvFrameMsg.EvMessage = 0;
+	EvFrameMsg.EvBdBits.SlaveAddress = index;
+	EvFrameMsg.EvBdBits.MessageID = EV_Command_AddressAssignment;
+	EvFrameMsg.EvMessage = PackageIdCmd(EvFrameMsg.EvMessage);
 
 	byte data[8];
 
@@ -45,20 +47,47 @@ void SetTargetAddr(byte *target_number, byte index)
 	data[3] = *(target_number + 3);
 	data[4] = index;
 
-	SendCmdToEvboard(id, data, 5);
+	SendCmdToEvboard(EvFrameMsg, data, 5);
 }
 
 void GetFirmwareVersion(byte gun_index, byte toId)
 {
-	int id = PackageIdCmd(Ev_Cmd.get_firmware_ver + toId);
+	EvFrame EvFrameMsg;
+
+	EvFrameMsg.EvMessage = 0;
+	EvFrameMsg.EvBdBits.SlaveAddress = toId;
+	EvFrameMsg.EvBdBits.MessageID = EV_Command_GetFwVersion;
+	EvFrameMsg.EvMessage = PackageIdCmd(EvFrameMsg.EvMessage);
+
+	byte data[8];
+
+	SendCmdToEvboard(EvFrameMsg, data, 0);
+}
+
+void SetConnectInfo(byte type, byte toId)
+{
+	EvFrame EvFrameMsg;
+
+	EvFrameMsg.EvMessage = 0;
+	EvFrameMsg.EvBdBits.SlaveAddress = toId;
+	EvFrameMsg.EvBdBits.MessageID = EV_Command_CCSconnectorInfo;
+	EvFrameMsg.EvMessage = PackageIdCmd(EvFrameMsg.EvMessage);
+
 	byte data[8];
 
-	SendCmdToEvboard(id, data, 0);
+	data[0] = type;
+	SendCmdToEvboard(EvFrameMsg, data, 1);
 }
 
 void SyncRtcInfo(byte gun_index, byte toId, int epoch)
 {
-	int id = PackageIdCmd(Ev_Cmd.sync_rtc_info + toId);
+	EvFrame EvFrameMsg;
+
+	EvFrameMsg.EvMessage = 0;
+	EvFrameMsg.EvBdBits.SlaveAddress = toId;
+	EvFrameMsg.EvBdBits.MessageID = EV_Command_SyncRtcInfo;
+	EvFrameMsg.EvMessage = PackageIdCmd(EvFrameMsg.EvMessage);
+
 	byte data[8];
 
 	data[0] = epoch & 0xff;
@@ -66,20 +95,32 @@ void SyncRtcInfo(byte gun_index, byte toId, int epoch)
 	data[2] = (epoch >> 16) & 0xff;
 	data[3] = (epoch >> 24) & 0xff;
 
-	SendCmdToEvboard(id, data, 4);
+	SendCmdToEvboard(EvFrameMsg, data, 4);
 }
 
 void GetHardwareVersion(byte gun_index, byte toId)
 {
-	int id = PackageIdCmd(Ev_Cmd.get_hardware_ver + toId);
+	EvFrame EvFrameMsg;
+
+	EvFrameMsg.EvMessage = 0;
+	EvFrameMsg.EvBdBits.SlaveAddress = toId;
+	EvFrameMsg.EvBdBits.MessageID = EV_Command_GetHwVersion;
+	EvFrameMsg.EvMessage = PackageIdCmd(EvFrameMsg.EvMessage);
+
 	byte data[8];
 
-	SendCmdToEvboard(id, data, 0);
+	SendCmdToEvboard(EvFrameMsg, data, 0);
 }
 
 void SetChargingPermission(byte gun_index, byte permissionStatus, short aOutputPw, short aOutputCur, short aOutputVol, byte toId)
 {
-	int id = PackageIdCmd(Ev_Cmd.charging_permission + toId);
+	EvFrame EvFrameMsg;
+
+	EvFrameMsg.EvMessage = 0;
+	EvFrameMsg.EvBdBits.SlaveAddress = toId;
+	EvFrameMsg.EvBdBits.MessageID = EV_Command_ChargingPermission;
+	EvFrameMsg.EvMessage = PackageIdCmd(EvFrameMsg.EvMessage);
+
 	byte data[8];
 
 	data[0] = permissionStatus;
@@ -91,12 +132,18 @@ void SetChargingPermission(byte gun_index, byte permissionStatus, short aOutputP
 	data[6] = (aOutputVol >> 8) & 0xff;
 	data[7] = 0xf0;
 
-	SendCmdToEvboard(id, data, sizeof(data));
+	SendCmdToEvboard(EvFrameMsg, data, sizeof(data));
 }
 
 void SetPresentOutputPower(short outputVol_b1, short outputCur_b1, short outputVol_b2, short outputCur_b2)
 {
-	int id = PackageIdCmd(Ev_Cmd.present_output_power);
+	EvFrame EvFrameMsg;
+
+	EvFrameMsg.EvMessage = 0;
+	EvFrameMsg.EvBdBits.SlaveAddress = 0;
+	EvFrameMsg.EvBdBits.MessageID = EV_Command_PresentOutputPow;
+	EvFrameMsg.EvMessage = PackageIdCmd(EvFrameMsg.EvMessage);
+
 	byte data[8];
 
 	data[0] = outputVol_b1 & 0xff;
@@ -108,12 +155,18 @@ void SetPresentOutputPower(short outputVol_b1, short outputCur_b1, short outputV
 	data[6] = outputCur_b2 & 0xff;
 	data[7] = (outputCur_b2 >> 8) & 0xff;
 
-	SendCmdToEvboard(id, data, 8);
+	SendCmdToEvboard(EvFrameMsg, data, 8);
 }
 
 void SetPresentOutputCapacity(short aOutputPw_b1, short aOutputCur_b1, short aOutputPw_b2, short aOutputCur_b2)
 {
-	int id = PackageIdCmd(Ev_Cmd.present_output_cap);
+	EvFrame EvFrameMsg;
+
+	EvFrameMsg.EvMessage = 0;
+	EvFrameMsg.EvBdBits.SlaveAddress = 0;
+	EvFrameMsg.EvBdBits.MessageID = EV_Command_PresentOutputCap;
+	EvFrameMsg.EvMessage = PackageIdCmd(EvFrameMsg.EvMessage);
+
 	byte data[8];
 
 	data[0] = aOutputPw_b1 & 0xff;
@@ -125,28 +178,60 @@ void SetPresentOutputCapacity(short aOutputPw_b1, short aOutputCur_b1, short aOu
 	data[6] = aOutputCur_b2 & 0xff;
 	data[7] = (aOutputCur_b2 >> 8) & 0xff;
 
-	SendCmdToEvboard(id, data, 8);
+	SendCmdToEvboard(EvFrameMsg, data, 8);
 }
 
 void GetOutputReq(byte gun_index, byte toId)
 {
-	int id = PackageIdCmd(Ev_Cmd.get_output_req + toId);
+	EvFrame EvFrameMsg;
+
+	EvFrameMsg.EvMessage = 0;
+	EvFrameMsg.EvBdBits.SlaveAddress = toId;
+	EvFrameMsg.EvBdBits.MessageID = EV_Command_GetOutputReq;
+	EvFrameMsg.EvMessage = PackageIdCmd(EvFrameMsg.EvMessage);
+
+	byte data[8];
+
+	SendCmdToEvboard(EvFrameMsg, data, 0);
+}
+
+void GetEvccIdReq(byte gun_index, byte toId)
+{
+	EvFrame EvFrameMsg;
+
+	EvFrameMsg.EvMessage = 0;
+	EvFrameMsg.EvBdBits.SlaveAddress = toId;
+	EvFrameMsg.EvBdBits.MessageID = EV_Command_EvccidReq;
+	EvFrameMsg.EvMessage = PackageIdCmd(EvFrameMsg.EvMessage);
+
 	byte data[8];
 
-	SendCmdToEvboard(id, data, 0);
+	SendCmdToEvboard(EvFrameMsg, data, 0);
 }
 
 void GetEvBatteryInfo(byte gun_index, byte toId)
 {
-	int id = PackageIdCmd(Ev_Cmd.get_battery_info + toId);
+	EvFrame EvFrameMsg;
+
+	EvFrameMsg.EvMessage = 0;
+	EvFrameMsg.EvBdBits.SlaveAddress = toId;
+	EvFrameMsg.EvBdBits.MessageID = EV_Command_GetBetteryInfo;
+	EvFrameMsg.EvMessage = PackageIdCmd(EvFrameMsg.EvMessage);
+
 	byte data[8];
 
-	SendCmdToEvboard(id, data, 0);
+	SendCmdToEvboard(EvFrameMsg, data, 0);
 }
 
 void EvseStopChargingEvent(byte stopResult, byte *stopReason, byte toId)
 {
-	int id = PackageIdCmd(Ev_Cmd.evse_stop_charging + toId);
+	EvFrame EvFrameMsg;
+
+	EvFrameMsg.EvMessage = 0;
+	EvFrameMsg.EvBdBits.SlaveAddress = toId;
+	EvFrameMsg.EvBdBits.MessageID = EV_Command_EvseStopCharging;
+	EvFrameMsg.EvMessage = PackageIdCmd(EvFrameMsg.EvMessage);
+
 	byte data[8];
 
 	data[0] = stopResult;
@@ -157,12 +242,18 @@ void EvseStopChargingEvent(byte stopResult, byte *stopReason, byte toId)
 	data[5] = *(stopReason + 4);
 	data[6] = *(stopReason + 5);
 
-	SendCmdToEvboard(id, data, 7);
+	SendCmdToEvboard(EvFrameMsg, data, 7);
 }
 
 void GetMiscellaneousInfo(byte gun_index, byte relayStatus, float power, float voltage, byte toId)
 {
-	int id = PackageIdCmd(Ev_Cmd.get_miscellaneous_info + toId);
+	EvFrame EvFrameMsg;
+
+	EvFrameMsg.EvMessage = 0;
+	EvFrameMsg.EvBdBits.SlaveAddress = toId;
+	EvFrameMsg.EvBdBits.MessageID = EV_Command_GetMiscellaneous;
+	EvFrameMsg.EvMessage = PackageIdCmd(EvFrameMsg.EvMessage);
+
 	byte data[8];
 
 	int _power = power * 10;
@@ -173,24 +264,36 @@ void GetMiscellaneousInfo(byte gun_index, byte relayStatus, float power, float v
 	data[3] = (int)voltage & 0xff;
 	data[4] = ((int)voltage >> 8) & 0xff;
 
-	SendCmdToEvboard(id, data, 5);
+	SendCmdToEvboard(EvFrameMsg, data, 5);
 }
 
 void SetIsolationStatus(byte gun_index, byte result, byte toId)
 {
-	int id = PackageIdCmd(Ev_Cmd.isolation_status + toId);
+	EvFrame EvFrameMsg;
+
+	EvFrameMsg.EvMessage = 0;
+	EvFrameMsg.EvBdBits.SlaveAddress = toId;
+	EvFrameMsg.EvBdBits.MessageID = EV_Command_IsolationStatus;
+	EvFrameMsg.EvMessage = PackageIdCmd(EvFrameMsg.EvMessage);
+
 	byte data[8];
 
 	data[0] = result;
-	SendCmdToEvboard(id, data, 1);
+	SendCmdToEvboard(EvFrameMsg, data, 1);
 }
 
 void SetEvsePrechargeInfo(byte gun_index, byte result, byte toId)
 {
-	int id = PackageIdCmd(Ev_Cmd.evse_precharge_info + toId);
+	EvFrame EvFrameMsg;
+
+	EvFrameMsg.EvMessage = 0;
+	EvFrameMsg.EvBdBits.SlaveAddress = toId;
+	EvFrameMsg.EvBdBits.MessageID = EV_Command_EvsePrechargeInfo;
+	EvFrameMsg.EvMessage = PackageIdCmd(EvFrameMsg.EvMessage);
+
 	byte data[8];
 
 	data[0] = result;
-	SendCmdToEvboard(id, data, 1);
+	SendCmdToEvboard(EvFrameMsg, data, 1);
 }
 

+ 56 - 5
EVSE/Projects/DS60-120/Apps/FactoryConfig.c

@@ -77,6 +77,27 @@ void helpOutput(void)
 	printf("	-m Write to flash\r\n");
 }
 
+int runShellCmd(const char*cmd)
+{
+	int result = FAIL;
+	char buf[256];
+	FILE *fp;
+
+	fp = popen(cmd, "r");
+	if(fp != NULL)
+	{
+		while(fgets(buf, sizeof(buf), fp) != NULL)
+		{
+			StoreLogMsg("%s\n", buf);
+		}
+
+		result = PASS;
+	}
+	pclose(fp);
+
+	return result;
+}
+
 /**************************************************************************************/
 /************This task will create Factory default confgiuration file *****************/
  /***********and store it into mtdblock 10,11,12                               ****************/
@@ -84,7 +105,8 @@ void helpOutput(void)
 int main(int argc,char *argv[])
 {
 	unsigned char outType=0;
-	unsigned int i,Chk, MtdBlockSize=0x600000;
+	unsigned int i,Chk; //MtdBlockSize = 0x600000;
+	unsigned int MtdBlockSize = 0x300000;
 	unsigned char *ptr;
 	int fd,wrd;
 
@@ -198,11 +220,15 @@ int main(int argc,char *argv[])
 
 	//calculate CRC
 	Chk=0;
-	for(i=0;i<(MtdBlockSize-4);i++)
+//	for(i=0;i<(MtdBlockSize-4);i++)
+//	{
+//		Chk+=*(ptr+i);
+//	}
+	for(i = ARRAY_SIZE(SysConfig.CsuBootLoadFwRev); i < (MtdBlockSize-4); i++)
 	{
 		Chk+=*(ptr+i);
 	}
-	memcpy(	ptr+MtdBlockSize-4,&Chk,4);
+	memcpy(ptr+MtdBlockSize-4,&Chk,4);
 
 	/*
 	* Parameter process
@@ -243,9 +269,10 @@ int main(int argc,char *argv[])
 	/*
 	 * Configuration bin file generate
 	*/
-	if((outType&OUTPUT_FILE)>0)
+	if((outType&OUTPUT_FILE) > 0)
 	{
-		fd = open("/mnt/FactoryDefaultConfig.bin", O_RDWR | O_CREAT);
+		//fd = open("/mnt/FactoryDefaultConfig.bin", O_RDWR | O_CREAT);
+		fd = open("/mnt/FactoryDefaultConfig.bin", O_RDWR | O_CREAT | O_TRUNC);
 		if (fd < 0)
 		{
 			StoreLogMsg("[FactoryConfig]main: open /mnt/FactoryDefaultConfig.bin NG");
@@ -261,6 +288,30 @@ int main(int argc,char *argv[])
 			return 0;
 		}
 		StoreLogMsg("FactoryConfig write to file in /mnt OK.\r\n");
+
+		/* * Flash memory write */
+		if((outType&OUTPUT_FLASH)>0)
+		{
+			StoreLogMsg("Erase /dev/mtd10.\n");
+			runShellCmd("flash_erase /dev/mtd10 0 0");
+			StoreLogMsg("Write /dev/mtd10.\n");
+			runShellCmd("nandwrite -p /dev/mtd10 /mnt/FactoryDefaultConfig.bin");
+
+			StoreLogMsg("Erase /dev/mtd11.\n");
+			runShellCmd("flash_erase /dev/mtd11 0 0");
+			StoreLogMsg("Write /dev/mtd11.\n");
+			runShellCmd("nandwrite -p /dev/mtd11 /mnt/FactoryDefaultConfig.bin");
+
+			StoreLogMsg("Erase /dev/mtd12.\n");
+			runShellCmd("flash_erase /dev/mtd12 0 0");
+			StoreLogMsg("Write /dev/mtd12.\n");
+			runShellCmd("nandwrite -p /dev/mtd12 /mnt/FactoryDefaultConfig.bin");
+
+			system("rm -f /mnt/FactoryDefaultConfig.bin");
+
+			StoreLogMsg("FactoryConfig write to flash OK\n");
+		}
+		free(ptr);
 	}
 
 	/*

+ 299 - 176
EVSE/Projects/DS60-120/Apps/Module_EvComm.c

@@ -57,19 +57,23 @@ struct DcCommonInformation		*ShmDcCommonData;
 
 byte gun_count;
 int chargingTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
+byte rtcChkCount = 0;
 
 float LogInfo[2][10];
+bool _useOfflineNoCharging = false;
 
 // 限制最大充電電壓,因應不同 type 槍線來限制
-// Chademo : 500V, 125A,
-// GB : 750, 120A
-// CCS : 950V, 120A
-double chademoVol = 5000;
-double ccsVol = 9500;
-double gbVol = 7500;
-float maxChargingVol[2] = { 0, 0 };			// 限制最大充電電壓,如依照模塊則填上 0
+double Chademo_Simple = 5000;
+double GB_Simple = 7500;
+double CCS_Simple = 7500;
+// ---------------------------------------
+double Chademo_Standard= 5000;
+double GB_Standard = 7500;
+double CCS_Standard = 9500;
+
+//float maxChargingVol[2] = { 0, 0 };			// 限制最大充電電壓,如依照模塊則填上 0
 // 限制最大充電電流與能量透過 Web
-float maxChargingCur[2] = { 0, 0 };			// 限制最大充電電流,如依照模塊則填上 0
+//float maxChargingCur[2] = { 0, 0 };			// 限制最大充電電流,如依照模塊則填上 0
 float maxChargingPow = 0;					// 限制最大充電能量,如依照模塊則填上 0
 
 // 允許當前輸出與需求落差超過 10A 的累積次數 (超過 ALLOW_COUNT_MAX 即給予當前值)
@@ -85,29 +89,6 @@ struct timeval _chk_chademo_permission_timeout[CHAdeMO_QUANTITY + CCS_QUANTITY +
 bool chkChademoPermission[2] = { false, false };
 byte SendErrorCount[2] = { 0, 0};
 
-struct Ev_Board_Cmd Ev_Cmd={
-		0,
-		0x00000200,
-		0x00000400,
-		0x00000500,
-		0x00000600,
-		0x00000700,
-		0x00000800,
-		0x00000900,
-		0x00000A00,
-		0x00000C00,
-		0x00000D00,
-
-		0x00000E00,
-		0x00000F00,
-		0x00001000,
-		0x00001100,
-
-		0x00001200,
-		0x00001400,
-		0x00001500,
-};
-
 unsigned char mask_table[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
 
 void PRINTF_FUNC(char *string, ...);
@@ -462,7 +443,7 @@ void AddrAssignment(byte *data)
 	{
 		if (_chargingData[index - 1]->Type == _Type_Chademo)
 			PRINTF_FUNC("Set EV board info : (Chademo) TargetAddr = %d \n", index);
-		else if (_chargingData[index - 1]->Type == _Type_CCS_2)
+		else if (_chargingData[index - 1]->Type == _Type_CCS)
 			PRINTF_FUNC("Set EV board info : (CCS) TargetAddr = %d \n", index);
 		else if (_chargingData[index - 1]->Type == _Type_GB)
 			PRINTF_FUNC("Set EV board info : (GB) TargetAddr = %d \n", index);
@@ -2818,43 +2799,45 @@ void CANReceiver()
 			memset(&frame, 0, sizeof(struct can_frame));
 			nbytes = read(CanFd, &frame, sizeof(struct can_frame));
 
-			for (byte _index = 0; _index < gun_count; _index++)
-			{
-				if (GetTimeoutValue(_cmd_ack_timeout[_index]) >= 5000000)
-				{
-					// ACK timeout
-					//PRINTF_FUNC("gun = %x, ack timeout \n", _index);
-				}
-			}
+//			for (byte _index = 0; _index < gun_count; _index++)
+//			{
+//				if (GetTimeoutValue(_cmd_ack_timeout[_index]) >= 5000000)
+//				{
+//					// ACK timeout
+//					//PRINTF_FUNC("gun = %x, ack timeout \n", _index);
+//				}
+//			}
 
 			if (nbytes > 0)
 			{
 				byte target;
 				byte targetGun = 0x00;
 				byte findIndex = 0x00;
+				EvFrame *EvFrameMsg;
 
-				intCmd = (int) (frame.can_id & CAN_EFF_MASK);
+				EvFrameMsg = (EvFrame *)&frame.can_id;
+				intCmd = EvFrameMsg->EvBdBits.MessageID;
 
 				if (!isClearBuf)
 				{
 					continue;
 				}
 
-				if (intCmd == ADDRESS_REQ)
+				if (intCmd == EV_Command_AddressReq)
 				{
 					ShmDcCommonData->CcsVersion = _CCS_VERSION_CHECK_TAG_V013S0;
 					AddrAssignment(frame.data);
 					continue;
 				}
-				intCmd = (int) (frame.can_id & CAN_EFF_MASK & 0xFFFFFF00);
-				target = ((byte) (frame.can_id & 0x000000FF));		// 0x01 or 0x02
+
+				target = EvFrameMsg->EvBdBits.SlaveAddress;		// 0x01 or 0x02
 
 				for (byte _index = 0; _index < gun_count; _index++)
 				{
 					// 假設有找到回應的 Index
 					findIndex = target;
 					if (gun_count == 1 &&
-							_chargingData[_index]->Type == _Type_CCS_2 &&
+							_chargingData[_index]->Type == _Type_CCS &&
 							ShmDcCommonData->CcsVersion == _CCS_VERSION_CHECK_TAG_V015S0)
 					{
 						target -= 1;
@@ -2872,22 +2855,21 @@ void CANReceiver()
 					PRINTF_FUNC("EvComm (CANReceiver) : Target index = %x is < 0 or > QUANTITY \n", targetGun);
 					continue;
 				}
-				else if (gun_count == 1 && targetGun == 0 && findIndex == 1 &&
-						ShmDcCommonData->CcsVersion == _CCS_VERSION_CHECK_TAG_V015S0)
-				{
-					// 這樣的條件下~ 也是單槍 CCS 舊版本的狀況 : 因為舊版 CCS 不會 timeout, then send request id
-					ShmDcCommonData->CcsVersion = _CCS_VERSION_CHECK_TAG_V013S0;
-				}
 
-				if(intCmd == 256)
+				if (gun_count == 1)
 				{
-					continue;
+					if (findIndex == 1)
+						ShmDcCommonData->CcsVersion = _CCS_VERSION_CHECK_TAG_V013S0;
+					else
+						ShmDcCommonData->CcsVersion = _CCS_VERSION_CHECK_TAG_V015S0;
 				}
 
+				if(intCmd == 256) { continue; }
+
 				gettimeofday(&_cmd_ack_timeout[targetGun], NULL);
 				switch (intCmd)
 				{
-					case NOTIFICATION_EV_STATUS:
+					case EV_Command_EvStatusNotification:
 					{
 						if (_chargingData[targetGun]->ConnectorPlugIn != frame.data[0])
 						{
@@ -2896,7 +2878,7 @@ void CANReceiver()
 							else if (frame.data[0] == UNPLUG)
 								PRINTF_FUNC("Conn %d, Unplug. \n", targetGun);
 							else
-								PRINTF_FUNC("Conn %d, None Check. (%d) \n", targetGun, frame.data[0]);
+								PRINTF_FUNC("Conn %d, Plug None Check. (%d) \n", targetGun, frame.data[0]);
 						}
 
 						_chargingData[targetGun]->ConnectorPlugIn = frame.data[0];
@@ -2906,7 +2888,7 @@ void CANReceiver()
 						//PRINTF_FUNC("ConnectorPlugIn = %x \n", (-120 + frame.data[1]) / 10);
 					}
 						break;
-					case ACK_EV_FW_VERSION:
+					case EV_Command_GetFwVersion:
 					{
 						byte ver[16];
 
@@ -2927,7 +2909,7 @@ void CANReceiver()
 							PRINTF_FUNC("Connector %d, GBT Ver. : %s\n",
 									targetGun, ShmGBTData->evse[_chargingData[targetGun]->type_index].version);
 						}
-						else if (_chargingData[targetGun]->Type == _Type_CCS_2)
+						else if (_chargingData[targetGun]->Type == _Type_CCS)
 						{
 							if (ShmCcsData->CommProtocol == _CCS_COMM_V2GMessage_DIN70121)
 							{
@@ -2951,12 +2933,12 @@ void CANReceiver()
 						}
 					}
 						break;
-					case ACK_EV_HW_VERSION:
+					case EV_Command_GetHwVersion:
 					{
 						//PRINTF_FUNC("Get EV HW = %s \n", frame.data);
 					}
 						break;
-					case ACK_GET_OUTPUT_REQ:
+					case EV_Command_GetOutputReq:
 					{
 						if ((_chargingData[targetGun]->SystemStatus >= S_PREPARING_FOR_EV &&
 								_chargingData[targetGun]->SystemStatus <= S_CHARGING) ||
@@ -2966,7 +2948,8 @@ void CANReceiver()
 							if (_chargingData[targetGun]->EvBatteryStartSoc <= 0)
 								_chargingData[targetGun]->EvBatteryStartSoc = frame.data[1];
 
-							if (frame.data[1] > _chargingData[targetGun]->EvBatterySoc)
+							if (frame.data[1] > _chargingData[targetGun]->EvBatterySoc ||
+									_chargingData[targetGun]->SystemStatus == S_CHARGING)
 								_chargingData[targetGun]->EvBatterySoc = frame.data[1];
 						}
 
@@ -2998,7 +2981,7 @@ void CANReceiver()
 							ShmGBTData->ev[_chargingData[targetGun]->type_index].TargetBatteryVoltage = (_chargingData[targetGun]->EvBatterytargetVoltage * 10);
 							ShmGBTData->ev[_chargingData[targetGun]->type_index].ChargingCurrentRequest = (_chargingData[targetGun]->EvBatterytargetCurrent * 10);
 						}
-						else if (_chargingData[targetGun]->Type == _Type_CCS_2)
+						else if (_chargingData[targetGun]->Type == _Type_CCS)
 						{
 							if(ShmCcsData->CommProtocol == _CCS_COMM_V2GMessage_DIN70121)
 							{
@@ -3012,7 +2995,7 @@ void CANReceiver()
 						//PRINTF_FUNC("CurrentRequest = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].ChargingCurrentRequest);
 					}
 						break;
-					case ACK_GET_EV_BATTERY_INFO:
+					case EV_Command_GetBetteryInfo:
 					{
 						//_chargingData[target].EvACorDCcharging = frame.data[0];
 						//_chargingData[target]->TotalBatteryCap = ((float) frame.data[4] << 8) + (short) frame.data[3];
@@ -3034,13 +3017,13 @@ void CANReceiver()
 							ShmGBTData->ev[_chargingData[targetGun]->type_index].TotalBatteryCapacity = ((short) frame.data[2] << 8) + (short) frame.data[1];
 							ShmGBTData->ev[_chargingData[targetGun]->type_index].MaxiBatteryVoltage = _chargingData[targetGun]->EvBatteryMaxVoltage;
 						}
-						else if (_chargingData[targetGun]->Type == _Type_CCS_2)
+						else if (_chargingData[targetGun]->Type == _Type_CCS)
 						{
 
 						}
 					}
 						break;
-					case ACK_GET_MISCELLANEOUS_INFO:
+					case EV_Command_GetMiscellaneous:
 					{
 						_chargingData[targetGun]->GunLocked = frame.data[0];
 						_chargingData[targetGun]->PilotVoltage = (float)(-120 + frame.data[3]) / 10;
@@ -3048,21 +3031,24 @@ void CANReceiver()
 						ShmDcCommonData->ConnectorTemp1[targetGun] = frame.data[1];
 						ShmDcCommonData->ConnectorTemp2[targetGun] = frame.data[2];
 
-						_chargingData[targetGun]->ConnectorTemp = ReturnConnectTemp(frame.data[1], frame.data[2]);
 						if (_chargingData[targetGun]->Type == _Type_Chademo)
 						{
+							// 200A 以上的槍才會有 cha 槍溫
+							_chargingData[targetGun]->ConnectorTemp = UNDEFINED_TEMP;
 							ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureP = frame.data[1];
 							ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureN = frame.data[2];
 							ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].EvboardStatus = frame.data[7];
 						}
 						else if (_chargingData[targetGun]->Type == _Type_GB)
 						{
+							_chargingData[targetGun]->ConnectorTemp = ReturnConnectTemp(frame.data[1], frame.data[2]);
 							ShmGBTData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureP = frame.data[1];
 							ShmGBTData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureN = frame.data[2];
 							ShmGBTData->evse[_chargingData[targetGun]->type_index].EvboardStatus = frame.data[7];
 						}
-						else if (_chargingData[targetGun]->Type == _Type_CCS_2)
+						else if (_chargingData[targetGun]->Type == _Type_CCS)
 						{
+							_chargingData[targetGun]->ConnectorTemp = ReturnConnectTemp(frame.data[1], frame.data[2]);
 							if (ShmCcsData->CommProtocol == _CCS_COMM_V2GMessage_DIN70121)
 							{
 								//ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index]. .ConnectorTemperatureP = frame.data[1];
@@ -3077,14 +3063,37 @@ void CANReceiver()
 						//PRINTF_FUNC("PilotVoltage = %x \n", (-120 + frame.data[3]) / 10);
 					}
 						break;
-					case ACK_EVSE_ISOLATION_STATUS:	{}
+					case EV_Command_IsolationStatus:{}
+						break;
+					case EV_Command_EvccidReq:
+					{
+						if (frame.can_dlc > 0 &&
+								strcmp((char *)_chargingData[targetGun]->EVCCID, "") == EQUAL)
+						{
+							if (_chargingData[targetGun]->Type == _Type_CCS)
+							{
+								if (ShmCcsData->CommProtocol == _CCS_COMM_V2GMessage_DIN70121)
+								{
+									memset(ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].SessionSetupRequest.EVCCID, 0, sizeof(ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].SessionSetupRequest.EVCCID));
+									memcpy(ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].SessionSetupRequest.EVCCID, frame.data, frame.can_dlc);
+								}
+							}
+
+							sprintf((char *)_chargingData[targetGun]->EVCCID, "%.2x%.2x%.2x%.2x%.2x%.2x",
+									frame.data[0], frame.data[1], frame.data[2], frame.data[3],
+									frame.data[4], frame.data[5]);
+
+							_chargingData[targetGun]->EVCCID[17] = '\0';
+							PRINTF_FUNC("*******Gun %d->EVCCID = %s \n", targetGun, _chargingData[targetGun]->EVCCID);
+						}
+					}
 						break;
-					case ACK_EVSE_PRECHAGE_INFO:
+					case EV_Command_EvsePrechargeInfo:
 					{
 						_chargingData[targetGun]->PrechargeStatus = frame.data[0];
 					}
 						break;
-					case NOTIFICATION_EV_STOP:
+					case EV_Command_EvStopNotification:
 					{
 						// 車端要求停止
 						if ((_chargingData[targetGun]->SystemStatus >= S_REASSIGN_CHECK &&
@@ -3117,7 +3126,7 @@ void CANReceiver()
 					}
 						break;
 					default:
-						//PRINTF_FUNC("EV board = %d, Ack none defined. intCmd = %d  \n", targetGun, intCmd);
+						PRINTF_FUNC("EV board = %d, Ack none defined. intCmd = %d  \n", targetGun, intCmd);
 						break;
 				}
 			}
@@ -3199,6 +3208,22 @@ void SetPresentChargingOutputPower(struct ChargingInfoData *chargingData_1, stru
 			curAllowCount[1] = 0;
 	}
 
+	if (!_useOfflineNoCharging)
+	{
+		if (ShmSysConfigAndInfo->SysInfo.OcppConnStatus == NO &&
+				ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_NO_CHARGING)
+		{
+			PRINTF_FUNC("Offline Policy : No Charing... \n");
+			_useOfflineNoCharging = true;
+			cur1 = cur2 = 0;
+		}
+	}
+	else
+	{
+		if (ShmSysConfigAndInfo->SysInfo.OcppConnStatus == YES)
+			_useOfflineNoCharging = false;
+	}
+
 	SetPresentOutputPower(vol1, cur1, vol2, cur2);
 }
 
@@ -3304,11 +3329,13 @@ void Initialization()
 
 void GetMaxVolAndCurMethod(byte index, float *vol, float *cur)
 {
-	if (maxChargingVol[index] != 0 && maxChargingVol[index] <= *vol)
-		*vol = maxChargingVol[index];
+	if (_chargingData[index]->ConnectorMaxVoltage != 0 &&
+			_chargingData[index]->ConnectorMaxVoltage <= *vol)
+		*vol = _chargingData[index]->ConnectorMaxVoltage;
 
-	if (maxChargingCur[index] != 0 && maxChargingCur[index] <= *cur)
-		*cur = maxChargingCur[index];
+	if (_chargingData[index]->ConnectorMaxCurrent != 0 &&
+			_chargingData[index]->ConnectorMaxCurrent <= *cur)
+		*cur = _chargingData[index]->ConnectorMaxCurrent;
 
 	if (((_chargingData[index]->SystemStatus >= S_PREPARING_FOR_EVSE && _chargingData[index]->SystemStatus <= S_CHARGING) ||
 			(_chargingData[index]->SystemStatus >= S_CCS_PRECHARGE_ST0 && _chargingData[index]->SystemStatus <= S_CCS_PRECHARGE_ST1)) &&
@@ -3362,109 +3389,120 @@ byte GetStopChargingReasonByEvse(byte gunIndex, byte *reason)
 	if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip == 0x01)
 	{
 		// 012251
-		*(reason + 5)  = 0;
-		*(reason + 4)  = 1;
-		*(reason + 3)  = 2;
-		*(reason + 2)  = 2;
-		*(reason + 1)  = 5;
-		*(reason + 0)  = 1;
+		*(reason + 0)  = '0';
+		*(reason + 1)  = '1';
+		*(reason + 2)  = '2';
+		*(reason + 3)  = '2';
+		*(reason + 4)  = '5';
+		*(reason + 5)  = '1';
 		result = YES;
 	}
 
 	if (_chargingData[gunIndex]->Type == _Type_Chademo)
 	{
-		if (ShmStatusCodeData->FaultCode.FaultEvents.bits.ChademoOutputRelayDrivingFault == YES)
+		if (ShmDcCommonData->ConnectErrList[gunIndex].GunBits.ChaRelayDrivingFault == YES)
 		{
 			// 011012
-			*(reason + 5) = 0;
-			*(reason + 4) = 1;
-			*(reason + 3) = 1;
-			*(reason + 2) = 0;
-			*(reason + 1) = 1;
-			*(reason + 0) = 2;
+			*(reason + 0) = '0';
+			*(reason + 1) = '1';
+			*(reason + 2) = '1';
+			*(reason + 3) = '0';
+			*(reason + 4) = '1';
+			*(reason + 5) = '2';
 			result = YES;
 		}
-		else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoOutputUVPFail == YES)
+		else if (ShmDcCommonData->ConnectErrList[gunIndex].GunBits.ChaUvpFail == YES)
 		{
 			// 012289
-			*(reason + 5) = 0;
-			*(reason + 4) = 1;
-			*(reason + 3) = 2;
-			*(reason + 2) = 2;
-			*(reason + 1) = 8;
-			*(reason + 0) = 9;
+			*(reason + 0) = '0';
+			*(reason + 1) = '1';
+			*(reason + 2) = '2';
+			*(reason + 3) = '2';
+			*(reason + 4) = '8';
+			*(reason + 5) = '9';
 			result = YES;
 		}
-		else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGfdTrip == YES)
+		else if (ShmDcCommonData->ConnectErrList[gunIndex].GunBits.ChaGfdTrip == YES)
 		{
 			// 012234
-			*(reason + 5) = 0;
-			*(reason + 4) = 1;
-			*(reason + 3) = 2;
-			*(reason + 2) = 2;
-			*(reason + 1) = 3;
-			*(reason + 0) = 4;
+			*(reason + 0) = '0';
+			*(reason + 1) = '1';
+			*(reason + 2) = '2';
+			*(reason + 3) = '2';
+			*(reason + 4) = '3';
+			*(reason + 5) = '4';
 			result = YES;
 		}
 	}
 	else if (_chargingData[gunIndex]->Type == _Type_GB)
 	{
-		if (ShmStatusCodeData->FaultCode.FaultEvents.bits.ChademoOutputRelayDrivingFault == YES)
+		if (ShmDcCommonData->ConnectErrList[gunIndex].GunBits.GBTRelayDrivingFault == YES)
 		{
 			// 012290
-			*(reason + 5) = 0;
-			*(reason + 4) = 1;
-			*(reason + 3) = 2;
-			*(reason + 2) = 2;
-			*(reason + 1) = 9;
-			*(reason + 0) = 0;
+			*(reason + 0) = '0';
+			*(reason + 1) = '1';
+			*(reason + 2) = '2';
+			*(reason + 3) = '2';
+			*(reason + 4) = '9';
+			*(reason + 5) = '0';
 			result = YES;
 		}
-		else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip == YES)
+		else if (ShmDcCommonData->ConnectErrList[gunIndex].GunBits.GBTUvpFail == YES)
+		{
+			// 012290
+			*(reason + 0) = '0';
+			*(reason + 1) = '1';
+			*(reason + 2) = '2';
+			*(reason + 3) = '2';
+			*(reason + 4) = '9';
+			*(reason + 5) = '0';
+			result = YES;
+		}
+		else if (ShmDcCommonData->ConnectErrList[gunIndex].GunBits.GBTGfdTrip == YES)
 		{
 			// 012236
-			*(reason + 5) = 0;
-			*(reason + 4) = 1;
-			*(reason + 3) = 2;
-			*(reason + 2) = 2;
-			*(reason + 1) = 3;
-			*(reason + 0) = 6;
+			*(reason + 0) = '0';
+			*(reason + 1) = '1';
+			*(reason + 2) = '2';
+			*(reason + 3) = '2';
+			*(reason + 4) = '3';
+			*(reason + 5) = '6';
 			result = YES;
 		}
 	}
-	else if (_chargingData[gunIndex]->Type == _Type_CCS_2)
+	else if (_chargingData[gunIndex]->Type == _Type_CCS)
 	{
-		if (ShmStatusCodeData->FaultCode.FaultEvents.bits.CcsOutputRelayDrivingFault == YES)
+		if (ShmDcCommonData->ConnectErrList[gunIndex].GunBits.CCSRelayDrivingFault == YES)
 		{
 			// 011014
-			*(reason + 5) = 0;
-			*(reason + 4) = 1;
-			*(reason + 3) = 1;
-			*(reason + 2) = 0;
-			*(reason + 1) = 1;
-			*(reason + 0) = 4;
+			*(reason + 0) = '0';
+			*(reason + 1) = '1';
+			*(reason + 2) = '1';
+			*(reason + 3) = '0';
+			*(reason + 4) = '1';
+			*(reason + 5) = '4';
 			result = YES;
 		}
-		else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsOutputUVPFail == YES)
+		else if (ShmDcCommonData->ConnectErrList[gunIndex].GunBits.CCSUvpFail == YES)
 		{
 			// 012288
-			*(reason + 5) = 0;
-			*(reason + 4) = 1;
-			*(reason + 3) = 2;
-			*(reason + 2) = 2;
-			*(reason + 1) = 8;
-			*(reason + 0) = 8;
+			*(reason + 0) = '0';
+			*(reason + 1) = '1';
+			*(reason + 2) = '2';
+			*(reason + 3) = '2';
+			*(reason + 4) = '8';
+			*(reason + 5) = '8';
 			result = YES;
 		}
-		else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGfdTrip == YES)
+		else if (ShmDcCommonData->ConnectErrList[gunIndex].GunBits.CCSGfdTrip == YES)
 		{
 			// 012235
-			*(reason + 5) = 0;
-			*(reason + 4) = 1;
-			*(reason + 3) = 2;
-			*(reason + 2) = 2;
-			*(reason + 1) = 3;
-			*(reason + 0) = 5;
+			*(reason + 0) = '0';
+			*(reason + 1) = '1';
+			*(reason + 2) = '2';
+			*(reason + 3) = '2';
+			*(reason + 4) = '3';
+			*(reason + 5) = '5';
 			result = YES;
 		}
 	}
@@ -3477,7 +3515,7 @@ void SendCommunicationOnly(byte index)
 	byte targetID = _chargingData[index]->Evboard_id;
 
 	if (gun_count == 1 &&
-			_chargingData[index]->Type == _Type_CCS_2 &&
+			_chargingData[index]->Type == _Type_CCS &&
 			ShmDcCommonData->CcsVersion == _CCS_VERSION_CHECK_TAG_V015S0)
 	{
 		targetID += 1;
@@ -3495,7 +3533,7 @@ void SendStopOnly(byte index)
 	byte targetID = _chargingData[index]->Evboard_id;
 
 	if (gun_count == 1 &&
-			_chargingData[index]->Type == _Type_CCS_2 &&
+			_chargingData[index]->Type == _Type_CCS &&
 			ShmDcCommonData->CcsVersion == _CCS_VERSION_CHECK_TAG_V015S0)
 	{
 		targetID += 1;
@@ -3528,6 +3566,7 @@ void FormatVoltageAndCurrent()
 		}
 		else
 		{
+			// 60KW 以上的系統
 			isLowCur = 0x02;
 		}
 	}
@@ -3536,63 +3575,83 @@ void FormatVoltageAndCurrent()
 	{
 		if (_chargingData[_index]->Type == _Type_Chademo)
 		{
-			maxChargingVol[_index] = chademoVol;
+			if (ShmDcCommonData->chargerType == CHARGER_TYPE_STANDARD)
+				_chargingData[_index]->ConnectorMaxVoltage = Chademo_Standard;
+			else
+				_chargingData[_index]->ConnectorMaxVoltage = Chademo_Simple;
 		}
-		else if (_chargingData[_index]->Type == _Type_CCS_2)
+		else if (_chargingData[_index]->Type == _Type_CCS)
 		{
-			maxChargingVol[_index] = ccsVol;
+			if (ShmDcCommonData->chargerType == CHARGER_TYPE_STANDARD)
+				_chargingData[_index]->ConnectorMaxVoltage = CCS_Standard;
+			else
+				_chargingData[_index]->ConnectorMaxVoltage = CCS_Simple;
 		}
 		else if (_chargingData[_index]->Type == _Type_GB)
 		{
-			maxChargingVol[_index] = gbVol;
+			if (ShmDcCommonData->chargerType == CHARGER_TYPE_STANDARD)
+				_chargingData[_index]->ConnectorMaxVoltage = GB_Standard;
+			else
+				_chargingData[_index]->ConnectorMaxVoltage = GB_Simple;
 		}
 
 		if (isLowCur == 0x00)
 		{
 			if (_chargingData[_index]->Type == _Type_Chademo)
 			{
-				maxChargingCur[_index] = 600;
+				_chargingData[_index]->ConnectorMaxCurrent = 600;
 			}
-			else if (_chargingData[_index]->Type == _Type_CCS_2)
+			else if (_chargingData[_index]->Type == _Type_CCS)
 			{
-				maxChargingCur[_index] = 600;
+				if (_chargingData[_index]->ModelType == 'M' ||
+						_chargingData[_index]->ModelType == 'N')
+					_chargingData[_index]->ConnectorMaxCurrent = 800;
+				else
+					_chargingData[_index]->ConnectorMaxCurrent = 600;
 			}
 			else if (_chargingData[_index]->Type == _Type_GB)
 			{
-				maxChargingCur[_index] = 800;
+				_chargingData[_index]->ConnectorMaxCurrent = 800;
 			}
 		}
 		else if (isLowCur == 0x01)
 		{
 			if (_chargingData[_index]->Type == _Type_Chademo)
 			{
-				maxChargingCur[_index] = 1200;
+				_chargingData[_index]->ConnectorMaxCurrent = 1200;
 			}
-			else if (_chargingData[_index]->Type == _Type_CCS_2)
+			else if (_chargingData[_index]->Type == _Type_CCS)
 			{
-				maxChargingCur[_index] = 1200;
+				_chargingData[_index]->ConnectorMaxCurrent = 1200;
 			}
 			else if (_chargingData[_index]->Type == _Type_GB)
 			{
-				maxChargingCur[_index] = 1200;
+				_chargingData[_index]->ConnectorMaxCurrent = 1200;
 			}
 		}
 		else
 		{
 			if (_chargingData[_index]->Type == _Type_Chademo)
 			{
-				maxChargingCur[_index] = 1200;
+				_chargingData[_index]->ConnectorMaxCurrent = 1200;
 			}
-			else if (_chargingData[_index]->Type == _Type_CCS_2)
+			else if (_chargingData[_index]->Type == _Type_CCS)
 			{
-				maxChargingCur[_index] = 2000;
+				_chargingData[_index]->ConnectorMaxCurrent = 2000;
 			}
 			else if (_chargingData[_index]->Type == _Type_GB)
 			{
-				maxChargingCur[_index] = 2500;
+				_chargingData[_index]->ConnectorMaxCurrent = 2500;
 			}
 		}
 	}
+
+	if (ShmDcCommonData->chargerType == CHARGER_TYPE_SIMPLE &&
+			strcmp(EvsePower, "18") == EQUAL)
+	{
+		// 簡易版且180KW -> 限制最小輸出電流 50A
+		ShmDcCommonData->minOutputCur = 50;
+	}
 }
 
 // 如果是使用 Meter 計算的話
@@ -3601,11 +3660,13 @@ void CalOutputPowerAndEnergy(int _index)
 	if(ShmSysConfigAndInfo->SysConfig.ModelName[3] == 'M' ||
 			ShmSysConfigAndInfo->SysConfig.ModelName[3] == 'L')
 	{
+		// AC Meter
 		//printf("(%d), totalChargingValue = %f \n", _index, ShmCsuMeterData->_meter[_index]._curTotalCharging / 100);
 		float totalChargingValue = ShmCsuMeterData->_meter[_index]._curTotalCharging / 100;
 
 		if (totalChargingValue > _chargingData[_index]->PresentChargedEnergy)
 		{
+			ShmDcCommonData->energy_time_period[_index][ShmDcCommonData->_hour_index] += totalChargingValue - _chargingData[_index]->PresentChargedEnergy;
 			_chargingData[_index]->PowerConsumption += totalChargingValue - _chargingData[_index]->PresentChargedEnergy;
 		}
 
@@ -3616,6 +3677,35 @@ void CalOutputPowerAndEnergy(int _index)
 			_chargingData[_index]->ChargingFee = totalChargingValue * ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee;
 		}
 	}
+	else if (ShmSysConfigAndInfo->SysConfig.ModelName[3] == 'P')
+	{
+		// DC Meter
+		if (ShmCsuMeterData->_meter[_index].curMeterValue == 0)
+				ShmCsuMeterData->_meter[_index].curMeterValue = ShmSysConfigAndInfo->SysInfo.DcMeterInfo[_index].totlizeImportEnergy;
+		else
+		{
+			if (ShmSysConfigAndInfo->SysInfo.DcMeterInfo[_index].totlizeImportEnergy > ShmCsuMeterData->_meter[_index].curMeterValue)
+			{
+				ShmCsuMeterData->_meter[_index]._curTotalCharging += ShmSysConfigAndInfo->SysInfo.DcMeterInfo[_index].totlizeImportEnergy - ShmCsuMeterData->_meter[_index].curMeterValue;
+				float totalChargingValue = ShmCsuMeterData->_meter[_index]._curTotalCharging / 100;
+
+				if (totalChargingValue > _chargingData[_index]->PresentChargedEnergy)
+				{
+					ShmDcCommonData->energy_time_period[_index][ShmDcCommonData->_hour_index] += totalChargingValue - _chargingData[_index]->PresentChargedEnergy;
+					_chargingData[_index]->PowerConsumption += totalChargingValue - _chargingData[_index]->PresentChargedEnergy;
+				}
+
+				_chargingData[_index]->PresentChargedEnergy = totalChargingValue;
+
+				if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
+				{
+					_chargingData[_index]->ChargingFee = totalChargingValue * ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee;
+				}
+
+				ShmCsuMeterData->_meter[_index].curMeterValue = ShmSysConfigAndInfo->SysInfo.DcMeterInfo[_index].totlizeImportEnergy;
+			}
+		}
+	}
 	else
 	{
 		if (chargingTime[_index] == 0 ||
@@ -3632,6 +3722,7 @@ void CalOutputPowerAndEnergy(int _index)
 				float changingPow = (_chargingData[_index]->PresentChargingPower) * passTime / 3600;
 				if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
 				{
+					ShmDcCommonData->energy_time_period[_index][ShmDcCommonData->_hour_index] += changingPow;
 					_chargingData[_index]->ChargingFee += changingPow * ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee;
 				}
 
@@ -3673,21 +3764,28 @@ int main(int argc, char *argv[])
 		if (_chargingData[_index]->Type == _Type_Chademo)
 		{
 			PRINTF_FUNC("Conn %d (Chademo), MaxVol = %f, MaxCur = %f \n",
-				_index, maxChargingVol[_index], maxChargingCur[_index]);
+				_index,
+				_chargingData[_index]->ConnectorMaxVoltage,
+				_chargingData[_index]->ConnectorMaxCurrent);
 		}
-		else if (_chargingData[_index]->Type == _Type_CCS_2)
+		else if (_chargingData[_index]->Type == _Type_CCS)
 		{
 			PRINTF_FUNC("Conn %d (CCS), MaxVol = %f, MaxCur = %f \n",
-				_index, maxChargingVol[_index], maxChargingCur[_index]);
+				_index,
+				_chargingData[_index]->ConnectorMaxVoltage,
+				_chargingData[_index]->ConnectorMaxCurrent);
 		}
 		else if (_chargingData[_index]->Type == _Type_GB)
 		{
 			PRINTF_FUNC("Conn %d (GBT), MaxVol = %f, MaxCur = %f \n",
-				_index, maxChargingVol[_index], maxChargingCur[_index]);
+				_index,
+				_chargingData[_index]->ConnectorMaxVoltage,
+				_chargingData[_index]->ConnectorMaxCurrent);
 		}
 	}
 
 	unsigned long _timeBuf = 0;
+
 	while(CanFd)
 	{
 		for(byte _index = 0; _index < gun_count; _index++)
@@ -3695,7 +3793,7 @@ int main(int argc, char *argv[])
 			byte targetID = _chargingData[_index]->Evboard_id;
 
 			if (gun_count == 1 &&
-					_chargingData[_index]->Type == _Type_CCS_2 &&
+					_chargingData[_index]->Type == _Type_CCS &&
 					ShmDcCommonData->CcsVersion == _CCS_VERSION_CHECK_TAG_V015S0)
 			{
 				targetID += 1;
@@ -3707,25 +3805,34 @@ int main(int argc, char *argv[])
 				if (_chargingData[_index]->Type == _Type_Chademo &&
 						ShmCHAdeMOData->evse[_chargingData[_index]->type_index].SelfTest_Comp != PASS)
 				{
-					SyncRtcInfo(_index, _chargingData[_index]->Evboard_id, (int)rtc);
+					if (rtcChkCount == 0)
+						SyncRtcInfo(_index, _chargingData[_index]->Evboard_id, (int)rtc);
 					GetFirmwareVersion(_index, _chargingData[_index]->Evboard_id);
 				}
 				else if (_chargingData[_index]->Type == _Type_GB &&
 						ShmGBTData->evse[_chargingData[_index]->type_index].SelfTest_Comp != PASS)
 				{
-					SyncRtcInfo(_index, _chargingData[_index]->Evboard_id, (int)rtc);
+					if (rtcChkCount == 0)
+						SyncRtcInfo(_index, _chargingData[_index]->Evboard_id, (int)rtc);
 					GetFirmwareVersion(_index, _chargingData[_index]->Evboard_id);
 				}
-				else if (_chargingData[_index]->Type == _Type_CCS_2)
+				else if (_chargingData[_index]->Type == _Type_CCS)
 				{
 					if (ShmCcsData->CommProtocol == _CCS_COMM_V2GMessage_DIN70121 &&
 						ShmCcsData->V2GMessage_DIN70121[_chargingData[_index]->type_index].SelfTest_Comp != PASS)
 					{
-						SyncRtcInfo(_index, targetID, (int)rtc);
+						if (rtcChkCount == 0)
+							SyncRtcInfo(_index, targetID, (int)rtc);
 						GetFirmwareVersion(_index, targetID);
+						SetConnectInfo(ShmDcCommonData->CcsTypeSaved[_index], targetID);
 					}
 				}
 
+				if (rtcChkCount >= 2)
+					rtcChkCount = 0;
+				else
+					rtcChkCount++;
+
 				// 固定要取得的資訊 : 1.槍鎖狀態, 2."Connector 1" 溫度, 3."Connector 2" 溫度, 4.Pilot Voltage
 				//PRINTF_FUNC("GetMiscellaneousInfo. index = %d, Eid = %d \n", _index, _chargingData[_index]->Evboard_id);
 
@@ -3744,7 +3851,7 @@ int main(int argc, char *argv[])
 					else
 						isOTP = false;
 				}
-				else if (_chargingData[_index]->Type == _Type_CCS_2)
+				else if (_chargingData[_index]->Type == _Type_CCS)
 				{
 					if (ShmDcCommonData->ConnectErrList[_index].GunBits.CCSConnectOTP)
 						isOTP = true;
@@ -3818,7 +3925,7 @@ int main(int argc, char *argv[])
 						if (ShmDcCommonData->ConnectErrList[_index].GunBits.GBTConnectOTP == NO)
 							_chargingData[_index]->StopChargeFlag = NO;
 					}
-					else if (_chargingData[_index]->Type == _Type_CCS_2)
+					else if (_chargingData[_index]->Type == _Type_CCS)
 					{
 						ClearAbnormalStatus_CCS(_index);
 
@@ -3898,7 +4005,7 @@ int main(int argc, char *argv[])
 					break;
 				case S_PREPARING_FOR_EV:
 				{
-					if (ShmDcCommonData->startTransationFlag[_index] == START_TRANSATION_STATUS_WAIT)
+					if (ShmDcCommonData->startTransactionFlag[_index] == START_TRANSATION_STATUS_WAIT)
 						continue;
 
 					// 開始確認車端是否同意開始充電 : 1.SOC, 2.Target Vol, 3.Target Cur, 4.Charging remaining time
@@ -3937,6 +4044,9 @@ int main(int argc, char *argv[])
 								maxVol,
 								targetID);
 
+						if (_chargingData[_index]->Type == _Type_CCS)
+							GetEvccIdReq(_index, _chargingData[_index]->Evboard_id);
+
 						// 取得車端電池資訊 : 1.AC or DC ? 2.Total battery cap, 3.Max battery vol, 4.Max battery cur
 						GetEvBatteryInfo(_index, targetID);
 					}
@@ -3958,6 +4068,9 @@ int main(int argc, char *argv[])
 
 					if (priorityLow % 5 == 1)
 					{
+						if (_chargingData[_index]->Type == _Type_CCS)
+							GetEvccIdReq(_index, _chargingData[_index]->Evboard_id);
+
 						// 取得車端電池資訊 : 1.AC or DC ? 2.Total battery cap, 3.Max battery vol, 4.Max battery cur
 						GetEvBatteryInfo(_index, targetID);
 
@@ -4077,11 +4190,8 @@ int main(int argc, char *argv[])
 							SetPresentChargingOutputCap(_chargingData[0], _chargingData[1]);
 					}
 
-					if(_chargingData[_index]->GroundFaultStatus == GFD_FAIL)
-					{
-						SetIsolationStatus(_index, _chargingData[_index]->GroundFaultStatus, targetID);
-					}
-					else if(_chargingData[_index]->Type == _Type_CCS_2)
+					if(_chargingData[_index]->GroundFaultStatus == GFD_FAIL ||
+							_chargingData[_index]->Type == _Type_CCS)
 					{
 						SetIsolationStatus(_index, _chargingData[_index]->GroundFaultStatus, targetID);
 					}
@@ -4089,7 +4199,7 @@ int main(int argc, char *argv[])
 					// GFD 失敗再通知
 					if (priorityLow == 1)
 					{
-						if(_chargingData[_index]->Type == _Type_CCS_2 &&
+						if(_chargingData[_index]->Type == _Type_CCS &&
 							_chargingData[_index]->PrechargeStatus == PRECHARGE_READY)
 						{
 							SetEvsePrechargeInfo(_index, PRECHARGE_CHARELAY_PASS, targetID);
@@ -4103,6 +4213,11 @@ int main(int argc, char *argv[])
 				case S_ALARM:
 				case S_TERMINATING:
 				{
+					// 當前 Power
+					_chargingData[_index]->PresentChargingPower = ((float)((_chargingData[_index]->PresentChargingVoltage) * (_chargingData[_index]->PresentChargingCurrent)) / 1000);
+
+					CalOutputPowerAndEnergy(_index);
+
 					// 設定當前輸出
 					if (gun_count == 1)
 					{
@@ -4123,21 +4238,29 @@ int main(int argc, char *argv[])
 					// 槍鎖還在,則代表是樁端要求的停止
 					if (SendErrorCount[_index] < 3 &&
 							(_chargingData[_index]->GunLocked == START ||
-							_chargingData[_index]->Type == _Type_CCS_2))
+							_chargingData[_index]->Type == _Type_CCS))
 					{
 						byte normalStop = 0x01;
-						byte stopReason[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+						byte stopReason[7] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
 
 						if (GetStopChargingReasonByEvse(_index, stopReason))
 						{
 							normalStop = 0x02;
 						}
 
+						if (SendErrorCount[_index] == 0)
+						{
+							if (normalStop == 0x01)
+								PRINTF_FUNC("EVSE : Normal Stop (%d). \n", _index);
+							else
+								PRINTF_FUNC("EVSE : EMC Stop : (%d) - (%s) \n", _index, stopReason);
+						}
+
 						EvseStopChargingEvent(normalStop, stopReason, targetID);
 						SendErrorCount[_index] += 1;
 					}
 
-					if(_chargingData[_index]->Type == _Type_CCS_2)
+					if(_chargingData[_index]->Type == _Type_CCS)
 					{
 						SetIsolationStatus(_index, _chargingData[_index]->GroundFaultStatus, targetID);
 					}

+ 42 - 38
EVSE/Projects/DS60-120/Apps/Module_EvComm.h

@@ -7,29 +7,48 @@ int CanFd;
 
 typedef unsigned char 		byte;
 
-extern struct Ev_Board_Cmd
-{
-	int none;							// 0
-	int address_assignment;				// 0x00000200
-	int get_firmware_ver;				// 0x00000400
-	int get_hardware_ver;				// 0x00000500
-	int charging_permission;			// 0x00000600
-	int present_output_power;			// 0x00000700
-	int present_output_cap;				// 0x00000800
-	int get_output_req;					// 0x00000900
-	int get_battery_info;				// 0x00000A00
-	int evse_stop_charging;				// 0x00000C00
-	int get_miscellaneous_info;			// 0x00000D00
 
-	int download_req;					// 0x00000E00
-	int start_block_transfer;			// 0x00000F00
-	int data_transfer;					// 0x00001000
-	int download_finish;				// 0x00001100
+typedef enum
+{
+    EV_Slave_Address_Broadcast  	= 0xFF,
+	EV_Slave_Address_Bd1       		= 0x01,
+	EV_Slave_Address_Bd2      		= 0x02
+}EvSlaveAddr;
 
-	int isolation_status;				// 0x00001200
-	int sync_rtc_info;					// 0x00001400
-	int evse_precharge_info;			// 0x00001500
-}Ev_Cmd;
+typedef enum
+{
+	EV_Command_AddressReq 			= 0x01,
+    EV_Command_AddressAssignment  	= 0x02,
+	EV_Command_EvStatusNotification	= 0x03,
+	EV_Command_GetFwVersion       	= 0x04,
+	EV_Command_GetHwVersion      	= 0x05,
+	EV_Command_ChargingPermission  	= 0x06,
+	EV_Command_PresentOutputPow   	= 0x07,
+	EV_Command_PresentOutputCap    	= 0x08,
+	EV_Command_GetOutputReq	    	= 0x09,
+	EV_Command_GetBetteryInfo    	= 0x0A,
+	EV_Command_EvStopNotification	= 0x0B,
+	EV_Command_EvseStopCharging    	= 0x0C,
+	EV_Command_GetMiscellaneous    	= 0x0D,
+	EV_Command_IsolationStatus    	= 0x12,
+	EV_Command_CCSconnectorInfo   	= 0x13,
+	EV_Command_SyncRtcInfo      	= 0x14,
+	EV_Command_EvsePrechargeInfo  	= 0x15,
+	EV_Command_EvccidReq	      	= 0x16,
+}EvCmd;
+
+typedef union
+{
+    unsigned int EvMessage;
+    struct
+    {
+        unsigned int SlaveAddress:8;
+        unsigned int MessageID:8;
+        unsigned int Rsv:11;
+        unsigned int Dir:1;
+        unsigned int res:4;
+    }EvBdBits;
+}EvFrame;
 
 extern struct Ev_Cmd_Dir
 {
@@ -44,11 +63,13 @@ void SetTargetAddr(byte *target_number, byte index);
 
 void GetFirmwareVersion(byte gun_index, byte toId);
 void SyncRtcInfo(byte gun_index, byte toId, int epoch);
+void SetConnectInfo(byte type, byte toId);
 void GetHardwareVersion(byte gun_index, byte toId);
 void SetChargingPermission(byte gun_index, byte permissionStatus, short aOutputPw, short aOutputVol, short aOutputCur, byte toId);
 void SetPresentOutputPower(short outputVol_b1, short outputCur_b1, short outputVol_b2, short outputCur_b2);
 void SetPresentOutputCapacity(short aOutputPw_b1, short aOutputCur_b1, short aOutputPw_b2, short aOutputCur_b2);
 void GetOutputReq(byte gun_index, byte toId);
+void GetEvccIdReq(byte gun_index, byte toId);
 void GetEvBatteryInfo(byte gun_index, byte toId);
 void GetMiscellaneousInfo(byte gun_index, byte relayStatus, float power, float voltage, byte toId);
 void SetIsolationStatus(byte gun_index, byte result, byte toId);
@@ -58,23 +79,6 @@ void EvseStopChargingEvent(byte stopResult, byte *stopReason, byte toId);
 
 // Receive msg From can-bus.
 
-enum Receieve_PSU_msgf
-{
-	// ¨®ºÝ¥D°Ê
-	ADDRESS_REQ = 						0x080001FF,
-	NOTIFICATION_EV_STATUS = 			0x08000300,
-	NOTIFICATION_EV_STOP = 				0x08000B00,
-
-	// ¨®ºÝ¦^À³
-	ACK_EV_FW_VERSION = 				0x08000400,
-	ACK_EV_HW_VERSION = 				0x08000500,
-	ACK_GET_OUTPUT_REQ =				0x08000900,
-	ACK_GET_EV_BATTERY_INFO =			0x08000A00,
-	ACK_GET_MISCELLANEOUS_INFO = 		0x08000D00,
-	ACK_EVSE_ISOLATION_STATUS = 		0x08001200,
-	ACK_EVSE_PRECHAGE_INFO = 			0x08001500,
-};
-
 enum EV_LOG_INDEX
 {
 	EV_LOG_OUTPUT_CAP_POW = 0,

+ 105 - 28
EVSE/Projects/DS60-120/Apps/Module_EventLogging.c

@@ -34,12 +34,26 @@
 #define CHANGED				1
 #define UNCHANGED			0
 
+struct network_previous_status
+{
+	int		rssiWifi;
+	int		rssi4g;
+	uint8_t	isInternet:1;
+	uint8_t	isOcppConnected:1;
+	uint8_t	ethIsInternet:1;
+	uint8_t	maln0IsInternet:1;
+	uint8_t	ppp0IsInternet:1;
+}netPreviousStatus;
+
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
 struct StatusCodeData 			*ShmStatusCodeData;
 
 sqlite3 *localDb;
 #define DB_FILE				"/Storage/ChargeLog/localCgargingRecord.db"
 
+sqlite3 *networkDb;
+#define	NETWORK_DB_FILE		"/Storage/EventLog/Eventlog.db"
+
 void PRINTF_FUNC(char *string, ...);
 
 int StoreLogMsg(const char *fmt, ...);
@@ -262,34 +276,43 @@ void RemoveFaultCodeToBuf(unsigned char *Code)
 //==========================================
 // SQLite routne
 //==========================================
-int DB_Open(sqlite3 *db)
+int DB_Insert_Record(sqlite3 *db, uint8_t *statusCode)
 {
 	int result = PASS;
 	char* errMsg = NULL;
-	char* createRecordSql="CREATE TABLE IF NOT EXISTS event_record("
-					      "idx integer primary key AUTOINCREMENT, "
-						  "occurDatetime text NOT NULL, "
-						  "statusCode text NOT NULL"
-						  ");";
+	char sqlStr[1024];
+
+	sprintf(sqlStr, "insert into event_record(occurDatetime, statusCode) values(CURRENT_TIMESTAMP, '%s');", statusCode);
 
+	// 0 : open successfully, else fail.
 	if(sqlite3_open(DB_FILE, &db))
 	{
 		result = FAIL;
-		DEBUG_ERROR( "Can't open database: %s\n", sqlite3_errmsg(db));
+		DEBUG_INFO( "Can't open database: %s\n", sqlite3_errmsg(db));
 		sqlite3_close(db);
 	}
 	else
 	{
 		DEBUG_INFO( "Local event record database open successfully.\n");
+		if (sqlite3_exec(db, sqlStr, 0, 0, &errMsg) != SQLITE_OK)
+		{
+			result = FAIL;
+			DEBUG_INFO( "Insert local event record error message: %s\n", errMsg);
+		}
+		else
+		{
+			DEBUG_INFO( "Insert local event record successfully\n");
+		}
 
-		if (sqlite3_exec(db, createRecordSql, 0, 0, &errMsg) != SQLITE_OK)
+		sprintf(sqlStr, "delete from event_record where idx < (select idx from event_record order by idx desc limit 1)-2000;");
+		if (sqlite3_exec(db, sqlStr, 0, 0, &errMsg) != SQLITE_OK)
 		{
 			result = FAIL;
-			DEBUG_ERROR( "Create local event record table error message: %s\n", errMsg);
+			DEBUG_INFO( "delete local event_record error message: %s\n", errMsg);
 		}
 		else
 		{
-			DEBUG_INFO( "Opened local event record table successfully\n");
+			DEBUG_INFO( "delete local event record successfully\n");
 		}
 
 		sqlite3_close(db);
@@ -298,15 +321,58 @@ int DB_Open(sqlite3 *db)
 	return result;
 }
 
-int DB_Insert_Record(sqlite3 *db, uint8_t *statusCode)
+int DB_Network_Insert_Record(sqlite3 *db)
 {
 	int result = PASS;
 	char* errMsg = NULL;
 	char sqlStr[1024];
 
-	sprintf(sqlStr, "insert into event_record(occurDatetime, statusCode) values(CURRENT_TIMESTAMP, '%s');", statusCode);
+	if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D')
+	{
+		sprintf(sqlStr, "insert into network_record(occurDatetime, isInternet, isOcppConnected, isEth0Internet, isMlan0Internet, isPpp0Internet, rssiMlan0, rssiPpp0) values(CURRENT_TIMESTAMP, '%d', '%d', '%d', '%d', '%d', '%d', '%d');",
+				ShmSysConfigAndInfo->SysInfo.InternetConn,
+				ShmSysConfigAndInfo->SysInfo.OcppConnStatus,
+				!ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet,
+				!ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi,
+				!ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi,
+				ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi,
+				ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi);
+	}
+	else if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W')
+	{
+		sprintf(sqlStr, "insert into network_record(occurDatetime, isInternet, isOcppConnected, isEth0Internet, isMlan0Internet, isPpp0Internet, rssiMlan0, rssiPpp0) values(CURRENT_TIMESTAMP, '%d', '%d', '%d', '%d', '%d', '%d', '%d');",
+				ShmSysConfigAndInfo->SysInfo.InternetConn,
+				ShmSysConfigAndInfo->SysInfo.OcppConnStatus,
+				!ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet,
+				!ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi,
+				0,
+				ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi,
+				0);
+	}
+	else if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T')
+	{
+		sprintf(sqlStr, "insert into network_record(occurDatetime, isInternet, isOcppConnected, isEth0Internet, isMlan0Internet, isPpp0Internet, rssiMlan0, rssiPpp0) values(CURRENT_TIMESTAMP, '%d', '%d', '%d', '%d', '%d', '%d', '%d');",
+				ShmSysConfigAndInfo->SysInfo.InternetConn,
+				ShmSysConfigAndInfo->SysInfo.OcppConnStatus,
+				!ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet,
+				0,
+				!ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi,
+				0,
+				ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi);
+	}
+	else
+	{
+		sprintf(sqlStr, "insert into network_record(occurDatetime, isInternet, isOcppConnected, isEth0Internet, isMlan0Internet, isPpp0Internet, rssiMlan0, rssiPpp0) values(CURRENT_TIMESTAMP, '%d', '%d', '%d', '%d', '%d', '%d', '%d');",
+				ShmSysConfigAndInfo->SysInfo.InternetConn,
+				ShmSysConfigAndInfo->SysInfo.OcppConnStatus,
+				!ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet,
+				0,
+				0,
+				0,
+				0);
+	}
 
-	if(sqlite3_open(DB_FILE, &db))
+	if(sqlite3_open(NETWORK_DB_FILE, &db))
 	{
 		result = FAIL;
 		DEBUG_INFO( "Can't open database: %s\n", sqlite3_errmsg(db));
@@ -314,26 +380,17 @@ int DB_Insert_Record(sqlite3 *db, uint8_t *statusCode)
 	}
 	else
 	{
-		DEBUG_INFO( "Local event record database open successfully.\n");
 		if (sqlite3_exec(db, sqlStr, 0, 0, &errMsg) != SQLITE_OK)
 		{
 			result = FAIL;
-			DEBUG_INFO( "Insert local event record error message: %s\n", errMsg);
-		}
-		else
-		{
-			DEBUG_INFO( "Insert local event record successfully\n");
+			DEBUG_INFO( "Insert local network status record error message: %s\n", errMsg);
 		}
 
-		sprintf(sqlStr, "delete from event_record where idx < (select idx from event_record order by idx desc limit 1)-2000;");
+		sprintf(sqlStr, "delete from network_record where idx < (select idx from network_record order by idx desc limit 1)-20000;");
 		if (sqlite3_exec(db, sqlStr, 0, 0, &errMsg) != SQLITE_OK)
 		{
 			result = FAIL;
-			DEBUG_INFO( "delete local event_record error message: %s\n", errMsg);
-		}
-		else
-		{
-			DEBUG_INFO( "delete local event record successfully\n");
+			DEBUG_INFO( "delete local network_record error message: %s\n", errMsg);
 		}
 
 		sqlite3_close(db);
@@ -367,7 +424,7 @@ int main(void)
 		isChanged = UNCHANGED;
 
 		//check Fault Status
-		for(ByteCount=0;ByteCount<4;ByteCount++)
+		for(ByteCount=0;ByteCount<ARRAY_SIZE(ShmStatusCodeData->FaultCode.FaultEvents.FaultVal);ByteCount++)
 		{
 			if (isChanged == CHANGED)
 				break;
@@ -409,7 +466,7 @@ int main(void)
 		}
 
 		//check Alarm Status
-		for(ByteCount=0;ByteCount<14;ByteCount++)
+		for(ByteCount=0;ByteCount<ARRAY_SIZE(ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal);ByteCount++)
 		{
 			if (isChanged == CHANGED)
 				break;
@@ -451,7 +508,7 @@ int main(void)
 		}
 
 		//check Info Status
-		for(ByteCount=0;ByteCount<41;ByteCount++)
+		for(ByteCount=0;ByteCount<ARRAY_SIZE(ShmStatusCodeData->InfoCode.InfoEvents.InfoVal);ByteCount++)
 		{
 			if (isChanged == CHANGED)
 				break;
@@ -491,6 +548,26 @@ int main(void)
 				}
 			}
 		}
+
+		if((netPreviousStatus.isInternet != ShmSysConfigAndInfo->SysInfo.InternetConn) ||
+				(netPreviousStatus.isOcppConnected != ShmSysConfigAndInfo->SysInfo.OcppConnStatus) ||
+				(netPreviousStatus.ethIsInternet != ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet) ||
+				(netPreviousStatus.maln0IsInternet != ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi) ||
+				(netPreviousStatus.ppp0IsInternet != ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi) ||
+				(netPreviousStatus.rssiWifi != ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi) ||
+				(netPreviousStatus.rssi4g != ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi))
+		{
+
+			DB_Network_Insert_Record(networkDb);
+			netPreviousStatus.isInternet = ShmSysConfigAndInfo->SysInfo.InternetConn;
+			netPreviousStatus.isOcppConnected = ShmSysConfigAndInfo->SysInfo.OcppConnStatus;
+			netPreviousStatus.ethIsInternet = ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet;
+			netPreviousStatus.maln0IsInternet = ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi;
+			netPreviousStatus.ppp0IsInternet = ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi;
+			netPreviousStatus.rssiWifi = ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi;
+			netPreviousStatus.rssi4g = ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi;
+		}
+
 		usleep(500000);
 	}
 

Fișier diff suprimat deoarece este prea mare
+ 583 - 196
EVSE/Projects/DS60-120/Apps/Module_InternalComm.c


+ 10 - 1
EVSE/Projects/DS60-120/Apps/Module_LcmContro.h

@@ -58,6 +58,13 @@ struct DcCommonInformation		*ShmDcCommonData;
 #define CMD_BACKLIGHT			0x01
 #define CMD_REGISTER			0x03
 
+//=======================================
+// Register Control type
+//=======================================
+#define REG_TYPE_CONTROL					0x00
+#define REG_TYPE_RAM						0x01
+#define REG_TYPE_SPECIAL_CONTROL			0x02
+
 enum _BATTERY_LEVEL_FOR_MAP
 {
 	_BATTERY_LEVEL_FOR_MAP_EMP = 0x00,
@@ -68,7 +75,7 @@ enum _BATTERY_LEVEL_FOR_MAP
 	_BATTERY_LEVEL_FOR_MAP_LV5 = 0x05,
 };
 
-int _port;
+int Uart1Fd;
 //char* pPortName = "/dev/ttyO2";
 char* pPortName = "/dev/ttyS3";
 char* moduleName = "DMT80480T070_09WT";
@@ -101,6 +108,7 @@ short __wifi_status = 0x003C;
 short __sel_gun_btn = 0x0040;
 short __ret_home_btn = 0x0042;
 short __stop_method_btn = 0x0044;
+short __phihong_string = 0x0046;
 
 short __lcm_version = 0x004A;
 
@@ -223,3 +231,4 @@ byte _logo_cmp = 62;
 byte _battery_eng_trp_map = 63;
 byte _money_trp_map = 64;
 byte _elapse_time_trp_map = 65;
+byte _phihong_string_map = 66;

+ 54 - 24
EVSE/Projects/DS60-120/Apps/Module_LcmControl.c

@@ -5,6 +5,8 @@ bool needReloadQr = true;
 bool _isShow = false;
 byte _showInformIndex = 0;
 
+byte _btn_pressed = 0xF0;
+
 void PRINTF_FUNC(char *string, ...);
 
 int StoreLogMsg(const char *fmt, ...);
@@ -166,12 +168,12 @@ int CreateCommunicationLcmPort()
 
 void CloseCommunicationLcmPort()
 {
-	close(_port);
+	close(Uart1Fd);
 }
 
 void WriteCmdToLcm(byte *cmd, byte cmdLen)
 {
-	int len = write(_port, cmd, cmdLen);
+	int len = write(Uart1Fd, cmd, cmdLen);
 	if(len >= sizeof(cmd))
 	{
 		//PRINTF_FUNC("Write cmd to LCM successfully. \n");
@@ -180,7 +182,7 @@ void WriteCmdToLcm(byte *cmd, byte cmdLen)
 
 void ReadMsgFromLcm(byte *msg, byte readLen)
 {
-	read(_port, msg, readLen);
+	read(Uart1Fd, msg, readLen);
 
 //	5a : CMD_TITLE_1
 //	a5 : CMD_TITLE_2
@@ -228,7 +230,8 @@ void ReadMsgFromLcm(byte *msg, byte readLen)
 		}
 		else if (*(msg + 3) == CMD_MULTI_READ)
 		{
-			if ((*(msg + 4) >> 8) + *(msg + 5) == __lcm_version)
+			short key = ((short)(*(msg + 4) << 8) + *(msg + 5));
+			if (key == __lcm_version)
 			{
 				ShmDcCommonData->LcmFwVersion = atoi((char *)(msg + 7));
 				//printf("msg = %d \n", atoi((char *)(msg + 7)));
@@ -236,6 +239,20 @@ void ReadMsgFromLcm(byte *msg, byte readLen)
 //				printf("msg = %x \n", *(msg + 8));
 //				printf("msg = %x \n", *(msg + 9));
 			}
+			else if (key == 0x0600)
+			{
+				if (_btn_pressed != *(msg + 8))
+				{
+					if (_btn_pressed == 0x0A)
+						printf("NotPressed \n");
+					else
+						printf("Pressed \n");
+
+					_btn_pressed = *(msg + 8);
+				}
+
+				//printf("msg = %x \n", *(msg + 7));
+			}
 
 //			switch ((unsigned short) (*(msg + 4) << 8) + (unsigned short) *(msg + 5))
 //			{
@@ -764,9 +781,9 @@ void DisplayMoneyCur(byte *cur)
 	byte cmd[5];
 	byte buf[5];
 
-	*(cur + 3) = '\0';
 	memset(cmd, 0x00, sizeof(cmd));
-	sprintf((char *) buf, "%s", cur);
+	memcpy((char *) buf, cur, 3);
+	buf[3] = '\0';
 	string2ByteArray(buf, cmd);
 	DisplayValueToLcm(__money_rate, cmd, sizeof(cmd));
 }
@@ -839,7 +856,10 @@ void RefreshConnStatus()
 		{ ChangeDisplay2Value(__wifi_status, _wifi_disconnect); }
 	}
 	else
-	{ ChangeDisplay2Value(__wifi_status, _disappear); }
+	{
+		ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi = 0;
+		ChangeDisplay2Value(__wifi_status, _disappear);
+	}
 
 	if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T' || ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D') &&
 			ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomEnabled != NO)
@@ -865,6 +885,7 @@ void RefreshConnStatus()
 	}
 	else
 	{
+		ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi = 0;
 		ChangeDisplay2Value(__3G4G_status, _disappear);
 		ChangeDisplay2Value(__3G4G_move_status, _disappear);
 	}
@@ -1344,7 +1365,9 @@ void ProcessPageInfo()
 			bool isCharging = false;
 			for(byte i = 0; i < _totalCount; i++)
 			{
-				if (_chargingInfoData[i]->SystemStatus == S_IDLE)
+				if (_chargingInfoData[i]->SystemStatus == S_IDLE ||
+						_chargingInfoData[i]->SystemStatus == S_MAINTAIN ||
+						_chargingInfoData[i]->SystemStatus == S_RESERVATION)
 					continue;
 
 				isCharging = true;
@@ -1524,7 +1547,7 @@ void ProcessPageInfo()
 						}
 					}
 						break;
-					case _Type_CCS_2:
+					case _Type_CCS:
 					{
 						if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == i && !isShowAc)
 						{
@@ -1693,12 +1716,15 @@ void ChangeDisplayMoneyInfo()
 
 		if (tmCSU->tm_hour <= 23)
 		{
+			ShmDcCommonData->_hour_index = tmCSU->tm_hour;
 			ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee = ShmSysConfigAndInfo->SysConfig.BillingData.Fee[tmCSU->tm_hour];
 			DisplayMoneyRate(ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee);
 		}
 
 		if (ShmSysConfigAndInfo->SysConfig.BillingData.Currency <= 53)
+		{
 			DisplayMoneyCur((byte *)Currency[ShmSysConfigAndInfo->SysConfig.BillingData.Currency]);
+		}
 	}
 	else
 	{
@@ -1763,6 +1789,19 @@ void DefaultIconStatus()
 		ChangeDisplay2Value(__sel_gun_btn, _disappear);
 	else
 		ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
+
+	if (ShmDcCommonData->ShowLogoFlag)
+	{
+		ChangeDisplay2Value(__logo, _logo);
+		ChangeDisplay2Value(__logo_cmp, _logo_cmp);
+		ChangeDisplay2Value(__phihong_string, _phihong_string_map);
+	}
+	else
+	{
+		ChangeDisplay2Value(__logo, _disappear);
+		ChangeDisplay2Value(__logo_cmp, _disappear);
+		ChangeDisplay2Value(__phihong_string, _disappear);
+	}
 }
 
 int main(void)
@@ -1780,7 +1819,7 @@ int main(void)
 		return 0;
 	}
 
-	_port = CreateCommunicationLcmPort();
+	Uart1Fd = CreateCommunicationLcmPort();
 	byte changeWarningPriority = 0;
 	byte curWarningCount = 255;
 	ChangeBackLight(true);
@@ -1789,13 +1828,15 @@ int main(void)
 
 	Initialization();
 
-//	ChangeToOtherPage(_LCM_EMC);
-//	return -1;
+	//	ChangeToOtherPage(_LCM_INIT);
+	//	ChangeDisplay2Value(__phihong_string, _disappear);
+	//	return -1;
 
 	DefaultIconStatus();
+
 	byte _verShowCount = 3;
 
-	while(_port != -1)
+	while(Uart1Fd != -1)
 	{
 		if (strcmp((char *)ShmSysConfigAndInfo->SysInfo.LcmHwRev, moduleName) != 0x00)
 		{
@@ -1808,17 +1849,6 @@ int main(void)
 				PRINTF_FUNC("LCM Version = V.%03d \n", ShmDcCommonData->LcmFwVersion);
 				_verShowCount--;
 			}
-
-			if (ShmDcCommonData->ShowLogoFlag)
-			{
-				ChangeDisplay2Value(__logo, _logo);
-				ChangeDisplay2Value(__logo_cmp, _logo_cmp);
-			}
-			else
-			{
-				ChangeDisplay2Value(__logo, _disappear);
-				ChangeDisplay2Value(__logo_cmp, _disappear);
-			}
 		}
 		else
 		{

+ 4 - 1
EVSE/Projects/DS60-120/Apps/Module_PrimaryComm.c

@@ -336,10 +336,13 @@ void GetInputGpioStatus()
 		if (_reCheckCount[_PRIMARY_CHECK_TAG_AC_CONTACT] >= 3 &&
 				ShmDcCommonData->psuKeepCommunication == YES &&
 				gpio_in.AC_Connector == NO)
+		{
 			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.AcContactStestFail = YES;
+		}
 		else
+		{
 			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.AcContactStestFail = NO;
-
+		}
 		// -------------------------------------------------------------------
 		if (_curDeviceStatus[_PRIMARY_CHECK_TAG_MAIN_BREAKER] != gpio_in.AC_MainBreaker)
 		{

Fișier diff suprimat deoarece este prea mare
+ 464 - 441
EVSE/Projects/DS60-120/Apps/Module_PsuComm.c


+ 10 - 4
EVSE/Projects/DS60-120/Apps/Module_PsuComm.h

@@ -43,10 +43,8 @@ struct timeval _derating_time;
 struct timeval _max_time;
 struct timeval _log_time;
 
-bool isCharging = false;
-bool isWaitingAver = false;
-bool isReadToCharging = false;
-bool CanAverageCharging = false;
+byte _maxChargingStatus;
+bool isReadyToCharging = false;
 int preChargingTarget;
 int preChargingCur;
 
@@ -58,6 +56,14 @@ int connector_2[12];
 byte conn_1_count = 0;
 byte conn_2_count = 0;
 
+enum _CHARGING_GUN_STATUS
+{
+	_CHARGING_GUN_STATUS_NONE		= 0,
+	_CHARGING_GUN_STATUS_COMM,
+	_CHARGING_GUN_STATUS_CHARGING,
+	_CHARGING_GUN_STATUS_STOP
+};
+
 enum _PSU_CMD_SEQ
 {
 	_PSU_CMD_STATUS		= 1,

+ 343 - 11
EVSE/Projects/DS60-120/Apps/ReadCmdline.c

@@ -45,6 +45,8 @@ typedef unsigned char			byte;
 #define ARRAY_SIZE(A)		(sizeof(A) / sizeof(A[0]))
 #define NO_DEFINE			255
 #define DEFAULT_AC_INDEX	2
+#define YES					1
+#define NO					0
 
 #define AUTORUN_STEP1_TIME_START			140				// Minutes
 #define AUTORUN_STEP1_TIME_END				150
@@ -72,6 +74,7 @@ struct RelayModuleData			*ShmRelayModuleData;
 struct LedModuleData			*ShmLedModuleData;
 struct PsuData 					*ShmPsuData;
 struct DcCommonInformation		*ShmDcCommonData;
+struct OCPP16Data				*ShmOCPP16Data;
 
 struct ChargingInfoData 		*_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 struct ChargingInfoData 		*ac_chargingInfo[AC_QUANTITY];
@@ -223,6 +226,15 @@ int InitShareMemory()
    		result = FAIL;
    	}
 
+   	if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data), 0777)) < 0)
+   	{
+   		result = FAIL;
+   	}
+   	else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+   	{
+   		result = FAIL;
+   	}
+
    	if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData),	IPC_CREAT | 0777)) < 0)
    	{
    		result = FAIL;
@@ -262,7 +274,8 @@ void RunStatusProc(char *v1, char *v2)
 		{
 			printf("FindChargingInfoData (AC) false \n");
 		}
-		printf("AC Status = %d \n", ac_chargingInfo[0]->ConnectorPlugIn);
+		printf("AC Status = %d \n", ac_chargingInfo[0]->SystemStatus);
+		printf("AC ConnectorPlugIn = %d \n", ac_chargingInfo[0]->ConnectorPlugIn);
 		return;
 	}
 
@@ -558,6 +571,24 @@ void GetGunTemp(char *v1)
 			ShmDcCommonData->ConnectorTemp2[_index] - 60);
 }
 
+void GetDcMeterInfor(char *v1)
+{
+	int _index = atoi(v1);
+	if (!FindChargingInfoData(_index, &_chargingData[0]))
+	{
+		printf ("FindChargingInfoData error\n");
+		return;
+	}
+
+	printf("Index = %d, presetVoltage = %f, presentCurrent = %f, presentPower = %f, totlizeImportEnergy = %f, totlizeExportEnergy = %f \n",
+			_index,
+			ShmSysConfigAndInfo->SysInfo.DcMeterInfo[_index].presetVoltage,
+			ShmSysConfigAndInfo->SysInfo.DcMeterInfo[_index].presentCurrent,
+			ShmSysConfigAndInfo->SysInfo.DcMeterInfo[_index].presentPower,
+			ShmSysConfigAndInfo->SysInfo.DcMeterInfo[_index].totlizeImportEnergy,
+			ShmSysConfigAndInfo->SysInfo.DcMeterInfo[_index].totlizeExportEnergy);
+}
+
 void GetPowerValue()
 {
 	for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++)
@@ -675,14 +706,21 @@ void SetGFDMode(char *v1)
 
 void GetPsuTemp()
 {
+	char _ex_maxTemp = 0;
+	char _cr_maxTemp = 0;
+
 	for (byte index = 0; index < ShmPsuData->GroupCount; index++)
 	{
+		_ex_maxTemp = 0;
+		_cr_maxTemp = 0;
 		for (byte count = 0; count < ShmPsuData->PsuGroup[index].GroupPresentPsuQuantity; count++)
 		{
-			printf("D.D. Temp = %d ------ Env Temp = %d \n",
-					ShmPsuData->PsuGroup[index].PsuModule[count].ExletTemp,
-					ShmPsuData->PsuGroup[index].PsuModule[count].CriticalTemp1);
+			if (ShmPsuData->PsuGroup[index].PsuModule[count].ExletTemp > _ex_maxTemp)
+				_ex_maxTemp = ShmPsuData->PsuGroup[index].PsuModule[count].ExletTemp;
+			if (ShmPsuData->PsuGroup[index].PsuModule[count].CriticalTemp1 > _cr_maxTemp)
+				_cr_maxTemp = ShmPsuData->PsuGroup[index].PsuModule[count].CriticalTemp1;
 		}
+		printf("D.D. Temp = %d ------ Env Temp = %d \n", _ex_maxTemp, _cr_maxTemp);
 	}
 }
 
@@ -829,6 +867,249 @@ static void get_char(char *word)
     }
 }
 
+void AverageCharging(char *g1_vol, char *g1_cur, char *g2_vol, char *g2_cur)
+{
+	float _Voltage[2];
+	float _Current[2];
+
+	_Voltage[0] = atof(g1_vol);
+	_Current[0] = atof(g1_cur);
+
+	_Voltage[1] = atof(g2_vol);
+	_Current[1] = atof(g2_cur);
+
+	printf ("g1_vol = %f, g1_cur = %f pow1 = %f (KW) \n", _Voltage[0], _Current[0], (_Voltage[0] * _Current[0]) / 1000);
+	printf ("g2_vol = %f, g2_cur = %f pow2 = %f (KW) \n", _Voltage[1], _Current[1], (_Voltage[1] * _Current[1]) / 1000);
+
+	if(_Voltage[0] > 1000 || _Voltage[0] < 50 ||
+			_Voltage[1] > 1000 || _Voltage[1] < 50)
+	{
+		printf ("Input Voltage over range\n");
+	    return;
+	}
+
+	system("killall Module_EvComm");
+
+	for (byte _index = 0; _index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; _index++)
+	{
+		if (!FindChargingInfoData(_index, &_chargingData[0]))
+		{
+			printf("AverageCharging : FindChargingInfoData false \n");
+			return;
+		}
+	}
+	unsigned char PreviousSystemStatus[2] = {0xff, 0xff};
+	bool isComplete[2] = {false, false};
+
+	while(1)
+	{
+		for (byte gun_index = 0; gun_index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; gun_index++)
+		{
+			switch(_chargingData[gun_index]->SystemStatus)
+			{
+				case S_IDLE:
+				{
+					if(PreviousSystemStatus[gun_index] != _chargingData[gun_index]->SystemStatus)
+					{
+						PreviousSystemStatus[gun_index] = _chargingData[gun_index]->SystemStatus;
+					    printf ("[AverageCharging (%d) - S_IDLE] \n", gun_index);
+					}
+
+					_chargingData[gun_index]->SystemStatus = S_PREPARNING;
+				}
+					break;
+				case S_PREPARNING:
+				{
+					if(PreviousSystemStatus[gun_index] != _chargingData[gun_index]->SystemStatus)
+				    {
+						PreviousSystemStatus[gun_index] = _chargingData[gun_index]->SystemStatus;
+						printf ("[AverageCharging (%d) - S_PREPARNIN] \n", gun_index);
+
+						//等待 AC Relay 搭上且找到模組 (main 在此 statue 其它 task 會去做完)
+				        printf ("wait find module\n");
+				    }
+
+					ShmSysConfigAndInfo->SysInfo.MainChargingMode = _MAIN_CHARGING_MODE_AVER;
+				    //清除 main timeout 機制
+					_chargingData[gun_index]->TimeoutFlag = 0;
+					//不論是什麼 type 的槍都固意設成 Chademo 不跑 Prechage step
+				    _chargingData[gun_index]->Type = 9;
+				}
+					break;
+				case S_PREPARING_FOR_EV:
+				{
+					if(PreviousSystemStatus[gun_index] != _chargingData[gun_index]->SystemStatus)
+				    {
+				    	PreviousSystemStatus[gun_index] = _chargingData[gun_index]->SystemStatus;
+				        printf ("[AverageCharging (%d) - S_PREPARING_FOR_EV] \n", gun_index);
+				        printf ("ReqVoltage = %f, ReqCurrent = %f \n", _Voltage[gun_index] * 10, _Current[gun_index] * 10);
+				    }
+				    //清除 main timeout 機制
+				    _chargingData[gun_index]->TimeoutFlag = 0;
+				    //不論是什麼 type 的槍都固意設成 Chademo 不跑 Prechage step
+				    _chargingData[gun_index]->Type = 9;
+
+				    //充電電壓電流
+				    _chargingData[gun_index]->EvBatterySoc = 50;
+				   	_chargingData[gun_index]->EvBatterytargetVoltage = 500;
+				    _chargingData[gun_index]->EvBatterytargetCurrent = 2;
+				    _chargingData[gun_index]->AvailableChargingCurrent = 1000;
+
+				    //****** 注意~此行為是防止 K1K2 先開導到無法升壓 ( Relay Board 在此 state 還未搭上 K1K2 )
+				    //確定模組己升壓完成
+				    //if(_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingVoltage <=  (3000+500) &&
+				    		 //  _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingVoltage >=  (3000-500) )
+				    {
+				    	printf ("Preparing Done = %f \n", _chargingData[gun_index]->PresentChargingVoltage);
+				    	//EV done
+				    	_chargingData[gun_index]->SystemStatus = S_PREPARING_FOR_EVSE;
+				    }
+				}
+					break;
+				case S_PREPARING_FOR_EVSE:
+				{
+					if(PreviousSystemStatus[gun_index] != _chargingData[gun_index]->SystemStatus)
+					{
+						PreviousSystemStatus[gun_index] = _chargingData[gun_index]->SystemStatus;
+						printf ("[AverageCharging (%d) - S_PREPARING_FOR_EVSE]\n", gun_index);
+					}
+
+					//printf ("tar vol = %d \n", _Voltage);
+					//printf ("tar cur = %d \n", _Current);
+
+					//清除 main timeout 機制
+					_chargingData[gun_index]->TimeoutFlag = 0;
+					//不論是什麼 type 的槍都固意設成 Chademo 不跑 Prechage step
+					_chargingData[gun_index]->Type = 9;
+
+					//充電電壓電流
+					_chargingData[gun_index]->EvBatterySoc = 50;
+					_chargingData[gun_index]->EvBatterytargetVoltage = 500;
+					_chargingData[gun_index]->EvBatterytargetCurrent = 2;
+					_chargingData[gun_index]->AvailableChargingCurrent = 1000;
+
+					//printf ("tar vol_ = %d \n", _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage);
+					// printf ("tar cur_ = %d \n", _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent);
+
+					//****** 注意~此行為是防止 K1K2 先開導到無法升壓 ( Relay Board 在此 state 還未搭上 K1K2 )
+					//確定模組己升壓完成
+					if(_chargingData[gun_index]->GroundFaultStatus == 0x01 ||
+						_chargingData[gun_index]->GroundFaultStatus == 0x03)
+					{
+						printf ("First Ground Fault State (%d)\n",_chargingData[gun_index]->GroundFaultStatus);
+						printf ("Wait K1K2 = %f \n", _chargingData[gun_index]->PresentChargingVoltage);
+						sleep(5);
+						//EV done
+						_chargingData[gun_index]->SystemStatus = S_CHARGING;
+					}
+					else if (_chargingData[gun_index]->GroundFaultStatus > 0x02)
+					{
+						printf ("First Ground Fault check Fail (%d)\n",_chargingData[gun_index]->GroundFaultStatus);
+						_chargingData[gun_index]->SystemStatus = S_TERMINATING;
+					}
+				}
+					break;
+				case S_CHARGING:
+				{
+					if(PreviousSystemStatus[gun_index] != _chargingData[gun_index]->SystemStatus)
+				    {
+				        PreviousSystemStatus[gun_index] = _chargingData[gun_index]->SystemStatus;
+
+				        //充電電壓電流
+				        _chargingData[gun_index]->EvBatterytargetVoltage = _Voltage[gun_index];
+				        _chargingData[gun_index]->EvBatterytargetCurrent = _Current[gun_index];
+				        _chargingData[gun_index]->EvBatterySoc = 50;
+				        _chargingData[gun_index]->AvailableChargingCurrent = 1000;
+
+				        printf ("[AverageCharging (%d) - S_CHARGING]\n", gun_index);
+				    }
+
+				    //ev task do this
+				    _chargingData[gun_index]->PresentChargingPower =
+				    ((float)((_chargingData[gun_index]->PresentChargingVoltage) * (_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingCurrent)) / 1000);
+
+				    if (_chargingData[gun_index]->GroundFaultStatus == 0x02)
+				    {
+				    	printf ("Charging Ground Fault check Fail (%d)\n",_chargingData[gun_index]->GroundFaultStatus);
+				    	_chargingData[gun_index]->SystemStatus = S_TERMINATING;
+				    }
+				}
+				    break;
+				case S_TERMINATING:
+				{
+					if(PreviousSystemStatus[gun_index] != _chargingData[gun_index]->SystemStatus)
+				    {
+						PreviousSystemStatus[gun_index] = _chargingData[gun_index]->SystemStatus;
+				        printf ("[AverageCharging (%d) - S_TERMINATING] \n", gun_index);
+				        //無阻塞偵測 keybaord 結束
+				        system(STTY_DEF TTY_PATH);
+				    }
+
+				    sleep(3);
+				    _chargingData[gun_index]->SystemStatus = S_COMPLETE;
+				}
+				    break;
+				case S_COMPLETE:
+				{
+				    if(PreviousSystemStatus[gun_index] != _chargingData[gun_index]->SystemStatus)
+				    {
+				    	PreviousSystemStatus[gun_index] = _chargingData[gun_index]->SystemStatus;
+				    	printf ("[AverageCharging (%d) - S_COMPLETE] \n", gun_index);
+				    }
+
+				    _chargingData[gun_index]->PresentChargingPower = 0;
+				    isComplete[gun_index] = true;
+				    sleep(3);
+				}
+				    break;
+			}
+		}
+
+		if (isComplete[0] == true && isComplete[1] == true)
+			return;
+
+		char word[128];
+		char newString[7][10];
+		int i,j,ctr;
+
+		memset(word, 0x00, sizeof(word));
+		get_char(word);
+
+		if (strlen(word) == 0)
+			continue;
+
+		j=0; ctr=0;
+		strcpy(newString[1], "-1");
+		strcpy(newString[2], "-1");
+		for (i = 0; i <= (strlen(word)); i++)
+		{
+			if (word[i] == ' ' || word[i] == '\0' || word[i] == 10)
+		    {
+		    	newString[ctr][j] = '\0';
+		    	ctr++;
+		    	j = 0;
+		    }
+		    else
+		    {
+		    	newString[ctr][j] = word[i];
+		    	j++;
+		    }
+		}
+
+		if (strcmp(newString[0], "c") == 0)
+		{
+			for (byte gun_index = 0; gun_index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; gun_index++)
+			{
+				ShmDcCommonData->StartToChargingFlag[gun_index] = 0x00;
+				_chargingData[gun_index]->SystemStatus = S_TERMINATING;
+			}
+			printf("stop \n\r");
+		}
+
+		usleep(100000);
+	}
+}
+
 void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
 {
 	int _GunIndex;
@@ -1369,18 +1650,49 @@ int main(void)
 			}
 			GetGunTemp(newString[1]);
 		}
+		else if (strcmp(newString[0], "meter") == 0)
+		{
+			// DC meter infor
+			if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0)
+			{
+				printf ("meter cmd fail.\n");
+				continue;
+			}
+			GetDcMeterInfor(newString[1]);
+		}
 		else if (strcmp(newString[0], "soc") == 0)
 		{
 			GetSOC(newString[1]);
 		}
+		else if (strcmp(newString[0], "run") == 0)
+		{
+			if (ShmDcCommonData->_isAutoRunTest == YES)
+				ShmDcCommonData->_isAutoRunTest = NO;
+			else
+				ShmDcCommonData->_isAutoRunTest = YES;
+
+			printf ("_isAutoRunTest = %d \n", ShmDcCommonData->_isAutoRunTest);
+		}
 		else if (strcmp(newString[0], "test") == 0)
 		{
-			if (!FindChargingInfoData(1, &_chargingData[0]))
-			{
-				printf ("FindChargingInfoData error\n");
-				continue;
-			}
-			ShmSysConfigAndInfo->SysInfo.AuthorizeFlag = 0x01;
+//			if (!FindChargingInfoData(0, &_chargingData[0]))
+//			{
+//				printf ("FindChargingInfoData error\n");
+//				continue;
+//			}
+//			_chargingData[0]->PresentChargingVoltage = 900;
+//			_chargingData[0]->PresentChargingCurrent = 200;
+//
+//			if (!FindChargingInfoData(1, &_chargingData[0]))
+//			{
+//				printf ("FindChargingInfoData error\n");
+//				continue;
+//			}
+//			_chargingData[1]->PresentChargingVoltage = 500;
+//			_chargingData[1]->PresentChargingCurrent = 60;
+			ShmSysConfigAndInfo->SysInfo.MainChargingMode = 0;
+			printf("ShmSysConfigAndInfo->SysInfo.MainChargingMode = %d \n",
+					ShmSysConfigAndInfo->SysInfo.MainChargingMode);
 		}
 		else if(strcmp(newString[0], "strchg") == 0)
 		{
@@ -1396,9 +1708,29 @@ int main(void)
 				continue;
 			}
 
-			// 槍狀態
 			RunUnconditionalChargeIndex1(newString[1], newString[2], newString[3]);
 		}
+		else if(strcmp(newString[0], "avechg") == 0)
+		{
+			// 雙槍同時忙充輸出
+			if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0 ||
+					strcmp(newString[2], "-1") == 0 || strcmp(newString[2], "") == 0 ||
+					strcmp(newString[3], "-1") == 0 || strcmp(newString[3], "") == 0 ||
+					strcmp(newString[4], "-1") == 0 || strcmp(newString[4], "") == 0)
+			{
+				printf ("Input cmd fail ------  avechg\n");
+				continue;
+			}
+
+			if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount < 2 ||
+					ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == 1)
+			{
+				printf ("Sorry, This is single gun system. \n");
+				continue;
+			}
+
+			AverageCharging(newString[1], newString[2], newString[3], newString[4]);
+		}
 		else
 			printf ("%s\n", msg);
 		usleep(100000);

+ 44 - 8
EVSE/Projects/DS60-120/Apps/internalComm.c

@@ -38,7 +38,7 @@
 #define FAIL				-1
 
 struct Address Addr={0x01,0x02,0x03,0x05,0x06,0xFF};
-struct Command Cmd={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x24,0x27,0x28,0x29,0x2C,0x81,0x83,
+struct Command Cmd={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x24,0x27,0x28,0x29,0x2C,0x35,0x81,0x83,
 		0x85,0x86,0x87,0x88,0x089,0x8A,0x8B,0x8C,0x90,0x93,0xe0,0xe1,0xe2,0xe3};
 
 int tranceiveRelDelayTime(int fd, unsigned char* cmd, unsigned char cmd_len, unsigned char* rx, unsigned short _delay)
@@ -543,13 +543,13 @@ unsigned char Config_Fan_Speed(unsigned char fd, unsigned char targetAddr, FanSp
 unsigned char Config_Relay_Output(unsigned char fd, unsigned char targetAddr, Relay *Set_Buf)
 {
 	unsigned char result = FAIL;
-	unsigned char tx[10] = {0xaa, 0x00, targetAddr, Cmd.config_Relay_Output, 0x03, 0x00, Set_Buf->relay_event.relay_status[0], Set_Buf->relay_event.relay_status[1], Set_Buf->relay_event.relay_status[2]};
+	unsigned char tx[11] = {0xaa, 0x00, targetAddr, Cmd.config_Relay_Output, 0x04, 0x00, Set_Buf->relay_event.relay_status[0], Set_Buf->relay_event.relay_status[1], Set_Buf->relay_event.relay_status[2], Set_Buf->relay_event.relay_status[3]};
 	unsigned char rx[512];
 	unsigned char chksum = 0x00;
 
 	for(int idx = 0;idx<(tx[4] | tx[5]<<8);idx++)
 		chksum ^= tx[6 + idx];
-	tx[9] = chksum;
+	tx[10] = chksum;
 
 //	for (int i = 0; i < 10; i++)
 //		printf("set relay cmd : tx = %x \n", tx[i]);
@@ -562,7 +562,7 @@ unsigned char Config_Relay_Output(unsigned char fd, unsigned char targetAddr, Re
 			return result;
 
 //		for (int i = 0; i < len; i++)
-//			printf("set relay cmd : rx = %x \n", rx[i]);
+//			printf("get relay cmd : rx = %x \n", rx[i]);
 
 		chksum = 0x00;
 		for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
@@ -1011,6 +1011,39 @@ unsigned char Query_Charging_Energy(unsigned char fd, unsigned char targetAddr,
 	return result;
 }
 
+unsigned char Query_AC_Charging_Power(unsigned char fd, unsigned char targetAddr, Ac_Charging_power *Ret_Buf)
+{
+	unsigned char result = FAIL;
+	unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_ac_output_power, 0x00, 0x00, 0x00};
+	unsigned char rx[512];
+	unsigned char chksum = 0x00;
+	unsigned char len = tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100);
+
+	if(len > 6)
+	{
+		if (len < 6+(rx[4] | rx[5]<<8))
+			return result;
+
+		for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
+		{
+			chksum ^= rx[6+idx];
+		}
+
+		if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
+				(rx[2] == tx[1]) &&
+				(rx[1] == tx[2]) &&
+				(rx[3] == tx[3]))
+		{
+			Ret_Buf->AWATT = rx[54] + (rx[55] << 8) + (rx[56] << 8) + (rx[57] << 8);
+			Ret_Buf->BWATT = rx[58] + (rx[59] << 8) + (rx[60] << 8) + (rx[61] << 8);
+			Ret_Buf->CWATT = rx[62] + (rx[63] << 8) + (rx[64] << 8) + (rx[65] << 8);
+			result = PASS;
+		}
+	}
+
+	return result;
+}
+
 unsigned char Query_Charging_Current(unsigned char fd, unsigned char targetAddr, Ac_Charging_current *Ret_Buf)
 {
 	unsigned char result = FAIL;
@@ -1029,14 +1062,17 @@ unsigned char Query_Charging_Current(unsigned char fd, unsigned char targetAddr,
 			chksum ^= rx[6+idx];
 		}
 
+//		for(int i = 0; i < len; i++)
+//			printf ("rx = %x \n", rx[i]);
+
 		if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
 				(rx[2] == tx[1]) &&
 				(rx[1] == tx[2]) &&
 				(rx[3] == tx[3]))
 		{
-			Ret_Buf->OuputCurrentL1 = rx[6] + (rx[7] << 8);
-			Ret_Buf->OuputCurrentL2 = rx[8] + (rx[9] << 8);
-			Ret_Buf->OuputCurrentL3 = rx[10] + (rx[11] << 8);
+			Ret_Buf->OuputCurrentL1 = (rx[6] + (rx[7] << 8)) / 10;
+			Ret_Buf->OuputCurrentL2 = (rx[8] + (rx[9] << 8)) / 10;
+			Ret_Buf->OuputCurrentL3 = (rx[10] + (rx[11] << 8)) / 10;
 			result = PASS;
 		}
 	}
@@ -1216,7 +1252,7 @@ unsigned char Config_Led_Color(unsigned char fd, unsigned char targetAddr, Led_C
 
 	for (int idx = 0; idx < (tx[4] | tx[5] << 8); idx++)
 		chksum ^= tx[6 + idx];
-	tx[13] = chksum;
+	tx[12] = chksum;
 
 //	for(int i = 0; i < 13; i++)
 //			printf ("tx = %x \n", tx[i]);

+ 20 - 0
EVSE/Projects/DS60-120/Apps/internalComm.h

@@ -38,6 +38,8 @@ extern struct Command
 
 	unsigned char query_ac_output_energy;		//0x2C
 
+	unsigned char query_ac_output_power;		//0x35
+
 	unsigned char config_Fan_Speed;			//0x81
 	unsigned char config_Model_Name;			//0x83
 	unsigned char config_Relay_Output;			//0x85
@@ -131,6 +133,15 @@ typedef struct RELAY
 			unsigned char :1;					//bit 5 reserved
 			unsigned char :1;					//bit 6 reserved
 			unsigned char :1;					//bit 7 reserved
+
+			unsigned char AC_L1_Relay :1;		//bit 0
+			unsigned char AC_L2_Relay :1;		//bit 1
+			unsigned char AC_L3_Relay :1; 		//bit 2
+			unsigned char AC_TypeE_Socket :1;	//bit 3
+			unsigned char :1;					//bit 4 reserved
+			unsigned char :1;					//bit 5 reserved
+			unsigned char :1;					//bit 6 reserved
+			unsigned char :1;					//bit 7 reserved
 		}bits;
 	}relay_event;
 }Relay;
@@ -239,6 +250,14 @@ typedef struct AC_Charging_Current
 }
 Ac_Charging_current;
 
+typedef struct AC_Charging_Power
+{
+	float		AWATT;
+	float		BWATT;
+	float		CWATT;
+}
+Ac_Charging_power;
+
 extern unsigned char Query_FW_Ver(unsigned char fd, unsigned char targetAddr, Ver *Ret_Buf);
 extern unsigned char Query_HW_Ver(unsigned char fd, unsigned char targetAddr, Ver *Ret_Buf);
 extern unsigned char Query_Present_InputVoltage(unsigned char fd, unsigned char targetAddr, PresentInputVoltage *Ret_Buf);
@@ -267,6 +286,7 @@ extern unsigned char Query_AC_Status(unsigned char fd, unsigned char targetAddr,
 extern unsigned char Query_AC_Alarm_Code(unsigned char fd, unsigned char targetAddr, Ac_Alarm_code *Ret_Buf);
 extern unsigned char Query_Charging_Energy(unsigned char fd, unsigned char targetAddr, Ac_Charging_energy *Ret_Buf);
 extern unsigned char Query_Charging_Current(unsigned char fd, unsigned char targetAddr, Ac_Charging_current *Ret_Buf);
+extern unsigned char Query_AC_Charging_Power(unsigned char fd, unsigned char targetAddr, Ac_Charging_power *Ret_Buf);
 extern unsigned char Config_LED_Status(unsigned char fd, unsigned char targetAddr, Ac_Led_Status *Ret_Buf);
 extern unsigned char Config_Legacy_Req(unsigned char fd, unsigned char targetAddr, unsigned char _switch);
 extern unsigned char Config_Ac_Duty(unsigned char fd, unsigned char targetAddr, unsigned char _value);

Fișier diff suprimat deoarece este prea mare
+ 354 - 153
EVSE/Projects/DS60-120/Apps/main.c


+ 2 - 1
EVSE/Projects/DS60-120/Apps/timeout.h

@@ -56,10 +56,11 @@ enum Timeout_flag
 struct timeval _cmdSubPriority_time;
 unsigned short _connectionTimeout;
 
-bool _isAllowChargingOnDisconnect;
 // for main
 struct timeval _cmdMainPriority_time;
 struct timeval _toAverage_time;
 unsigned char _ocppProfileChkFlag;
+unsigned char _ac_ocppProfileChkFlag;
 bool stopChargingChkByCard;
+
 #endif /* TIMEOUT_H_ */

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff