Browse Source

[Add][AW-CCS][main / Module_LcmControl]

2021.09.27 / Folus Wen

Actions:
1. LCM OTA function implement.

Files:
1. As follow commit history

Image version: D0.55.XX.XXXX.XX
Image checksum: XXXXXXXX

Hardware PWB P/N : XXXXXXX
Hardware Version : XXXXXXX
FolusWen 3 năm trước cách đây
mục cha
commit
e0772dc42a

+ 168 - 88
EVSE/Projects/AW-CCS/Apps/LCM/Module_LcmControl.c

@@ -2081,19 +2081,23 @@ int downloadBMP(uint8_t picIdx, char *filename)
 	uint32_t pixelSize;
 	uint32_t transferedByte=0;
 	uint16_t bufferRamAddr = 0x8000;
+	uint32_t dataLen = 0;
+	uint32_t startAddr=0;
 
 	// Reset LCD
 	uint8_t cmd_reset[] = {0x55, 0xaa, 0x5a, 0xa5};
-	if(lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, 0x04, cmd_reset, ARRAY_SIZE(cmd_reset)) == FAIL)
+	while(lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, 0x04, cmd_reset, ARRAY_SIZE(cmd_reset)) != PASS)
 	{
 		DEBUG_INFO("LCD reset fail.\n");
 	}
+	sleep(1);
 
 	// Get image file size
 	stat(filename, &fileSt);
 	bmp = bopen(filename);
 	uint8_t buf[bmp->width*bmp->height*2];
 
+	DEBUG_INFO("Target address: %d\n", picIdx);
 	DEBUG_INFO("Image filename: %s\n", filename);
 	DEBUG_INFO("Image width: %d height: %d\n", bmp->width, bmp->height);
 	DEBUG_INFO("Image data size: %d\n", ARRAY_SIZE(buf));
@@ -2122,38 +2126,39 @@ int downloadBMP(uint8_t picIdx, char *filename)
 		if((idxSrcData+1) != (((pixelSize%pageSize)==0)?(pixelSize/pageSize):(pixelSize/pageSize)+1))
 		{
 			// Data transfer
-			while(lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, bufferRamAddr, &buf[(idxSrcData*pageSize)], pageSize) != PASS)
+			while(lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, (bufferRamAddr+(dataLen>>1)), &buf[(idxSrcData*pageSize)], pageSize) != PASS)
 			{
 				DEBUG_INFO("Transfer data to ram 0x%04X fail.\n", transferedByte);
 			}
 			transferedByte += pageSize;
-
-			display_cmd[3] = ((pageSize>>1) >> 8) & 0xff;							// Data length high byte
-			display_cmd[4] = ((pageSize>>1) >> 0) & 0xff;							// Data length low byte
-			display_cmd[5] = (((idxSrcData*pageSize)>>1) >> 16) & 0xff;				// Screen on ram address 1st byte
-			display_cmd[6] = (((idxSrcData*pageSize)>>1) >> 8) & 0xff;				// Screen on ram address 2nd byte
-			display_cmd[7] = (((idxSrcData*pageSize)>>1) >> 0) & 0xff;				// Screen on ram address 3th byte
+			dataLen += pageSize;
 		}
 		else
 		{
 			// Last data transfer
-			while(lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, bufferRamAddr, &buf[(idxSrcData*pageSize)], (pixelSize-(idxSrcData*pageSize))) != PASS)
+			while(lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, (bufferRamAddr+(dataLen>>1)), &buf[(idxSrcData*pageSize)], (pixelSize-(idxSrcData*pageSize))) != PASS)
 			{
 				DEBUG_INFO("Transfer data to ram 0x%04X fail.\n", transferedByte);
 			}
 			transferedByte += (pixelSize-(idxSrcData*pageSize));
-
-			display_cmd[3] = (((pixelSize-(idxSrcData*pageSize))>>1) >> 8) & 0xff;	// Data length high byte
-			display_cmd[4] = (((pixelSize-(idxSrcData*pageSize))>>1) >> 0) & 0xff;	// Data length low byte
-			display_cmd[5] = (((idxSrcData*pageSize)>>1) >> 16) & 0xff;				// Screen on ram address 1st byte
-			display_cmd[6] = (((idxSrcData*pageSize)>>1) >> 8) & 0xff;				// Screen on ram address 2nd byte
-			display_cmd[7] = (((idxSrcData*pageSize)>>1) >> 0) & 0xff;				// Screen on ram address 3th byte
+			dataLen += (pixelSize-(idxSrcData*pageSize));
 		}
 
 		// Move data from ram to flash
