Эх сурвалжийг харах

[Improve][AW-Regular][main.c]
2022-03-08 / Eason Yang
Action
1. Improve: The system sleeps 2 seconds to send unplugged connector message.
2. Improve: checkChargingProgileLimit() function. Rearrange charging profile.
3. Improve: checkChargingProfileLimit() function. Integrated min and max targer current protection.
4. Improve: StorUseConfigDate() function. erase all mtd10 & mtd11 for re-write data.
5. Improve: If the system is under debug mode and the system must accept reset and upgrade command.
6. Improve: checkReset() function. Chagned delay time from 5 to 10 seconds.

File
1. main.c
Action 1
Action 2
Action 3
Action 4
Action 5
Action 6

FIRMWARE VERSION: V0.70.XX.XXXX.PX

8009 3 жил өмнө
parent
commit
d098e4da29

+ 158 - 199
EVSE/Projects/AW-Regular/Apps/main.c

@@ -1832,7 +1832,7 @@ int LoadSysConfigAndInfo(struct SysConfigData *ptr)
 
 		if(strlen((char*)ShmSysConfigAndInfo->SysConfig.SystemId) == 0x00)
 		{
-			DEBUG_INFO("System id over length.\n");
+			DEBUG_INFO("SystemId over length.\n");
 		}
 
 		system("cd /root;./Module_FactoryConfig -m");
@@ -1883,12 +1883,12 @@ int StoreUsrConfigData(struct SysConfigData *UsrData)
 		DEBUG_INFO("EvseConfig write to file in /mnt OK.\n");
 
 		DEBUG_INFO("Erase /dev/mtd10.\n");
-		runShellCmd("flash_erase /dev/mtd10 0 12");
+		runShellCmd("flash_erase /dev/mtd10 0 0");
 		DEBUG_INFO("Write /dev/mtd10.\n");
 		runShellCmd("nandwrite -p /dev/mtd10 /mnt/EvseConfig.bin");
 
 		DEBUG_INFO("Erase /dev/mtd11.\n");
-		runShellCmd("flash_erase /dev/mtd11 0 12");
+		runShellCmd("flash_erase /dev/mtd11 0 0");
 		DEBUG_INFO("Write /dev/mtd11.\n");
 		runShellCmd("nandwrite -p /dev/mtd11 /mnt/EvseConfig.bin");
 
