/*
 * Module_PhBackend.c
 *
 *  Created on: 2020/06/11
 *      Author: foluswen
 */
#include "Module_PhBackend.h"
#include "Module_RatedCurrent.h"

ParsingRatedCur modelnameInfo = {0};


int StoreLogMsg(const char *fmt, ...)
{
	char Buf[65536+256];
	char buffer[65536];
	//char Buf[4096+256];
	//char buffer[4096];
	time_t CurrentTime;
	struct tm *tm;
	struct timeval tv;
	va_list args;

	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);
	gettimeofday(&tv, NULL); // get microseconds, 10^-6

	sprintf(Buf,"echo -n \"[%04d.%02d.%02d %02d:%02d:%02d.%03ld]%s\" >>  /Storage/SystemLog/[%04d.%02d]Module_PhBackendLog",
			tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec/1000,
			buffer,
			tm->tm_year+1900,tm->tm_mon+1);
	system((const char*)Buf);

#ifdef ConsloePrintLog
	printf("[%04d.%02d.%02d %02d:%02d:%02d.%03ld]%s", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec/1000, buffer);
#endif

	return rc;
}

uint8_t split(char *src, const char *separator, char **dest)
{
     char *pNext;
     int count = 0;

     if (src == NULL || strlen(src) == 0)
        return count;
     if (separator == NULL || strlen(separator) == 0)
        return count;
     pNext = (char *)strtok(src,separator);
     while(pNext != NULL)
     {
         *dest++ = pNext;
         ++count;
         pNext = (char *)strtok(NULL,separator);
    }

     return count;
}

int decTobcd(int dec)
{
	return (dec/10 * 16)+ (dec%10);
}

//==========================================
// Init all share memory
//==========================================
int InitShareMemory()
{
	int result = PASS;
	int MeterSMId;

	//creat ShmSysConfigAndInfo
	if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo),  0777)) < 0)
    {
		#ifdef SystemLogMessage
		DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
		#endif
		result = FAIL;
	}
    else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
    {
    	#ifdef SystemLogMessage
    	DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
		#endif
    	result = FAIL;
   	 }
    else
    {}

   	//creat ShmStatusCodeData
   	if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData),  0777)) < 0)
    {
		#ifdef SystemLogMessage
   		DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
		#endif
   		result = FAIL;
	}
    else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
    {
    	#ifdef SystemLogMessage
    	DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
		#endif
    	result = FAIL;
   	}
    else
    {}

    return result;
}

uint8_t checksum_valid(struct Message *message)
{
	uint8_t chksum = 0;

	for(uint16_t idx=6;idx<(message->buffer[2] | ((uint16_t)message->buffer[3]<<8));idx++)
		chksum += message->buffer[idx];

	chksum += 11;

	return ((chksum&0xff)==message->buffer[(message->buffer[2] | ((uint16_t)message->buffer[3]<<8))-1]?PASS:FAIL);
}

uint8_t checksum_cal(struct Message *message)
{
	uint8_t chksum = 0;

	for(uint16_t idx=6;idx<(message->size-1);idx++)
		chksum += message->buffer[idx];

	chksum += 11;

	return (chksum & 0xff);
}