-		while(lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, 0xa2, display_cmd, ARRAY_SIZE(display_cmd)) != PASS)
+		if((dataLen >= (pageSize*10)) || (idxSrcData == (((pixelSize%pageSize)==0)?(pixelSize/pageSize):(pixelSize/pageSize)+1)-1))
 		{
-			DEBUG_INFO("Write data to display buffer 0x%04X fail.\n", transferedByte);
+			display_cmd[3] = ((dataLen>>1) >> 8) & 0xff;							// Data length high byte
+			display_cmd[4] = ((dataLen>>1) >> 0) & 0xff;							// Data length low byte
+			display_cmd[5] = (((startAddr)>>1) >> 16) & 0xff;				// Screen on ram address 1st byte
+			display_cmd[6] = (((startAddr)>>1) >> 8) & 0xff;				// Screen on ram address 2nd byte
+			display_cmd[7] = (((startAddr)>>1) >> 0) & 0xff;				// Screen on ram address 3th byte
+
+			while(lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, 0xa2, display_cmd, ARRAY_SIZE(display_cmd)) != PASS)
+			{
+				DEBUG_INFO("Write data to display buffer 0x%04X fail.\n", transferedByte);
+			}
+			startAddr += dataLen;
+			dataLen = 0;
 		}
 	}
 
@@ -2164,6 +2169,7 @@ int downloadBMP(uint8_t picIdx, char *filename)
 		DEBUG_INFO("Save image fail.\n");
 	}
 	DEBUG_INFO("Save image success.\n");
+	sleep(1);
 
 	return result;
 }
@@ -2183,15 +2189,17 @@ int downloadBIN(uint8_t targetAddr, char *filename)
 
 	// Reset LCD
 	uint8_t cmd_reset[] = {0x55, 0xaa, 0x5a, 0xa5};
-	if(lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, 0x04, cmd_reset, ARRAY_SIZE(cmd_reset)) == FAIL)
+	while(lcdRegisterWrite(Uart1Fd, REG_TYPE_RAM, 0x04, cmd_reset, ARRAY_SIZE(cmd_reset)) != PASS)
 	{
 		DEBUG_INFO("LCD reset fail.\n");
 	}
+	sleep(1);
 
 	// Get image file size
 	stat(filename, &fileSt);
-	uint8_t buf[(fileSt.st_size%32768==0?fileSt.st_size/32768:(fileSt.st_size/32768)+1)*32768];
+	uint8_t buf[(fileSt.st_size%32768==0?(fileSt.st_size/32768)*32768:(fileSt.st_size/32768)+1)*32768];
 
+	DEBUG_INFO("Target address: %d\n", targetAddr);
 	DEBUG_INFO("Bin filename: %s\n", filename);
 	DEBUG_INFO("Bin data size: %d\n", fileSt.st_size);
 
@@ -2203,19 +2211,18 @@ int downloadBIN(uint8_t targetAddr, char *filename)
 	}
 	else
 	{
+		// Read data from bin file
+		memset(buf, 0x00, ARRAY_SIZE(buf));
+		read(fd, buf, ARRAY_SIZE(buf));
+		close(fd);
+
 		for(uint8_t idxBinSrc=0;idxBinSrc<(fileSt.st_size%32768==0?fileSt.st_size/32768:(fileSt.st_size/32768)+1);idxBinSrc++)
 		{
-			// Read data from bin file
-			memset(buf, 0x00, ARRAY_SIZE(buf));
-			read(fd, buf, ARRAY_SIZE(buf));
-			close(fd);
-
 			// Transfer data to ram
 			for(uint16_t idxSrcData=0;idxSrcData<(((blocklSize%pageSize)==0)?(blocklSize/pageSize):(blocklSize/pageSize)+1);idxSrcData++)
 			{
 				//DEBUG_INFO("Buffer start data address: 0x%08X\n", (idxBinSrc*blocklSize)+(idxSrcData*pageSize));
 				//DEBUG_INFO("  Image start ram address: 0x%08X\n", ((idxSrcData*pageSize) >> 1));
-
 				if((idxSrcData+1) != (((blocklSize%pageSize)==0)?(blocklSize/pageSize):(blocklSize/pageSize)+1))
 				{
 					// Data transfer
@@ -2243,12 +2250,77 @@ int downloadBIN(uint8_t targetAddr, char *filename)
 				DEBUG_INFO("Save bin file to 0x%04X fail.\n", ((targetAddr*8)+idxBinSrc));
 			}
 			DEBUG_INFO("Save bin file on 0x%04X success.\n", ((targetAddr*8)+idxBinSrc));
+			sleep(1);
 		}
 	}
 
 	return result;
 }
 
