Переглянути джерело

2020-05-25 / Alston Lin

Actions
1. Modify the output current limit 10A -> 100A
2. Send maximum current to ev before obtaining available current in maximum charging mode
3. Convert the maximum charging mode to the average charging mode, and then send the group current output to ev

Files
1. As follow commit history
Alston 4 роки тому
батько
коміт
45c42e8d4c

+ 1 - 0
EVSE/Projects/DS60-120/Apps/Config.h

@@ -156,6 +156,7 @@ enum _REASSIGNED_RESOURCE_STEP
 	_REASSIGNED_GET_NEW_CAP = 		2,	// 充電中的重新取得屬於自己火線上的總能量並透過小板通知車端 - 超過10秒直接跳下一步
 	_REASSIGNED_GET_NEW_CAP = 		2,	// 充電中的重新取得屬於自己火線上的總能量並透過小板通知車端 - 超過10秒直接跳下一步
 	_REASSIGNED_ADJUST_M_TO_A = 	3,	// 模塊重新分配完成
 	_REASSIGNED_ADJUST_M_TO_A = 	3,	// 模塊重新分配完成
 	_REASSIGNED_RELAY_M_TO_A =		4,	// 切斷橋接的 Relay
 	_REASSIGNED_RELAY_M_TO_A =		4,	// 切斷橋接的 Relay
+	_REASSIGNED_CHECK = 			5,
 
 
 	_REASSIGNED_PREPARE_A_TO_M = 	11,
 	_REASSIGNED_PREPARE_A_TO_M = 	11,
 	_REASSIGNED_ADJUST_A_TO_M = 	12, // 模塊升壓
 	_REASSIGNED_ADJUST_A_TO_M = 	12, // 模塊升壓

BIN
EVSE/Projects/DS60-120/Apps/FactoryConfig


+ 2 - 2
EVSE/Projects/DS60-120/Apps/FactoryConfig.c

@@ -103,7 +103,7 @@ int main(int argc,char *argv[])
 	*/
 	*/
 	//********** System **********// udhcpc -i eth1 -s ./dhcp_script/eth1.script
 	//********** System **********// udhcpc -i eth1 -s ./dhcp_script/eth1.script
 	//
 	//
-	strcpy((char *)SysConfig.ModelName, "DSYE601J0EE2PH");
+	strcpy((char *)SysConfig.ModelName, "DSYE601J0EW2PH");
 	strcpy((char *)SysConfig.SerialNumber, "");
 	strcpy((char *)SysConfig.SerialNumber, "");
 
 
 	memset(SysConfig.SystemId, 0x00, sizeof(SysConfig.SystemId));
 	memset(SysConfig.SystemId, 0x00, sizeof(SysConfig.SystemId));
@@ -130,7 +130,7 @@ int main(int argc,char *argv[])
 	SysConfig.MaxChargingEnergy = 0;
 	SysConfig.MaxChargingEnergy = 0;
 	SysConfig.MaxChargingCurrent = 200;		// ³Ì¤j¥i¿é¥X¹q¬y (¾ã¼Î)
 	SysConfig.MaxChargingCurrent = 200;		// ³Ì¤j¥i¿é¥X¹q¬y (¾ã¼Î)
 	SysConfig.MaxChargingDuration = 0;
 	SysConfig.MaxChargingDuration = 0;
-	SysConfig.AcMaxChargingCurrent = 32;
+	SysConfig.AcMaxChargingCurrent = 0;
 	SysConfig.PhaseLossPolicy = 0;
 	SysConfig.PhaseLossPolicy = 0;
 	for(unsigned char i = 0; i < 10; i++)
 	for(unsigned char i = 0; i < 10; i++)
 		strcpy((char *)SysConfig.LocalWhiteCard, "");
 		strcpy((char *)SysConfig.LocalWhiteCard, "");

BIN
EVSE/Projects/DS60-120/Apps/Module_EvComm


Різницю між файлами не показано, бо вона завелика
+ 1916 - 230
EVSE/Projects/DS60-120/Apps/Module_EvComm.c


BIN
EVSE/Projects/DS60-120/Apps/Module_EventLogging


BIN
EVSE/Projects/DS60-120/Apps/Module_InternalComm


+ 33 - 13
EVSE/Projects/DS60-120/Apps/Module_InternalComm.c

@@ -541,10 +541,20 @@ void CheckK1K2RelayOutput(byte index)
 
 
 			if(_chargingData[index]->Type == _Type_CCS_2)
 			if(_chargingData[index]->Type == _Type_CCS_2)
 			{
 			{
-				if (regRelay.relay_event.bits.Gun1_N == YES	&& regRelay.relay_event.bits.CCS_Precharge == YES)
-					_chargingData[index]->RelayKPK2Status = YES;
+				if (gunCount == 1)
+				{
+					if (regRelay.relay_event.bits.Gun1_N == YES	&& regRelay.relay_event.bits.CCS_Precharge == YES)
+						_chargingData[index]->RelayKPK2Status = YES;
+					else
+						_chargingData[index]->RelayKPK2Status = NO;
+				}
 				else
 				else
-					_chargingData[index]->RelayKPK2Status = NO;
+				{
+					if (_chargingData[index]->SystemStatus == S_CCS_PRECHARGE_ST0)
+						_chargingData[index]->RelayKPK2Status = YES;
+					else
+						_chargingData[index]->RelayKPK2Status = NO;
+				}
 			}
 			}
 		}
 		}
 		else if (_chargingData[index]->Evboard_id == 0x02)
 		else if (_chargingData[index]->Evboard_id == 0x02)
@@ -792,7 +802,7 @@ void SetK1K2RelayStatus(byte index)
 			else if (regRelay.relay_event.bits.Gun1_N == YES)
 			else if (regRelay.relay_event.bits.Gun1_N == YES)
 				outputRelay.relay_event.bits.Gun1_N = NO;
 				outputRelay.relay_event.bits.Gun1_N = NO;
 
 