void showCmdRaw(struct Message *message, uint8_t isTx)
{
	if(isTx)
		DEBUG_INFO("%s -----> Server\n", ShmSysConfigAndInfo->SysConfig.SystemId);
	else
		DEBUG_INFO("%s <----- Server\n", ShmSysConfigAndInfo->SysConfig.SystemId);

	DEBUG_INFO("- CMD_%04d ------------------------------------\n", (message->buffer[6] | ((uint16_t)message->buffer[7]<<8)));
	DEBUG_INFO("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
	DEBUG_INFO("-----------------------------------------------\n");

	for(uint8_t idx=0;idx<((message->size/16)+1);idx++)
	{
		DEBUG_INFO("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", message->buffer[idx*16+0],
																									  message->buffer[idx*16+1],
																									  message->buffer[idx*16+2],
																									  message->buffer[idx*16+3],
																									  message->buffer[idx*16+4],
																									  message->buffer[idx*16+5],
																									  message->buffer[idx*16+6],
																									  message->buffer[idx*16+7],
																									  message->buffer[idx*16+8],
																									  message->buffer[idx*16+9],
																									  message->buffer[idx*16+10],
																									  message->buffer[idx*16+11],
																									  message->buffer[idx*16+12],
																									  message->buffer[idx*16+13],
																									  message->buffer[idx*16+14],
																									  message->buffer[idx*16+15]);
	}

	DEBUG_INFO("-----------------------------------------------\n");
}

void handle_cmd_1001(struct Message *in, struct Message *out)
{
	uint32_t startAddr;
	uint32_t offset = 0;
	uint8_t	count;
	uint32_t value;

	DEBUG_INFO("User ID: %d\n", (in->buffer[8] | ((uint16_t)in->buffer[9]<<8)));
	DEBUG_INFO("CMD SN: %d\n", (in->buffer[10] | ((uint16_t)in->buffer[11]<<8)));
	if(in->buffer[12])
			DEBUG_INFO("CMD Type: Set\n");
	else
		DEBUG_INFO("CMD Type: Query\n");

	startAddr = in->buffer[13] | ((uint32_t)in->buffer[14]<<8) | ((uint32_t)in->buffer[15]<<16) | ((uint32_t)in->buffer[16]<<24);
	count = in->buffer[17];

	if(in->buffer[12])
	{
		for(int idx=startAddr;idx<(startAddr+count);idx++)
		{
			value = in->buffer[20+(offset*4)] | ((uint32_t)in->buffer[21+(offset*4)]<<8) | ((uint32_t)in->buffer[22+(offset*4)]<<16) | ((uint32_t)in->buffer[23+(offset*4)]<<24);

			switch(idx)
			{
				case 1:
					DEBUG_INFO("Sign in interval: %d\n", value);
					offset++;
					break;
				case 2:
					DEBUG_INFO("Charger type: %d\n", value);
					offset++;
					break;
				case 3:
					DEBUG_INFO("Charger gun count: %d\n", value);
					offset++;
					break;
				case 4:
					DEBUG_INFO("Communication No: %d\n", value);
					offset++;
					break;
				case 5:
					offset++;
					break;
				case 6:
					offset++;
					break;
				case 7:
					offset++;
					break;
				case 8:
					offset++;
					break;
				case 9:
					offset++;
					break;
				case 10:
					offset++;
					break;
				case 11:
					offset++;
					break;
				case 12:
					offset++;
					break;
				case 13:
					offset++;
					break;
				case 14:
					offset++;
					break;
				case 15:
					offset++;
					break;
				case 16:
					offset++;
					break;
				case 17:
					offset++;
					break;
				case 18:
					offset++;
					break;
				case 19:
					offset++;
					break;
				case 20:
					DEBUG_INFO("Report interval: %d\n", value);
					offset++;
					break;
				case 21:
					DEBUG_INFO("Heart beat interval: %d\n", value);
					backend_info.interval_heartbeat = value;
					offset++;
					break;
				case 22:
					DEBUG_INFO("Heart beat overtime count: %d\n", value);
					backend_info.retry_heartbeat = value;
					offset++;
					break;
				case 23:
					DEBUG_INFO("Status report interval: %d\n", value);
					backend_info.interval_status = value;
					offset++;
					break;
				case 24:
					offset++;
					break;
				case 25:
					offset++;
					break;
				case 26:
					offset++;
					break;
				case 27:
					DEBUG_INFO("Service price: %.2f\n", (value/100.0));
					offset++;
					break;
				case 28:
					DEBUG_INFO("Charging price: %.2f\n", (value/100.0));
					offset++;
					break;
				case 29:
					offset++;
					break;
				case 30:
					offset++;
					break;
				case 31:
					offset++;
					break;
				case 32:
					offset++;
					break;
				case 33:
					offset++;
					break;
				case 34:
					offset++;
					break;
				case 35:
					offset++;
					break;
			}
		}
	}

	create_Cmd_1002(out, in->buffer[12], startAddr, count);
}

void handle_cmd_1003(struct Message *in, struct Message *out)
{
	uint32_t startAddr;
	uint8_t data[in->size-11-9];
	uint8_t *server_info[3];

	DEBUG_INFO("User ID: %d\n", (in->buffer[8] | ((uint16_t)in->buffer[9]<<8)));
	DEBUG_INFO("CMD SN: %d\n", (in->buffer[10] | ((uint16_t)in->buffer[11]<<8)));
	if(in->buffer[12])
		DEBUG_INFO("CMD Type: Set\n");
	else
		DEBUG_INFO("CMD Type: Query\n");

	startAddr = in->buffer[13] | ((uint32_t)in->buffer[14]<<8) | ((uint32_t)in->buffer[15]<<16) | ((uint32_t)in->buffer[16]<<24);
	memcpy(&data[0], &in->buffer[19], ARRAY_SIZE(data));

	switch(startAddr)
	{
		case 1:
			break;
		case 2:
			DEBUG_INFO("Server time: %02X%02X-%02X-%02X %02X:%02X:%02X\n", data[0], data[1], data[2], data[3], data[4], data[5], data[6]);
			break;
		case 3:
			break;
		case 4:
			break;
		case 5:
			break;
		case 6:
			break;
		case 7:
			break;
		case 8:
			break;
		case 9:
			break;
		case 10:
			break;
		case 11:
			memset(server_addr, 0x00, ARRAY_SIZE(server_addr));
			memcpy(&server_addr[0], &in->buffer[19], 128);
			split((char*)server_addr, ":", (char**)server_info);

			message_header = strtol((char*)server_info[2], NULL, 16);
			server_port = atoi((char*)server_info[1]);
			sprintf((char*)server_addr, "%s", (char*)server_info[0]);

			DEBUG_INFO("Server address: %s\n", server_addr);
			DEBUG_INFO("Server port: %d\n", server_port);
			DEBUG_INFO("Message header: %04X\n", message_header);
			break;
		case 12:
			DEBUG_INFO("Customer ID: %s\n", data);
			break;
	}

	create_Cmd_1004(out, in->buffer[12], startAddr, &data[0], ARRAY_SIZE(data));
}

void handle_cmd_1005(struct Message *in, struct Message *out)
{
	uint32_t startAddr;
	uint32_t offset = 0;
	uint8_t	count;
	uint32_t value;
	uint8_t	gun_index;

	DEBUG_INFO("User ID: %d\n", (in->buffer[8] | ((uint16_t)in->buffer[9]<<8)));
	DEBUG_INFO("CMD SN: %d\n", (in->buffer[10] | ((uint16_t)in->buffer[11]<<8)));

	gun_index = in->buffer[12];
	startAddr = in->buffer[13] | ((uint32_t)in->buffer[14]<<8) | ((uint32_t)in->buffer[15]<<16) | ((uint32_t)in->buffer[16]<<24);
	count = in->buffer[17];

	for(int idx=startAddr;idx<(startAddr+count);idx++)
	{
		value = in->buffer[20+(offset*4)] | ((uint32_t)in->buffer[21+(offset*4)]<<8) | ((uint32_t)in->buffer[22+(offset*4)]<<16) | ((uint32_t)in->buffer[23+(offset*4)]<<24);

		switch(idx)
		{
			case 1:
				if(value == 0x55)
				{
					DEBUG_INFO("Charger start.\n");
				}
				offset++;
				break;
			case 2:
				if(value == 0x55)
				{
					DEBUG_INFO("Charger stop.\n");
				}
				offset++;
				break;

			case 3:
				if(value == 0)
				{
					DEBUG_INFO("Charge soon.\n");
				}
				else if(value ==1)
				{
					DEBUG_INFO("Charge reserve.\n");
				}
				offset++;
				break;
			case 4:
				if(value == 0)
				{
					DEBUG_INFO("BMS control charging.\n");
				}
				else if(value == 1)
				{
					DEBUG_INFO("Directly charging.\n");
				}
				offset++;
				break;

			case 5:
				if(value == 0x55)
				{

				}
				offset++;
				break;

			case 6:
				if(value == 0x55)
				{

				}
				offset++;
				break;

			case 7:
				if(value == 0x55)
				{

				}
				offset++;
				break;

			case 8:
				if(value == 0x55)
				{

				}
				offset++;
				break;

			case 9:
				if(value == 0x55)
				{

				}
				offset++;
				break;

			case 10:
				if(value == 0x55)
				{

				}
				offset++;
				break;

			case 11:
				if(value == 0x55)
				{

				}
				offset++;
				break;

			case 12:
				if(value == 0x55)
				{

				}
				offset++;
				break;

			case 13:
				if(value == 0x55)
				{

				}
				offset++;
				break;

			case 14:
				if(value == 0x55)
				{

				}
				offset++;
				break;

			case 15:
				if(value == 0x55)
				{

				}
				offset++;
				break;

			case 16:
				if(value == 0x55)
				{

				}
				offset++;
				break;

			case 17:
				if(value == 0x55)
				{
					DEBUG_INFO("Upload log request.\n");
					system("/usr/bin/run_tmate_restart.sh");
				}
				offset++;
				break;

			case 18:
				if(value == 0x55)
				{

				}
				offset++;
				break;

			case 19:
				if(value == 0x55)
				{
					DEBUG_INFO("Disable charger.\n");
				}
				offset++;
				break;

			case 20:
				if(value == 0x55)
				{
					DEBUG_INFO("Enable charger.\n");
				}
				offset++;
				break;
		}
	}

	create_Cmd_1006(out, gun_index, startAddr, count, true);
}

void handle_cmd_1101(struct Message *in)
{
	DEBUG_INFO("User ID: %d\n", (in->buffer[8] | ((uint16_t)in->buffer[9]<<8)));
	DEBUG_INFO("CMD SN: %d\n", (in->buffer[10] | ((uint16_t)in->buffer[11]<<8)));
	backend_info.sn_heartbeat = (in->buffer[12] | ((uint16_t)in->buffer[13]<<8));
	backend_info.counter_heartbeat_retry = 0;
}

void handle_cmd_1103(struct Message *in)
{
	DEBUG_INFO("User ID: %d\n", (in->buffer[8] | ((uint16_t)in->buffer[9]<<8)));
	DEBUG_INFO("CMD SN: %d\n", (in->buffer[10] | ((uint16_t)in->buffer[11]<<8)));
	DEBUG_INFO("Connector id: %d\n", in->buffer[12]);
}

void handle_cmd_1105(struct Message *in)
{
	DEBUG_INFO("User ID: %d\n", (in->buffer[8] | ((uint16_t)in->buffer[9]<<8)));
	DEBUG_INFO("CMD SN: %d\n", (in->buffer[10] | ((uint16_t)in->buffer[11]<<8)));
	DEBUG_INFO("Charger sign in OK.\n");
	backend_info.isSignin = ON;
	backend_info.st_hearbeat = time((time_t*)NULL);
	backend_info.counter_heartbeat_retry = 0;
	backend_info.interval_heartbeat = 10;
	backend_info.interval_status = 30;
}

void handle_cmd_2303(struct Message *in, struct Message *out)
{
	DEBUG_INFO("User ID: %d\n", (in->buffer[8] | ((uint16_t)in->buffer[9]<<8)));
	DEBUG_INFO("CMD SN: %d\n", (in->buffer[10] | ((uint16_t)in->buffer[11]<<8)));
	create_Cmd_2304(out);
}

void handle_cmd_2305(struct Message *in, struct Message *out)
{
	DEBUG_INFO("User ID: %d\n", (in->buffer[8] | ((uint16_t)in->buffer[9]<<8)));
	DEBUG_INFO("CMD SN: %d\n", (in->buffer[10] | ((uint16_t)in->buffer[11]<<8)));
	create_Cmd_2306(out);
}



void create_Cmd_1002(struct Message *out, uint8_t cmd_type, uint32_t address, uint32_t count)
{
	memset(out->buffer, 0, ARRAY_SIZE(out->buffer));
	out->size = 9 + 43 + (count*4);

	// Message header
	out->buffer[0x00] = (message_header>>8) & 0xff;
	out->buffer[0x01] = (message_header>>0) & 0xff;

	// Message length
	out->buffer[0x02] = (out->size>>0) & 0xff;
	out->buffer[0x03] = (out->size>>8) & 0xff;

	// Message protocol version
	out->buffer[0x04] = PROTOCOL_VER;

	// Message server command serial number
	out->buffer[0x05] = server_cmd_sn & 0xff;

	// Message command
	out->buffer[0x06] = (1002>>0) & 0xff;
	out->buffer[0x07] = (1002>>8) & 0xff;

	// Message user id
	out->buffer[0x08] = (server_user_id>>0) & 0xff;
	out->buffer[0x09] = (server_user_id>>8) & 0xff;

	// Message server command serial number
	out->buffer[0x0a] = (server_cmd_sn>>0) & 0xff;
	out->buffer[0x0b] = (server_cmd_sn>>8) & 0xff;

	// Charger ID
	memcpy(&out->buffer[0x0c], &ShmSysConfigAndInfo->SysConfig.SystemId[0], 32);

	// Command type (0:Check  1:Set)
	out->buffer[0x2c] = cmd_type;

	// Start adress
	out->buffer[0x2d] = (address>>0) & 0xff;
	out->buffer[0x2e] = (address>>8) & 0xff;
	out->buffer[0x2f] = (address>>16) & 0xff;
	out->buffer[0x30] = (address>>24) & 0xff;

	// Count
	out->buffer[0x31] = count;

	// Result (0:Success  1:Fail)
	out->buffer[0x31] = 0x00;

	memset(&out->buffer[0x32], 0x00, (count*4));

	// Checksum
	out->buffer[out->size-1] = checksum_cal(out);

	showCmdRaw(out, true);

}

void create_Cmd_1004(struct Message *out, uint8_t cmd_type, uint32_t address, uint8_t *data, uint8_t data_len)
{
	memset(out->buffer, 0, ARRAY_SIZE(out->buffer));
	out->size = 9 + 42 + data_len;

	// Message header
	out->buffer[0x00] = (message_header>>8) & 0xff;
	out->buffer[0x01] = (message_header>>0) & 0xff;

	// Message length
	out->buffer[0x02] = (out->size>>0) & 0xff;
	out->buffer[0x03] = (out->size>>8) & 0xff;

	// Message protocol version
	out->buffer[0x04] = PROTOCOL_VER;

	// Message server command serial number
	out->buffer[0x05] = server_cmd_sn & 0xff;

	// Message command
	out->buffer[0x06] = (1004>>0) & 0xff;
	out->buffer[0x07] = (1004>>8) & 0xff;

	// Message user id
	out->buffer[0x08] = (server_user_id>>0) & 0xff;
	out->buffer[0x09] = (server_user_id>>8) & 0xff;

	// Message server command serial number
	out->buffer[0x0a] = (server_cmd_sn>>0) & 0xff;
	out->buffer[0x0b] = (server_cmd_sn>>8) & 0xff;

	// Charger ID
	memcpy(&out->buffer[0x0c], &ShmSysConfigAndInfo->SysConfig.SystemId[0], 32);

	// Command type (0:Check  1:Set)
	out->buffer[0x2c] = cmd_type;

	// Start adress
	out->buffer[0x2d] = (address>>0) & 0xff;
	out->buffer[0x2e] = (address>>8) & 0xff;
	out->buffer[0x2f] = (address>>16) & 0xff;
	out->buffer[0x30] = (address>>24) & 0xff;

	// Result (0:Success  1:Fail)
	out->buffer[0x31] = 0x00;

	// Result data
	memcpy(&out->buffer[0x32], &data[0], data_len);

	// Checksum
	out->buffer[out->size-1] = checksum_cal(out);

	showCmdRaw(out, true);
}

void create_Cmd_1006(struct Message *out, uint8_t gun_index, uint32_t address, uint8_t count, uint8_t isExecuted)
{
	memset(out->buffer, 0, ARRAY_SIZE(out->buffer));
	out->size = 0x34;

	// Message header
	out->buffer[0x00] = (message_header>>8) & 0xff;
	out->buffer[0x01] = (message_header>>0) & 0xff;

	// Message length
	out->buffer[0x02] = (out->size>>0) & 0xff;
	out->buffer[0x03] = (out->size>>8) & 0xff;

	// Message protocol version
	out->buffer[0x04] = PROTOCOL_VER;

	// Message server command serial number
	out->buffer[0x05] = server_cmd_sn & 0xff;

	// Message command
	out->buffer[0x06] = (1006>>0) & 0xff;
	out->buffer[0x07] = (1006>>8) & 0xff;

	// Message user id
	out->buffer[0x08] = (server_user_id>>0) & 0xff;
	out->buffer[0x09] = (server_user_id>>8) & 0xff;

	// Message server command serial number
	out->buffer[0x0a] = (server_cmd_sn>>0) & 0xff;
	out->buffer[0x0b] = (server_cmd_sn>>8) & 0xff;

	// Charger ID
	memcpy(&out->buffer[0x0c], &ShmSysConfigAndInfo->SysConfig.SystemId[0], 32);

	// Gun index
	out->buffer[0x2c] = gun_index;

	// Start adress
	out->buffer[0x2d] = (address>>0) & 0xff;
	out->buffer[0x2e] = (address>>8) & 0xff;
	out->buffer[0x2f] = (address>>16) & 0xff;
	out->buffer[0x30] = (address>>24) & 0xff;

	// Command count
	out->buffer[0x31] = count;

	// Command execute result;
	out->buffer[0x32] = isExecuted;

	// Checksum
	out->buffer[out->size-1] = checksum_cal(out);

	showCmdRaw(out, true);
}

void create_Cmd_1102(struct Message *out)
{
	memset(out->buffer, 0, ARRAY_SIZE(out->buffer));

	out->size = 0x2f;

	// Message header
	out->buffer[0x00] = (message_header>>8) & 0xff;
	out->buffer[0x01] = (message_header>>0) & 0xff;

	// Message length
	out->buffer[0x02] = (out->size>>0) & 0xff;
	out->buffer[0x03] = (out->size>>8) & 0xff;

	// Message protocol version
	out->buffer[0x04] = PROTOCOL_VER;

	// Message server command serial number
	out->buffer[0x05] = server_cmd_sn & 0xff;

	// Message command
	out->buffer[0x06] = (1102>>0) & 0xff;
	out->buffer[0x07] = (1102>>8) & 0xff;

	// Message user id
	out->buffer[0x08] = (server_user_id>>0) & 0xff;
	out->buffer[0x09] = (server_user_id>>8) & 0xff;

	// Message server command serial number
	out->buffer[0x0a] = (server_cmd_sn>>0) & 0xff;
	out->buffer[0x0b] = (server_cmd_sn>>8) & 0xff;

	// Charger ID
	memcpy(&out->buffer[0x0c], &ShmSysConfigAndInfo->SysConfig.SystemId[0], 32);

	// Heart beat sn
	out->buffer[0x2c] = (backend_info.sn_heartbeat>>0) & 0xff;
	out->buffer[0x2d] = (backend_info.sn_heartbeat>>8) & 0xff;

	// Checksum
	out->buffer[out->size-1] = checksum_cal(out);

	showCmdRaw(out, true);
}

void create_Cmd_1104(struct Message *out, uint8_t gun_index)
{
	uint8_t tempIndex;

	memset(out->buffer, 0, ARRAY_SIZE(out->buffer));

	out->size = 0xd7;

	// Message header
	out->buffer[0x00] = (message_header>>8) & 0xff;
	out->buffer[0x01] = (message_header>>0) & 0xff;

	// Message length
	out->buffer[0x02] = (out->size>>0) & 0xff;
	out->buffer[0x03] = (out->size>>8) & 0xff;

	// Message protocol version
	out->buffer[0x04] = PROTOCOL_VER;

	// Message server command serial number
	out->buffer[0x05] = server_cmd_sn & 0xff;

	// Message command
	out->buffer[0x06] = (1104>>0) & 0xff;
	out->buffer[0x07] = (1104>>8) & 0xff;

	// Message user id
	out->buffer[0x08] = (server_user_id>>0) & 0xff;
	out->buffer[0x09] = (server_user_id>>8) & 0xff;

	// Message server command serial number
	out->buffer[0x0a] = (server_cmd_sn>>0) & 0xff;
	out->buffer[0x0b] = (server_cmd_sn>>8) & 0xff;

	// Charger ID
	memcpy(&out->buffer[0x0c], &ShmSysConfigAndInfo->SysConfig.SystemId[0], 0x20);

	// Charger connector quantity
	out->buffer[0x2c] = AC_QUANTITY + CCS_QUANTITY + GB_QUANTITY + CHAdeMO_QUANTITY;

	// Connector id
	out->buffer[0x2d] = gun_index;

	// Charger model type (1: DC, 2: AC)
	out->buffer[0x2e] = (ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D'?1:2);

	// Connector status
	switch(modelnameInfo.ParsingInfo[gun_index].GunType)
	{
		case Gun_Type_Chademo:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_BOOTING) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_UPDATE))
							out->buffer[0x2f] = 7;
						else if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_IDLE)
							out->buffer[0x2f] = 0;
						else if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_AUTHORIZING) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_PREPARING))
							out->buffer[0x2f] = 1;
						else if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_PREPARE_FOR_EV) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_TERMINATING))
							out->buffer[0x2f] = 2;
						else if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_COMPLETE)
							out->buffer[0x2f] = 3;
						else if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_FAULT))
							out->buffer[0x2f] = 6;
						else if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_RESERVATION)
							out->buffer[0x2f] = 5;
						else
							out->buffer[0x2f] = 0;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
					{
						if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_BOOTING) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_UPDATE))
							out->buffer[0x2f] = 7;
						else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_IDLE)
							out->buffer[0x2f] = 0;
						else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_PREPARING))
							out->buffer[0x2f] = 1;
						else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_PREPARE_FOR_EV) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING))
							out->buffer[0x2f] = 2;
						else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_COMPLETE)
							out->buffer[0x2f] = 3;
						else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT))
							out->buffer[0x2f] = 6;
						else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_RESERVATION)
							out->buffer[0x2f] = 5;
						else
							out->buffer[0x2f] = 0;
					}
				}
			}

			break;
		case Gun_Type_CCS_2:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_BOOTING) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_UPDATE))
							out->buffer[0x2f] = 7;
						else if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_IDLE)
							out->buffer[0x2f] = 0;
						else if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_AUTHORIZING) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_PREPARING))
							out->buffer[0x2f] = 1;
						else if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_PREPARE_FOR_EV) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_TERMINATING))
							out->buffer[0x2f] = 2;
						else if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_COMPLETE)
							out->buffer[0x2f] = 3;
						else if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_FAULT))
							out->buffer[0x2f] = 6;
						else if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_RESERVATION)
							out->buffer[0x2f] = 5;
						else
							out->buffer[0x2f] = 0;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CCS_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
					{
						if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_BOOTING) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_UPDATE))
							out->buffer[0x2f] = 7;
						else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_IDLE)
							out->buffer[0x2f] = 0;
						else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_PREPARING))
							out->buffer[0x2f] = 1;
						else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_PREPARE_FOR_EV) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING))
							out->buffer[0x2f] = 2;
						else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_COMPLETE)
							out->buffer[0x2f] = 3;
						else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_FAULT))
							out->buffer[0x2f] = 6;
						else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_RESERVATION)
							out->buffer[0x2f] = 5;
						else
							out->buffer[0x2f] = 0;
					}
				}
			}

			break;
		case Gun_Type_GB:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_BOOTING) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_UPDATE))
							out->buffer[0x2f] = 7;
						else if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_IDLE)
							out->buffer[0x2f] = 0;
						else if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_AUTHORIZING) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_PREPARING))
							out->buffer[0x2f] = 1;
						else if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_PREPARE_FOR_EV) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_TERMINATING))
							out->buffer[0x2f] = 2;
						else if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_COMPLETE)
							out->buffer[0x2f] = 3;
						else if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_FAULT))
							out->buffer[0x2f] = 6;
						else if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_RESERVATION)
							out->buffer[0x2f] = 5;
						else
							out->buffer[0x2f] = 0;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < GB_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
					{
						if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_BOOTING) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_UPDATE))
							out->buffer[0x2f] = 7;
						else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_IDLE)
							out->buffer[0x2f] = 0;
						else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_PREPARING))
							out->buffer[0x2f] = 1;
						else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_PREPARE_FOR_EV) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_TERMINATING))
							out->buffer[0x2f] = 2;
						else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_COMPLETE)
							out->buffer[0x2f] = 3;
						else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_FAULT))
							out->buffer[0x2f] = 6;
						else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_RESERVATION)
							out->buffer[0x2f] = 5;
						else
							out->buffer[0x2f] = 0;
					}
				}
			}

			break;
		case Gun_Type_AC:
			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
			{
				tempIndex = 2;
			}
			else
			{
				tempIndex = gun_index;
			}

			for (int index = 0; index < AC_QUANTITY; index++)
			{
				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
				{
					if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_BOOTING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_UPDATE))
						out->buffer[0x2f] = 7;
					else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE)
						out->buffer[0x2f] = 0;
					else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_PREPARING))
						out->buffer[0x2f] = 1;
					else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_PREPARE_FOR_EV) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING))
						out->buffer[0x2f] = 2;
					else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_COMPLETE)
						out->buffer[0x2f] = 3;
					else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT))
						out->buffer[0x2f] = 6;
					else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_RESERVATION)
						out->buffer[0x2f] = 5;
					else
						out->buffer[0x2f] = 0;
				}
			}
			break;
	}

	// SOC
	switch(modelnameInfo.ParsingInfo[gun_index].GunType)
	{
		case Gun_Type_Chademo:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x30] = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.EvBatterySoc;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
					{
						out->buffer[0x30] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].EvBatterySoc;
					}
				}
			}

			break;
		case Gun_Type_CCS_2:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x30] = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.EvBatterySoc;					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CCS_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
					{
						out->buffer[0x30] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].EvBatterySoc;
					}
				}
			}

			break;
		case Gun_Type_GB:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x30] = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.EvBatterySoc;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < GB_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
					{
						out->buffer[0x30] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].EvBatterySoc;
					}
				}
			}

			break;
		case Gun_Type_AC:
			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
			{
				tempIndex = 2;
			}
			else
			{
				tempIndex = gun_index;
			}

			for (int index = 0; index < AC_QUANTITY; index++)
			{
				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
				{
					out->buffer[0x30] = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].EvBatterySoc;
				}
			}
			break;
	}

	// Alarm code
	out->buffer[0x31] = 0x00;
	out->buffer[0x32] = 0x00;
	out->buffer[0x33] = 0x00;
	out->buffer[0x34] = 0x00;

	// Connect status
	switch(modelnameInfo.ParsingInfo[gun_index].GunType)
	{
		case Gun_Type_Chademo:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x35] = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.ConnectorPlugIn?0x02:0x00;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
					{
						out->buffer[0x35] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn?0x02:0x00;
					}
				}
			}

			break;
		case Gun_Type_CCS_2:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x35] = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.ConnectorPlugIn?0x02:0x00;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CCS_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
					{
						out->buffer[0x35] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn?0x02:0x00;
					}
				}
			}

			break;
		case Gun_Type_GB:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x35] = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.ConnectorPlugIn?0x02:0x00;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < GB_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
					{
						out->buffer[0x35] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn?0x02:0x00;
					}
				}
			}

			break;
		case Gun_Type_AC:
			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
			{
				tempIndex = 2;
			}
			else
			{
				tempIndex = gun_index;
			}

			for (int index = 0; index < AC_QUANTITY; index++)
			{
				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
				{
					out->buffer[0x35] = ((2<=ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState<=5))?0x02:0x00;
				}
			}
			break;
	}

	// Charging amount
	out->buffer[0x36] = 0x00;
	out->buffer[0x37] = 0x00;
	out->buffer[0x38] = 0x00;
	out->buffer[0x39] = 0x00;

	// Charging temperature
	out->buffer[0x3a] = 0x00;
	out->buffer[0x3b] = 0x00;
	out->buffer[0x3c] = 0x00;
	out->buffer[0x3d] = 0x00;

	// Total power consumption
	switch(modelnameInfo.ParsingInfo[gun_index].GunType)
	{
		case Gun_Type_Chademo:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x3e] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)&0xff;
						out->buffer[0x3f] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)>>8)&0xff;
						out->buffer[0x40] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)>>16)&0xff;
						out->buffer[0x41] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)>>24)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
					{
						out->buffer[0x3e] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption*100)&0xff;
						out->buffer[0x3f] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption*100)>>8)&0xff;
						out->buffer[0x40] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption*100)>>16)&0xff;
						out->buffer[0x41] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption*100)>>24)&0xff;
					}
				}
			}

			break;
		case Gun_Type_CCS_2:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x3e] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)&0xff;
						out->buffer[0x3f] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)>>8)&0xff;
						out->buffer[0x40] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)>>16)&0xff;
						out->buffer[0x41] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)>>24)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CCS_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
					{
						out->buffer[0x3e] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption*100)&0xff;
						out->buffer[0x3f] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption*100)>>8)&0xff;
						out->buffer[0x40] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption*100)>>16)&0xff;
						out->buffer[0x41] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption*100)>>24)&0xff;
					}
				}
			}

			break;
		case Gun_Type_GB:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x3e] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)&0xff;
						out->buffer[0x3f] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)>>8)&0xff;
						out->buffer[0x40] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)>>16)&0xff;
						out->buffer[0x41] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)>>24)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < GB_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
					{
						out->buffer[0x3e] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption*100)&0xff;
						out->buffer[0x3f] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption*100)>>8)&0xff;
						out->buffer[0x40] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption*100)>>16)&0xff;
						out->buffer[0x41] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption*100)>>24)&0xff;
					}
				}
			}

			break;
		case Gun_Type_AC:
			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
			{
				tempIndex = 2;
			}
			else
			{
				tempIndex = gun_index;
			}

			for (int index = 0; index < AC_QUANTITY; index++)
			{
				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
				{
					out->buffer[0x3e] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption*100)&0xff;
					out->buffer[0x3f] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption*100)>>8)&0xff;
					out->buffer[0x40] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption*100)>>16)&0xff;
					out->buffer[0x41] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption*100)>>24)&0xff;
				}
			}
			break;
	}

	// DC voltage
	switch(modelnameInfo.ParsingInfo[gun_index].GunType)
	{
		case Gun_Type_Chademo:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x42] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.FireChargingVoltage*10)&0xff;
						out->buffer[0x43] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.FireChargingVoltage*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
					{
						out->buffer[0x42] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].FireChargingVoltage*10)&0xff;
						out->buffer[0x43] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].FireChargingVoltage*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_CCS_2:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x42] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.FireChargingVoltage*10)&0xff;
						out->buffer[0x43] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.FireChargingVoltage*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CCS_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
					{
						out->buffer[0x42] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].FireChargingVoltage*10)&0xff;
						out->buffer[0x43] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].FireChargingVoltage*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_GB:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x42] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.FireChargingVoltage*10)&0xff;
						out->buffer[0x43] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.FireChargingVoltage*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < GB_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
					{
						out->buffer[0x42] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].FireChargingVoltage*10)&0xff;
						out->buffer[0x43] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].FireChargingVoltage*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_AC:
			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
			{
				tempIndex = 2;
			}
			else
			{
				tempIndex = gun_index;
			}

			for (int index = 0; index < AC_QUANTITY; index++)
			{
				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
				{
					out->buffer[0x42] = 0x00;
					out->buffer[0x43] = 0x00;
				}
			}
			break;
	}

	// DC current
	switch(modelnameInfo.ParsingInfo[gun_index].GunType)
	{
		case Gun_Type_Chademo:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x44] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrent*10)&0xff;
						out->buffer[0x45] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrent*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
					{
						out->buffer[0x44] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrent*10)&0xff;
						out->buffer[0x45] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrent*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_CCS_2:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x44] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrent*10)&0xff;
						out->buffer[0x45] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrent*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CCS_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
					{
						out->buffer[0x44] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrent*10)&0xff;
						out->buffer[0x45] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrent*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_GB:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x44] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrent*10)&0xff;
						out->buffer[0x45] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrent*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < GB_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
					{
						out->buffer[0x44] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrent*10)&0xff;
						out->buffer[0x45] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrent*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_AC:
			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
			{
				tempIndex = 2;
			}
			else
			{
				tempIndex = gun_index;
			}

			for (int index = 0; index < AC_QUANTITY; index++)
			{
				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
				{
					out->buffer[0x44] = 0x00;
					out->buffer[0x45] = 0x00;
				}
			}
			break;
	}

	// BMS voltage request
	out->buffer[0x46] = 0x00;
	out->buffer[0x47] = 0x00;

	// BMS current request
	out->buffer[0x48] = 0x00;
	out->buffer[0x49] = 0x00;

	// BMS charging mode
	out->buffer[0x4a] = 0x00;

	// AC L1 voltage
	switch(modelnameInfo.ParsingInfo[gun_index].GunType)
	{
		case Gun_Type_Chademo:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x4b] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingVoltage*10)&0xff;
						out->buffer[0x4c] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingVoltage*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
					{
						out->buffer[0x4b] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltage*10)&0xff;
						out->buffer[0x4c] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltage*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_CCS_2:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x4b] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingVoltage*10)&0xff;
						out->buffer[0x4c] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingVoltage*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CCS_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
					{
						out->buffer[0x4b] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltage*10)&0xff;
						out->buffer[0x4c] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltage*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_GB:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x4b] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingVoltage*10)&0xff;
						out->buffer[0x4c] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingVoltage*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < GB_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
					{
						out->buffer[0x4b] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltage*10)&0xff;
						out->buffer[0x4c] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltage*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_AC:
			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
			{
				tempIndex = 2;
			}
			else
			{
				tempIndex = gun_index;
			}

			for (int index = 0; index < AC_QUANTITY; index++)
			{
				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
				{
					out->buffer[0x4b] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingVoltage*10)&0xff;
					out->buffer[0x4c] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingVoltage*10)>>8)&0xff;
				}
			}
			break;
	}

	// AC L2 voltage
	switch(modelnameInfo.ParsingInfo[gun_index].GunType)
	{
		case Gun_Type_Chademo:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x4d] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingVoltageL2*10)&0xff;
						out->buffer[0x4e] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingVoltageL2*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
					{
						out->buffer[0x4d] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltageL2*10)&0xff;
						out->buffer[0x4e] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltageL2*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_CCS_2:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x4d] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingVoltageL2*10)&0xff;
						out->buffer[0x4e] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingVoltageL2*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CCS_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
					{
						out->buffer[0x4d] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltageL2*10)&0xff;
						out->buffer[0x4e] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltageL2*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_GB:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x4d] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingVoltageL2*10)&0xff;
						out->buffer[0x4e] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingVoltageL2*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < GB_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
					{
						out->buffer[0x4d] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltageL2*10)&0xff;
						out->buffer[0x4e] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltageL2*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_AC:
			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
			{
				tempIndex = 2;
			}
			else
			{
				tempIndex = gun_index;
			}

			for (int index = 0; index < AC_QUANTITY; index++)
			{
				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
				{
					out->buffer[0x4d] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingVoltageL2*10)&0xff;
					out->buffer[0x4e] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingVoltageL2*10)>>8)&0xff;
				}
			}
			break;
	}

	// AC L3 voltage
	switch(modelnameInfo.ParsingInfo[gun_index].GunType)
	{
		case Gun_Type_Chademo:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x4f] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingVoltageL3*10)&0xff;
						out->buffer[0x50] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingVoltageL3*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
					{
						out->buffer[0x4f] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltageL3*10)&0xff;
						out->buffer[0x50] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltageL3*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_CCS_2:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x4f] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingVoltageL3*10)&0xff;
						out->buffer[0x50] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingVoltageL3*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CCS_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
					{
						out->buffer[0x4f] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltageL3*10)&0xff;
						out->buffer[0x50] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltageL3*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_GB:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x4f] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingVoltageL3*10)&0xff;
						out->buffer[0x50] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingVoltageL3*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < GB_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
					{
						out->buffer[0x4f] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltageL3*10)&0xff;
						out->buffer[0x50] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltageL3*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_AC:
			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
			{
				tempIndex = 2;
			}
			else
			{
				tempIndex = gun_index;
			}

			for (int index = 0; index < AC_QUANTITY; index++)
			{
				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
				{
					out->buffer[0x4f] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingVoltageL3*10)&0xff;
					out->buffer[0x50] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingVoltageL3*10)>>8)&0xff;
				}
			}
			break;
	}

	// AC L1 current
	switch(modelnameInfo.ParsingInfo[gun_index].GunType)
	{
		case Gun_Type_Chademo:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x51] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrent*10)&0xff;
						out->buffer[0x52] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrent*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
					{
						out->buffer[0x51] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrent*10)&0xff;
						out->buffer[0x52] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrent*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_CCS_2:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x51] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrent*10)&0xff;
						out->buffer[0x52] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrent*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CCS_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
					{
						out->buffer[0x51] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrent*10)&0xff;
						out->buffer[0x52] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrent*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_GB:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x51] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrent*10)&0xff;
						out->buffer[0x52] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrent*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < GB_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
					{
						out->buffer[0x51] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrent*10)&0xff;
						out->buffer[0x52] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrent*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_AC:
			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
			{
				tempIndex = 2;
			}
			else
			{
				tempIndex = gun_index;
			}

			for (int index = 0; index < AC_QUANTITY; index++)
			{
				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
				{
					out->buffer[0x51] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingCurrent*10)&0xff;
					out->buffer[0x52] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingCurrent*10)>>8)&0xff;
				}
			}
			break;
	}

	// AC L2 current
	switch(modelnameInfo.ParsingInfo[gun_index].GunType)
	{
		case Gun_Type_Chademo:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x53] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrentL2*10)&0xff;
						out->buffer[0x54] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrentL2*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
					{
						out->buffer[0x53] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrentL2*10)&0xff;
						out->buffer[0x54] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrentL2*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_CCS_2:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x53] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrentL2*10)&0xff;
						out->buffer[0x54] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrentL2*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CCS_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
					{
						out->buffer[0x53] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrentL2*10)&0xff;
						out->buffer[0x54] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrentL2*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_GB:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x53] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrentL2*10)&0xff;
						out->buffer[0x54] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrentL2*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < GB_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
					{
						out->buffer[0x53] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrentL2*10)&0xff;
						out->buffer[0x54] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrentL2*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_AC:
			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
			{
				tempIndex = 2;
			}
			else
			{
				tempIndex = gun_index;
			}

			for (int index = 0; index < AC_QUANTITY; index++)
			{
				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
				{
					out->buffer[0x53] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingCurrentL2*10)&0xff;
					out->buffer[0x54] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingCurrentL2*10)>>8)&0xff;
				}
			}
			break;
	}

	// AC L3 current
	switch(modelnameInfo.ParsingInfo[gun_index].GunType)
	{
		case Gun_Type_Chademo:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x55] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrentL3*10)&0xff;
						out->buffer[0x56] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrentL3*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
					{
						out->buffer[0x55] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrentL3*10)&0xff;
						out->buffer[0x56] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrentL3*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_CCS_2:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x55] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrentL3*10)&0xff;
						out->buffer[0x56] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrentL3*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CCS_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
					{
						out->buffer[0x55] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrentL3*10)&0xff;
						out->buffer[0x56] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrentL3*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_GB:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x55] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrentL3*10)&0xff;
						out->buffer[0x56] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargingCurrentL3*10)>>8)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < GB_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
					{
						out->buffer[0x55] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrentL3*10)&0xff;
						out->buffer[0x56] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrentL3*10)>>8)&0xff;
					}
				}
			}

			break;
		case Gun_Type_AC:
			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
			{
				tempIndex = 2;
			}
			else
			{
				tempIndex = gun_index;
			}

			for (int index = 0; index < AC_QUANTITY; index++)
			{
				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
				{
					out->buffer[0x55] = (uint16_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingCurrentL3*10)&0xff;
					out->buffer[0x56] = ((uint16_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingCurrentL3*10)>>8)&0xff;
				}
			}
			break;
	}

	// Charging remind time
	out->buffer[0x57] = 0x00;
	out->buffer[0x58] = 0x00;

	// Charging time
	switch(modelnameInfo.ParsingInfo[gun_index].GunType)
	{
		case Gun_Type_Chademo:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x59] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedDuration*1)&0xff;
						out->buffer[0x5a] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedDuration*1)>>8)&0xff;
						out->buffer[0x5b] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedDuration*1)>>16)&0xff;
						out->buffer[0x5c] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedDuration*1)>>24)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
					{
						out->buffer[0x59] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedDuration*1)&0xff;
						out->buffer[0x5a] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedDuration*1)>>8)&0xff;
						out->buffer[0x5b] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedDuration*1)>>16)&0xff;
						out->buffer[0x5c] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedDuration*1)>>24)&0xff;
					}
				}
			}

			break;
		case Gun_Type_CCS_2:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x59] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedDuration*1)&0xff;
						out->buffer[0x5a] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedDuration*1)>>8)&0xff;
						out->buffer[0x5b] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedDuration*1)>>16)&0xff;
						out->buffer[0x5c] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedDuration*1)>>24)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CCS_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
					{
						out->buffer[0x59] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedDuration*1)&0xff;
						out->buffer[0x5a] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedDuration*1)>>8)&0xff;
						out->buffer[0x5b] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedDuration*1)>>16)&0xff;
						out->buffer[0x5c] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedDuration*1)>>24)&0xff;
					}
				}
			}

			break;
		case Gun_Type_GB:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x59] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedDuration*1)&0xff;
						out->buffer[0x5a] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedDuration*1)>>8)&0xff;
						out->buffer[0x5b] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedDuration*1)>>16)&0xff;
						out->buffer[0x5c] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedDuration*1)>>24)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < GB_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
					{
						out->buffer[0x59] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedDuration*1)&0xff;
						out->buffer[0x5a] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedDuration*1)>>8)&0xff;
						out->buffer[0x5b] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedDuration*1)>>16)&0xff;
						out->buffer[0x5c] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedDuration*1)>>24)&0xff;
					}
				}
			}

			break;
		case Gun_Type_AC:
			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
			{
				tempIndex = 2;
			}
			else
			{
				tempIndex = gun_index;
			}

			for (int index = 0; index < AC_QUANTITY; index++)
			{
				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
				{
					out->buffer[0x59] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedDuration*1)&0xff;
					out->buffer[0x5a] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedDuration*1)>>8)&0xff;
					out->buffer[0x5b] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedDuration*1)>>16)&0xff;
					out->buffer[0x5c] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedDuration*1)>>24)&0xff;
				}
			}
			break;
	}

	// Charging power consumption
	switch(modelnameInfo.ParsingInfo[gun_index].GunType)
	{
		case Gun_Type_Chademo:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x5d] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedEnergy*100)&0xff;
						out->buffer[0x5e] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedEnergy*100)>>8)&0xff;
						out->buffer[0x5f] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedEnergy*100)>>16)&0xff;
						out->buffer[0x60] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedEnergy*100)>>24)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
					{
						out->buffer[0x5d] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy*100)&0xff;
						out->buffer[0x5e] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy*100)>>8)&0xff;
						out->buffer[0x5f] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy*100)>>16)&0xff;
						out->buffer[0x60] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy*100)>>24)&0xff;
					}
				}
			}

			break;
		case Gun_Type_CCS_2:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x5d] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedEnergy*100)&0xff;
						out->buffer[0x5e] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedEnergy*100)>>8)&0xff;
						out->buffer[0x5f] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedEnergy*100)>>16)&0xff;
						out->buffer[0x60] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedEnergy*100)>>24)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CCS_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
					{
						out->buffer[0x5d] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy*100)&0xff;
						out->buffer[0x5e] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy*100)>>8)&0xff;
						out->buffer[0x5f] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy*100)>>16)&0xff;
						out->buffer[0x60] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy*100)>>24)&0xff;
					}
				}
			}

			break;
		case Gun_Type_GB:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x5d] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedEnergy*100)&0xff;
						out->buffer[0x5e] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedEnergy*100)>>8)&0xff;
						out->buffer[0x5f] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedEnergy*100)>>16)&0xff;
						out->buffer[0x60] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PresentChargedEnergy*100)>>24)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < GB_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
					{
						out->buffer[0x5d] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy*100)&0xff;
						out->buffer[0x5e] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy*100)>>8)&0xff;
						out->buffer[0x5f] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy*100)>>16)&0xff;
						out->buffer[0x60] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy*100)>>24)&0xff;
					}
				}
			}

			break;
		case Gun_Type_AC:
			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
			{
				tempIndex = 2;
			}
			else
			{
				tempIndex = gun_index;
			}

			for (int index = 0; index < AC_QUANTITY; index++)
			{
				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
				{
					out->buffer[0x5d] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy*100)&0xff;
					out->buffer[0x5e] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy*100)>>8)&0xff;
					out->buffer[0x5f] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy*100)>>16)&0xff;
					out->buffer[0x60] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy*100)>>24)&0xff;
				}
			}
			break;
	}

	// Before charging meter value
	out->buffer[0x61] = 0x00;
	out->buffer[0x62] = 0x00;
	out->buffer[0x63] = 0x00;
	out->buffer[0x64] = 0x00;

	// After charging meter value
	switch(modelnameInfo.ParsingInfo[gun_index].GunType)
	{
		case Gun_Type_Chademo:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x65] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)&0xff;
						out->buffer[0x66] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)>>8)&0xff;
						out->buffer[0x67] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)>>16)&0xff;
						out->buffer[0x68] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)>>24)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
					{
						out->buffer[0x65] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption*100)&0xff;
						out->buffer[0x66] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption*100)>>8)&0xff;
						out->buffer[0x67] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption*100)>>16)&0xff;
						out->buffer[0x68] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption*100)>>24)&0xff;
					}
				}
			}

			break;
		case Gun_Type_CCS_2:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x65] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)&0xff;
						out->buffer[0x66] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)>>8)&0xff;
						out->buffer[0x67] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)>>16)&0xff;
						out->buffer[0x68] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)>>24)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CCS_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
					{
						out->buffer[0x65] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption*100)&0xff;
						out->buffer[0x66] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption*100)>>8)&0xff;
						out->buffer[0x67] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption*100)>>16)&0xff;
						out->buffer[0x68] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption*100)>>24)&0xff;
					}
				}
			}

			break;
		case Gun_Type_GB:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x65] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)&0xff;
						out->buffer[0x66] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)>>8)&0xff;
						out->buffer[0x67] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)>>16)&0xff;
						out->buffer[0x68] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.PowerConsumption*100)>>24)&0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < GB_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
					{
						out->buffer[0x65] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption*100)&0xff;
						out->buffer[0x66] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption*100)>>8)&0xff;
						out->buffer[0x67] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption*100)>>16)&0xff;
						out->buffer[0x68] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption*100)>>24)&0xff;
					}
				}
			}

			break;
		case Gun_Type_AC:
			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
			{
				tempIndex = 2;
			}
			else
			{
				tempIndex = gun_index;
			}

			for (int index = 0; index < AC_QUANTITY; index++)
			{
				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
				{
					out->buffer[0x65] = (uint32_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption*100)&0xff;
					out->buffer[0x66] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption*100)>>8)&0xff;
					out->buffer[0x67] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption*100)>>16)&0xff;
					out->buffer[0x68] = ((uint32_t)(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption*100)>>24)&0xff;
				}
			}
			break;
	}

	// Start method
	out->buffer[0x69] = 0x00;

	// Charging strategy
	out->buffer[0x6a] = 0x00;

	// Charging parameter
	out->buffer[0x6b] = 0x00;
	out->buffer[0x6c] = 0x00;
	out->buffer[0x6d] = 0x00;
	out->buffer[0x6e] = 0x00;

	// Reservation flag
	switch(modelnameInfo.ParsingInfo[gun_index].GunType)
	{
		case Gun_Type_Chademo:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x6f] = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_RESERVATION?0x01:0x00;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
					{
						out->buffer[0x6f] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_RESERVATION?0x01:0x00;
					}
				}
			}

			break;
		case Gun_Type_CCS_2:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x6f] = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_RESERVATION?0x01:0x00;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CCS_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
					{
						out->buffer[0x6f] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_RESERVATION?0x01:0x00;
					}
				}
			}

			break;
		case Gun_Type_GB:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						out->buffer[0x6f] = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_RESERVATION?0x01:0x00;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < GB_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
					{
						out->buffer[0x6f] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_RESERVATION?0x01:0x00;
					}
				}
			}

			break;
		case Gun_Type_AC:
			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
			{
				tempIndex = 2;
			}
			else
			{
				tempIndex = gun_index;
			}

			for (int index = 0; index < AC_QUANTITY; index++)
			{
				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
				{
					out->buffer[0x6f] = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_RESERVATION?0x01:0x00;
				}
			}
			break;
	}

	// User
	memset(&out->buffer[0x70], 0x00, 0x24);
	switch(modelnameInfo.ParsingInfo[gun_index].GunType)
	{
		case Gun_Type_Chademo:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						memcpy(&out->buffer[0x70], ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.StartUserId, ARRAY_SIZE(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.StartUserId));
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
					{
						memcpy(&out->buffer[0x70], ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].StartUserId, ARRAY_SIZE(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].StartUserId));
					}
				}
			}

			break;
		case Gun_Type_CCS_2:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						memcpy(&out->buffer[0x70], ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.StartUserId, ARRAY_SIZE(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.StartUserId));
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CCS_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
					{
						memcpy(&out->buffer[0x70], ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].StartUserId, ARRAY_SIZE(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].StartUserId));
					}
				}
			}

			break;
		case Gun_Type_GB:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						memcpy(&out->buffer[0x70], ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.StartUserId, ARRAY_SIZE(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.StartUserId));
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < GB_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
					{
						memcpy(&out->buffer[0x70], ShmSysConfigAndInfo->SysInfo.GbChargingData[index].StartUserId, ARRAY_SIZE(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].StartUserId));
					}
				}
			}

			break;
		case Gun_Type_AC:
			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
			{
				tempIndex = 2;
			}
			else
			{
				tempIndex = gun_index;
			}

			for (int index = 0; index < AC_QUANTITY; index++)
			{
				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
				{
					memcpy(&out->buffer[0x70], ShmSysConfigAndInfo->SysInfo.AcChargingData[index].StartUserId, ARRAY_SIZE(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].StartUserId));
				}
			}
			break;
	}

	// Reservation over time
	out->buffer[0x94] = 0x00;

	// Start time
	struct ParsingResult
	{
		int year;
		int month;
		int mday;
		int hour;
		int min;
		int sec;
	}result;
	switch(modelnameInfo.ParsingInfo[gun_index].GunType)
	{
		case Gun_Type_Chademo:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						sscanf((char*)ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.StartDateTime, "%04d.%02d.%02d %02d:%02d:%02d",
																																							&result.year,
																																							&result.month,
																																							&result.mday,
																																							&result.hour,
																																							&result.min,
																																							&result.sec);

						out->buffer[0x95] = decTobcd(result.year/100) & 0xff;
						out->buffer[0x96] = decTobcd(result.year%100) & 0xff;
						out->buffer[0x97] = decTobcd(result.month) & 0xff;
						out->buffer[0x98] = decTobcd(result.mday) & 0xff;
						out->buffer[0x99] = decTobcd(result.hour) & 0xff;
						out->buffer[0x9a] = decTobcd(result.min) & 0xff;
						out->buffer[0x9b] = decTobcd(result.sec) & 0xff;
						out->buffer[0x9c] = 0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CHAdeMO_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
					{
						sscanf((char*)ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].StartDateTime, "%04d.%02d.%02d %02d:%02d:%02d",
																																		&result.year,
																																		&result.month,
																																		&result.mday,
																																		&result.hour,
																																		&result.min,
																																		&result.sec);

						out->buffer[0x95] = decTobcd(result.year/100) & 0xff;
						out->buffer[0x96] = decTobcd(result.year%100) & 0xff;
						out->buffer[0x97] = decTobcd(result.month) & 0xff;
						out->buffer[0x98] = decTobcd(result.mday) & 0xff;
						out->buffer[0x99] = decTobcd(result.hour) & 0xff;
						out->buffer[0x9a] = decTobcd(result.min) & 0xff;
						out->buffer[0x9b] = decTobcd(result.sec) & 0xff;
						out->buffer[0x9c] = 0xff;
					}
				}
			}

			break;
		case Gun_Type_CCS_2:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						sscanf((char*)ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.StartDateTime, "%04d.%02d.%02d %02d:%02d:%02d",
																																							&result.year,
																																							&result.month,
																																							&result.mday,
																																							&result.hour,
																																							&result.min,
																																							&result.sec);

						out->buffer[0x95] = decTobcd(result.year/100) & 0xff;
						out->buffer[0x96] = decTobcd(result.year%100) & 0xff;
						out->buffer[0x97] = decTobcd(result.month) & 0xff;
						out->buffer[0x98] = decTobcd(result.mday) & 0xff;
						out->buffer[0x99] = decTobcd(result.hour) & 0xff;
						out->buffer[0x9a] = decTobcd(result.min) & 0xff;
						out->buffer[0x9b] = decTobcd(result.sec) & 0xff;
						out->buffer[0x9c] = 0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < CCS_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
					{
						sscanf((char*)ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].StartDateTime, "%04d.%02d.%02d %02d:%02d:%02d",
																																		&result.year,
																																		&result.month,
																																		&result.mday,
																																		&result.hour,
																																		&result.min,
																																		&result.sec);

						out->buffer[0x95] = decTobcd(result.year/100) & 0xff;
						out->buffer[0x96] = decTobcd(result.year%100) & 0xff;
						out->buffer[0x97] = decTobcd(result.month) & 0xff;
						out->buffer[0x98] = decTobcd(result.mday) & 0xff;
						out->buffer[0x99] = decTobcd(result.hour) & 0xff;
						out->buffer[0x9a] = decTobcd(result.min) & 0xff;
						out->buffer[0x9b] = decTobcd(result.sec) & 0xff;
						out->buffer[0x9c] = 0xff;
					}
				}
			}

			break;
		case Gun_Type_GB:
			if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
			{
				tempIndex = gun_index;

				for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
					{
						sscanf((char*)ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.StartDateTime, "%04d.%02d.%02d %02d:%02d:%02d",
																																							&result.year,
																																							&result.month,
																																							&result.mday,
																																							&result.hour,
																																							&result.min,
																																							&result.sec);

						out->buffer[0x95] = decTobcd(result.year/100) & 0xff;
						out->buffer[0x96] = decTobcd(result.year%100) & 0xff;
						out->buffer[0x97] = decTobcd(result.month) & 0xff;
						out->buffer[0x98] = decTobcd(result.mday) & 0xff;
						out->buffer[0x99] = decTobcd(result.hour) & 0xff;
						out->buffer[0x9a] = decTobcd(result.min) & 0xff;
						out->buffer[0x9b] = decTobcd(result.sec) & 0xff;
						out->buffer[0x9c] = 0xff;
					}
				}
			}
			else
			{
				if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
				{
					tempIndex = ((gun_index==2) ? 1: 0);
				}
				else
				{
					tempIndex = gun_index;
				}

				for (int index = 0; index < GB_QUANTITY; index++)
				{
					if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
					{
						sscanf((char*)ShmSysConfigAndInfo->SysInfo.GbChargingData[index].StartDateTime, "%04d.%02d.%02d %02d:%02d:%02d",
																																		&result.year,
																																		&result.month,
																																		&result.mday,
																																		&result.hour,
																																		&result.min,
																																		&result.sec);

						out->buffer[0x95] = decTobcd(result.year/100) & 0xff;
						out->buffer[0x96] = decTobcd(result.year%100) & 0xff;
						out->buffer[0x97] = decTobcd(result.month) & 0xff;
						out->buffer[0x98] = decTobcd(result.mday) & 0xff;
						out->buffer[0x99] = decTobcd(result.hour) & 0xff;
						out->buffer[0x9a] = decTobcd(result.min) & 0xff;
						out->buffer[0x9b] = decTobcd(result.sec) & 0xff;
						out->buffer[0x9c] = 0xff;
					}
				}
			}

			break;
		case Gun_Type_AC:
			if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
			{
				tempIndex = 2;
			}
			else
			{
				tempIndex = gun_index;
			}

			for (int index = 0; index < AC_QUANTITY; index++)
			{
				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
				{
					sscanf((char*)ShmSysConfigAndInfo->SysInfo.AcChargingData[index].StartDateTime, "%d.%d.%d %d:%d:%d",
																																	&result.year,
																																	&result.month,
																																	&result.mday,
																																	&result.hour,
																																	&result.min,
																																	&result.sec);

					out->buffer[0x95] = decTobcd(result.year/100) & 0xff;
					out->buffer[0x96] = decTobcd(result.year%100) & 0xff;
					out->buffer[0x97] = decTobcd(result.month) & 0xff;
					out->buffer[0x98] = decTobcd(result.mday) & 0xff;
					out->buffer[0x99] = decTobcd(result.hour) & 0xff;
					out->buffer[0x9a] = decTobcd(result.min) & 0xff;
					out->buffer[0x9b] = decTobcd(result.sec) & 0xff;
					out->buffer[0x9c] = 0xff;
				}
			}
			break;
	}



	// Surplus
	memset(&out->buffer[0x9d], 0x00, 0x04);

	// System variable reserve
	memset(&out->buffer[0xa1], 0x00, 0x14);

	// RFID/Member flag
	out->buffer[0xb5] = 0x00;

	// Order No.
	memset(&out->buffer[0xb6], 0x00, 0x20);

	// SN
	memset(&out->buffer[0xd6], 0x00, 0x10);

	// Checksum
	out->buffer[out->size-1] = checksum_cal(out);

	showCmdRaw(out, true);
}

