Răsfoiți Sursa

Merge branch 'DS60-120'

FolusWen 3 ani în urmă
părinte
comite
172722bf96

+ 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