+//=======================================
+// LCD upgrade
+//=======================================
+int lcdUpgrade(char *forlder)
+{
+	int result = PASS;
+	DIR *dir;
+	struct dirent *file;
+	struct stat fileSt;
+
+	if ((dir = opendir (forlder)) != NULL)
+	{
+		/* print all the files and directories within directory */
+		while ((file = readdir (dir)) != NULL)
+		{
+			if((strlen(file->d_name)>2))
+			{
+				int targetAddr;
+				stat(file->d_name, &fileSt);
+
+				if(sscanf(file->d_name, "%d", &targetAddr) == 1)
+				{
+					char targetFile[384];
+
+					sprintf(targetFile, "/mnt/lcd/%s", file->d_name);
+					if(strstr(file->d_name, ".bmp") != NULL)
+					{
+						downloadBMP(targetAddr, targetFile);
+					}
+					else
+					{
+						downloadBIN(targetAddr, targetFile);
+					}
+				}
+				else
+				{
+					DEBUG_WARN("%s can not parse target address.\n", file->d_name);
+				}
+			}
+			else
+			{
+				if(strlen(file->d_name) >= 3)
+				{
+					DEBUG_ERROR("File name error.\n");
+					result = FAIL;
+				}
+				else
+				{
+					DEBUG_INFO("Searching file.\n");
+				}
+			}
+			sleep(1);
+		}
+		closedir (dir);
+	}
+	else
+	{
+		DEBUG_ERROR("%s does not valid.\n", forlder);
+		result = FAIL;
+	}
+
+	return result;
+}
+
 //=======================================
 // Main process
 //=======================================