@@ -1982,8 +1982,8 @@ void InitEthernet()
 					system("pgrep -f \"udhcpc -i eth0\" | xargs kill");
 					memset(tmpbuf,0,256);
 					sprintf(tmpbuf,"/sbin/ifconfig eth0 %s netmask %s up &",
-					        ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress,
-					        ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress);
+							ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress,
+							ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress);
 					system(tmpbuf);
 					memset(tmpbuf,0,256);
 					sprintf(tmpbuf,"route add default gw %s eth0 &",
@@ -2002,26 +2002,29 @@ void InitEthernet()
 				if(cnt_pingDNS_Fail >= 3)
 				{
 					ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet=ON;
-					if((ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthDhcpClient==0))
+					if(!ShmSysConfigAndInfo->SysInfo.OcppConnStatus)
 					{
-						system("pgrep -f \"udhcpc -i eth0\" | xargs kill");
-						sprintf(tmpbuf, "/sbin/udhcpc -i eth0 -x hostname:CSU3_%s -s /root/dhcp_script/eth0.script > /dev/null &", ShmSysConfigAndInfo->SysConfig.SystemId);
-						system(tmpbuf);
-					}
-					else
-					{
-						system("pgrep -f \"udhcpc -i eth0\" | xargs kill");
-						memset(tmpbuf,0,256);
-						sprintf(tmpbuf,"/sbin/ifconfig eth0 %s netmask %s up &",
-								ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress,
-								ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress);
-						system(tmpbuf);
-						memset(tmpbuf,0,256);
-						sprintf(tmpbuf,"route add default gw %s eth0 &",
-						ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthGatewayAddress);
-						system(tmpbuf);
+						if((ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthDhcpClient==0))
+						{
+							system("pgrep -f \"udhcpc -i eth0\" | xargs kill");
+							sprintf(tmpbuf, "/sbin/udhcpc -i eth0 -x hostname:CSU3_%s -s /root/dhcp_script/eth0.script > /dev/null &", ShmSysConfigAndInfo->SysConfig.SystemId);
+							system(tmpbuf);
+						}
+						else
+						{
+							system("pgrep -f \"udhcpc -i eth0\" | xargs kill");
+							memset(tmpbuf,0,256);
+							sprintf(tmpbuf,"/sbin/ifconfig eth0 %s netmask %s up &",
+									ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress,
+									ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress);
+							system(tmpbuf);
+							memset(tmpbuf,0,256);
+							sprintf(tmpbuf,"route add default gw %s eth0 &",
+							ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthGatewayAddress);
+							system(tmpbuf);
+						}
+						cnt_pingDNS_Fail = 0;
 					}
-					cnt_pingDNS_Fail = 0;
 				}
 				else
 				{
@@ -3276,14 +3279,14 @@ void checkReset()
 				if(strcmp((char*)ShmOCPP16Data->Reset.Type, "Hard") == 0)
 				{
 					system("sync");
-					sleep(5);
+					sleep(10);
 					system("reboot -f");
-					sleep(5);
+					sleep(10);
 					system("reboot -f");
 				}
 				else
 				{
-					sleep(5);
+					sleep(10);
 					close(wtdFd);
 					system("/usr/bin/run_evse_restart.sh");
 				}
@@ -3306,16 +3309,15 @@ void checkReset()
 					setChargerMode(gun_index, SYS_MODE_BOOTING);
 				if(strcmp((char*)ShmOCPP20Data->Reset.type, "Immediate") == 0)
 				{
-
 					system("sync");
-					sleep(5);
+					sleep(10);
 					system("reboot -f");
-					sleep(5);
+					sleep(10);
 					system("reboot -f");
 				}
 				else
 				{
-					sleep(5);
+					sleep(10);
 					close(wtdFd);
 					system("/usr/bin/run_evse_restart.sh");
 				}
@@ -3331,13 +3333,14 @@ void checkReservation(uint8_t gun_index)
 		if(ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowReq)
 		{
 			ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowReq = OFF;
+			ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowConf = ON;
 			if(isMode(gun_index, SYS_MODE_IDLE) && !isReservationExpired(gun_index))
 			{
+				sleep(5);
 				ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].ReservationId = ShmOCPP16Data->ReserveNow[gun_index].ReservationId;
 				setChargerMode(gun_index, SYS_MODE_RESERVATION);
 			}
 			DEBUG_INFO("Reservation request on connector-%d.\n", gun_index);
-			ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowConf = ON;
 		}
 	}
 	else if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20)
@@ -3345,13 +3348,14 @@ void checkReservation(uint8_t gun_index)
 		if(ShmOCPP20Data->CsMsg.bits[gun_index].ReserveNowReq)
 		{
 			ShmOCPP20Data->CsMsg.bits[gun_index].ReserveNowReq = OFF;
+			ShmOCPP20Data->CsMsg.bits[gun_index].ReserveNowConf = ON;
 			if(isMode(gun_index, SYS_MODE_IDLE) && !isReservationExpired(gun_index))
 			{
+				sleep(5);
 				ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].ReservationId = ShmOCPP20Data->ReserveNow[gun_index].id;
 				setChargerMode(gun_index, SYS_MODE_RESERVATION);
 			}
 			DEBUG_INFO("Reservation request on connector-%d.\n", gun_index);
-			ShmOCPP20Data->CsMsg.bits[gun_index].ReserveNowConf = ON;
 		}
 	}
 }
@@ -3424,17 +3428,25 @@ void checkAvailability(uint8_t gun_index)
 	}
 }
 