void create_Cmd_1106(struct Message *out)
{
	memset(out->buffer, 0, ARRAY_SIZE(out->buffer));

	out->size = 0x63;

	// Message header
	out->buffer[0x00] = (message_header>>8) & 0xff;
	out->buffer[0x01] = (message_header>>0) & 0xff;

	// Message length
	out->buffer[0x02] = (out->size>>0) & 0xff;
	out->buffer[0x03] = (out->size>>8) & 0xff;

	// Message protocol version
	out->buffer[0x04] = PROTOCOL_VER;

	// Message server command serial number
	out->buffer[0x05] = server_cmd_sn & 0xff;

	// Message command
	out->buffer[0x06] = (1106>>0) & 0xff;
	out->buffer[0x07] = (1106>>8) & 0xff;

	// Message user id
	out->buffer[0x08] = (server_user_id>>0) & 0xff;
	out->buffer[0x09] = (server_user_id>>8) & 0xff;

	// Message server command serial number
	out->buffer[0x0a] = (server_cmd_sn>>0) & 0xff;
	out->buffer[0x0b] = (server_cmd_sn>>8) & 0xff;

	// Charger ID
	memcpy(&out->buffer[0x0c], &ShmSysConfigAndInfo->SysConfig.SystemId[0], 32);

	// Charger type  (0:Normal  1:none polar  2:polling)
	out->buffer[0x2c] = 0x00;

	// Software version
	out->buffer[0x2d] = 0x01;
	out->buffer[0x2e] = 0x00;
	out->buffer[0x2f] = 0x00;
	out->buffer[0x30] = 0x00;

	// Charger item type
	out->buffer[0x31] = 0x00;
	out->buffer[0x32] = 0x00;

	// Start count
	out->buffer[0x33] = 0x00;
	out->buffer[0x34] = 0x00;
	out->buffer[0x35] = 0x00;
	out->buffer[0x36] = 0x00;

	// Data upload type  (1:Handshake  2:Report)
	out->buffer[0x37] = 0x02;

	// Register time  (Minute)
	out->buffer[0x38] = 0x00;
	out->buffer[0x39] = 0x00;

	// Spare
	out->buffer[0x3a] = 0x00;

	// Charge gun count
	out->buffer[0x3b] = 0x01;

	// Heart beat upload cycle
	out->buffer[0x3c] = 0x98;

	// Heart beat overtime count
	out->buffer[0x3d] = 0x00;

	// Charge record count
	out->buffer[0x3e] = 0x00;
	out->buffer[0x3f] = 0x00;
	out->buffer[0x40] = 0x00;
	out->buffer[0x41] = 0x00;

	// Current system time
	out->buffer[0x42] = 0x20;
	out->buffer[0x43] = 0x20;
	out->buffer[0x44] = 0x06;
	out->buffer[0x45] = 0x11;
	out->buffer[0x46] = 0x11;
	out->buffer[0x47] = 0x02;
	out->buffer[0x48] = 0x18;
	out->buffer[0x49] = 0xff;

	// Latest charge time
	out->buffer[0x4a] = 0x20;
	out->buffer[0x4b] = 0x20;
	out->buffer[0x4c] = 0x06;
	out->buffer[0x4d] = 0x11;
	out->buffer[0x4e] = 0x11;
	out->buffer[0x4f] = 0x01;
	out->buffer[0x50] = 0x52;
	out->buffer[0x51] = 0xff;

	// Latest start time
	out->buffer[0x52] = 0x20;
	out->buffer[0x53] = 0x20;
	out->buffer[0x54] = 0x06;
	out->buffer[0x55] = 0x11;
	out->buffer[0x56] = 0x11;
	out->buffer[0x57] = 0x01;
	out->buffer[0x58] = 0x52;
	out->buffer[0x59] = 0xff;

	// Latest register time
	out->buffer[0x5a] = 0x20;
	out->buffer[0x5b] = 0x20;
	out->buffer[0x5c] = 0x06;
	out->buffer[0x5d] = 0x11;
	out->buffer[0x5e] = 0x11;
	out->buffer[0x5f] = 0x02;
	out->buffer[0x60] = 0x08;
	out->buffer[0x61] = 0xff;

	// Checksum
	out->buffer[out->size-1] = checksum_cal(out);

	showCmdRaw(out, true);
}