-			if (_chargingData[index]->Type == _Type_CCS_2)
+			if (gunCount == 1 && _chargingData[index]->Type == _Type_CCS_2)
 			{
 			{
 				if(regRelay.relay_event.bits.CCS_Precharge == YES)
 				if(regRelay.relay_event.bits.CCS_Precharge == YES)
 					outputRelay.relay_event.bits.CCS_Precharge = NO;
 					outputRelay.relay_event.bits.CCS_Precharge = NO;
@@ -860,10 +870,13 @@ void SetK1K2RelayStatus(byte index)
 		{
 		{
 			if (_chargingData[index]->Type == _Type_CCS_2)
 			if (_chargingData[index]->Type == _Type_CCS_2)
 			{
 			{
-				if (regRelay.relay_event.bits.CCS_Precharge == NO)
-					outputRelay.relay_event.bits.CCS_Precharge = YES;
-				else if (regRelay.relay_event.bits.CCS_Precharge == YES)
-					outputRelay.relay_event.bits.Gun1_P = NO;
+				if (gunCount == 1)
+				{
+					if (regRelay.relay_event.bits.CCS_Precharge == NO)
+						outputRelay.relay_event.bits.CCS_Precharge = YES;
+					else if (regRelay.relay_event.bits.CCS_Precharge == YES)
+						outputRelay.relay_event.bits.Gun1_P = NO;
+				}
 			}
 			}
 		}
 		}
 		else if (_chargingData[index]->Evboard_id == 0x02)
 		else if (_chargingData[index]->Evboard_id == 0x02)
@@ -883,10 +896,13 @@ void SetK1K2RelayStatus(byte index)
 		{
 		{
 			if (_chargingData[index]->Type == _Type_CCS_2)
 			if (_chargingData[index]->Type == _Type_CCS_2)
 			{
 			{
-				if (regRelay.relay_event.bits.Gun1_P == NO)
-					outputRelay.relay_event.bits.Gun1_P = YES;
-				else if(regRelay.relay_event.bits.Gun1_P == YES)
-					outputRelay.relay_event.bits.CCS_Precharge = NO;
+				if (gunCount == 1)
+				{
+					if (regRelay.relay_event.bits.Gun1_P == NO)
+						outputRelay.relay_event.bits.Gun1_P = YES;
+					else if(regRelay.relay_event.bits.Gun1_P == YES)
+						outputRelay.relay_event.bits.CCS_Precharge = NO;
+				}
 			}
 			}
 		}
 		}
 		else if (_chargingData[index]->Evboard_id == 0x02)
 		else if (_chargingData[index]->Evboard_id == 0x02)
@@ -1538,6 +1554,11 @@ void GetAcStatus()
 {
 {
 	if (Query_AC_Status(Uart5Fd, Addr.AcPlug, &acStatus) == PASS)
 	if (Query_AC_Status(Uart5Fd, Addr.AcPlug, &acStatus) == PASS)
 	{
 	{
+		ShmSysConfigAndInfo->SysConfig.AcRatingCurrent = acStatus.MaxCurrent;
+
+		if(ShmSysConfigAndInfo->SysConfig.AcMaxChargingCurrent == 0)
+			ShmSysConfigAndInfo->SysConfig.AcMaxChargingCurrent = ShmSysConfigAndInfo->SysConfig.AcRatingCurrent;
+
 	//				printf("CpStatus = %d \n", acStatus.CpStatus);
 	//				printf("CpStatus = %d \n", acStatus.CpStatus);
 	//				printf("CurLimit = %d \n", acStatus.CurLimit);
 	//				printf("CurLimit = %d \n", acStatus.CurLimit);
 	//				printf("PilotVol_P = %d \n", acStatus.PilotVol_P);
 	//				printf("PilotVol_P = %d \n", acStatus.PilotVol_P);
@@ -1621,7 +1642,6 @@ void AcChargeTypeProcess()
 				ChangeToCsuMode();
 				ChangeToCsuMode();
 				return;
 				return;
 			}
 			}
-
 			GetAcStatus();
 			GetAcStatus();
 			GetAcAlarmCode();
 			GetAcAlarmCode();
 
 

BIN
EVSE/Projects/DS60-120/Apps/Module_LcmControl


+ 4 - 2
EVSE/Projects/DS60-120/Apps/Module_LcmControl.c

@@ -923,7 +923,8 @@ void ProcessPageInfo()
 						else
 						else
 						{
 						{
 							ChangeChargingEnergyValue(0);
 							ChangeChargingEnergyValue(0);
-							ChangeChargingFeeValue(0);
+							if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
+								ChangeChargingFeeValue(0);
 						}
 						}
 
 
 						if(!ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
 						if(!ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
@@ -1039,7 +1040,8 @@ void ProcessPageInfo()
 						else
 						else
 						{
 						{
 							ChangeChargingEnergyValue(0);
 							ChangeChargingEnergyValue(0);
-							ChangeChargingFeeValue(0);
+							if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
+								ChangeChargingFeeValue(0);
 						}
 						}
 
 
 						if(!ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
 						if(!ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)

BIN
EVSE/Projects/DS60-120/Apps/Module_PrimaryComm


BIN
EVSE/Projects/DS60-120/Apps/Module_PsuComm


+ 268 - 103
EVSE/Projects/DS60-120/Apps/Module_PsuComm.c

@@ -6,7 +6,8 @@
 #define FAIL				-1
 #define FAIL				-1
 #define YES					1
 #define YES					1
 #define NO					0
 #define NO					0
-#define DERATING			30
+#define DERATING_COUNT		30
+#define DERATING_GAP		30
 #define ELEMENT_NOT_FIND	255
 #define ELEMENT_NOT_FIND	255
 #define CHK_VOL_RANGE		50
 #define CHK_VOL_RANGE		50
 #define CHK_CUR_RANGE		10
 #define CHK_CUR_RANGE		10
@@ -14,7 +15,9 @@
 #define ZERO_CURRENT		10			// 該值須保持最小為 1A
 #define ZERO_CURRENT		10			// 該值須保持最小為 1A
 #define ZERO_VOLTAGE		50
 #define ZERO_VOLTAGE		50
 #define STOP_CURRENT		30
 #define STOP_CURRENT		30
-#define PSU_MIN_CUR			100
+#define PSU_MIN_CUR			1000
+#define PRE_CHARG_STEP_CUR	30
+#define PRE_CHARG_RANGE		50
 #define EQUAL				0
 #define EQUAL				0
 
 
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
@@ -51,19 +54,21 @@ int StoreLogMsg(const char *fmt, ...)
 {
 {
 	char Buf[4096+256];
 	char Buf[4096+256];
 	char buffer[4096];
 	char buffer[4096];
-	time_t CurrentTime;
-	struct tm *tm;
 	va_list args;
 	va_list args;
+	struct timeb  SeqEndTime;
+	struct tm *tm;
 
 
 	va_start(args, fmt);
 	va_start(args, fmt);
 	int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
 	int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
 	va_end(args);
 	va_end(args);
 
 
 	memset(Buf,0,sizeof(Buf));
 	memset(Buf,0,sizeof(Buf));
-	CurrentTime = time(NULL);
-	tm=localtime(&CurrentTime);
-	sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
-			tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,
+	ftime(&SeqEndTime);
+	SeqEndTime.time = time(NULL);
+	tm=localtime(&SeqEndTime.time);
+
+	sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
+			tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
 			buffer,
 			buffer,
 			tm->tm_year+1900,tm->tm_mon+1);
 			tm->tm_year+1900,tm->tm_mon+1);
 	system(Buf);
 	system(Buf);
@@ -333,7 +338,7 @@ void GetAvailableCapCallback(byte address, short maxVol, short minVol, short max
 		ShmPsuData->PsuGroup[group].PsuModule[address].AvailableCurrent = maxCur;
 		ShmPsuData->PsuGroup[group].PsuModule[address].AvailableCurrent = maxCur;
 
 
 	ShmPsuData->PsuGroup[group].PsuModule[address].AvailablePower = totalPow;
 	ShmPsuData->PsuGroup[group].PsuModule[address].AvailablePower = totalPow;
-
+	// 總和該 Group 的可輸出電流
 	for (byte index = 0; index < ShmPsuData->PsuGroup[group].GroupPresentPsuQuantity; index++)
 	for (byte index = 0; index < ShmPsuData->PsuGroup[group].GroupPresentPsuQuantity; index++)
 	{
 	{
 		_groupCurrent += ShmPsuData->PsuGroup[group].PsuModule[index].AvailableCurrent;
 		_groupCurrent += ShmPsuData->PsuGroup[group].PsuModule[index].AvailableCurrent;
@@ -347,13 +352,20 @@ void GetAvailableCapCallback(byte address, short maxVol, short minVol, short max
 	chargingInfo[group]->MaximumChargingVoltage = maxVol;
 	chargingInfo[group]->MaximumChargingVoltage = maxVol;
 
 
 	int _power = 0, _current = 0, _ratingcurrent = 0;
 	int _power = 0, _current = 0, _ratingcurrent = 0;
+	bool isGetAllDeratingCurrent = true;
+
 	for (byte index = 0; index < ShmPsuData->GroupCount; index++)
 	for (byte index = 0; index < ShmPsuData->GroupCount; index++)
 	{
 	{
 		_power += ShmPsuData->PsuGroup[index].GroupAvailablePower;
 		_power += ShmPsuData->PsuGroup[index].GroupAvailablePower;
 		_current += ShmPsuData->PsuGroup[index].GroupAvailableCurrent;
 		_current += ShmPsuData->PsuGroup[index].GroupAvailableCurrent;
 		_ratingcurrent += chargingInfo[index]->DeratingChargingCurrent;
 		_ratingcurrent += chargingInfo[index]->DeratingChargingCurrent;
+		if (chargingInfo[index]->DeratingChargingCurrent == 0)
+			isGetAllDeratingCurrent = false;
 	}
 	}
 
 
+	// 如果不是所有群都得到 Derating current,則先不採樣該次的 ratingCurrent
+	if (!isGetAllDeratingCurrent) _ratingcurrent = 0;
+
 	ShmPsuData->SystemAvailableCurrent = _current;
 	ShmPsuData->SystemAvailableCurrent = _current;
 	ShmPsuData->SystemAvailablePower = _power;
 	ShmPsuData->SystemAvailablePower = _power;
 
 
@@ -365,6 +377,18 @@ void GetAvailableCapCallback(byte address, short maxVol, short minVol, short max
 		int halfCur = ShmPsuData->PsuGroup[group].GroupAvailableCurrent;
 		int halfCur = ShmPsuData->PsuGroup[group].GroupAvailableCurrent;
 		int ratingCur = chargingInfo[group]->DeratingChargingCurrent;
 		int ratingCur = chargingInfo[group]->DeratingChargingCurrent;
 
 
+		if ((ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_GET_NEW_CAP &&
+				ShmSysConfigAndInfo->SysInfo.ReAssignedFlag <= _REASSIGNED_RELAY_M_TO_A))
+		{
+			if (chargingInfo[group]->DividChargingCurrent == 0)
+				return;
+			else
+			{
+				halfCur = chargingInfo[group]->DividChargingCurrent;
+				ratingCur = 0;
+			}
+		}
+
 		GetMaxPowerAndCur(_MAIN_CHARGING_MODE_AVER, ratingCur, &halfPow, &halfCur);
 		GetMaxPowerAndCur(_MAIN_CHARGING_MODE_AVER, ratingCur, &halfPow, &halfCur);
 
 
 //		if ((ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_GET_NEW_CAP &&
 //		if ((ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_GET_NEW_CAP &&
@@ -436,25 +460,43 @@ void GetInputVoltageCallback(byte address, unsigned short vol1, unsigned short v
 
 
 void GetPresentOutputCallback(byte group, unsigned short outVol, unsigned short outCur)
 void GetPresentOutputCallback(byte group, unsigned short outVol, unsigned short outCur)
 {
 {
-	unsigned short outputVol = outVol;
-	unsigned short outputCur = outCur;
+	//if (outCur != ShmPsuData->PsuGroup[group].GroupPresentOutputCurrent)
+	//{
+	//	PRINTF_FUNC("Gp_%d, gp output cur = %d \n", group, outCur);
+	//}
 
 
 	// PSU Group - 電壓
 	// PSU Group - 電壓
-	ShmPsuData->PsuGroup[group].GroupPresentOutputVoltage = outputVol;
+	ShmPsuData->PsuGroup[group].GroupPresentOutputVoltage = outVol;
 	// PSU Group - 電流
 	// PSU Group - 電流
-	ShmPsuData->PsuGroup[group].GroupPresentOutputCurrent = outputCur;
+	ShmPsuData->PsuGroup[group].GroupPresentOutputCurrent = outCur;
 
 
-	if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_MAX)
+	if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_MAX ||
+			(ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_AVER &&
+			(ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_WAITING &&
+			ShmSysConfigAndInfo->SysInfo.ReAssignedFlag <= _REASSIGNED_COMP))
+		)
 	{
 	{
-		outputVol = 0;
-		outputCur = 0;
+		unsigned short outputVol = 0;
+		unsigned short outputCur = 0;
 
 
 		for (byte index = 0; index < ShmPsuData->GroupCount; index++)
 		for (byte index = 0; index < ShmPsuData->GroupCount; index++)
 		{
 		{
+			bool needtoAdd = true;
+
 			if (ShmPsuData->PsuGroup[index].GroupPresentOutputVoltage > outputVol)
 			if (ShmPsuData->PsuGroup[index].GroupPresentOutputVoltage > outputVol)
 				outputVol = ShmPsuData->PsuGroup[index].GroupPresentOutputVoltage;
 				outputVol = ShmPsuData->PsuGroup[index].GroupPresentOutputVoltage;
 
 
-			outputCur += ShmPsuData->PsuGroup[index].GroupPresentOutputCurrent;
+			if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_ADJUST_M_TO_A &&
+					ShmSysConfigAndInfo->SysInfo.ReAssignedFlag <= _REASSIGNED_RELAY_M_TO_A)
+			{
+//				PRINTF_FUNC("Gp_%d, DividChargingCurrent = %d \n", index,
+//						chargingInfo[index]->DividChargingCurrent);
+				if (chargingInfo[index]->DividChargingCurrent == 0)
+					needtoAdd = false;
+			}
+
+			if (needtoAdd)
+				outputCur += ShmPsuData->PsuGroup[index].GroupPresentOutputCurrent;
 		}
 		}
 
 
 		// 黑白機
 		// 黑白機
@@ -566,7 +608,7 @@ void GetIavailableCallback(byte address, unsigned short Iavail, unsigned short V
 				{
 				{
 					chargingInfo[group]->SampleChargingCur[count] = totalCur;
 					chargingInfo[group]->SampleChargingCur[count] = totalCur;
 					isPass = false;
 					isPass = false;
-					continue;
+					break;
 				}
 				}
 			}
 			}
 		}
 		}
@@ -764,6 +806,8 @@ void CheckSmartChargingStep(bool isWaitingAver, bool isCharging)
 			if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_AVER)
 			if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_AVER)
 			{
 			{
 				PRINTF_FUNC("=============Smart Charging : _REASSIGNED_ADJUST_A_TO_M============= Step 12 \n");
 				PRINTF_FUNC("=============Smart Charging : _REASSIGNED_ADJUST_A_TO_M============= Step 12 \n");
+				preChargingCur = preChargingTarget = 0;
+				gettimeofday(&_max_time, NULL);
 				ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_ADJUST_A_TO_M;
 				ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_ADJUST_A_TO_M;
 			}
 			}
 			else
 			else
@@ -965,9 +1009,6 @@ int main(void)
 						// Pooling Status
 						// Pooling Status
 						GetStatus(index);
 						GetStatus(index);
 
 
-						// 取系統總輸出能力
-						GetModuleCap(index);
-
 						// 取得模塊輸入電壓
 						// 取得模塊輸入電壓
 						GetModuleInput(index);
 						GetModuleInput(index);
 
 
@@ -1018,6 +1059,9 @@ int main(void)
 
 
 				for (byte groupIndex = 0; groupIndex < _gunCount; groupIndex++)
 				for (byte groupIndex = 0; groupIndex < _gunCount; groupIndex++)
 				{
 				{
+					// 取系統總輸出能力
+					GetModuleCap(groupIndex);
+					// 取得模塊的當前輸出
 					GetModuleOutput(groupIndex);
 					GetModuleOutput(groupIndex);
 					// 針對各槍當前狀態,傳送需要回傳的資料指令
 					// 針對各槍當前狀態,傳送需要回傳的資料指令
 					if (((chargingInfo[groupIndex]->SystemStatus >= S_PREPARING_FOR_EVSE && chargingInfo[groupIndex]->SystemStatus <= S_CHARGING) && chargingInfo[groupIndex]->RelayK1K2Status) ||
 					if (((chargingInfo[groupIndex]->SystemStatus >= S_PREPARING_FOR_EVSE && chargingInfo[groupIndex]->SystemStatus <= S_CHARGING) && chargingInfo[groupIndex]->RelayK1K2Status) ||
@@ -1063,15 +1107,36 @@ int main(void)
 //									chargingInfo[groupIndex]->SystemStatus, chargingInfo[groupIndex]->EvBatterytargetCurrent,
 //									chargingInfo[groupIndex]->SystemStatus, chargingInfo[groupIndex]->EvBatterytargetCurrent,
 //									(chargingInfo[groupIndex]->PresentChargingCurrent * 10));
 //									(chargingInfo[groupIndex]->PresentChargingCurrent * 10));
 							// 智能判斷 Start -----------------------------------------------------------
 							// 智能判斷 Start -----------------------------------------------------------
+							if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_GET_NEW_CAP &&
+									ShmSysConfigAndInfo->SysInfo.ReAssignedFlag <= _REASSIGNED_RELAY_M_TO_A)
+							{
+								if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_GET_NEW_CAP)
+								{
+									//PRINTF_FUNC("group = %d, GroupPresentOutputCurrent = %d \n",
+									//		groupIndex, ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent);
+
+									if (chargingInfo[groupIndex]->DividChargingCurrent == 0)
+									{
+										chargingInfo[groupIndex]->DividChargingCurrent = ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent;
+									}
+								}
+								PRINTF_FUNC("Index = %d, DividChargingCurrent = %f \n", groupIndex, chargingInfo[groupIndex]->DividChargingCurrent);
+							}
+							else
+							{
+								chargingInfo[groupIndex]->DividChargingCurrent = 0;
+							}
+
 							if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_GET_NEW_CAP)
 							if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_GET_NEW_CAP)
 							{
 							{
 								if (ShmPsuData->SystemAvailableCurrent != chargingInfo[groupIndex]->AvailableChargingCurrent)
 								if (ShmPsuData->SystemAvailableCurrent != chargingInfo[groupIndex]->AvailableChargingCurrent)
 								{
 								{
 									// 車端要求電流為該充電槍的額定輸出電流的範圍內
 									// 車端要求電流為該充電槍的額定輸出電流的範圍內
-									if (chargingInfo[groupIndex]->EvBatterytargetCurrent <= chargingInfo[groupIndex]->AvailableChargingCurrent ||
-										deratingKeepCount >= DERATING)
+									if (chargingInfo[groupIndex]->EvBatterytargetCurrent <= ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent + DERATING_GAP ||
+										deratingKeepCount >= DERATING_COUNT)
 									{
 									{
 										// 車端降載完成
 										// 車端降載完成
+										PRINTF_FUNC("Index = %d, newEvCurrent = %f \n", groupIndex, chargingInfo[groupIndex]->EvBatterytargetCurrent);
 										PRINTF_FUNC("=============Smart Charging : _REASSIGNED_ADJUST_M_TO_A============= Step 3 \n");
 										PRINTF_FUNC("=============Smart Charging : _REASSIGNED_ADJUST_M_TO_A============= Step 3 \n");
 										ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_ADJUST_M_TO_A;
 										ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_ADJUST_M_TO_A;
 										gettimeofday(&_derating_time, NULL);
 										gettimeofday(&_derating_time, NULL);
@@ -1080,6 +1145,11 @@ int main(void)
 									else
 									else
 									{
 									{
 										deratingKeepCount++;
 										deratingKeepCount++;
+										PRINTF_FUNC("** Step 2 ** : Index = %d, EvBatterytargetCurrent = %f, TargetCurrent = %d, Count = %d \n",
+												groupIndex,
+												chargingInfo[groupIndex]->EvBatterytargetCurrent,
+												(ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent + DERATING_GAP),
+												deratingKeepCount);
 									}
 									}
 								}
 								}
 
 
@@ -1088,39 +1158,41 @@ int main(void)
 							{
 							{
 								bool isChanged = false;
 								bool isChanged = false;
 
 
-								// 需求電流不降低的情況下 -> 依然要切
-								if (chargingInfo[groupIndex]->AvailableChargingCurrent < chargingInfo[groupIndex]->EvBatterytargetCurrent)
+								if (chargingInfo[groupIndex]->AvailableChargingCurrent <= chargingInfo[groupIndex]->EvBatterytargetCurrent)
 								{
 								{
-									PRINTF_FUNC("** _REASSIGNED_ADJUST_M_TO_A ** Gun_%d, AvailableChargingCurrent = %f, EvBatterytargetCurrent = %f \n", groupIndex,
+									PRINTF_FUNC("** _REASSIGNED_ADJUST_M_TO_A ** Gun_%d, PresentChargingCurrent = %f, AvailableChargingCurrent = %f, EvBatterytargetCurrent = %f \n", groupIndex,
 											(chargingInfo[groupIndex]->PresentChargingCurrent * 10),
 											(chargingInfo[groupIndex]->PresentChargingCurrent * 10),
-											chargingInfo[groupIndex]->AvailableChargingCurrent);
+											chargingInfo[groupIndex]->AvailableChargingCurrent,
+											chargingInfo[groupIndex]->EvBatterytargetCurrent);
+
 									for (byte subIndex = 0; subIndex < ShmPsuData->GroupCount; subIndex++)
 									for (byte subIndex = 0; subIndex < ShmPsuData->GroupCount; subIndex++)
 									{
 									{
 										if (chargingInfo[subIndex]->SystemStatus == S_REASSIGN)
 										if (chargingInfo[subIndex]->SystemStatus == S_REASSIGN)
 										{
 										{
-											if ((chargingInfo[subIndex]->PresentChargingCurrent * 10) <= CHK_CUR_RANGE)
+											// 當 B 模塊輸出電流小於 5A 及退開 relay
+											if ((ShmPsuData->PsuGroup[subIndex].GroupPresentOutputCurrent) <= 50)
 												isChanged = true;
 												isChanged = true;
 											break;
 											break;
 										}
 										}
 									}
 									}
-
-									// 這狀況下輸出端的電流載滿載衝的狀況下,並不會降電流
-									// 所以只能拉載到該槍端的最大輸出能力
-									if ((chargingInfo[groupIndex]->PresentChargingCurrent * 10) >= chargingInfo[groupIndex]->AvailableChargingCurrent - CHK_CUR_RANGE ||
-											(chargingInfo[groupIndex]->PresentChargingCurrent * 10) <= CHK_CUR_RANGE)
-									{
-										isChanged = true;
-									}
 								}
 								}
 								else if (((chargingInfo[groupIndex]->PresentChargingCurrent * 10) >= ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent - CHK_CUR_RANGE) &&
 								else if (((chargingInfo[groupIndex]->PresentChargingCurrent * 10) >= ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent - CHK_CUR_RANGE) &&
 										((chargingInfo[groupIndex]->PresentChargingCurrent * 10) <= ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent + CHK_CUR_RANGE))
 										((chargingInfo[groupIndex]->PresentChargingCurrent * 10) <= ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent + CHK_CUR_RANGE))
 								{
 								{
-									isChanged = true;
+									for (byte subIndex = 0; subIndex < ShmPsuData->GroupCount; subIndex++)
+									{
+										if (chargingInfo[subIndex]->SystemStatus == S_REASSIGN)
+										{
+											if ((ShmPsuData->PsuGroup[subIndex].GroupPresentOutputCurrent) <= CHK_CUR_RANGE)
+												isChanged = true;
+											break;
+										}
+									}
 								}
 								}
 
 
 								if (isChanged)
 								if (isChanged)
 								{
 								{
-									PRINTF_FUNC("** _REASSIGNED_ADJUST_M_TO_A ** Gun_%d, PresentChargingCurrent = %f, GroupPresentOutputCurrent = %d \n", groupIndex,
+									PRINTF_FUNC("** _REASSIGNED_ADJUST_M_TO_A To 4** Gun_%d, PresentChargingCurrent = %f, GroupPresentOutputCurrent = %d \n", groupIndex,
 										(chargingInfo[groupIndex]->PresentChargingCurrent * 10),
 										(chargingInfo[groupIndex]->PresentChargingCurrent * 10),
 										ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent);
 										ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent);
 
 
@@ -1128,67 +1200,75 @@ int main(void)
 									PRINTF_FUNC("=============Smart Charging : _REASSIGNED_RELAY_M_TO_A============= Step 4 \n");
 									PRINTF_FUNC("=============Smart Charging : _REASSIGNED_RELAY_M_TO_A============= Step 4 \n");
 									ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_RELAY_M_TO_A;
 									ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_RELAY_M_TO_A;
 								}
 								}
+								else
+								{
+									if ((GetTimeoutValue(_derating_time) / 1000) > 1000)
+									{
+										gettimeofday(&_derating_time, NULL);
+									}
+								}
 							}
 							}
 
 
-							if (ShmPsuData->SystemAvailablePower > 0)
+							//if (ShmPsuData->SystemAvailablePower > 0)
 							{
 							{
 								// 調整輸出電流 : 漸進調整方式
 								// 調整輸出電流 : 漸進調整方式
-								if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_ADJUST_M_TO_A)
+								if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_GET_NEW_CAP &&
+										ShmSysConfigAndInfo->SysInfo.ReAssignedFlag < _REASSIGNED_RELAY_M_TO_A)
 								{
 								{
-									// 當前充電中的目標電壓
-									float targetVol = chargingInfo[groupIndex]->EvBatterytargetVoltage;
-									// 當前充電中的目標電流
-									//float targetCur = 0;
-									// 準備切出去的模塊電流
-									float deratingCur = 0;
-
-									byte reassignIndex = ELEMENT_NOT_FIND;
-									// 找到等待分配的槍
-									for (byte subIndex = 0; subIndex < ShmPsuData->GroupCount; subIndex++)
-									{
-										if (chargingInfo[subIndex]->SystemStatus == S_REASSIGN)
-										{
-											reassignIndex = subIndex;
-										}
-									}
-
-									if (reassignIndex != ELEMENT_NOT_FIND)
+									if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_ADJUST_M_TO_A)
 									{
 									{
-										//int derating = GetTimeoutValue(_derating_time) / 1000;
+										// 當前充電中的目標電壓
+										float targetVol = chargingInfo[groupIndex]->EvBatterytargetVoltage;
+										byte reassignIndex = ELEMENT_NOT_FIND;
 
 
-										//if (derating > 1000)
+										// 找到等待分配的槍
+										for (byte subIndex = 0; subIndex < ShmPsuData->GroupCount; subIndex++)
 										{
 										{
-											if (ShmPsuData->PsuGroup[reassignIndex].GroupPresentOutputCurrent > 0)
+											if (chargingInfo[subIndex]->SystemStatus == S_REASSIGN)
 											{
 											{
-												deratingCur = ShmPsuData->PsuGroup[reassignIndex].GroupPresentOutputCurrent - DERATING_RANGE;
-												if (deratingCur <= CHK_CUR_RANGE)
-													deratingCur = CHK_CUR_RANGE;
-
-												PresentOutputVol(reassignIndex, targetVol, deratingCur);
-												gettimeofday(&_derating_time, NULL);
+												reassignIndex = subIndex;
+												break;
 											}
 											}
 										}
 										}
 
 
-										// ***********直接降低要移除的模塊電流即可*************
-										// 因為爬的速度沒有降的速度快,所以採兩倍速度爬升
-//										targetCur = ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent + (DERATING_RANGE * 2);
-//										if (targetCur >= chargingInfo[groupIndex]->EvBatterytargetCurrent)
-//												targetCur = chargingInfo[groupIndex]->EvBatterytargetCurrent;
-
-										if (targetVol == 0)
-										{
-											SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
-											FlashLed(SYSTEM_CMD, PSU_FLASH_NORMAL);
-										}
-										else
+										if (reassignIndex != ELEMENT_NOT_FIND)
 										{
 										{
-											SwitchPower(SYSTEM_CMD, PSU_POWER_ON);
-											FlashLed(SYSTEM_CMD, PSU_FLASH_ON);
+											if ((GetTimeoutValue(_derating_time) / 1000) <= 50)
+											{
+												// A 模塊維持當前電壓電流
+												//PRINTF_FUNC("A : index = %d, cur = %d \n", groupIndex, ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent);
+												//PresentOutputVol(groupIndex, targetVol, ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent);
+												//PRINTF_FUNC("set out (%d) value = %f******** 1 \n", groupIndex, chargingInfo[groupIndex]->EvBatterytargetCurrent);
+												PresentOutputVol(groupIndex, targetVol, chargingInfo[groupIndex]->EvBatterytargetCurrent);
+//											}
+//
+//											if ((GetTimeoutValue(_derating_time) / 1000) <= 50)
+//											{
+												// 直接拉掉 B 模塊的電流
+												//PRINTF_FUNC("B : index = %d, cur = %d \n", reassignIndex, CHK_CUR_RANGE);
+												//PRINTF_FUNC("set out (%d) value = %d******** 2 \n", reassignIndex, CHK_CUR_RANGE);
+												PresentOutputVol(reassignIndex, targetVol, CHK_CUR_RANGE);
+											}
 										}
 										}
 									}
 									}
+
+									if (chargingInfo[groupIndex]->EvBatterytargetVoltage == 0)
+									{
+										//PRINTF_FUNC("sys ******** 1 \n");
+										SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
+										FlashLed(SYSTEM_CMD, PSU_FLASH_NORMAL);
+									}
+								}
+								else if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_RELAY_M_TO_A)
+								{
+									//PRINTF_FUNC("set out (%d) value = %f******** 3 \n", groupIndex, chargingInfo[groupIndex]->EvBatterytargetCurrent);
+									PresentOutputVol(groupIndex,
+											chargingInfo[groupIndex]->EvBatterytargetVoltage,
+											chargingInfo[groupIndex]->EvBatterytargetCurrent);
 								}
 								}
 								else
 								else
 								{
 								{
+									//PRINTF_FUNC("set out (sys) value = %f******** 4 \n", chargingInfo[groupIndex]->EvBatterytargetCurrent);
 									// 該充電槍的目標電壓與目標電流
 									// 該充電槍的目標電壓與目標電流
 									PresentOutputVol(SYSTEM_CMD,
 									PresentOutputVol(SYSTEM_CMD,
 										chargingInfo[groupIndex]->EvBatterytargetVoltage,
 										chargingInfo[groupIndex]->EvBatterytargetVoltage,
@@ -1196,6 +1276,7 @@ int main(void)
 
 
 									if (chargingInfo[groupIndex]->EvBatterytargetVoltage == 0)
 									if (chargingInfo[groupIndex]->EvBatterytargetVoltage == 0)
 									{
 									{
+										//PRINTF_FUNC("sys ******** 2 \n");
 										SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
 										SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
 										FlashLed(SYSTEM_CMD, PSU_FLASH_NORMAL);
 										FlashLed(SYSTEM_CMD, PSU_FLASH_NORMAL);
 									}
 									}
@@ -1238,63 +1319,135 @@ int main(void)
 									// 閒置端與車端要求電壓接近
 									// 閒置端與車端要求電壓接近
 									PRINTF_FUNC("=============Smart Charging : _REASSIGNED_RELAY_A_TO_M============= Step 13 \n");
 									PRINTF_FUNC("=============Smart Charging : _REASSIGNED_RELAY_A_TO_M============= Step 13 \n");
 									ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_RELAY_A_TO_M;
 									ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_RELAY_A_TO_M;
-									gettimeofday(&_averageComp_time, NULL);
+								}
+								else
+								{
+									if ((GetTimeoutValue(_max_time) / 1000) > 500)
+									{
+										gettimeofday(&_max_time, NULL);
+									}
 								}
 								}
 							}
 							}
 							else if(ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_WAITING)
 							else if(ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_WAITING)
 							{
 							{
-								int avrTime = GetTimeoutValue(_averageComp_time) / 1000;
+								int idleCurrent = 0;
+								int chargingCurrent = 0;
 
 
-								if (avrTime > 10000)
+								for (byte subIndex = 0; subIndex < ShmPsuData->GroupCount; subIndex++)
+								{
+									if (chargingInfo[subIndex]->SystemStatus == S_IDLE ||
+											chargingInfo[subIndex]->SystemStatus == S_RESERVATION ||
+											chargingInfo[subIndex]->SystemStatus == S_REASSIGN_CHECK)
+										idleCurrent = ShmPsuData->PsuGroup[subIndex].GroupPresentOutputCurrent;
+									else
+										chargingCurrent = ShmPsuData->PsuGroup[subIndex].GroupPresentOutputCurrent;
+								}
+
+								if (idleCurrent >= chargingCurrent - PRE_CHARG_RANGE)
 								{
 								{
-									// 閒置端與車端要求電壓接近
 									PRINTF_FUNC("=============Smart Charging_0 : _REASSIGNED_COMP============= Step 15 \n");
 									PRINTF_FUNC("=============Smart Charging_0 : _REASSIGNED_COMP============= Step 15 \n");
 									ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_COMP;
 									ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_COMP;
 								}
 								}
+								else
+								{
+									if ((GetTimeoutValue(_max_time) / 1000) > 500)
+									{
+										gettimeofday(&_max_time, NULL);
+									}
+								}
 							}
 							}
 
 
 							if (chargingInfo[groupIndex]->AvailableChargingCurrent > 0)
 							if (chargingInfo[groupIndex]->AvailableChargingCurrent > 0)
 							{
 							{
-								if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_ADJUST_A_TO_M)
+								if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_ADJUST_A_TO_M)
 								{
 								{
+									byte reassignIndex = ELEMENT_NOT_FIND;
+
 									for (byte subIndex = 0; subIndex < ShmPsuData->GroupCount; subIndex++)
 									for (byte subIndex = 0; subIndex < ShmPsuData->GroupCount; subIndex++)
 									{
 									{
 										if (chargingInfo[subIndex]->SystemStatus == S_IDLE ||
 										if (chargingInfo[subIndex]->SystemStatus == S_IDLE ||
-												chargingInfo[subIndex]->SystemStatus == S_RESERVATION)
+												chargingInfo[subIndex]->SystemStatus == S_RESERVATION ||
+												chargingInfo[subIndex]->SystemStatus == S_REASSIGN_CHECK)
 										{
 										{
-											// 閒置模塊升壓
-											PresentOutputVol(subIndex,
-													chargingInfo[groupIndex]->EvBatterytargetVoltage,
-													ZERO_CURRENT);
+											reassignIndex = subIndex;
+//											if ((GetTimeoutValue(_max_time) / 1000) <= 50)
+//											{
+//												// 閒置模塊升壓,另對剛分配近來的模塊,預上升電流值 (preChargingCur)
+//												PresentOutputVol(subIndex,
+//														chargingInfo[groupIndex]->EvBatterytargetVoltage,
+//														ZERO_CURRENT + preChargingTarget);
+//											}
+											//PRINTF_FUNC("preChargingCur = %d \n", preChargingCur);
+											if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_WAITING)
+											{
+												preChargingCur = ShmPsuData->PsuGroup[subIndex].GroupPresentOutputCurrent;
+											}
+											else
+												preChargingCur = 0;
 										}
 										}
 										else
 										else
 										{
 										{
+											//PRINTF_FUNC("CurOutputCurrent = %d \n", ShmPsuData->PsuGroup[subIndex].GroupPresentOutputCurrent - preChargingCur);
 											// 充電中的模塊維持輸出
 											// 充電中的模塊維持輸出
-											PresentOutputVol(subIndex,
-												chargingInfo[subIndex]->EvBatterytargetVoltage,
-												chargingInfo[subIndex]->EvBatterytargetCurrent);
+//											if ((GetTimeoutValue(_max_time) / 1000) <= 50)
+//											{
+//												PresentOutputVol(subIndex,
+//													chargingInfo[subIndex]->EvBatterytargetVoltage,
+//													chargingInfo[subIndex]->EvBatterytargetCurrent - preChargingCur);
+//											}
+
+											if ((ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_WAITING) &&
+													(preChargingCur >= preChargingTarget - ZERO_CURRENT))
+												preChargingTarget += PRE_CHARG_STEP_CUR;
+
+											if (preChargingTarget >= chargingInfo[subIndex]->EvBatterytargetCurrent / 2)
+												preChargingTarget = chargingInfo[subIndex]->EvBatterytargetCurrent / 2;
 										}
 										}
+									}
 
 
-										if (chargingInfo[groupIndex]->EvBatterytargetVoltage == 0)
-										{
-											SwitchPower(subIndex, PSU_POWER_OFF);
-											FlashLed(subIndex, PSU_FLASH_NORMAL);
-										}
-										else
+									if (reassignIndex != ELEMENT_NOT_FIND)
+									{
+										if ((GetTimeoutValue(_max_time) / 1000) <= 50)
 										{
 										{
-											SwitchPower(subIndex, PSU_POWER_ON);
-											FlashLed(subIndex, PSU_FLASH_ON);
+											//PRINTF_FUNC("set out (%d) value = %d******** 5 \n", reassignIndex, ZERO_CURRENT + preChargingTarget);
+											// 閒置模塊升壓,另對剛分配近來的模塊,預上升電流值 (preChargingCur)
+											PresentOutputVol(reassignIndex,
+												chargingInfo[groupIndex]->EvBatterytargetVoltage,
+												ZERO_CURRENT + preChargingTarget);
+
+											byte _ovCahrgingCur = 0;
+											if (preChargingCur > PRE_CHARG_STEP_CUR)
+												_ovCahrgingCur = PRE_CHARG_STEP_CUR;
+
+											//PRINTF_FUNC("set out (%d) value = %f******** 6 \n", groupIndex, chargingInfo[groupIndex]->EvBatterytargetCurrent - preChargingCur - _ovCahrgingCur);
+											PresentOutputVol(groupIndex,
+												chargingInfo[groupIndex]->EvBatterytargetVoltage,
+												chargingInfo[groupIndex]->EvBatterytargetCurrent - preChargingCur - _ovCahrgingCur);
 										}
 										}
 									}
 									}
+
+									if (chargingInfo[groupIndex]->EvBatterytargetVoltage == 0)
+									{
+										//PRINTF_FUNC("sys ******** 3 \n");
+										SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
+										FlashLed(SYSTEM_CMD, PSU_FLASH_NORMAL);
+									}
+									else
+									{
+										SwitchPower(SYSTEM_CMD, PSU_POWER_ON);
+										FlashLed(SYSTEM_CMD, PSU_FLASH_ON);
+									}
 								}
 								}
 								else
 								else
 								{
 								{
+									//PRINTF_FUNC("set out (%d) value = %f******** 7 \n", groupIndex, chargingInfo[groupIndex]->EvBatterytargetCurrent);
 									PresentOutputVol(groupIndex,
 									PresentOutputVol(groupIndex,
 										chargingInfo[groupIndex]->EvBatterytargetVoltage,
 										chargingInfo[groupIndex]->EvBatterytargetVoltage,
 										chargingInfo[groupIndex]->EvBatterytargetCurrent);
 										chargingInfo[groupIndex]->EvBatterytargetCurrent);
 
 
 									if (chargingInfo[groupIndex]->EvBatterytargetVoltage == 0)
 									if (chargingInfo[groupIndex]->EvBatterytargetVoltage == 0)
 									{
 									{
+										//PRINTF_FUNC("%d ******** 4 \n", groupIndex);
 										SwitchPower(groupIndex, PSU_POWER_OFF);
 										SwitchPower(groupIndex, PSU_POWER_OFF);
 										FlashLed(groupIndex, PSU_FLASH_NORMAL);
 										FlashLed(groupIndex, PSU_FLASH_NORMAL);
 									}
 									}
@@ -1314,6 +1467,7 @@ int main(void)
 						{
 						{
 							if (!isCharging)
 							if (!isCharging)
 							{
 							{
+								//PRINTF_FUNC("sys ******** 5 \n");
 								SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
 								SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
 								FlashLed(SYSTEM_CMD, PSU_FLASH_NORMAL);
 								FlashLed(SYSTEM_CMD, PSU_FLASH_NORMAL);
 
 
@@ -1350,9 +1504,20 @@ int main(void)
 								SwitchPower(groupIndex, PSU_POWER_OFF);
 								SwitchPower(groupIndex, PSU_POWER_OFF);
 								FlashLed(groupIndex, PSU_FLASH_NORMAL);
 								FlashLed(groupIndex, PSU_FLASH_NORMAL);
 							}
 							}
-							ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_NONE;
+
+							if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_WAITING)
+								ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_COMP;
+							else
+								ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_NONE;
 						}
 						}
 					}
 					}
+					else if ((chargingInfo[groupIndex]->SystemStatus >= S_PREPARNING && chargingInfo[groupIndex]->SystemStatus <= S_PREPARING_FOR_EV) &&
+							ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_AVER)
+					{
+						//PRINTF_FUNC("%d ******** 7 \n", groupIndex);
+						SwitchPower(groupIndex, PSU_POWER_OFF);
+						FlashLed(groupIndex, PSU_FLASH_NORMAL);
+					}
 				}
 				}
 					break;
 					break;
 			}
 			}

+ 3 - 1
EVSE/Projects/DS60-120/Apps/Module_PsuComm.h

@@ -41,14 +41,16 @@ struct ChargingInfoData *chargingInfo[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANT
 
 
 struct timeval _cmdSubPriority_time;
 struct timeval _cmdSubPriority_time;
 byte _getCapDelayCount;
 byte _getCapDelayCount;
-struct timeval _averageComp_time;
 struct timeval _derating_time;
 struct timeval _derating_time;
+struct timeval _max_time;
 
 
 struct timeval _test_time;
 struct timeval _test_time;
 
 
 bool isCharging = false;
 bool isCharging = false;
 bool isWaitingAver = false;
 bool isWaitingAver = false;
 bool isReadToCharging = false;
 bool isReadToCharging = false;
+int preChargingTarget;
+int preChargingCur;
 
 
 float toAverVolPoint;
 float toAverVolPoint;
 byte toAverVolCount;
 byte toAverVolCount;

BIN
EVSE/Projects/DS60-120/Apps/ReadCmdline


+ 2 - 1
EVSE/Projects/DS60-120/Apps/ReadCmdline.c

@@ -789,7 +789,8 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
         	    }
         	    }
 
 
     		    //ev task do this
     		    //ev task do this
-    		    _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingPower = ((float)((_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingVoltage) * (_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingCurrent)) / 1000);
+    		    _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingPower =
+    		    		((float)((_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingVoltage) * (_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingCurrent)) / 1000);
 
 
     		    if (_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus == 0x02){
     		    if (_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus == 0x02){
     		         printf ("Charging Ground Fault check Fail (%d)\n",_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus);
     		         printf ("Charging Ground Fault check Fail (%d)\n",_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus);

+ 5 - 0
EVSE/Projects/DS60-120/Apps/internalComm.c

@@ -70,6 +70,11 @@ unsigned char Query_FW_Ver(unsigned char fd, unsigned char targetAddr, Ver *Ret_
 	unsigned char chksum = 0x00;
 	unsigned char chksum = 0x00;
 	unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
 	unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
 
 
+//		for (int i = 0; i < 7; i++)
+//			printf("tx = %x \n", tx[i]);
+//		for (int i = 0; i < len; i++)
+//			printf("rx = %x \n", rx[i]);
+
 	if(len > 6)
 	if(len > 6)
 	{
 	{
 		if (len < 6+(rx[4] | rx[5]<<8))
 		if (len < 6+(rx[4] | rx[5]<<8))

BIN
EVSE/Projects/DS60-120/Apps/main


+ 193 - 55
EVSE/Projects/DS60-120/Apps/main.c

@@ -81,6 +81,11 @@ void gpio_set_value(unsigned int gpio, unsigned int value);
 void PRINTF_FUNC(char *string, ...);
 void PRINTF_FUNC(char *string, ...);
 void ChangeGunSelectByIndex(byte sel);
 void ChangeGunSelectByIndex(byte sel);
 
 
+void RecordAlarmCode(byte gunIndex, char *code);
+void RecordWarningCode(byte gunIndex, char *code);
+void ReleaseWarningCodeByString(byte gunIndex, char *code);
+void ReleaseAlarmCode(byte gunIndex);
+
 #define DEBUG_INFO_MSG(format, args...) StoreLogMsg_1("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_INFO_MSG(format, args...) StoreLogMsg_1("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_WARN_MSG(format, args...) StoreLogMsg_1("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_WARN_MSG(format, args...) StoreLogMsg_1("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_ERROR_MSG(format, args...) StoreLogMsg_1("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_ERROR_MSG(format, args...) StoreLogMsg_1("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
@@ -118,7 +123,7 @@ bool isModelNameMatch = true;
 
 
 int rfidFd = -1;
 int rfidFd = -1;
 char* rfidPortName = "/dev/ttyS2";
 char* rfidPortName = "/dev/ttyS2";
-char* fwVersion = "D0.11.00.0000.00";
+char* fwVersion = "D0.13.00.0000.00";
 
 
 //================================================
 //================================================
 // initial can-bus
 // initial can-bus
@@ -1851,50 +1856,160 @@ bool IsAuthorizingMode()
 //===============================================
 //===============================================
 // 紀錄 Alarm Code
 // 紀錄 Alarm Code
 //===============================================
 //===============================================
-void RecordAlarmCode(char *code)
+void RecordAlarmCode(byte gunIndex, char *code)
 {
 {
-	if (strcmp(code, "012234") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGfdTrip = YES;
-	if (strcmp(code, "012235") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGfdTrip = YES;
-	if (strcmp(code, "012236") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip = YES;
-	if (strcmp(code, "012288") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsOutputUVPFail = YES;
-	if (strcmp(code, "012289") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoOutputUVPFail = YES;
-	if (strcmp(code, "012290") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbtOutputUVPFail = YES;
-
-	if (strcmp(code, "012296") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning = YES;
-	if (strcmp(code, "012297") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning = YES;
-	if (strcmp(code, "012298") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning = YES;
+	memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, code, 6);
+
+	if (strcmp(code, "012234") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGfdTrip = YES;
+	if (strcmp(code, "012235") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGfdTrip = YES;
+	if (strcmp(code, "012236") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip = YES;
+	if (strcmp(code, "012288") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsOutputUVPFail = YES;
+	if (strcmp(code, "012289") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoOutputUVPFail = YES;
+	if (strcmp(code, "012290") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbtOutputUVPFail = YES;
+}
+
+void RecordWarningCode(byte gunIndex, char *code)
+{
+	memcpy(chargingInfo[gunIndex]->ConnectorWarningCode, code, 6);
+
+	if (strcmp(code, "012296") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning = YES;
+	if (strcmp(code, "012297") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning = YES;
+	if (strcmp(code, "012298") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning = YES;
 }
 }
 
 
 void ReleaseAlarmCode(byte gunIndex)
 void ReleaseAlarmCode(byte gunIndex)
 {
 {
+	bool isCleanCheck = false;
+	char code[7];
+
 	if (chargingInfo[gunIndex]->Type == _Type_Chademo)
 	if (chargingInfo[gunIndex]->Type == _Type_Chademo)
 	{
 	{
-		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGfdTrip = NO;
-		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoOutputUVPFail = NO;
-		ShmStatusCodeData->FaultCode.FaultEvents.bits.ChademoOutputRelayWelding = NO;
-		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning = NO;
+		if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012234", 6) == EQUAL &&
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGfdTrip == YES)
+		{
+			memcpy(code, "012234", 6);
+			memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, "", 6);
+			isCleanCheck = true;
+		}
+		else if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012289", 6) == EQUAL &&
+				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoOutputUVPFail == YES)
+		{
+			memcpy(code, "012289", 6);
+			memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, "", 6);
+			isCleanCheck = true;
+		}
+		else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning == YES)
+		{
+			ReleaseWarningCodeByString(gunIndex, "012296");
+		}
 	}
 	}
 	else if (chargingInfo[gunIndex]->Type == _Type_GB)
 	else if (chargingInfo[gunIndex]->Type == _Type_GB)
 	{
 	{
-		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip = NO;
-		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbtOutputUVPFail = NO;
-		ShmStatusCodeData->FaultCode.FaultEvents.bits.GbOutputRelayWelding = NO;
-		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning = NO;
+		if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012236", 6) == EQUAL &&
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip == YES)
+		{
+			memcpy(code, "012236", 6);
+			memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, "", 6);
+			isCleanCheck = true;
+		}
+		else if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012290", 6) == EQUAL &&
+				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbtOutputUVPFail == YES)
+		{
+			memcpy(code, "012290", 6);
+			memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, "", 6);
+			isCleanCheck = true;
+		}
+		else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning == YES)
+		{
+			ReleaseWarningCodeByString(gunIndex, "012298");
+		}
 	}
 	}
 	else if (chargingInfo[gunIndex]->Type == _Type_CCS_2)
 	else if (chargingInfo[gunIndex]->Type == _Type_CCS_2)
 	{
 	{
-		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGfdTrip = NO;
-		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsOutputUVPFail = NO;
-		ShmStatusCodeData->FaultCode.FaultEvents.bits.CcsOutputRelayWelding = NO;
-		ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning = NO;
+		if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012235", 6) == EQUAL &&
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGfdTrip == YES)
+		{
+			memcpy(code, "012235", 6);
+			memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, "", 6);
+			isCleanCheck = true;
+		}
+		else if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012288", 6) == EQUAL &&
+				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsOutputUVPFail == YES)
+		{
+			memcpy(code, "012288", 6);
+			memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, "", 6);
+			isCleanCheck = true;
+		}
+		else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning == YES)
+		{
+			ReleaseWarningCodeByString(gunIndex, "012297");
+		}
+	}
+
+	if (isCleanCheck)
+	{
+		for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++)
+		{
+			if (index == gunIndex)
+				continue;
+			else
+			{
+				if (strncmp((char *)chargingInfo[index]->ConnectorAlarmCode, code, 6) != EQUAL)
+				{
+					if (strncmp(code, "012234", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGfdTrip = NO;
+					if (strncmp(code, "012289", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoOutputUVPFail = NO;
+
+					if (strncmp(code, "012236", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip = NO;
+					if (strncmp(code, "012290", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbtOutputUVPFail = NO;
+
+					if (strncmp(code, "012235", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGfdTrip = NO;
+					if (strncmp(code, "012288", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsOutputUVPFail = NO;
+				}
+			}
+		}
 	}
 	}
 }
 }
 
 
-void CleanAlarmCodeByString(char *code)
+void ReleaseWarningCodeByString(byte gunIndex, char *code)
 {
 {
-	if (strcmp(code, "012296") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning = NO;
-	if (strcmp(code, "012297") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning = NO;
-	if (strcmp(code, "012298") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning = NO;
+	bool isCleanCheck = false;
+
+	if (strncmp((char *)chargingInfo[gunIndex]->ConnectorWarningCode, code, 6) == EQUAL &&
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning == YES)
+	{
+		memcpy(chargingInfo[gunIndex]->ConnectorWarningCode, "", 6);
+		isCleanCheck = true;
+	}
+	else if (strncmp((char *)chargingInfo[gunIndex]->ConnectorWarningCode, code, 6) == EQUAL &&
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning == YES)
+	{
+		memcpy(chargingInfo[gunIndex]->ConnectorWarningCode, "", 6);
+		isCleanCheck = true;
+	}
+	else if (strncmp((char *)chargingInfo[gunIndex]->ConnectorWarningCode, code, 6) == EQUAL &&
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning == YES)
+	{
+		memcpy(chargingInfo[gunIndex]->ConnectorWarningCode, "", 6);
+		isCleanCheck = true;
+	}
+
+	if (isCleanCheck)
+	{
+		for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++)
+		{
+			if (index == gunIndex)
+				continue;
+			else
+			{
+				if (strncmp((char *)chargingInfo[index]->ConnectorWarningCode, code, 6) != EQUAL)
+				{
+					if (strncmp(code, "012296", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning = NO;
+					if (strncmp(code, "012297", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning = NO;
+					if (strncmp(code, "012298", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning = NO;
+				}
+			}
+		}
+	}
 }
 }
 //===============================================
 //===============================================
 // EmergencyStop and Charging Stop
 // EmergencyStop and Charging Stop
@@ -2068,6 +2183,8 @@ void ChkPrimaryStatus()
 					}
 					}
 				}
 				}
 					break;
 					break;
+				case S_REASSIGN_CHECK:
+				case S_REASSIGN:
 				case S_PREPARNING:
 				case S_PREPARNING:
 				case S_PREPARING_FOR_EV:
 				case S_PREPARING_FOR_EV:
 				case S_PREPARING_FOR_EVSE:
 				case S_PREPARING_FOR_EVSE:
@@ -2583,7 +2700,6 @@ bool AddGunInfoByConnector(byte typeValue, byte slots)
 		case '2': // IEC 62196-2 Type 1/SAE J1772 Socket
 		case '2': // IEC 62196-2 Type 1/SAE J1772 Socket
 			break;
 			break;
 		case '3': // IEC 62196-2 Type 2 Plug
 		case '3': // IEC 62196-2 Type 2 Plug
-			break;
 		case '4': // IEC 62196-2 Type 2 Socket
 		case '4': // IEC 62196-2 Type 2 Socket
 			if (AC_QUANTITY > _ac_Index)
 			if (AC_QUANTITY > _ac_Index)
 			{
 			{
@@ -2701,7 +2817,7 @@ bool CheckConnectorTypeStatus()
 		// 偵測槍屬於哪個 slot : 可知道插在板上的Slot 0 或 1 是 Chademo 還是 CCS
 		// 偵測槍屬於哪個 slot : 可知道插在板上的Slot 0 或 1 是 Chademo 還是 CCS
 		for (byte gunIndex = 0; gunIndex < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; gunIndex++)
 		for (byte gunIndex = 0; gunIndex < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; gunIndex++)
 		{
 		{
-			if (bd0_1_status == 0 && bd0_2_status == 1)
+			if (gunIndex == 0 && bd0_1_status == 0 && bd0_2_status == 1)
 			{
 			{
 				// 與硬體相同 type : Chademo
 				// 與硬體相同 type : Chademo
 				if (chargingInfo[gunIndex]->Type == _Type_Chademo)
 				if (chargingInfo[gunIndex]->Type == _Type_Chademo)
@@ -2709,7 +2825,7 @@ bool CheckConnectorTypeStatus()
 					chargingInfo[gunIndex]->Evboard_id = 0x01;
 					chargingInfo[gunIndex]->Evboard_id = 0x01;
 				}
 				}
 			}
 			}
-			else if (bd0_1_status == 1 && bd0_2_status == 0)
+			else if (gunIndex == 0 && bd0_1_status == 1 && bd0_2_status == 0)
 			{
 			{
 				// 與硬體相同 type : CCS
 				// 與硬體相同 type : CCS
 				if (chargingInfo[gunIndex]->Type == _Type_CCS_2)
 				if (chargingInfo[gunIndex]->Type == _Type_CCS_2)
@@ -2717,7 +2833,7 @@ bool CheckConnectorTypeStatus()
 					chargingInfo[gunIndex]->Evboard_id = 0x01;
 					chargingInfo[gunIndex]->Evboard_id = 0x01;
 				}
 				}
 			}
 			}
-			else if (bd0_1_status == 1 && bd0_2_status == 1)
+			else if (gunIndex == 0 && bd0_1_status == 1 && bd0_2_status == 1)
 			{
 			{
 				// 與硬體相同 type : GB
 				// 與硬體相同 type : GB
 				if (chargingInfo[gunIndex]->Type == _Type_GB)
 				if (chargingInfo[gunIndex]->Type == _Type_GB)
@@ -2726,7 +2842,7 @@ bool CheckConnectorTypeStatus()
 				}
 				}
 			}
 			}
 
 
-			if (bd1_1_status == 0 && bd1_2_status == 1)
+			if (gunIndex == 1 && bd1_1_status == 0 && bd1_2_status == 1)
 			{
 			{
 				// 與硬體相同 type : Chademo
 				// 與硬體相同 type : Chademo
 				if (chargingInfo[gunIndex]->Type == _Type_Chademo)
 				if (chargingInfo[gunIndex]->Type == _Type_Chademo)
@@ -2737,7 +2853,7 @@ bool CheckConnectorTypeStatus()
 				if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount == 1)
 				if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount == 1)
 					chargingInfo[gunIndex]->Evboard_id = 0x01;
 					chargingInfo[gunIndex]->Evboard_id = 0x01;
 			}
 			}
-			else if (bd1_1_status == 1 && bd1_2_status == 0)
+			else if (gunIndex == 1 && bd1_1_status == 1 && bd1_2_status == 0)
 			{
 			{
 				// 與硬體相同 type : CCS
 				// 與硬體相同 type : CCS
 				if (chargingInfo[gunIndex]->Type == _Type_CCS_2)
 				if (chargingInfo[gunIndex]->Type == _Type_CCS_2)
@@ -2748,7 +2864,7 @@ bool CheckConnectorTypeStatus()
 				if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount == 1)
 				if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount == 1)
 					chargingInfo[gunIndex]->Evboard_id = 0x01;
 					chargingInfo[gunIndex]->Evboard_id = 0x01;
 			}
 			}
-			else if (bd1_1_status == 1 && bd1_2_status == 1)
+			else if (gunIndex == 1 && bd1_1_status == 1 && bd1_2_status == 1)
 			{
 			{
 				// 與硬體相同 type : GB
 				// 與硬體相同 type : GB
 				if (chargingInfo[gunIndex]->Type == _Type_GB)
 				if (chargingInfo[gunIndex]->Type == _Type_GB)
@@ -3968,6 +4084,24 @@ int main(void)
 						else if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_AVER &&
 						else if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_AVER &&
 								ShmSysConfigAndInfo->SysInfo.ReAssignedFlag != _REASSIGNED_NONE)
 								ShmSysConfigAndInfo->SysInfo.ReAssignedFlag != _REASSIGNED_NONE)
 						{
 						{
+							// 如果在切換最大充的過程中,需等待最大充切換完成後,在走均充流程
+							if (ShmSysConfigAndInfo->SysInfo.BridgeRelayStatus == YES)
+							{
+								if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag != _REASSIGNED_COMP &&
+										ShmSysConfigAndInfo->SysInfo.ReAssignedFlag != _REASSIGNED_WAITING)
+								{
+									PRINTF_FUNC("=============Smart Charging============= Step 14 \n");
+									ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_WAITING;
+								}
+								else if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_COMP)
+								{
+									ShmSysConfigAndInfo->SysInfo.MainChargingMode = _MAIN_CHARGING_MODE_MAX;
+									ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_NONE;
+								}
+							}
+
+							if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == gun_index)
+								ShmSysConfigAndInfo->SysInfo.ConnectorPage = _LCM_PRE_CHARGE;
 							continue;
 							continue;
 						}
 						}
 					}
 					}
@@ -3976,6 +4110,9 @@ int main(void)
 						setChargerMode(gun_index, MODE_REASSIGN);
 						setChargerMode(gun_index, MODE_REASSIGN);
 					else
 					else
 						setChargerMode(gun_index, MODE_PRECHARGE);
 						setChargerMode(gun_index, MODE_PRECHARGE);
+
+					if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == gun_index)
+						ShmSysConfigAndInfo->SysInfo.ConnectorPage = _LCM_PRE_CHARGE;
 				}
 				}
 					break;
 					break;
 				case S_REASSIGN:
 				case S_REASSIGN:
@@ -3983,6 +4120,7 @@ int main(void)
 					if (isModeChange(gun_index))
 					if (isModeChange(gun_index))
 					{
 					{
 						PRINTF_FUNC("S_REASSIGN================================== %x \n", gun_index);
 						PRINTF_FUNC("S_REASSIGN================================== %x \n", gun_index);
+						gettimeofday(&_toAverage_time, NULL);
 					}
 					}
 
 
 					// 重新分配,此階段主要是讓已經在充電或者準備進入充電前的緩衝
 					// 重新分配,此階段主要是讓已經在充電或者準備進入充電前的緩衝
@@ -4097,12 +4235,12 @@ int main(void)
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 						{
 							// GFD 錯誤停止
 							// GFD 錯誤停止
-							RecordAlarmCode("012234");
+							RecordAlarmCode(gun_index, "012234");
 						}
 						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 						{
 							// GFD 警告
 							// GFD 警告
-							RecordAlarmCode("012296");
+							RecordWarningCode(gun_index, "012296");
 						}
 						}
 					}
 					}
 					else if (chargingInfo[gun_index]->Type == _Type_GB)
 					else if (chargingInfo[gun_index]->Type == _Type_GB)
@@ -4116,12 +4254,12 @@ int main(void)
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 						{
 							// GFD 錯誤停止
 							// GFD 錯誤停止
-							RecordAlarmCode("012236");
+							RecordAlarmCode(gun_index, "012236");
 						}
 						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 						{
 							// GFD 警告
 							// GFD 警告
-							RecordAlarmCode("012298");
+							RecordWarningCode(gun_index, "012298");
 						}
 						}
 					}
 					}
 					else if (chargingInfo[gun_index]->Type == _Type_CCS_2)
 					else if (chargingInfo[gun_index]->Type == _Type_CCS_2)
@@ -4136,12 +4274,12 @@ int main(void)
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 						{
 							// GFD 錯誤停止
 							// GFD 錯誤停止
-							RecordAlarmCode("012235");
+							RecordAlarmCode(gun_index, "012235");
 						}
 						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 						{
 							// GFD 警告
 							// GFD 警告
-							RecordAlarmCode("012297");
+							RecordWarningCode(gun_index, "012297");
 						}
 						}
 					}
 					}
 
 
@@ -4176,67 +4314,67 @@ int main(void)
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 						{
 							// GFD 錯誤停止
 							// GFD 錯誤停止
-							RecordAlarmCode("012234");
+							RecordAlarmCode(gun_index, "012234");
 						}
 						}
 						else if ((chargingInfo[gun_index]->EvBatterytargetVoltage > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
 						else if ((chargingInfo[gun_index]->EvBatterytargetVoltage > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
 								(chargingInfo[gun_index]->RemainChargingDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL))
 								(chargingInfo[gun_index]->RemainChargingDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL))
 						{
 						{
 							// UVP
 							// UVP
-							RecordAlarmCode("012289");
+							RecordAlarmCode(gun_index, "012289");
 							ChargingTerminalProcess(gun_index);
 							ChargingTerminalProcess(gun_index);
 						}
 						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 						{
 							// GFD 警告
 							// GFD 警告
-							RecordAlarmCode("012296");
+							RecordWarningCode(gun_index, "012296");
 						}
 						}
 						else
 						else
-							CleanAlarmCodeByString("012296");
+							ReleaseWarningCodeByString(gun_index, "012296");
 					}
 					}
 					else if (chargingInfo[gun_index]->Type == _Type_GB)
 					else if (chargingInfo[gun_index]->Type == _Type_GB)
 					{
 					{
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 						{
 							// GFD 錯誤停止
 							// GFD 錯誤停止
-							RecordAlarmCode("012236");
+							RecordAlarmCode(gun_index, "012236");
 						}
 						}
 						else if (isPrechargeStatus_gb(gun_index) == 10 &&
 						else if (isPrechargeStatus_gb(gun_index) == 10 &&
 								((chargingInfo[gun_index]->EvBatterytargetVoltage > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
 								((chargingInfo[gun_index]->EvBatterytargetVoltage > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
 								(chargingInfo[gun_index]->RemainChargingDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL)))
 								(chargingInfo[gun_index]->RemainChargingDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL)))
 						{
 						{
 							// UVP
 							// UVP
-							RecordAlarmCode("012290");
+							RecordAlarmCode(gun_index, "012290");
 							ChargingTerminalProcess(gun_index);
 							ChargingTerminalProcess(gun_index);
 						}
 						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 						{
 							// GFD 警告
 							// GFD 警告
-							RecordAlarmCode("012298");
+							RecordWarningCode(gun_index, "012298");
 						}
 						}
 						else
 						else
-							CleanAlarmCodeByString("012298");
+							ReleaseWarningCodeByString(gun_index, "012298");
 					}
 					}
 					else if (chargingInfo[gun_index]->Type == _Type_CCS_2)
 					else if (chargingInfo[gun_index]->Type == _Type_CCS_2)
 					{
 					{
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 						{
 							// GFD 錯誤停止
 							// GFD 錯誤停止
-							RecordAlarmCode("012235");
+							RecordAlarmCode(gun_index, "012235");
 						}
 						}
 						else if ((chargingInfo[gun_index]->EvBatterytargetVoltage > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
 						else if ((chargingInfo[gun_index]->EvBatterytargetVoltage > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
 								(chargingInfo[gun_index]->RemainChargingDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL))
 								(chargingInfo[gun_index]->RemainChargingDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL))
 						{
 						{
 							// UVP
 							// UVP
-							RecordAlarmCode("012288");
+							RecordAlarmCode(gun_index, "012288");
 							ChargingTerminalProcess(gun_index);
 							ChargingTerminalProcess(gun_index);
 						}
 						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 						{
 							// GFD 警告
 							// GFD 警告
-							RecordAlarmCode("012297");
+							RecordWarningCode(gun_index, "012297");
 						}
 						}
 						else
 						else
-							CleanAlarmCodeByString("012297");
+							ReleaseWarningCodeByString(gun_index, "012297");
 					}
 					}
 
 
 					if (isEvBoardStopChargeFlag(gun_index) ||
 					if (isEvBoardStopChargeFlag(gun_index) ||
@@ -4332,7 +4470,7 @@ int main(void)
 					if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 					if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 					{
 					{
 						// GFD 錯誤停止
 						// GFD 錯誤停止
-						RecordAlarmCode("012235");
+						RecordAlarmCode(gun_index, "012235");
 					}
 					}
 
 
 					if (isEvBoardStopChargeFlag(gun_index) == YES ||
 					if (isEvBoardStopChargeFlag(gun_index) == YES ||
@@ -4370,7 +4508,7 @@ int main(void)
 					if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 					if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 					{
 					{
 						// GFD 錯誤停止
 						// GFD 錯誤停止
-						RecordAlarmCode("012235");
+						RecordAlarmCode(gun_index, "012235");
 					}
 					}
 
 
 					if (isEvBoardStopChargeFlag(gun_index) == YES ||
 					if (isEvBoardStopChargeFlag(gun_index) == YES ||

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

@@ -49,4 +49,5 @@ enum Timeout_flag
 	Timeout_ReturnToChargingGunDet = 	11
 	Timeout_ReturnToChargingGunDet = 	11
 };
 };
 
 
+struct timeval _toAverage_time;
 #endif /* TIMEOUT_H_ */
 #endif /* TIMEOUT_H_ */

Деякі файли не було показано, через те що забагато файлів було змінено