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

Merge branch 'master' of https://git.phihong.com.tw:30000/System_Integration/CSU3_AM335x

ct_chen 4 роки тому
батько
коміт
af509e23b9

+ 64 - 3
EVSE/Projects/AW-CCS/Apps/Module_InternalComm.c

@@ -1323,6 +1323,53 @@ unsigned char Config_AC_MCU_LEGACY_REQUEST(unsigned char fd, unsigned char targe
 	return result;
 }
 
+unsigned char Config_AC_MCU_RELAY(unsigned char fd, unsigned char targetAddr, Legacy_Request *Set_Buf)
+{
+	unsigned char result = FAIL;
+	unsigned char tx[9];
+	unsigned char rx[512];
+	unsigned char chksum = 0x00;
+
+	tx[0] = 0xaa;
+	tx[1] = 0x00;
+	tx[2] = targetAddr;
+	tx[3] = CMD_CONFIG_MCU_MODE;
+	tx[4] = 0x02;
+	tx[5] = 0x00;
+	tx[6] = Set_Buf->isLegacyRequest;
+	tx[7] = 0x00;
+
+	for(int idx=0;idx<(tx[4] | tx[5]<<8);idx++)
+		chksum ^= tx[6+idx];
+	tx[8] = chksum;
+
+	unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
+
+	if(len > 6)
+	{
+		if (len < 6+(rx[4] | rx[5]<<8))
+			return result;
+
+		chksum = 0x00;
+		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]) &&
+		   (rx[6] == 0x01))
+		{
+			result = PASS;
+
+		}
+	}
+
+	return result;
+}
+
 unsigned char Config_AC_MCU_RESET_REQUEST(unsigned char fd, unsigned char targetAddr, Mcu_Reset_Request *Set_Buf)
 {
 	unsigned char result = FAIL;
@@ -1797,12 +1844,28 @@ int main(void)
 				}
 				else
 				{
-					DEBUG_WARN("MCU-%d set relay request fail...%d\r\n", gun_index, failCount[gun_index]);
+					DEBUG_WARN("MCU-%d set request fail...%d\r\n", gun_index, failCount[gun_index]);
 					if(failCount[gun_index]<1000)
 					{
 						failCount[gun_index]++;
 					}
 				}
+				
+				//===============================
+				// Case 2-X : Config primary Relay
+				//===============================
+				if(Config_AC_MCU_RELAY(Uart1Fd, (gun_index>0?ADDR_AC_PRIMARY_2:ADDR_AC_PRIMARY_1),&ShmCharger->gun_info[gun_index].legacyRequest))
+				{
+					failCount[gun_index] = 0;
+				}
+				else
+				{
+					DEBUG_WARN("MCU-%d set relay fail...%d\r\n", gun_index, failCount[gun_index]);
+					if(failCount[gun_index]<1000)
+					{
+						failCount[gun_index]++;
+					}
+				}				
 
 				//===============================
 				// Case 3 : Query primary MCU status