void create_Cmd_2304(struct Message *out)
{
	memset(out->buffer, 0, ARRAY_SIZE(out->buffer));

	out->size = 0x0e;

	// Message header
	out->buffer[0x00] = (message_header>>8) & 0xff;
	out->buffer[0x01] = (message_header>>0) & 0xff;

	// Message length
	out->buffer[0x02] = (out->size>>0) & 0xff;
	out->buffer[0x03] = (out->size>>8) & 0xff;

	// Message protocol version
	out->buffer[0x04] = PROTOCOL_VER;

	// Message server command serial number
	out->buffer[0x05] = server_cmd_sn & 0xff;

	// Message command
	out->buffer[0x06] = (2304>>0) & 0xff;
	out->buffer[0x07] = (2304>>8) & 0xff;

	// Message user id
	out->buffer[0x08] = (server_user_id>>0) & 0xff;
	out->buffer[0x09] = (server_user_id>>8) & 0xff;

	// Message server command serial number
	out->buffer[0x0a] = (server_cmd_sn>>0) & 0xff;
	out->buffer[0x0b] = (server_cmd_sn>>8) & 0xff;

	// Result (0:Success  1:Fail)
	out->buffer[0x0c] = 0x00;

	// Checksum
	out->buffer[out->size-1] = checksum_cal(out);

	showCmdRaw(out, true);

}