@@ -2292,78 +2364,86 @@ int main(void)
 
 	for(;;)
 	{
-		if(previousMode != ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus)
-		{
-			previousMode = ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus;
-		}
-
-		if(ShmCharger->isAuthrizing || ShmCharger->isGetAuthResult)
+		if(ShmCharger->isUpgradeLcmReq)
 		{
-			if(DiffTimebWithNow(startTime[ShmCharger->gun_selectd][TMR_IDX_SHOW_AUTH_RESULT]) >= TIME_AUTH_RESULT_TIME)
-				ShmCharger->isGetAuthResult = FALSE;
-
-			if(DiffTimebWithNow(startTime[ShmCharger->gun_selectd][TMR_IDX_SHOW_AUTH_RESULT]) < TIME_AUTH_RESULT_TIME)
-				page_authorizing(ShmCharger->gun_selectd);
-			else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus == SYS_MODE_IDLE) && (ShmCharger->gun_info[ShmCharger->gun_selectd].resultAuthorization == VALIDATED_RFID))
-				page_preparing(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
+			ShmCharger->isUpgradeLcmSuccess = ((lcdUpgrade("/mnt/lcd") == PASS) ? YES : NO);
+			ShmCharger->isUpgradeLcmReq = OFF;
 		}
 		else
 		{
-			ftime(&startTime[ShmCharger->gun_selectd][TMR_IDX_SHOW_AUTH_RESULT]);
+			if(previousMode != ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus)
+			{
+				previousMode = ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus;
+			}
 
-			switch(ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus)
+			if(ShmCharger->isAuthrizing || ShmCharger->isGetAuthResult)
 			{
-				case SYS_MODE_BOOTING:
-					page_booting();
-					break;
-				case SYS_MODE_IDLE:
-					page_idle(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
-					break;
-				case SYS_MODE_AUTHORIZING:
-					//page_authorizing(ShmCharger->gun_selectd);
-					break;
-				case SYS_MODE_PREPARING:
+				if(DiffTimebWithNow(startTime[ShmCharger->gun_selectd][TMR_IDX_SHOW_AUTH_RESULT]) >= TIME_AUTH_RESULT_TIME)
+					ShmCharger->isGetAuthResult = FALSE;
+
+				if(DiffTimebWithNow(startTime[ShmCharger->gun_selectd][TMR_IDX_SHOW_AUTH_RESULT]) < TIME_AUTH_RESULT_TIME)
+					page_authorizing(ShmCharger->gun_selectd);
+				else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus == SYS_MODE_IDLE) && (ShmCharger->gun_info[ShmCharger->gun_selectd].resultAuthorization == VALIDATED_RFID))
 					page_preparing(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
-					break;
-				case SYS_MODE_CHARGING:
-					page_charging(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
-					break;
-				case SYS_MODE_TERMINATING:
-					page_terminating(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
-					break;
-				case SYS_MODE_COMPLETE:
-					page_complete(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
-					break;
-				case SYS_MODE_ALARM:
-					page_alarm();
-					break;
-				case SYS_MODE_FAULT:
-					page_fault();
-					break;
-				case SYS_MODE_MAINTAIN:
-					page_maintain();
-					break;
-				case SYS_MODE_UPDATE:
-					page_update();
-					break;
-				case SYS_MODE_RESERVATION:
-					//page_reservation();
-					page_idle(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
-					break;
-				case SYS_MODE_BOOKING:
-					page_booking();
-					break;
-				case SYS_MODE_DEBUG:
-					page_debug();
-					break;
-				default:
-					page_unknown();
-					break;
 			}
-		}
+			else
+			{
+				ftime(&startTime[ShmCharger->gun_selectd][TMR_IDX_SHOW_AUTH_RESULT]);
 
-		page_header(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
-		page_footer();
+				switch(ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus)
+				{
+					case SYS_MODE_BOOTING:
+						page_booting();
+						break;
+					case SYS_MODE_IDLE:
+						page_idle(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
+						break;
+					case SYS_MODE_AUTHORIZING:
+						//page_authorizing(ShmCharger->gun_selectd);
+						break;
+					case SYS_MODE_PREPARING:
+						page_preparing(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
+						break;
+					case SYS_MODE_CHARGING:
+						page_charging(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
+						break;
+					case SYS_MODE_TERMINATING:
+						page_terminating(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
+						break;
+					case SYS_MODE_COMPLETE:
+						page_complete(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
+						break;
+					case SYS_MODE_ALARM:
+						page_alarm();
+						break;
+					case SYS_MODE_FAULT:
+						page_fault();
+						break;
+					case SYS_MODE_MAINTAIN:
+						page_maintain();
+						break;
+					case SYS_MODE_UPDATE:
+						page_update();
+						break;
+					case SYS_MODE_RESERVATION:
+						//page_reservation();
+						page_idle(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
+						break;
+					case SYS_MODE_BOOKING:
+						page_booking();
+						break;
+					case SYS_MODE_DEBUG:
+						page_debug();
+						break;
+					default:
+						page_unknown();
+						break;
+				}
+			}
+
+			page_header(ShmCharger->gun_selectd, ShmSysConfigAndInfo->SysInfo.AcChargingData[ShmCharger->gun_selectd].SystemStatus);
+			page_footer();
+		}
 
 		usleep(100000);
 	}

+ 1 - 2
EVSE/Projects/AW-CCS/Apps/LCM/lcmComm_dgus.c

@@ -45,12 +45,11 @@ int transceiverDgus(int32_t fd, uint8_t *tx, uint16_t tx_len, uint8_t *rx, uint1
 	displayMessageDgus(tx, tx_len, NO);
 	#endif
 
-	usleep(10000);
-
 	if(write(fd, tx, tx_len) >= ARRAY_SIZE(tx))
 	{
 		if(tx[3] == CMD_REG_WRITE_DATA)
 		{
+			usleep(100);
 			len = read(fd, rx, rx_len);
 			if(len > 0)
 			{

+ 49 - 12
EVSE/Projects/AW-CCS/Apps/main.c

@@ -2955,7 +2955,7 @@ int upgrade_check()
 	DIR *dir;
 	struct dirent *file;
 	char cmd[512];
-	long int MaxLen=48*1024*1024;
+	long int MaxLen=48*1024*1024, ImageLen=0, wrd;
 
 	if ((dir = opendir ("/mnt")) != NULL)
 	{
@@ -2967,6 +2967,9 @@ int upgrade_check()
 				// Wait for MCU upgrade finish.
 				while(ShmCharger->gun_info[0].mcuFlag.isMcuUpgradeReq || (AC_QUANTITY>1?ShmCharger->gun_info[1].mcuFlag.isMcuUpgradeReq:FALSE))sleep(1);
 
+				// Wait for LCM upgrade finish.
+				while(ShmCharger->isUpgradeLcmReq)sleep(1);
+
 				memset(&ShmCharger->fwUpgradeInfo, 0xFF, sizeof(Fw_Upgrade_Info));
 				DEBUG_INFO("New firmware file: %s\n", file->d_name);
 				sprintf(ShmCharger->fwUpgradeInfo.location, "/mnt/%s", file->d_name);
@@ -2975,7 +2978,7 @@ int upgrade_check()
 				{
 					unsigned char *ptr = malloc(MaxLen); //-48 is take out the header
 					memset(ptr, 0xFF, MaxLen);  //-48 is take out the header
-					read(fd, ptr, MaxLen);
+					ImageLen = read(fd, ptr, MaxLen);
 					close(fd);
 
 					ShmCharger->fwUpgradeInfo.fwType = ((ptr[0x13]<<0) | (ptr[0x12]<<8) | (ptr[0x11]<<16) | (ptr[0x10]<<24));
@@ -3039,6 +3042,39 @@ int upgrade_check()
 							case AC_WALLMOUNT_CONTROLLER:
 								for(int gun_index = 0;gun_index<AC_QUANTITY;gun_index++)
 									ShmCharger->gun_info[gun_index].mcuFlag.isMcuUpgradeReq = ON;
+								sleep(10);
+								break;
+							case LCM:
+								fd = open("/mnt/lcm.zip", O_RDWR | O_CREAT | O_EXCL);
+								if (fd < 0)
+								{
+									DEBUG_ERROR("Can not create lcm.zip file.\n");
+									result = FAIL;
+								}
+								else
+								{
+									// Write image to flash
+									DEBUG_INFO("Writing data to lcm.zip file...\n");
+									wrd=write(fd, ptr+48, ImageLen-48);
+									close(fd);
+									DEBUG_INFO(">> lcm.zip Written length: 0x%x\n", wrd);
+									if(wrd != (ImageLen-48))
+									{
+										result = FAIL;
+									}
+									else
+									{
+										runShellCmd("mkdir -p /mnt/lcd");
+										runShellCmd("unzip /mnt/lcm.zip -d /mnt/lcd");
+										sprintf(cmd, "yes|rm %s", ShmCharger->fwUpgradeInfo.location);
+										system(cmd);
+										system("rm -f /mnt/lcm.zip");
+										result = PASS;
+									}
+								}
+
+								ShmCharger->isUpgradeLcmReq = ON;
+								sleep(10);
 								break;
 							default:
 								result = FAIL;
@@ -3055,7 +3091,6 @@ int upgrade_check()
 						sprintf(cmd, "yes|rm %s", ShmCharger->fwUpgradeInfo.location);
 						system(cmd);
 					}
-
 					free(ptr);
 				}
 				else
@@ -3987,13 +4022,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;
+			DEBUG_INFO("Reservation request on gun-%d.\n", gun_index);
 		}
 	}
 	else if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20)
@@ -4001,13 +4037,13 @@ 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))
 			{
 				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;
+			DEBUG_INFO("Reservation request on gun-%d.\n", gun_index);
 		}
 	}
 }
@@ -4328,6 +4364,7 @@ void checkRemoteUpgradeStatus()
 		{
 			DEBUG_INFO("Firmware remote upgrading...\n");
 			sprintf((char*)ShmOCPP16Data->FirmwareStatusNotification.Status, "Installing");
+			sleep(1);
 			ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = ON;
 			ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = OFF;
 			int result = upgrade_check();
@@ -4774,7 +4811,7 @@ int main(void)
 				if((gpio_get_value(GPIO_IN_WAKEUP) == OFF) ||
 				   (ShmCharger->gun_info[gun_index].GPIO_Input.Button_Mode_Switch == ON) ||
 				   (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PreviousSystemStatus != ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus) ||
-				   (((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus == SYS_MODE_IDLE) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus == SYS_MODE_PREPARING)) &&
+				   (((ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus == SYS_MODE_IDLE) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus == SYS_MODE_PREPARING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus == SYS_MODE_RESERVATION)) &&
 					(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PilotState == CP_STATE_B) &&
 					(DiffTimebWithNow(startTime[gun_index][TMR_IDX_POWERSAVING_STATE_B]) < 10000)))
 				{
@@ -5930,8 +5967,8 @@ int main(void)
 						{
 							ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = CCS_PWM_DUTY_100;
 							ShmCharger->gun_info[gun_index].mcuFlag.isSetCpPwmDuty = ON;
+							sleep(3);
 							checkStopReason(gun_index);
-							sleep(6);
 							setChargerMode(gun_index, SYS_MODE_COMPLETE);
 						}
 						else if(ShmCharger->gun_info[gun_index].chargingMode == CHARGING_MODE_HLC)
@@ -6082,7 +6119,7 @@ int main(void)
 						ShmCharger->gun_info[gun_index].primaryMcuCp_Pwn_Duty.max_current = CCS_PWM_DUTY_100;
 						ShmCharger->gun_info[gun_index].mcuFlag.isSetCpPwmDuty = ON;
 						ShmCharger->gun_info[gun_index].isCCSWaitChangeDuty = OFF;
-
+						sleep(1);
 						checkStopReason(gun_index);
 						setChargerMode(gun_index, SYS_MODE_COMPLETE);
 					}
@@ -6092,7 +6129,7 @@ int main(void)
 					if(isModeChange(gun_index))
 					{
 						setLedMotion(gun_index, LED_ACTION_STOP);
-						sleep(2);
+						sleep(6);
 						setRelay(gun_index, OFF);
 						setRequest(gun_index, OFF);
 						sleep(13);
@@ -6187,7 +6224,7 @@ int main(void)
 						//======================================
 						// Upgrade complete reboot system
 						//======================================
-						if(!ShmCharger->gun_info[gun_index].mcuFlag.isMcuUpgradeReq && ((AC_QUANTITY>1)?!ShmCharger->gun_info[gun_index^1].mcuFlag.isMcuUpgradeReq:YES))
+						if(!ShmCharger->gun_info[gun_index].mcuFlag.isMcuUpgradeReq && ((AC_QUANTITY>1)?!ShmCharger->gun_info[gun_index^1].mcuFlag.isMcuUpgradeReq:YES) && !ShmCharger->isUpgradeLcmReq)
 						{
 							if(ShmCharger->isUpdateSuccess == YES)
 							{

+ 8 - 6
EVSE/Projects/AW-CCS/Apps/main.h

@@ -766,12 +766,14 @@ struct Charger
 
 	uint8_t					gun_selectd;
 	uint8_t	 				speaker_type;
-	uint8_t					isSpeakerOn:1;
-	uint8_t		 			isUpdateSuccess:1;
-	uint8_t		 			isCcsEnable:1;
-	uint8_t					isLcdOn:1;
-	uint8_t					isAuthrizing:1;
-	uint8_t					isGetAuthResult:1;
+	uint16_t				isSpeakerOn:1;
+	uint16_t		 		isUpdateSuccess:1;
+	uint16_t		 		isCcsEnable:1;
+	uint16_t				isLcdOn:1;
+	uint16_t				isAuthrizing:1;
+	uint16_t				isGetAuthResult:1;
+	uint16_t				isUpgradeLcmReq:1;
+	uint16_t				isUpgradeLcmSuccess:1;
 };
 
 #endif /* CONFIG_MAIN_H_ */