@@ -2242,8 +2305,6 @@ int main(void)
 							}
 							else
 							{
-								ShmCharger->gun_info[gun_index].mcuFlag.isSetCpPwmDuty = OFF;
-
 								DEBUG_WARN("MCU-%d set cp pwn duty fail...%d\r\n", gun_index, failCount[gun_index]);
 								if(failCount[gun_index]<1000)
 								{

Різницю між файлами не показано, бо вона завелика
+ 493 - 362
EVSE/Projects/AW-CCS/Apps/main.c


+ 21 - 0
EVSE/Projects/AW-CCS/Apps/main.h

@@ -117,6 +117,24 @@
 #define LED_ACTION_HANDSHAKE_FAIL   	16
 #define LED_ACTION_INTERNET_DISCONNECT	17
 
+//=================================
+//CCS related define
+//=================================
+#define CCS_PWM_DUTY_CP_STAT_E			0			
+#define CCS_PWM_DUTY_5					5
+#define CCS_PWM_DUTY_100				100
+
+
+#define HANDSHAKE_DUTY_5				1
+#define HANDSHAKE_CCS					2
+#define HANDSHAKE_CP_STATE_E			3
+#define HANDSHAKE_SET_MAX_CURRENT		4
+#define HANDSHAKE_NORMAL_CP				5
+#define HANDSHAKE_NORMAL_CCS			6
+
+#define	CHARGING_MODE_CP				0
+#define	CHARGING_MODE_CCS				1
+
 
 #define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
@@ -298,6 +316,7 @@ typedef struct AC_PRIMARY_MCU_CP_PWM_DUTY
 typedef struct LEGACY_REQUEST
 {
 	unsigned char isLegacyRequest:1;
+	uint8_t isRelayOn:1;
 }Legacy_Request;
 
 typedef struct POWER_CONSUMPTION
@@ -497,6 +516,8 @@ typedef struct GUN_INFO
 	Set_Breathe_Led_Timing							setBreatheLedTiming;
 	Set_Led_Brightness								setLedBrightness;
 	Ccs_Info										ccsInfo;
+	uint8_t											ccsHandshakeState;
+	uint8_t											chargingMode;
 	uint16_t										targetCurrent;
 	uint16_t										isAuthPassEnd:1;
 	uint16_t										rfidReq:1;

BIN
EVSE/Projects/AW-CCS/Images/FactoryDefaultConfig.bin


BIN
EVSE/Projects/AW-CCS/Images/ramdisk.gz


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

@@ -156,6 +156,7 @@ enum _REASSIGNED_RESOURCE_STEP
 	_REASSIGNED_GET_NEW_CAP = 		2,	// 充電中的重新取得屬於自己火線上的總能量並透過小板通知車端 - 超過10秒直接跳下一步
 	_REASSIGNED_ADJUST_M_TO_A = 	3,	// 模塊重新分配完成
 	_REASSIGNED_RELAY_M_TO_A =		4,	// 切斷橋接的 Relay
+	_REASSIGNED_CHECK = 			5,
 
 	_REASSIGNED_PREPARE_A_TO_M = 	11,
 	_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
 	//
-	strcpy((char *)SysConfig.ModelName, "DSYE601J0EE2PH");
+	strcpy((char *)SysConfig.ModelName, "DSYE601J0EW2PH");
 	strcpy((char *)SysConfig.SerialNumber, "");
 
 	memset(SysConfig.SystemId, 0x00, sizeof(SysConfig.SystemId));
@@ -130,7 +130,7 @@ int main(int argc,char *argv[])
 	SysConfig.MaxChargingEnergy = 0;
 	SysConfig.MaxChargingCurrent = 200;		// ³Ì¤j¥i¿é¥X¹q¬y (¾ã¼Î)
 	SysConfig.MaxChargingDuration = 0;
-	SysConfig.AcMaxChargingCurrent = 32;
+	SysConfig.AcMaxChargingCurrent = 0;
 	SysConfig.PhaseLossPolicy = 0;
 	for(unsigned char i = 0; i < 10; i++)
 		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 (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
-					_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)
@@ -792,7 +802,7 @@ void SetK1K2RelayStatus(byte index)
 			else if (regRelay.relay_event.bits.Gun1_N == YES)
 				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)
 					outputRelay.relay_event.bits.CCS_Precharge = NO;
@@ -860,10 +870,13 @@ void SetK1K2RelayStatus(byte index)
 		{
 			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)
@@ -883,10 +896,13 @@ void SetK1K2RelayStatus(byte index)
 		{
 			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)
@@ -1538,6 +1554,11 @@ void GetAcStatus()
 {
 	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("CurLimit = %d \n", acStatus.CurLimit);
 	//				printf("PilotVol_P = %d \n", acStatus.PilotVol_P);
@@ -1621,7 +1642,6 @@ void AcChargeTypeProcess()
 				ChangeToCsuMode();
 				return;
 			}
-
 			GetAcStatus();
 			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
 						{
 							ChangeChargingEnergyValue(0);
-							ChangeChargingFeeValue(0);
+							if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
+								ChangeChargingFeeValue(0);
 						}
 
 						if(!ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
@@ -1039,7 +1040,8 @@ void ProcessPageInfo()
 						else
 						{
 							ChangeChargingEnergyValue(0);
-							ChangeChargingFeeValue(0);
+							if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
+								ChangeChargingFeeValue(0);
 						}
 
 						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 YES					1
 #define NO					0
-#define DERATING			30
+#define DERATING_COUNT		30
+#define DERATING_GAP		30
 #define ELEMENT_NOT_FIND	255
 #define CHK_VOL_RANGE		50
 #define CHK_CUR_RANGE		10
@@ -14,7 +15,9 @@
 #define ZERO_CURRENT		10			// 該值須保持最小為 1A
 #define ZERO_VOLTAGE		50
 #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
 
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
@@ -51,19 +54,21 @@ int StoreLogMsg(const char *fmt, ...)
 {
 	char Buf[4096+256];
 	char buffer[4096];
-	time_t CurrentTime;
-	struct tm *tm;
 	va_list args;
+	struct timeb  SeqEndTime;
+	struct tm *tm;
 
 	va_start(args, fmt);
 	int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
 	va_end(args);
 
 	memset(Buf,0,sizeof(Buf));
-	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,
 			tm->tm_year+1900,tm->tm_mon+1);
 	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].AvailablePower = totalPow;
-
+	// 總和該 Group 的可輸出電流
 	for (byte index = 0; index < ShmPsuData->PsuGroup[group].GroupPresentPsuQuantity; index++)
 	{
 		_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;
 
 	int _power = 0, _current = 0, _ratingcurrent = 0;
+	bool isGetAllDeratingCurrent = true;
+
 	for (byte index = 0; index < ShmPsuData->GroupCount; index++)
 	{
 		_power += ShmPsuData->PsuGroup[index].GroupAvailablePower;
 		_current += ShmPsuData->PsuGroup[index].GroupAvailableCurrent;
 		_ratingcurrent += chargingInfo[index]->DeratingChargingCurrent;
+		if (chargingInfo[index]->DeratingChargingCurrent == 0)
+			isGetAllDeratingCurrent = false;
 	}
 
+	// 如果不是所有群都得到 Derating current,則先不採樣該次的 ratingCurrent
+	if (!isGetAllDeratingCurrent) _ratingcurrent = 0;
+
 	ShmPsuData->SystemAvailableCurrent = _current;
 	ShmPsuData->SystemAvailablePower = _power;
 
@@ -365,6 +377,18 @@ void GetAvailableCapCallback(byte address, short maxVol, short minVol, short max
 		int halfCur = ShmPsuData->PsuGroup[group].GroupAvailableCurrent;
 		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);
 
 //		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)
 {
-	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 - 電壓
-	ShmPsuData->PsuGroup[group].GroupPresentOutputVoltage = outputVol;
+	ShmPsuData->PsuGroup[group].GroupPresentOutputVoltage = outVol;
 	// 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++)
 		{
+			bool needtoAdd = true;
+
 			if (ShmPsuData->PsuGroup[index].GroupPresentOutputVoltage > outputVol)
 				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;
 					isPass = false;
-					continue;
+					break;
 				}
 			}
 		}
@@ -764,6 +806,8 @@ void CheckSmartChargingStep(bool isWaitingAver, bool isCharging)
 			if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_AVER)
 			{
 				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;
 			}
 			else