void create_Cmd_2306(struct Message *out)
{
	memset(out->buffer, 0, ARRAY_SIZE(out->buffer));

	out->size = 0x11;

	// Message header
	out->buffer[0x00] = (message_header>>8) & 0xff;
	out->buffer[0x01] = (message_header>>0) & 0xff;

	// Message length
	out->buffer[0x02] = (out->size>>0) & 0xff;
	out->buffer[0x03] = (out->size>>8) & 0xff;

	// Message protocol version
	out->buffer[0x04] = PROTOCOL_VER;

	// Message server command serial number
	out->buffer[0x05] = server_cmd_sn & 0xff;

	// Message command
	out->buffer[0x06] = (2306>>0) & 0xff;
	out->buffer[0x07] = (2306>>8) & 0xff;

	// Message user id
	out->buffer[0x08] = (server_user_id>>0) & 0xff;
	out->buffer[0x09] = (server_user_id>>8) & 0xff;

	// Message server command serial number
	out->buffer[0x0a] = (server_cmd_sn>>0) & 0xff;
	out->buffer[0x0b] = (server_cmd_sn>>8) & 0xff;

	// Result (0:Success  1:Fail)
	out->buffer[0x0c] = 0x00;
	out->buffer[0x0d] = 0x00;
	out->buffer[0x0e] = 0x00;
	out->buffer[0x0f] = 0x00;

	// Checksum
	out->buffer[out->size-1] = checksum_cal(out);

	showCmdRaw(out, true);
}