-void checkChargingProfileLimit(uint8_t gun_index)
+void checkChargingProfileLimit(uint8_t gun_index, uint8_t system_mode)
 {
+	static struct PreviousData
+	{
+		uint16_t targetCurrent;
+		uint16_t current_limit;
+		uint16_t primaryMcuCp_Pwn_Duty;
+	}previousData[4];
+
 	if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_16)
 	{
 		if((ocpp_get_smartcharging_profileId(gun_index) > 0) &&
-		   (ocpp_get_profile_req(gun_index) != ON)	&&
+		   //(ocpp_get_profile_req(gun_index) != ON) &&
 		   (((strlen((char*)ShmOCPP16Data->SmartChargingProfile[gun_index].ValidFrom)>0) && (strlen((char*)ShmOCPP16Data->SmartChargingProfile[gun_index].ValidTo)>0)) ? isProfileValid(gun_index) : ON))
 		{
 			// Debug information
 			if(DiffTimebWithNow(startTime[gun_index][TMR_IDX_LOGPPRINTOUT]) > TIMEOUT_SPEC_LOGPPRINTOUT)
 			{
+				DEBUG_INFO("========================================\n");
 				DEBUG_INFO("Profile ID found: %d\n", ShmOCPP16Data->SmartChargingProfile[gun_index].ChargingProfileId);
 				DEBUG_INFO("Valid from: %s\n", ShmOCPP16Data->SmartChargingProfile[gun_index].ValidFrom);
 				DEBUG_INFO("Valid to: %s\n", ShmOCPP16Data->SmartChargingProfile[gun_index].ValidTo);
@@ -3445,6 +3457,8 @@ void checkChargingProfileLimit(uint8_t gun_index)
 				DEBUG_INFO("Transaction ID: %d\n", ShmOCPP16Data->SmartChargingProfile[gun_index].TransactionId);
 				DEBUG_INFO("ChargingRateUnit: %s\n", ShmOCPP16Data->SmartChargingProfile[gun_index].ChargingSchedule.ChargingRateUnit);
 				DEBUG_INFO("========================================\n");
+
+				ftime(&startTime[gun_index][TMR_IDX_LOGPPRINTOUT]);
 			}
 
 			// Checking profile kind
@@ -3470,7 +3484,7 @@ void checkChargingProfileLimit(uint8_t gun_index)
 				}
 			}
 		}
-		else if((ShmOCPP16Data->SmartChargingProfile[gun_index].ChargingProfileId == 0) && (ShmOCPP16Data->CSUMsg.bits[gun_index].ChargingProfileReq != ON))
+		else if((ShmOCPP16Data->SmartChargingProfile[gun_index].ChargingProfileId == 0))//&& (ShmOCPP16Data->CSUMsg.bits[gun_index].ChargingProfileReq != ON))
 		{
 			ShmCharger->gun_info[gun_index].targetCurrent = ShmCharger->gun_info[gun_index].primaryMcuState.rating_current;
 		}
@@ -3478,12 +3492,13 @@ void checkChargingProfileLimit(uint8_t gun_index)
 	else if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20)
 	{
 		if((ocpp_get_smartcharging_profileId(gun_index) > 0) &&
-		   (ocpp_get_profile_req(gun_index) != ON)	&&
+		   //(ocpp_get_profile_req(gun_index) != ON) &&
 		   (((strlen((char*)ShmOCPP20Data->SmartChargingProfile[gun_index].validFrom)>0) && (strlen((char*)ShmOCPP20Data->SmartChargingProfile[gun_index].validTo)>0)) ? isProfileValid(gun_index) : ON))
 		{
 			// Debug information
 			if(DiffTimebWithNow(startTime[gun_index][TMR_IDX_LOGPPRINTOUT]) > TIMEOUT_SPEC_LOGPPRINTOUT)
 			{
+				DEBUG_INFO("========================================\n");
 				DEBUG_INFO("Profile ID found: %d\n", ShmOCPP20Data->SmartChargingProfile[gun_index].id);
 				DEBUG_INFO("Valid from: %s\n", ShmOCPP20Data->SmartChargingProfile[gun_index].validFrom);
 				DEBUG_INFO("Valid to: %s\n", ShmOCPP20Data->SmartChargingProfile[gun_index].validTo);
@@ -3493,7 +3508,9 @@ void checkChargingProfileLimit(uint8_t gun_index)
 				DEBUG_INFO("Profile purpose: %s\n", ShmOCPP20Data->SmartChargingProfile[gun_index].chargingProfilePurpose);
 				DEBUG_INFO("Transaction ID: %d\n", ShmOCPP20Data->SmartChargingProfile[gun_index].transactionId);
 				DEBUG_INFO("ChargingRateUnit: %s\n", ShmOCPP20Data->SmartChargingProfile[gun_index].chargingSchedule[0].chargingRateUnit);
-				DEBUG_INFO("=======================================\n");
+				DEBUG_INFO("========================================\n");
+
+				ftime(&startTime[gun_index][TMR_IDX_LOGPPRINTOUT]);
 			}
 
 			// Checking profile kind
@@ -3519,11 +3536,98 @@ void checkChargingProfileLimit(uint8_t gun_index)
 				}
 			}
 		}