@@ -965,9 +1009,6 @@ int main(void)
 						// Pooling Status
 						GetStatus(index);
 
-						// 取系統總輸出能力
-						GetModuleCap(index);
-
 						// 取得模塊輸入電壓
 						GetModuleInput(index);
 
@@ -1018,6 +1059,9 @@ int main(void)
 
 				for (byte groupIndex = 0; groupIndex < _gunCount; groupIndex++)
 				{
+					// 取系統總輸出能力
+					GetModuleCap(groupIndex);
+					// 取得模塊的當前輸出
 					GetModuleOutput(groupIndex);
 					// 針對各槍當前狀態,傳送需要回傳的資料指令
 					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]->PresentChargingCurrent * 10));
 							// 智能判斷 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 (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");
 										ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_ADJUST_M_TO_A;
 										gettimeofday(&_derating_time, NULL);
@@ -1080,6 +1145,11 @@ int main(void)
 									else
 									{
 										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;
 
-								// 需求電流不降低的情況下 -> 依然要切
-								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]->AvailableChargingCurrent);
+											chargingInfo[groupIndex]->AvailableChargingCurrent,
+											chargingInfo[groupIndex]->EvBatterytargetCurrent);
+
 									for (byte subIndex = 0; subIndex < ShmPsuData->GroupCount; subIndex++)
 									{
 										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;
 											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) &&
 										((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)
 								{
-									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),
 										ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent);
 