int main(void)
{
	struct PreviousState
	{
		uint8_t sys_mode;
		uint8_t connector_status;

		uint8_t isReportStatusReq:1;
	}previousState[3];

	int 				sockfd;
	struct sockaddr_in 	info;
	struct hostent 		*ghbn;
	struct timeval 		tv;
	uint8_t 			socketEnable;

	struct Message		input;
	struct Message		intputBuf;
	struct Message		output;

	sprintf((char*)server_addr, "evsocket.phihong.com.tw");
	server_port = 9999;

	if(InitShareMemory() == FAIL)
	{
		DEBUG_ERROR("InitShareMemory NG\n");

		if(ShmStatusCodeData!=NULL)
		{
			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=ON;
		}
		sleep(5);
		return 0;
	}
	RatedCurrentParsing((char*)ShmSysConfigAndInfo->SysConfig.ModelName, &modelnameInfo);
	DEBUG_INFO("Initialize OK!\n");

	for(;;)
	{
		while(!ShmSysConfigAndInfo->SysInfo.InternetConn)
		{
			sleep(1);
		}

		bzero(&info,sizeof(info));
		ghbn = gethostbyname((char*)server_addr);
		info.sin_family = PF_INET;
		info.sin_addr.s_addr = inet_addr(inet_ntoa(*(struct in_addr *)ghbn->h_addr_list[0]));
		info.sin_port = htons(server_port);
		DEBUG_INFO("Connecto to %s:%d\n", inet_ntoa(*(struct in_addr *)ghbn->h_addr_list[0]), server_port);

		sockfd = socket(AF_INET, SOCK_STREAM, 0);
		if (sockfd == -1)
		{
			DEBUG_ERROR("Fail to create a socket.");
			return 0;
		}

		if(connect(sockfd, (struct sockaddr *)&info,sizeof(info)) ==-1)
		{
			DEBUG_ERROR("Connection error");
		}
		else
		{
			DEBUG_INFO("Connect success.\n");
			tv.tv_sec = 0;
			tv.tv_usec = 500000;
			setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
			socketEnable = ON;
		}

		while(socketEnable)
		{
			memset(input.buffer, 0, ARRAY_SIZE(input.buffer));
			if((input.size = recv(sockfd, input.buffer, ARRAY_SIZE(input.buffer), 0)) > 0)
			{
				if(input.size < ARRAY_SIZE(input.buffer))
				{
					//DEBUG_INFO("Receive size: %d.\n", input.size);
					for(uint16_t idx=0;idx<input.size;idx++)
					{
						if((input.buffer[idx] == ((message_header>>8) & 0xff)) && (input.buffer[idx+1] == ((message_header>>0) & 0xff)))
						{
							//DEBUG_INFO("idx: %d\n", idx);
							memset(&intputBuf.buffer[0], 0x00, ARRAY_SIZE(intputBuf.buffer));
							memcpy(&intputBuf.buffer[0], &input.buffer[idx], input.buffer[idx+2] | ((uint16_t)input.buffer[idx+3]<<8));
							intputBuf.size = input.buffer[idx+2] | ((uint16_t)input.buffer[idx+3]<<8);
							idx += (input.buffer[idx+2] | (uint16_t)input.buffer[idx+3]) -1;
							server_cmd_sn = intputBuf.buffer[10] | ((uint16_t)intputBuf.buffer[11]<<8);

							if(!checksum_valid(&intputBuf))
								DEBUG_INFO("Message checksum wrong.\n");
							else
							{
								showCmdRaw(&intputBuf, OFF);
								switch(intputBuf.buffer[6] | ((uint16_t)intputBuf.buffer[7]<<8))
								{
									case 1001:
										handle_cmd_1001(&intputBuf, &output);
										send(sockfd, output.buffer, output.size, 0);
										break;
									case 1003:
										handle_cmd_1003(&intputBuf, &output);
										send(sockfd, output.buffer, output.size, 0);
										break;
									case 1005:
										handle_cmd_1005(&intputBuf, &output);
										send(sockfd, output.buffer, output.size, 0);
										break;
									case 1101:
										handle_cmd_1101(&intputBuf);
										break;
									case 1103:
										handle_cmd_1103(&intputBuf);
										break;
									case 1105:
										handle_cmd_1105(&intputBuf);
										break;
									case 2303:
										handle_cmd_2303(&intputBuf, &output);
										send(sockfd, output.buffer, output.size, 0);
										break;
									case 2305:
										handle_cmd_2305(&intputBuf, &output);
										send(sockfd, output.buffer, output.size, 0);
										break;
								}
							}
						}
					}
				}
			}
			else if(input.size == 0)
			{
				DEBUG_INFO("Disconnected.\n");
				fflush(stdout);
				backend_info.isSignin = OFF;
				socketEnable = OFF;
			}
			else if(input.size == -1)
			{
				// Sign in request
				if(!backend_info.isSignin)
				{
					create_Cmd_1106(&output);
					send(sockfd, output.buffer, output.size, 0);
				}

				// Heart beat request
				if(backend_info.isSignin && (difftime(time((time_t*)NULL), backend_info.st_hearbeat) > backend_info.interval_heartbeat))
				{
					create_Cmd_1102(&output);
					send(sockfd, output.buffer, output.size, 0);
					backend_info.st_hearbeat = time((time_t*)NULL);
					backend_info.counter_heartbeat_retry++;
				}

				// Heart beat retry fail
				if(backend_info.isSignin &&  (backend_info.counter_heartbeat_retry > backend_info.retry_heartbeat))
				{
					fflush(stdout);
					backend_info.isSignin = OFF;
					socketEnable = OFF;
					DEBUG_ERROR("Heart beat retry over count.\n");
				}

				for(uint8_t gun_index=0;gun_index<modelnameInfo.GetGunCount;gun_index++)
				{
					uint8_t tempIndex;

					switch(modelnameInfo.ParsingInfo[gun_index].GunType)
					{
						case Gun_Type_Chademo:
							if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
							{
								tempIndex = gun_index;

								for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
								{
									if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
									{
										if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus != previousState[index].sys_mode) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.ConnectorPlugIn != previousState[index].connector_status) )
										{
											previousState[index].sys_mode = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus;
											previousState[index].connector_status = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.ConnectorPlugIn;
											previousState[gun_index].isReportStatusReq = ON;
										}
									}
								}
							}
							else
							{
								if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
								{
									tempIndex = ((gun_index==2) ? 1: 0);
								}
								else
								{
									tempIndex = gun_index;
								}

								for (int index = 0; index < CHAdeMO_QUANTITY; index++)
								{
									if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
									{
										if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != previousState[index].sys_mode) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn != previousState[index].connector_status) )
										{
											previousState[index].sys_mode = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus;
											previousState[index].connector_status = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn;
											previousState[gun_index].isReportStatusReq = ON;
										}
									}
								}
							}

							break;
						case Gun_Type_CCS_2:
							if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
							{
								tempIndex = gun_index;

								for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
								{
									if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
									{
										if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus != previousState[index].sys_mode) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.ConnectorPlugIn != previousState[index].connector_status) )
										{
											previousState[index].sys_mode = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus;
											previousState[index].connector_status = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.ConnectorPlugIn;
											previousState[gun_index].isReportStatusReq = ON;
										}
									}
								}
							}
							else
							{
								if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
								{
									tempIndex = ((gun_index==2) ? 1: 0);
								}
								else
								{
									tempIndex = gun_index;
								}

								for (int index = 0; index < CCS_QUANTITY; index++)
								{
									if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
									{
										if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != previousState[index].sys_mode) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn != previousState[index].connector_status) )
										{
											previousState[index].sys_mode = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus;
											previousState[index].connector_status = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn;
											previousState[gun_index].isReportStatusReq = ON;
										}
									}
								}
							}

							break;
						case Gun_Type_GB:
							if((ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'D') && ((ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'O') || (ShmSysConfigAndInfo->SysConfig.ModelName[1] == 'K')))
							{
								tempIndex = gun_index;

								for (int index = 0; index < GENERAL_GUN_QUANTITY; index++)
								{
									if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
									{
										if((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus != previousState[index].sys_mode) || (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.ConnectorPlugIn != previousState[index].connector_status) )
										{
											previousState[index].sys_mode = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus;
											previousState[index].connector_status = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.ConnectorPlugIn;
											previousState[gun_index].isReportStatusReq = ON;
										}
									}
								}
							}
							else
							{
								if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
								{
									tempIndex = ((gun_index==2) ? 1: 0);
								}
								else
								{
									tempIndex = gun_index;
								}

								for (int index = 0; index < GB_QUANTITY; index++)
								{
									if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
									{
										if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != previousState[index].sys_mode) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn != previousState[index].connector_status) )
										{
											previousState[index].sys_mode = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus;
											previousState[index].connector_status = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn;
											previousState[gun_index].isReportStatusReq = ON;
										}
									}
								}
							}

							break;
						case Gun_Type_AC:
							if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
							{
								tempIndex = 2;
							}
							else
							{
								tempIndex = gun_index;
							}

							for (int index = 0; index < AC_QUANTITY; index++)
							{
								if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
								{
									if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != previousState[index].sys_mode) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState != previousState[index].connector_status) )
									{
										previousState[index].sys_mode = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus;
										previousState[index].connector_status = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState;
										previousState[gun_index].isReportStatusReq = ON;
									}
								}
							}
							break;
					}

					// Send status to backend server
					if(previousState[gun_index].isReportStatusReq || (difftime(time((time_t*)NULL), backend_info.st_status[gun_index]) > backend_info.interval_status))
					{
						create_Cmd_1104(&output, gun_index);
						send(sockfd, output.buffer, output.size, 0);
						previousState[gun_index].isReportStatusReq = OFF;
						backend_info.st_status[gun_index] = time((time_t*)NULL);
					}
				}
			}
			usleep(100000);
		}
		close(sockfd);
		sleep(5);
	}

	return 0;
}