-		else if((ShmOCPP20Data->SmartChargingProfile[gun_index].id == 0) && (ShmOCPP20Data->CSUMsg.bits[gun_index].ChargingProfileReq != ON))
+		else if((ShmOCPP20Data->SmartChargingProfile[gun_index].id == 0))// && (ShmOCPP20Data->CSUMsg.bits[gun_index].ChargingProfileReq != ON))
 		{
 			ShmCharger->gun_info[gun_index].targetCurrent = ShmCharger->gun_info[gun_index].primaryMcuState.rating_current;
 		}
 	}
+
+	switch(system_mode)
+	{
+		case SYS_MODE_IDLE:
+		case SYS_MODE_PREPARING:
+			if(ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent == 0)
+			{
+				ShmCharger->gun_info[gun_index].targetCurrent = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmCharger->gun_info[gun_index].primaryMcuState.rating_current)?ShmCharger->gun_info[gun_index].primaryMcuState.rating_current:ShmCharger->gun_info[gun_index].targetCurrent);
+				ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmCharger->gun_info[gun_index].primaryMcuState.rating_current)?ShmCharger->gun_info[gun_index].primaryMcuState.rating_current:ShmCharger->gun_info[gun_index].targetCurrent);
+				ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = ((1 <= ShmCharger->gun_info[gun_index].targetCurrent) && (ShmCharger->gun_info[gun_index].targetCurrent <= 5)? 6:((ShmCharger->gun_info[gun_index].targetCurrent == 0)? 100:ShmCharger->gun_info[gun_index].targetCurrent));
+			}
+			else
+			{
+				ShmCharger->gun_info[gun_index].targetCurrent = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent)?ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent:ShmCharger->gun_info[gun_index].targetCurrent);
+				ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent)?ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent:ShmCharger->gun_info[gun_index].targetCurrent);
+				ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = ((1 <= ShmCharger->gun_info[gun_index].targetCurrent) && (ShmCharger->gun_info[gun_index].targetCurrent <= 5)? 6:((ShmCharger->gun_info[gun_index].targetCurrent == 0)? 100:ShmCharger->gun_info[gun_index].targetCurrent));
+			}
+			ShmCharger->gun_info[gun_index].mcuFlag.isSetCpPwmDuty = YES;
+
+			break;
+		case SYS_MODE_CHARGING:
+		case SYS_MODE_TERMINATING:
+			if(ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent == 0)
+			{
+				ShmCharger->gun_info[gun_index].targetCurrent = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmCharger->gun_info[gun_index].primaryMcuState.rating_current)?ShmCharger->gun_info[gun_index].primaryMcuState.rating_current:ShmCharger->gun_info[gun_index].targetCurrent);
+				if((ShmCharger->gun_info[gun_index].targetCurrent != ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current) ||
+				   (ShmCharger->gun_info[gun_index].primaryMcuState.current_limit != ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current))
+				{
+					if(DiffTimebWithNow(startTime[gun_index][TMR_IDX_PWN_CHANGE]) > TIMEOUT_SPEC_PWN_CHANGE)
+					{
+						ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmCharger->gun_info[gun_index].primaryMcuState.rating_current)?ShmCharger->gun_info[gun_index].primaryMcuState.rating_current:ShmCharger->gun_info[gun_index].targetCurrent);
+						ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = ((1 <= ShmCharger->gun_info[gun_index].targetCurrent) && (ShmCharger->gun_info[gun_index].targetCurrent <= 5)? 6:((ShmCharger->gun_info[gun_index].targetCurrent == 0)? 100:ShmCharger->gun_info[gun_index].targetCurrent));
+						ShmCharger->gun_info[gun_index].mcuFlag.isSetCpPwmDuty = YES;
+						ftime(&startTime[gun_index][TMR_IDX_PWN_CHANGE]);
+					}
+					else
+					{}
+				}
+			}
+			else
+			{
+				ShmCharger->gun_info[gun_index].targetCurrent = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent)?ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent:ShmCharger->gun_info[gun_index].targetCurrent);
+				if((ShmCharger->gun_info[gun_index].targetCurrent != ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current) ||
+				   (ShmCharger->gun_info[gun_index].primaryMcuState.current_limit != ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current))
+				{
+					if(DiffTimebWithNow(startTime[gun_index][TMR_IDX_PWN_CHANGE]) > TIMEOUT_SPEC_PWN_CHANGE)
+					{
+						ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent)?ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent:ShmCharger->gun_info[gun_index].targetCurrent);
+						ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = ((1 <= ShmCharger->gun_info[gun_index].targetCurrent) && (ShmCharger->gun_info[gun_index].targetCurrent <= 5)? 6:((ShmCharger->gun_info[gun_index].targetCurrent == 0)? 100:ShmCharger->gun_info[gun_index].targetCurrent));
+						ShmCharger->gun_info[gun_index].mcuFlag.isSetCpPwmDuty = YES;
+						ftime(&startTime[gun_index][TMR_IDX_PWN_CHANGE]);
+					}
+					else
+					{}
+				}
+			}
+
+			if(previousData[gun_index].primaryMcuCp_Pwn_Duty != ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current)
+			{
+				DEBUG_INFO("====================================================\n");
+				DEBUG_INFO("gun-%02d primaryMcuCp_Pwn_Duty: %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current);
+				DEBUG_INFO("====================================================\n");
+
+				previousData[gun_index].primaryMcuCp_Pwn_Duty = ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current;
+			}
+
+			if(ShmCharger->gun_info[gun_index].targetCurrent != previousData[gun_index].targetCurrent)
+			{
+				DEBUG_INFO("====================================================\n");
+				DEBUG_INFO("MaxChargingCurrent: %d \n", ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent);
+				DEBUG_INFO("gun-%02d targetCurrent: %d\n", gun_index, ShmCharger->gun_info[gun_index].targetCurrent);
+				DEBUG_INFO("====================================================\n");
+
+				previousData[gun_index].targetCurrent = ShmCharger->gun_info[gun_index].targetCurrent;
+			}
+
+			if(ShmCharger->gun_info[gun_index].primaryMcuState.current_limit != previousData[gun_index].current_limit)
+			{
+				DEBUG_INFO("====================================================\n");
+				DEBUG_INFO("gun-%02d mcu current_limit: %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuState.current_limit);
+				DEBUG_INFO("====================================================\n");
+
+				previousData[gun_index].current_limit = ShmCharger->gun_info[gun_index].primaryMcuState.current_limit;
+			}
+
+			break;
+	}
 }
 
 void checkStopReason(uint8_t gun_index)