@@ -1128,67 +1200,75 @@ int main(void)
 									PRINTF_FUNC("=============Smart Charging : _REASSIGNED_RELAY_M_TO_A============= Step 4 \n");
 									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
 								{
+									//PRINTF_FUNC("set out (sys) value = %f******** 4 \n", chargingInfo[groupIndex]->EvBatterytargetCurrent);
 									// 該充電槍的目標電壓與目標電流
 									PresentOutputVol(SYSTEM_CMD,
 										chargingInfo[groupIndex]->EvBatterytargetVoltage,
@@ -1196,6 +1276,7 @@ int main(void)
 
 									if (chargingInfo[groupIndex]->EvBatterytargetVoltage == 0)
 									{
+										//PRINTF_FUNC("sys ******** 2 \n");
 										SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
 										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");
 									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)
 							{
-								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");
 									ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_COMP;
 								}
+								else
+								{
+									if ((GetTimeoutValue(_max_time) / 1000) > 500)
+									{
+										gettimeofday(&_max_time, NULL);
+									}
+								}
 							}
 
 							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++)
 									{
 										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
 										{
+											//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
 								{
+									//PRINTF_FUNC("set out (%d) value = %f******** 7 \n", groupIndex, chargingInfo[groupIndex]->EvBatterytargetCurrent);
 									PresentOutputVol(groupIndex,
 										chargingInfo[groupIndex]->EvBatterytargetVoltage,
 										chargingInfo[groupIndex]->EvBatterytargetCurrent);
 
 									if (chargingInfo[groupIndex]->EvBatterytargetVoltage == 0)
 									{
+										//PRINTF_FUNC("%d ******** 4 \n", groupIndex);
 										SwitchPower(groupIndex, PSU_POWER_OFF);
 										FlashLed(groupIndex, PSU_FLASH_NORMAL);
 									}
@@ -1314,6 +1467,7 @@ int main(void)
 						{
 							if (!isCharging)
 							{
+								//PRINTF_FUNC("sys ******** 5 \n");
 								SwitchPower(SYSTEM_CMD, PSU_POWER_OFF);
 								FlashLed(SYSTEM_CMD, PSU_FLASH_NORMAL);
 
@@ -1350,9 +1504,20 @@ int main(void)
 								SwitchPower(groupIndex, PSU_POWER_OFF);
 								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;
 			}

+ 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;
 byte _getCapDelayCount;
-struct timeval _averageComp_time;
 struct timeval _derating_time;
+struct timeval _max_time;
 
 struct timeval _test_time;
 
 bool isCharging = false;
 bool isWaitingAver = false;
 bool isReadToCharging = false;
+int preChargingTarget;
+int preChargingCur;
 
 float toAverVolPoint;
 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
-    		    _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){
     		         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 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+(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 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_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)
@@ -118,7 +123,7 @@ bool isModelNameMatch = true;
 
 int rfidFd = -1;
 char* rfidPortName = "/dev/ttyS2";
-char* fwVersion = "D0.11.00.0000.00";
+char* fwVersion = "D0.13.00.0000.00";
 
 //================================================
 // initial can-bus
@@ -1851,50 +1856,160 @@ bool IsAuthorizingMode()
 //===============================================
 // 紀錄 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)
 {
+	bool isCleanCheck = false;
+	char code[7];
+
 	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)
 	{
-		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)
 	{
-		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
@@ -2068,6 +2183,8 @@ void ChkPrimaryStatus()
 					}
 				}
 					break;
+				case S_REASSIGN_CHECK:
+				case S_REASSIGN:
 				case S_PREPARNING:
 				case S_PREPARING_FOR_EV:
 				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
 			break;
 		case '3': // IEC 62196-2 Type 2 Plug
-			break;
 		case '4': // IEC 62196-2 Type 2 Socket
 			if (AC_QUANTITY > _ac_Index)
 			{
@@ -2701,7 +2817,7 @@ bool CheckConnectorTypeStatus()
 		// 偵測槍屬於哪個 slot : 可知道插在板上的Slot 0 或 1 是 Chademo 還是 CCS
 		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
 				if (chargingInfo[gunIndex]->Type == _Type_Chademo)
@@ -2709,7 +2825,7 @@ bool CheckConnectorTypeStatus()
 					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
 				if (chargingInfo[gunIndex]->Type == _Type_CCS_2)
@@ -2717,7 +2833,7 @@ bool CheckConnectorTypeStatus()
 					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
 				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
 				if (chargingInfo[gunIndex]->Type == _Type_Chademo)
@@ -2737,7 +2853,7 @@ bool CheckConnectorTypeStatus()
 				if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount == 1)
 					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
 				if (chargingInfo[gunIndex]->Type == _Type_CCS_2)
@@ -2748,7 +2864,7 @@ bool CheckConnectorTypeStatus()
 				if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount == 1)
 					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
 				if (chargingInfo[gunIndex]->Type == _Type_GB)
@@ -3968,6 +4084,24 @@ int main(void)
 						else if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_AVER &&
 								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;
 						}
 					}