@@ -3791,8 +3895,8 @@ int main(void)
 		//==============================================
 		// Something need run in Idle mode
 		//==============================================
-		if(((ShmSysConfigAndInfo->SysInfo.AcChargingData[0].SystemStatus==SYS_MODE_IDLE) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[0].SystemStatus==SYS_MODE_ALARM)) &&
-		   (AC_QUANTITY>1?((ShmSysConfigAndInfo->SysInfo.AcChargingData[1].SystemStatus==SYS_MODE_IDLE) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[1].SystemStatus==SYS_MODE_ALARM)):true))
+		if(((ShmSysConfigAndInfo->SysInfo.AcChargingData[0].SystemStatus==SYS_MODE_IDLE) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[0].SystemStatus==SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[0].SystemStatus==SYS_MODE_DEBUG)) &&
+		   (AC_QUANTITY>1?((ShmSysConfigAndInfo->SysInfo.AcChargingData[1].SystemStatus==SYS_MODE_IDLE) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[1].SystemStatus==SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[1].SystemStatus==SYS_MODE_DEBUG)):true))
 		{
 			//======================================
 			// Check restore factory setting request
@@ -4101,40 +4205,7 @@ int main(void)
 						// Get target current
 						ocpp_set_profile_req(gun_index, ON);
 						sleep(1);
-						checkChargingProfileLimit(gun_index);
-						if(ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent == 0)
-						{
-							ShmCharger->gun_info[gun_index].targetCurrent = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmCharger->gun_info[gun_index].primaryMcuState.rating_current)?ShmCharger->gun_info[gun_index].primaryMcuState.rating_current:ShmCharger->gun_info[gun_index].targetCurrent);
-							if((6 <= ShmCharger->gun_info[gun_index].targetCurrent))
-							{
-								ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmCharger->gun_info[gun_index].primaryMcuState.rating_current)?ShmCharger->gun_info[gun_index].primaryMcuState.rating_current:ShmCharger->gun_info[gun_index].targetCurrent);
-							}
-							else if((1 <= ShmCharger->gun_info[gun_index].targetCurrent) && (ShmCharger->gun_info[gun_index].targetCurrent < 6))
-							{
-								ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = 6;
-							}
-							else
-							{
-								ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = 100;
-							}
-						}
-						else
-						{
-							ShmCharger->gun_info[gun_index].targetCurrent = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent)?ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent:ShmCharger->gun_info[gun_index].targetCurrent);
-							if((6 <= ShmCharger->gun_info[gun_index].targetCurrent))
-							{
-								ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent)?ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent:ShmCharger->gun_info[gun_index].targetCurrent);
-							}
-							else if((1 <= ShmCharger->gun_info[gun_index].targetCurrent) && (ShmCharger->gun_info[gun_index].targetCurrent < 6))
-							{
-								ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = 6;
-							}
-							else
-							{
-								ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = 100;
-							}
-						}
-						ShmCharger->gun_info[gun_index].mcuFlag.isSetCpPwmDuty = YES;
+						checkChargingProfileLimit(gun_index, ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus);
 
 						setChargerMode(gun_index, SYS_MODE_AUTHORIZING);
 					}
@@ -4317,8 +4388,10 @@ int main(void)
 						ShmCharger->gun_info[gun_index].isGunPlugged = YES;
 						ShmCharger->gun_info[gun_index].isGunUnpluggedBefore = NO;
 
+						checkChargingProfileLimit(gun_index, ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus);
+
 						// Set relay on when the system is state C
-						if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_C)
+						if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_C) && ((ShmCharger->gun_info[gun_index].targetCurrent != 0)))
 							setRelay(gun_index, ON);
 						
 						if((ShmCharger->gun_info[gun_index].primaryMcuState.relay_state == ON) || (ShmCharger->gun_info[gun_index].targetCurrent == 0))
@@ -4351,6 +4424,7 @@ int main(void)
 						ocpp_set_profile_req(gun_index, ON);
 						ShmCharger->gun_info[gun_index].isChargerStopByCondition = NO;
 					}
+
 					if(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_A)
 					{
 						ShmCharger->gun_info[gun_index].isGunUnpluggedBefore = YES;
@@ -4526,7 +4600,7 @@ int main(void)
 						}
 
 						// Checking profile id > 0 and current time is between charging profile validFrom & validTo
-						checkChargingProfileLimit(gun_index);
+						checkChargingProfileLimit(gun_index, ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus);
 
 						// If temperature warning derating PWM duty 20%
 						if(ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp >= SPEC_TEMPERATURE_WARN)
@@ -4539,70 +4613,16 @@ int main(void)
 						}
 						ShmCharger->gun_info[gun_index].targetCurrent = (ShmCharger->gun_info[gun_index].targetCurrent==0?ShmCharger->gun_info[gun_index].targetCurrent:(((ShmCharger->gun_info[gun_index].targetCurrent*ShmCharger->gun_info[gun_index].tempCoefficient)>=6) ?	(ShmCharger->gun_info[gun_index].targetCurrent*ShmCharger->gun_info[gun_index].tempCoefficient):6));
 