@@ -3976,6 +4110,9 @@ int main(void)
 						setChargerMode(gun_index, MODE_REASSIGN);
 					else
 						setChargerMode(gun_index, MODE_PRECHARGE);
+
+					if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == gun_index)
+						ShmSysConfigAndInfo->SysInfo.ConnectorPage = _LCM_PRE_CHARGE;
 				}
 					break;
 				case S_REASSIGN:
@@ -3983,6 +4120,7 @@ int main(void)
 					if (isModeChange(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)
 						{
 							// GFD 錯誤停止
-							RecordAlarmCode("012234");
+							RecordAlarmCode(gun_index, "012234");
 						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 							// GFD 警告
-							RecordAlarmCode("012296");
+							RecordWarningCode(gun_index, "012296");
 						}
 					}
 					else if (chargingInfo[gun_index]->Type == _Type_GB)
@@ -4116,12 +4254,12 @@ int main(void)
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 							// GFD 錯誤停止
-							RecordAlarmCode("012236");
+							RecordAlarmCode(gun_index, "012236");
 						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 							// GFD 警告
-							RecordAlarmCode("012298");
+							RecordWarningCode(gun_index, "012298");
 						}
 					}
 					else if (chargingInfo[gun_index]->Type == _Type_CCS_2)
@@ -4136,12 +4274,12 @@ int main(void)
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 							// GFD 錯誤停止
-							RecordAlarmCode("012235");
+							RecordAlarmCode(gun_index, "012235");
 						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 							// GFD 警告
-							RecordAlarmCode("012297");
+							RecordWarningCode(gun_index, "012297");
 						}
 					}
 
@@ -4176,67 +4314,67 @@ int main(void)
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 							// GFD 錯誤停止
-							RecordAlarmCode("012234");
+							RecordAlarmCode(gun_index, "012234");
 						}
 						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))
 						{
 							// UVP
-							RecordAlarmCode("012289");
+							RecordAlarmCode(gun_index, "012289");
 							ChargingTerminalProcess(gun_index);
 						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 							// GFD 警告
-							RecordAlarmCode("012296");
+							RecordWarningCode(gun_index, "012296");
 						}
 						else
-							CleanAlarmCodeByString("012296");
+							ReleaseWarningCodeByString(gun_index, "012296");
 					}
 					else if (chargingInfo[gun_index]->Type == _Type_GB)
 					{
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 							// GFD 錯誤停止
-							RecordAlarmCode("012236");
+							RecordAlarmCode(gun_index, "012236");
 						}
 						else if (isPrechargeStatus_gb(gun_index) == 10 &&
 								((chargingInfo[gun_index]->EvBatterytargetVoltage > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
 								(chargingInfo[gun_index]->RemainChargingDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL)))
 						{
 							// UVP
-							RecordAlarmCode("012290");
+							RecordAlarmCode(gun_index, "012290");
 							ChargingTerminalProcess(gun_index);
 						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 							// GFD 警告
-							RecordAlarmCode("012298");
+							RecordWarningCode(gun_index, "012298");
 						}
 						else
-							CleanAlarmCodeByString("012298");
+							ReleaseWarningCodeByString(gun_index, "012298");
 					}
 					else if (chargingInfo[gun_index]->Type == _Type_CCS_2)
 					{
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 							// GFD 錯誤停止
-							RecordAlarmCode("012235");
+							RecordAlarmCode(gun_index, "012235");
 						}
 						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))
 						{
 							// UVP
-							RecordAlarmCode("012288");
+							RecordAlarmCode(gun_index, "012288");
 							ChargingTerminalProcess(gun_index);
 						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 							// GFD 警告
-							RecordAlarmCode("012297");
+							RecordWarningCode(gun_index, "012297");
 						}
 						else
-							CleanAlarmCodeByString("012297");
+							ReleaseWarningCodeByString(gun_index, "012297");
 					}
 
 					if (isEvBoardStopChargeFlag(gun_index) ||
@@ -4332,7 +4470,7 @@ int main(void)
 					if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 					{
 						// GFD 錯誤停止
-						RecordAlarmCode("012235");
+						RecordAlarmCode(gun_index, "012235");
 					}
 
 					if (isEvBoardStopChargeFlag(gun_index) == YES ||
@@ -4370,7 +4508,7 @@ int main(void)
 					if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 					{
 						// GFD 錯誤停止
-						RecordAlarmCode("012235");
+						RecordAlarmCode(gun_index, "012235");
 					}
 
 					if (isEvBoardStopChargeFlag(gun_index) == YES ||

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

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

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