-						// Determine max charging current to MCU
-						if(ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent == 0)
-						{
-							ShmCharger->gun_info[gun_index].targetCurrent = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmCharger->gun_info[gun_index].primaryMcuState.rating_current)?ShmCharger->gun_info[gun_index].primaryMcuState.rating_current:ShmCharger->gun_info[gun_index].targetCurrent);
-							if(ShmCharger->gun_info[gun_index].targetCurrent != ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current)
-							{
-								if(DiffTimebWithNow(startTime[gun_index][TMR_IDX_PWN_CHANGE]) > TIMEOUT_SPEC_PWN_CHANGE)
-								{
-									if((6 <= ShmCharger->gun_info[gun_index].targetCurrent))
-									{
-										ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmCharger->gun_info[gun_index].primaryMcuState.rating_current)?ShmCharger->gun_info[gun_index].primaryMcuState.rating_current:ShmCharger->gun_info[gun_index].targetCurrent);
-									}
-									else if((1 <= ShmCharger->gun_info[gun_index].targetCurrent) && (ShmCharger->gun_info[gun_index].targetCurrent < 6))
-									{
-										ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = 6;
-									}
-									else
-									{
-										ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = 100;
-									}
-									
-									ShmCharger->gun_info[gun_index].mcuFlag.isSetCpPwmDuty = YES;
-									ftime(&startTime[gun_index][TMR_IDX_PWN_CHANGE]);
-								}
-								else
-								{}
-							}
-						}
-						else
-						{
-							ShmCharger->gun_info[gun_index].targetCurrent = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent)?ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent:ShmCharger->gun_info[gun_index].targetCurrent);
-							if(ShmCharger->gun_info[gun_index].targetCurrent != ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current)
-							{
-								if(DiffTimebWithNow(startTime[gun_index][TMR_IDX_PWN_CHANGE]) > TIMEOUT_SPEC_PWN_CHANGE)
-								{
-									if((6 <= ShmCharger->gun_info[gun_index].targetCurrent))
-									{
-										ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent)?ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent:ShmCharger->gun_info[gun_index].targetCurrent);
-									}
-									else if((1 <= ShmCharger->gun_info[gun_index].targetCurrent) && (ShmCharger->gun_info[gun_index].targetCurrent < 6))
-									{
-										ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = 6;
-									}
-									else
-									{
-										ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = 100;
-									}
-									
-									ShmCharger->gun_info[gun_index].mcuFlag.isSetCpPwmDuty = YES;
-									ftime(&startTime[gun_index][TMR_IDX_PWN_CHANGE]);
-								}
-								else
-								{}
-							}
-						}
-
 						// Debug information
 						if((DiffTimebWithNow(startTime[gun_index][TMR_IDX_LOGPPRINTOUT]) > TIMEOUT_SPEC_LOGPPRINTOUT) || (DiffTimebWithNow(startTime[gun_index][TMR_IDX_LOGPPRINTOUT]) < 0))
 						{
+							/*
 							DEBUG_INFO("=============================================================\n");
 							DEBUG_INFO("ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent: %d\n", ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent);
 							DEBUG_INFO("ShmCharger->gun_info[%d].primaryMcuCp_Pwn_Duty.max_current: %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current);
 							DEBUG_INFO("ShmCharger->gun_info[%d].targetCurrent: %d\n", gun_index, ShmCharger->gun_info[gun_index].targetCurrent);
 							DEBUG_INFO("=============================================================\n");
+							*/
 							ftime(&startTime[gun_index][TMR_IDX_LOGPPRINTOUT]);
 						}
 
@@ -4730,15 +4750,6 @@ int main(void)
 						setLedMotion(gun_index, LED_ACTION_STOP);
 						checkStopReason(gun_index);
 						setChargerMode(gun_index, SYS_MODE_COMPLETE);
-						
-						/*
-						// If relay is off, the system should change to complete mode
-						if(!ShmCharger->gun_info[gun_index].primaryMcuState.relay_state)
-						{
-							checkStopReason(gun_index);
-							setChargerMode(gun_index, SYS_MODE_COMPLETE);
-						}
-						*/
 					}
 					else
 					{
@@ -4891,72 +4902,20 @@ int main(void)
 						}
 
 						// Check target current if charging profile limit > 0
-						checkChargingProfileLimit(gun_index);
-						
-						// Determine max charging current to MCU
-						if(ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent == 0)
-						{
-							ShmCharger->gun_info[gun_index].targetCurrent = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmCharger->gun_info[gun_index].primaryMcuState.rating_current)?ShmCharger->gun_info[gun_index].primaryMcuState.rating_current:ShmCharger->gun_info[gun_index].targetCurrent);
-							if(ShmCharger->gun_info[gun_index].targetCurrent != ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current)
-							{
-								if(DiffTimebWithNow(startTime[gun_index][TMR_IDX_PWN_CHANGE]) > TIMEOUT_SPEC_PWN_CHANGE)
-								{
-									if((6 <= ShmCharger->gun_info[gun_index].targetCurrent))
-									{
-										ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmCharger->gun_info[gun_index].primaryMcuState.rating_current)?ShmCharger->gun_info[gun_index].primaryMcuState.rating_current:ShmCharger->gun_info[gun_index].targetCurrent);
-									}
-									else if((1 <= ShmCharger->gun_info[gun_index].targetCurrent) && (ShmCharger->gun_info[gun_index].targetCurrent < 6))
-									{
-										ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = 6;
-									}
-									else
-									{
-										ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = 100;
-									}
-									
-									ShmCharger->gun_info[gun_index].mcuFlag.isSetCpPwmDuty = YES;
-									ftime(&startTime[gun_index][TMR_IDX_PWN_CHANGE]);
-								}
-								else
-								{}
-							}
-						}
-						else
-						{
-							ShmCharger->gun_info[gun_index].targetCurrent = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent)?ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent:ShmCharger->gun_info[gun_index].targetCurrent);
-							if(ShmCharger->gun_info[gun_index].targetCurrent != ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current)
-							{
-								if(DiffTimebWithNow(startTime[gun_index][TMR_IDX_PWN_CHANGE]) > TIMEOUT_SPEC_PWN_CHANGE)
-								{
-									if((6 <= ShmCharger->gun_info[gun_index].targetCurrent))
-									{
-										ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = ((ShmCharger->gun_info[gun_index].targetCurrent > ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent)?ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent:ShmCharger->gun_info[gun_index].targetCurrent);
-									}
-									else if((1 <= ShmCharger->gun_info[gun_index].targetCurrent) && (ShmCharger->gun_info[gun_index].targetCurrent < 6))
-									{
-										ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = 6;
-									}
-									else
-									{
-										ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = 100;
-									}
-									
-									ShmCharger->gun_info[gun_index].mcuFlag.isSetCpPwmDuty = YES;
-									ftime(&startTime[gun_index][TMR_IDX_PWN_CHANGE]);
-								}
-								else
-								{}
-							}
-						}
+						checkChargingProfileLimit(gun_index, ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus);
+
+						setRelay(gun_index, OFF);
 
 						// Debug information
 						if((DiffTimebWithNow(startTime[gun_index][TMR_IDX_LOGPPRINTOUT]) > TIMEOUT_SPEC_LOGPPRINTOUT) || (DiffTimebWithNow(startTime[gun_index][TMR_IDX_LOGPPRINTOUT]) < 0))
 						{
+							/*
 							DEBUG_INFO("=============================================================\n");
 							DEBUG_INFO("ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent: %d\n", ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent);
 							DEBUG_INFO("ShmCharger->gun_info[%d].primaryMcuCp_Pwn_Duty.max_current: %d\n", gun_index, ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current);
 							DEBUG_INFO("ShmCharger->gun_info[%d].targetCurrent: %d\n", gun_index, ShmCharger->gun_info[gun_index].targetCurrent);
 							DEBUG_INFO("=============================================================\n");
+							*/
 							ftime(&startTime[gun_index][TMR_IDX_LOGPPRINTOUT]);
 						}
 
@@ -4990,6 +4949,7 @@ int main(void)
 					
 					if((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_A) || ocpp_get_reset_req())
 					{
+						sleep(2);
 						ShmCharger->gun_info[gun_index].rfidReq = OFF;
 						ShmCharger->gun_info[gun_index].isAuthPassEnd = OFF;
 						ShmCharger->gun_info[gun_index].bleConfigData.isRequestStop = OFF;
@@ -5187,7 +5147,6 @@ int main(void)
 								}
 
 								ShmCharger->gun_info[gun_index].rfidReq = OFF;
-
 							}
 							else if(ocpp_get_remotestart(gun_index))
 							{