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

2021.01.27 / Amos
Actions:
1. ATE add file for previous commit.

Files:
1. As follow commit history

amos 4 жил өмнө
parent
commit
dd79714dc0

+ 223 - 66
EVSE/Projects/ATE/Apps/Config.h

@@ -4,72 +4,236 @@
  *  Created on: 2019年4月23日
  *      Author: foluswen
  */
+
 #ifndef CONFIG_H_
 #define CONFIG_H_
+typedef unsigned char   UBYTE;
+typedef unsigned short  UWORD;
+typedef unsigned int    ULONG;
+typedef signed char     SBYTE;
+typedef signed short    SWORD;
+typedef signed int      SLONG;
+typedef unsigned char			byte;
+
+#define TOTAL_QUANTITY_GUN			4				//Max Count
+#define MODE_BOOT					0
+#define MODE_IDLE					1
+#define MODE_AUTHORIZING			2
+#define MODE_REASSIGN_CHECK			3
+#define MODE_REASSIGN				4
+#define MODE_PRECHARGE				5
+#define MODE_PREPARE_FOR_EV			6
+#define MODE_PREPARE_FOR_EVSE		7
+#define MODE_CHARGING				8
+#define MODE_TERMINATING			9
+#define MODE_COMPLETE				10
+#define MODE_ALARM					11
+#define MODE_RESERVATION			12
+#define MODE_BOOKING				13
+#define MODE_MAINTAIN				14
+#define MODE_DEBUG					15
+#define MODE_CCS_PRECHARGE_STEP0	16 	// ready for ccs precharge processing, For D+ relay to precharge relay
+#define MODE_CCS_PRECHARGE_STEP1	17	// waitting for ev board inform to enter to charging, For precharge relay to D+ relay
+#define MODE_SINGLE_RUN				18
+
+#define GFD_WAIT			0
+#define GFD_PASS			1
+#define GFD_FAIL			2
+
+#define PRECHARGE_WAIT				0
+#define PRECHARGE_READY				1
+#define PRECHARGE_PRERELAY_PASS		2
+#define PRECHARGE_CHARELAY_PASS		3
+
+#define BOOTTING			0
+#define BOOT_COMPLETE		1
+
+
+
+//unsigned char UDS_table[] = {0x610, 0x614, 0x612};
+
+
+/*
+#define VALUE_TABLE \
+	X(VCVCCU_ChargeFromVehicle_ID, "18FF2182") \
+	X(KOne, "One") \
+	X(KTwo, "Two")
+
+#define X(a, b) a,
+typedef enum  { VALUE_TABLE}EValue;
+#undef X
 
-typedef unsigned char           byte;
-
-#define TOTAL_QUANTITY_GUN          4   //Max Count
-
-#define MODE_BOOT                   0
-#define MODE_IDLE                   1
-#define MODE_AUTHORIZING            2
-#define MODE_REASSIGN_CHECK         3
-#define MODE_REASSIGN               4
-#define MODE_PRECHARGE              5
-#define MODE_PREPARE_FOR_EV         6
-#define MODE_PREPARE_FOR_EVSE       7
-#define MODE_CHARGING               8
-#define MODE_TERMINATING            9
-#define MODE_COMPLETE               10
-#define MODE_ALARM                  11
-#define MODE_FAULT                  12
-#define MODE_RESERVATION            13
-#define MODE_BOOKING                14
-#define MODE_MAINTAIN               15
-#define MODE_DEBUG                  16
-#define MODE_CCS_PRECHARGE_STEP0    17  // ready for ccs precharge processing, For D+ relay to precharge relay
-#define MODE_CCS_PRECHARGE_STEP1    18  // waitting for ev board inform to enter to charging, For precharge relay to D+ relay
-#define MODE_SINGLE_RUN             19
-
-#define GFD_WAIT                    0
-#define GFD_PASS                    1
-#define GFD_FAIL                    2
-#define GFD_WARNING                 3
-
-#define PRECHARGE_WAIT              0
-#define PRECHARGE_READY             1
-#define PRECHARGE_PRERELAY_PASS     2
-#define PRECHARGE_CHARELAY_PASS     3
-
-#define BOOTTING                    0
-#define BOOT_COMPLETE               1
+const char* ToString(EValue value)
+{
+#define X(a, b) b,
+	static char *table[] = { VALUE_TABLE };
+#undef X
+	return table[value];
+}
+*/
+typedef enum  { VCVCCU_ChargeFromVehicle_ID,}EValue;
+
+
+
+/*
+#define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
+#define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
+#define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
+*/
+/*
+typedef union{
+    struct{
+        ULONG B1:8;
+        ULONG B2:8;
+        ULONG B3:8;
+        ULONG B4:8;
+        ULONG B5:8;
+        ULONG B6:8;
+        ULONG B7:8;
+        ULONG B8:8;
+    };
+    ULONG id64;
+}J1939_ID;
 
+typedef struct __attribute__ ((packed))
+{
+    J1939_ID id;
+    UBYTE data[8];
+    UBYTE len;
+}J1939_PDU;
+*/
+/*
+enum _SYSTEM_STATUS
+{
+	S_BOOTING = 						0,//開機
+    S_IDLE,//閒置
+	S_AUTHORIZING,//授權
+	S_REASSIGN_CHECK,
+	S_REASSIGN,
+	S_PREPARNING,
+	S_PREPARING_FOR_EV,
+	S_PREPARING_FOR_EVSE,
+    S_CHARGING,
+	S_TERMINATING,
+	S_COMPLETE,
+	S_ALARM,
+	S_RESERVATION,
+	S_BOOKING,
+	S_MAINTAIN,
+	S_DEBUG,
+	S_CCS_PRECHARGE_ST0,
+	S_CCS_PRECHARGE_ST1,
+	S_SINGLE_RUN,
+};
+*/
 enum _SYSTEM_STATUS
 {
-    S_BOOTING                           = 0,
-    S_IDLE                              = 1,
-    S_AUTHORIZING                       = 2,
-    S_REASSIGN_CHECK                    = 3,
-    S_REASSIGN                          = 4,
-    S_PREPARNING                        = 5,
-    S_PREPARING_FOR_EV                  = 6,
-    S_PREPARING_FOR_EVSE                = 7,
-    S_CHARGING                          = 8,
-    S_TERMINATING                       = 9,
-    S_COMPLETE                          = 10,
-    S_ALARM                             = 11,
-    S_FAULT                             = 12,
-    S_RESERVATION                       = 13,
-    S_BOOKING                           = 14,
-    S_MAINTAIN                          = 15,
-    S_DEBUG                             = 16,
-    S_CCS_PRECHARGE_ST0                 = 17,
-    S_CCS_PRECHARGE_ST1                 = 18,
-    S_SINGLE_RUN                        = 19,
-    S_NONE                              = 20,
+	S_BOOTING = 						0,//開機
+    S_IDLE,//閒置
+	S_AUTHORIZING,//授權
+	S_REASSIGN_CHECK,
+	S_REASSIGN,
+	S_PREPARNING,
+	S_PREPARING_FOR_EV,
+	S_PREPARING_FOR_EVSE,
+    S_CHARGING,
+	S_TERMINATING,
+	S_COMPLETE,
+	S_ALARM,
+	S_RESERVATION,
+	S_BOOKING,
+	S_MAINTAIN,
+	S_DEBUG,
+	S_CCS_PRECHARGE_ST0,
+	S_CCS_PRECHARGE_ST1,
+	S_SINGLE_RUN,
 };
 
+enum _ATE_STATUS
+{
+	AS_ZERO = 						0,//開機
+    AS_ONE,//閒置
+	AS_TWO,//授權
+	AS_THREE,
+	AS_FOUR,
+	AS_FIVE,
+	AS_SIX,
+	AS_SEVEN,
+    AS_EIGHT,
+	AS_NINE,
+	AS_TEN,
+	AS_ELEVEN,
+	AS_TWELVE,
+	AS_THIRTEEN,
+	AS_FOURTEEN,
+	AS_FIFTEEN,
+	AS_SIXTEEN,
+	AS_SEVENTEEN,
+	AS_EIGHTEEN,
+};
+
+enum _VCCU_STATUS
+{
+    V_IDLE = 0,//閒置
+	V_UNMATEDPLUG,//(DC01) Unmated Plug
+	V_MATED_PLUG_INLET_UNLOCKED,//(DC02) Mated Plug - Inlet Unlocked
+	V_INLETLOCKING,//(DC03) Inlet Locking
+	V_INLETLOCKED,//DC04) Inlet Locked
+	V_SLAC,//(DC05) SLAC and Setup of Higher Layer Communication with EVSEE
+	V_DEFINITION,//(DC06) Definition of Charge Parameters
+    V_CABLECHECK,//(DC07) Cable Check
+	V_ISOLATION,//(DC08) Wait until Isolation Status == NOT_ACTIVE
+	V_VOLTAGEDIFFERENCE,//(DC09) Wait until Voltage Difference < 20V
+	V_CONTACTORSCLOSED,//(DC10) Wait until Contactors are closed
+	V_POWERDELIVERY,//(DC11) PowerDelivery
+	V_CURRENTDEMAND,//(DC12) Current Demand
+	V_POWERDELIVERYFALSE,//(DC13) PowerDelivery
+	V_DETECTION,//(DC14) Welding Detection
+	V_SESSION_STOP,//Session Stop
+	V_STOP_COMMUNICATION_SESSION,//Stop Communication Session
+	V_FINISHED,//Finished
+};
+
+enum _GUN_TYPE
+{
+	_Type_Chademo = 		0,
+	_Type_CCS,
+	_Type_GB,
+};
+
+
+/*
+int StoreLogMsg(const char *fmt, ...)
+{
+	char Buf[4096+256];
+	char buffer[4096];
+	time_t CurrentTime;
+	struct tm *tm;
+	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);
+	sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
+			tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,
+			buffer,
+			tm->tm_year+1900,tm->tm_mon+1);
+	system(Buf);
+	#ifdef Debug
+	char value[21];
+	getTimeStringByCSU(value);
+	printf("%s - %s", value, buffer);
+	#endif
+
+	return rc;
+}*/
+
+
+
 enum _AC_SYSTEM_STATUS
 {
     AC_SYS_NONE                         = 0,
@@ -80,14 +244,6 @@ enum _AC_SYSTEM_STATUS
     AC_SYS_E                            = 5,
 };
 
-enum _GUN_TYPE
-{
-    _Type_Chademo                       = 0,
-    _Type_CCS_2                         = 1,
-    _Type_GB                            = 2,
-    _Type_AC                            = 3,
-};
-
 enum _LCM_INDEX
 {
     _LCM_INIT                           = 0x00,
@@ -174,4 +330,5 @@ enum _SYS_WIFI_MODE
     _SYS_WIFI_MODE_ADHOC                = 3,
 };
 
+
 #endif /* CONFIG_H_ */

+ 238 - 120
EVSE/Projects/ATE/Apps/Ev_Comm.c

@@ -1,13 +1,14 @@
 #include "Module_EvComm.h"
-#include <linux/can.h>
-#include <linux/can/raw.h>
-#include <string.h>
-#include <stdio.h>      /*標準輸入輸出定義*/
-#include <stdlib.h>     /*標準函數庫定義*/
-#include <unistd.h>     /*Unix 標準函數定義*/
-#include <fcntl.h>      /*檔控制定義*/
-#include <termios.h>    /*PPSIX 終端控制定義*/
-#include <errno.h>      /*錯誤號定義*/
+#include "VCCU.h"
+#include 	<linux/can.h>
+#include 	<linux/can/raw.h>
+#include 	<string.h>
+#include    <stdio.h>      /*標準輸入輸出定義*/
+#include    <stdlib.h>     /*標準函數庫定義*/
+#include    <unistd.h>     /*Unix 標準函數定義*/
+#include    <fcntl.h>      /*檔控制定義*/
+#include    <termios.h>    /*PPSIX 終端控制定義*/
+#include    <errno.h>      /*錯誤號定義*/
 
 //================================================
 //================================================
@@ -17,179 +18,296 @@
 
 int PackageIdCmd(int cmd)
 {
-    return cmd | 0x80000000;
+	return cmd | 0x80000000;
 }
 
-void SendCmdToEvboard(int cmd, byte *data, byte dataLen)
+void SendCmdToEvboard(int canfd, int cmd, byte *data, byte dataLen)
 {
     struct can_frame frame;
-
-    frame.can_id = cmd;
+    frame.can_id = PackageIdCmd(cmd);//(0x00001000 + cmd) | 0x80000000;//(cmd | 0x80000000);
     frame.can_dlc = dataLen;
     memcpy(frame.data, data, sizeof(frame.data));
-
-    write(CanFd, &frame, sizeof(struct can_frame));
+    write(canfd, &frame, sizeof(struct can_frame));
 }
 
-void SetTargetAddr(byte *target_number, byte index)
+void SendCmdToEvboard2(int canfd, int cmd, byte *data, byte dataLen)
 {
-    int id = PackageIdCmd(Ev_Cmd.address_assignment + index);
-    //printf("intCmd = %x \n", cmd & CAN_EFF_MASK);
-    //cmd = cmd & CAN_EFF_MASK;
+    struct can_frame frame;
+    frame.can_id = PackageIdCmd(cmd);//(0x00001000 + cmd) | 0x80000000;//(cmd | 0x80000000);
+    frame.can_dlc = dataLen;
+    memcpy(frame.data, data, sizeof(frame.data));
+    write(canfd, &frame, sizeof(struct can_frame));
+    //printf("%08X %08X  ....................\n" , cmd, PackageIdCmd(cmd));
 
-    byte data[8];
+    //usleep(2000);
+}
 
-    data[0] = *target_number;
-    data[1] = *(target_number + 1);
-    data[2] = *(target_number + 2);
-    data[3] = *(target_number + 3);
-    data[4] = index;
+void setBootNotification1(){
+	byte data[8];
+	data[0] = 0x02;
+	data[1] = 0x02;
+	data[2] = 0x02;
+	data[3] = 0x02;
+	data[4] = 0x03;
+	data[5] = 0x03;
+	data[6] = 0x03;
+	data[7] = 0x03;
+
+	int id = PackageIdCmd(bn1);
+	SendCmdToEvboard(CanFd2, id, data, sizeof(data));
+}
 
-    SendCmdToEvboard(id, data, 5);
+void setBootNotification2(){
+	byte data[8];
+	data[0] = 0x04;
+	data[1] = 0x04;
+	data[2] = 0x04;
+	data[3] = 0x04;
+	data[4] = 0x05;
+	data[5] = 0x05;
+	data[6] = 0x05;
+	data[7] = 0x05;
+	int id = PackageIdCmd(bn2);
+	SendCmdToEvboard(CanFd2, id, data, sizeof(data));
 }
 
-void GetFirmwareVersion(byte gun_index, byte toId)
-{
-    int id = PackageIdCmd(Ev_Cmd.get_firmware_ver + toId);
-    byte data[8];
+void setEVStatus1(byte evstatus){
+	byte data[1];
+	data[0] =  evstatus;
+	int id = PackageIdCmd(EVStatus1);
+	SendCmdToEvboard(CanFd2, id, data, sizeof(data));
+}
 
-    SendCmdToEvboard(id, data, 0);
+void setEVStatus2(byte evstatus){
+	byte data[1];
+	data[0] = evstatus;
+	int id = PackageIdCmd(EVStatus2);
+	SendCmdToEvboard(CanFd2, id, data, sizeof(data));
 }
 
-void SyncRtcInfo(byte gun_index, byte toId, int epoch)
-{
-    int id = PackageIdCmd(Ev_Cmd.sync_rtc_info + toId);
-    byte data[8];
 
-    data[0] = epoch & 0xff;
-    data[1] = (epoch >> 8) & 0xff;
-    data[2] = (epoch >> 16) & 0xff;
-    data[3] = (epoch >> 24) & 0xff;
+void GetFirmwareVersion(byte gun_index, byte toId)
+{
+	int id = PackageIdCmd(Ev_Cmd.get_firmware_ver + toId);
+	byte data[8];
 
-    SendCmdToEvboard(id, data, 4);
+	SendCmdToEvboard(CanFd, id, data, 0);
 }
 
 void GetHardwareVersion(byte gun_index, byte toId)
 {
-    int id = PackageIdCmd(Ev_Cmd.get_hardware_ver + toId);
-    byte data[8];
+	int id = PackageIdCmd(Ev_Cmd.get_hardware_ver + toId);
+	byte data[8];
 
-    SendCmdToEvboard(id, data, 0);
+	SendCmdToEvboard(CanFd, id, data, 0);
 }
 
 void SetChargingPermission(byte gun_index, byte permissionStatus, short aOutputPw, short aOutputCur, short aOutputVol, byte toId)
 {
-    int id = PackageIdCmd(Ev_Cmd.charging_permission + toId);
-    byte data[8];
+	int id = PackageIdCmd(Ev_Cmd.charging_permission + toId);
+	byte data[8];
+
+	data[0] = permissionStatus;
+	data[1] = aOutputPw & 0xff;
+	data[2] = (aOutputPw >> 8) & 0xff;
+	data[3] = aOutputCur & 0xff;
+	data[4] = (aOutputCur >> 8) & 0xff;
+	data[5] = aOutputVol & 0xff;
+	data[6] = (aOutputVol >> 8) & 0xff;
+	data[7] = 0xff;
+	//printf(" ChargingPermission Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ",(Ev_Cmd.charging_permission + toId), data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7] );
+
+	SendCmdToEvboard(CanFd, id, data, sizeof(data));
+}
 
-    data[0] = permissionStatus;
-    data[1] = aOutputPw & 0xff;
-    data[2] = (aOutputPw >> 8) & 0xff;
-    data[3] = aOutputCur & 0xff;
-    data[4] = (aOutputCur >> 8) & 0xff;
-    data[5] = aOutputVol & 0xff;
-    data[6] = (aOutputVol >> 8) & 0xff;
-    data[7] = 0xff;
+void GetMiscellaneousInfo(byte gun_index, byte toId, short K1K2Status, short soc)
+{
+	int id = PackageIdCmd(Ev_Cmd.get_miscellaneous_info + toId);
+	byte data[8];
+	data[0] = 0x01;
+	data[1] = 0x02;
+	data[2] = 0x03;
+	data[3] = 0x04;
+	data[4] = 0x05;
+	data[5] = K1K2Status & 0xff;
+	data[6] = soc & 0xff;
+	data[7] = 0x08;
+	//printf(" Miscellaneous Info Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ",Ev_Cmd.get_miscellaneous_info, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7] );
+
+	/*
+	data[1] = 0x0001;
+	data[2] = 0x0001;
+	data[3] = 0x10;
+	data[4] = 0x10;
+	*/
+	SendCmdToEvboard(CanFd, id, data, sizeof(data));
+}
 
-    SendCmdToEvboard(id, data, sizeof(data));
+//TODO
+void setMisc(byte toId, float K1K2Status, float soc){
+	/*
+	float K1K2Status = 0;
+	float soc = 0;
+	K1K2Status = ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status;
+	soc = ShmSysConfigAndInfo->ate.chademo.id0D_req.Soc;
+	*/
+	GetMiscellaneousInfo(0, toId, K1K2Status, soc);
 }
 
-void SetPresentOutputPower(short outputVol_b1, short outputCur_b1, short outputVol_b2, short outputCur_b2)
+
+void SetPresentInputPower(short outputVol_b1, short outputCur_b1, byte toId)
 {
-    int id = PackageIdCmd(Ev_Cmd.present_output_power);
-    byte data[8];
+	int id = PackageIdCmd(Ev_Cmd.present_input_power + toId);
+	byte data[8];
+
+	data[0] = outputVol_b1 & 0xff;
+	data[1] = (outputVol_b1 >> 8) & 0xff;
+	data[2] = outputCur_b1 & 0xff;
+	data[3] = (outputCur_b1 >> 8) & 0xff;
+	/*
+	data[4] = outputVol_b2 & 0xff;
+	data[5] = (outputVol_b2 >> 8) & 0xff;
+	data[6] = outputCur_b2 & 0xff;
+	data[7] = (outputCur_b2 >> 8) & 0xff;
+	*/
+	//printf(" PresentInputPower Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ",Ev_Cmd.present_input_power, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7] );
+	SendCmdToEvboard(CanFd, id, data, sizeof(data));
+}
 
-    data[0] = outputVol_b1 & 0xff;
-    data[1] = (outputVol_b1 >> 8) & 0xff;
-    data[2] = outputCur_b1 & 0xff;
-    data[3] = (outputCur_b1 >> 8) & 0xff;
-    data[4] = outputVol_b2 & 0xff;
-    data[5] = (outputVol_b2 >> 8) & 0xff;
-    data[6] = outputCur_b2 & 0xff;
-    data[7] = (outputCur_b2 >> 8) & 0xff;
 
-    SendCmdToEvboard(id, data, 8);
+void SetPresentInputRequirement(short aOutputPw_b1, short aOutputCur_b1, short aOutputPw_b2, short aOutputCur_b2, byte toId)
+{
+	int id = PackageIdCmd(Ev_Cmd.present_input_requirement + toId );
+	byte data[8];
+
+	data[0] = aOutputPw_b1 & 0xff;
+	data[1] = (aOutputPw_b1 >> 8) & 0xff;
+	data[2] = aOutputCur_b1 & 0xff;
+	data[3] = (aOutputCur_b1 >> 8) & 0xff;
+	data[4] = aOutputPw_b2 & 0xff;
+	data[5] = (aOutputPw_b2 >> 8) & 0xff;
+	data[6] = aOutputCur_b2 & 0xff;
+	data[7] = 0x01;
+	/*
+	data[6] = aOutputCur_b2 & 0xff;
+	data[7] = (aOutputCur_b2 >> 8) & 0xff;
+	*/
+
+	//printf(" Present Input Requirement Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ",Ev_Cmd.present_input_requirement, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7] );
+
+	SendCmdToEvboard(CanFd, id, data, sizeof(data));
 }
 
-void SetPresentOutputCapacity(short aOutputPw_b1, short aOutputCur_b1, short aOutputPw_b2, short aOutputCur_b2)
+void GetEvseOutputStatus(byte gun_index, byte toId)
 {
-    int id = PackageIdCmd(Ev_Cmd.present_output_cap);
-    byte data[8];
+	int id = PackageIdCmd(Ev_Cmd.get_evse_output_status + toId);
+	byte data[8];
 
-    data[0] = aOutputPw_b1 & 0xff;
-    data[1] = (aOutputPw_b1 >> 8) & 0xff;
-    data[2] = aOutputCur_b1 & 0xff;
-    data[3] = (aOutputCur_b1 >> 8) & 0xff;
-    data[4] = aOutputPw_b2 & 0xff;
-    data[5] = (aOutputPw_b2 >> 8) & 0xff;
-    data[6] = aOutputCur_b2 & 0xff;
-    data[7] = (aOutputCur_b2 >> 8) & 0xff;
+	SendCmdToEvboard(CanFd, id, data, 0);
+}
+
+void GetEvseCapacityInfo(byte gun_index, byte toId)
+{
+	int id = PackageIdCmd(Ev_Cmd.get_evse_capacity_info + toId);
+	byte data[8];
 
-    SendCmdToEvboard(id, data, 8);
+	SendCmdToEvboard(CanFd, id, data, 0);
 }
 
-void GetOutputReq(byte gun_index, byte toId)
+void EvseStopChargingEvent(byte stopResult, byte *stopReason, byte toId)
 {
-    int id = PackageIdCmd(Ev_Cmd.get_output_req + toId);
-    byte data[8];
+	int id = PackageIdCmd(Ev_Cmd.evse_stop_charging + toId);
+	byte data[8];
+
+	data[0] = stopResult;
+	data[1] = *stopReason;
+	data[2] = *(stopReason + 1);
+	data[3] = *(stopReason + 2);
+	data[4] = *(stopReason + 3);
+	data[5] = *(stopReason + 4);
+	data[6] = *(stopReason + 5);
+
+	SendCmdToEvboard(CanFd, id, data, sizeof(data));
+}
+
 
-    SendCmdToEvboard(id, data, 0);
+void SetIsolationStatus(byte gun_index, byte result, byte toId)
+{
+	int id = PackageIdCmd(Ev_Cmd.isolation_status + toId);
+	byte data[8];
+	data[0] = result;
+	SendCmdToEvboard(CanFd, id, data, 1);
 }
 
-void GetEvBatteryInfo(byte gun_index, byte toId)
+void SetEvsePrechargeInfo(byte gun_index, byte result, byte toId)
 {
-    int id = PackageIdCmd(Ev_Cmd.get_battery_info + toId);
-    byte data[8];
+	int id = PackageIdCmd(Ev_Cmd.evse_precharge_info + toId);
+	byte data[8];
 
-    SendCmdToEvboard(id, data, 0);
+	data[0] = result;
+	SendCmdToEvboard(CanFd, id, data, 1);
 }
 
-void EvseStopChargingEvent(byte stopResult, byte *stopReason, byte toId)
+
+void SetTargetAddr(byte *target_number, byte index)
 {
-    int id = PackageIdCmd(Ev_Cmd.evse_stop_charging + toId);
-    byte data[8];
+	int id = PackageIdCmd(Ev_Cmd.address_assignment + index);
+	//printf("intCmd = %x \n", cmd & CAN_EFF_MASK);
+	//cmd = cmd & CAN_EFF_MASK;
 
-    data[0] = stopResult;
-    data[1] = *stopReason;
-    data[2] = *(stopReason + 1);
-    data[3] = *(stopReason + 2);
-    data[4] = *(stopReason + 3);
-    data[5] = *(stopReason + 4);
-    data[6] = *(stopReason + 5);
+	byte data[8];
 
-    SendCmdToEvboard(id, data, 7);
+	data[0] = *target_number;
+	data[1] = *(target_number + 1);
+	data[2] = *(target_number + 2);
+	data[3] = *(target_number + 3);
+	data[4] = index;
+
+	SendCmdToEvboard(CanFd2, id, data, sizeof(data));
 }
 
-void GetMiscellaneousInfo(byte gun_index, byte relayStatus, float power, float voltage, byte toId)
-{
-    int id = PackageIdCmd(Ev_Cmd.get_miscellaneous_info + toId);
-    byte data[8];
+void setVCCU_Requests(byte *data, byte dataLen){
+	SendCmdToEvboard(CanFd, VCCU_RequestsIds, data, dataLen);
+}
 
-    int _power = power * 10;
+void setVCCU_ChargeFromVehicle(byte *data, byte dataLen){
+	SendCmdToEvboard(CanFd, VCCU_ChargeFromVehicleIds, data, dataLen);
+}
 
-    data[0] = relayStatus;
-    data[1] = (int)_power & 0xff;
-    data[2] = ((int)_power >> 8) & 0xff;
-    data[3] = (int)voltage & 0xff;
-    data[4] = ((int)voltage >> 8) & 0xff;
+void setVCCU_V2G_EVMaximumVoltageLimit(byte *data, byte dataLen){
+	SendCmdToEvboard(CanFd, VCCU_V2G_EVMaximumVoltageLimitIds, data, dataLen);
+}
 
-    SendCmdToEvboard(id, data, 5);
+void setVCCU_V2G_RemainingTimeToFullSO(byte *data, byte dataLen){
+	SendCmdToEvboard(CanFd, VCCU_V2G_RemainingTimeToFullSOIds, data, dataLen);
 }
 
-void SetIsolationStatus(byte gun_index, byte result, byte toId)
-{
-    int id = PackageIdCmd(Ev_Cmd.isolation_status + toId);
-    byte data[8];
+void setVCCU_V2G_EVMaximumCurrentLimit(byte *data, byte dataLen){
+	SendCmdToEvboard(CanFd, VCCU_V2G_EVMaximumCurrentLimitIds, data, dataLen);
+}
 
-    data[0] = result;
-    SendCmdToEvboard(id, data, 1);
+void setVCCU_V2G_EVTargetVoltage(byte *data, byte dataLen){
+	SendCmdToEvboard(CanFd, VCCU_V2G_EVTargetVoltageIds, data, dataLen);
+}
+
+void setVCCU_V2G_EVTargetCurrent(byte *data, byte dataLen){
+	SendCmdToEvboard(CanFd, VCCU_V2G_EVTargetCurrentIds, data, dataLen);
+}
+
+void setVCCU_V2G_VehicleStatus(byte *data, byte dataLen){
+	SendCmdToEvboard(CanFd, VCCU_V2G_VehicleStatusIds, data, dataLen);
 }
 
-void SetEvsePrechargeInfo(byte gun_index, byte result, byte toId)
-{
-    int id = PackageIdCmd(Ev_Cmd.evse_precharge_info + toId);
-    byte data[8];
 
-    data[0] = result;
-    SendCmdToEvboard(id, data, 1);
+void VCCU_TD(){
+	byte data[8];
+	data[0] = 0x00;
+	data[1] = 0x00;
+	data[2] = 0x01;
+	data[3] = 0x01;
+	data[4] = 0x00;
+	data[5] = 0x00;
+	data[6] = 0x42;
+	data[7] = 0x66;
+	SendCmdToEvboard(CanFd, TDId, data, sizeof(data));
 }

+ 94 - 94
EVSE/Projects/ATE/Apps/Makefile

@@ -1,94 +1,94 @@
--include ../../../../Rules.make
-export PATH=/bin:/sbin:/usr/bin:$(SDK_PATH_TARGET)/usr/bin:$PATH
-
-#define library variable
-Internal485ProtocolLib = -L ../../../Modularization/Internal485Protocol -lInternal485Protocol
-Lib_SQLite3 = "-L../../../Modularization/ocppfiles" -lsqlite3
-
-all: CreateOutputFolder BuildFactorys BuildApps CopyExecuteFiles Clean
-
-BuildFactorys: FactoryConfigBin
-
-BuildApps: MainTask EvCommTask EventLoggingTask InternalCommTask LcmControlTask PrimaryCommTask PsuCommTask ReadCmdlineTask FactoryConfigApp
-
-MainTask:
-	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -include../../../Modularization/ocppfiles/sqlite3.h -include../../../Modularization/Module_RFID.h -include../../../Modularization/Module_Upgrade.h -O0 -g3 -Wall -c -fmessage-length=0 -o main.o main.c
-	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -O0 -g3 -Wall -c -fmessage-length=0 -o timeout.o timeout.c
-	$(CC) -o main main.o timeout.o ../../../Modularization/libModule_RFID.a ../../../Modularization/libModule_Upgrade.a ${Lib_SQLite3}
-
-EvCommTask:
-	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o Ev_Comm.o Ev_Comm.c
-	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o Module_EvComm.o Module_EvComm.c
-	$(CC) -o Module_EvComm Ev_Comm.o Module_EvComm.o
-
-EventLoggingTask:
-	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o Module_EventLogging.o Module_EventLogging.c
-	$(CC) -o Module_EventLogging Module_EventLogging.o
-
-InternalCommTask:
-	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o internalComm.o internalComm.c
-	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o Module_InternalComm.o Module_InternalComm.c
-	$(CC) -o Module_InternalComm Module_InternalComm.o internalComm.o
-
-LcmControlTask:
-	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o Module_LcmControl.o Module_LcmControl.c
-	$(CC) -o Module_LcmControl Module_LcmControl.o
-
-PrimaryCommTask:
-	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o Module_PrimaryComm.o Module_PrimaryComm.c
-	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o PrimaryComm.o PrimaryComm.c
-	$(CC) -o Module_PrimaryComm Module_PrimaryComm.o PrimaryComm.o
-
-PsuCommTask:
-	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -include../../../Modularization/Infypwr_PsuCommObj.h -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o Module_PsuComm.o Module_PsuComm.c
-	$(CC) -o Module_PsuComm Module_PsuComm.o ../../../Modularization/libInfypwr_PsuCommObj.a
-
-ReadCmdlineTask:
-	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o ReadCmdline.o ReadCmdline.c
-	$(CC) -o ReadCmdline ReadCmdline.o
-
-FactoryConfigApp:
-	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -O0 -g3 -Wall -c -fmessage-length=0 -o FactoryConfig.o FactoryConfig.c
-	$(CC) -o FactoryConfig FactoryConfig.o
-
-FactoryConfigBin:
-	gcc -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) "-I../../" -o FactoryConfig "./FactoryConfig.c"
-	mkdir -p /Storage/SystemLog
-	./FactoryConfig -f;true
-	cp /mnt/FactoryDefaultConfig.bin ../Images
-	rm -f FactoryConfig
-
-OtherTools:
-	cp -f init.sh ../Images/root
-	cp -f kill.sh ../Images/root
-
-CreateOutputFolder: 
-	rm -rfv ../Images/root
-	mkdir -p ../Images/root
-
-CopyExecuteFiles: OtherTools
-	cp -f main ../Images/root
-	cp -f Module_EvComm ../Images/root
-	cp -f Module_EventLogging ../Images/root
-	cp -f Module_InternalComm ../Images/root
-	cp -f Module_LcmControl ../Images/root
-	cp -f Module_PrimaryComm ../Images/root
-	cp -f Module_PsuComm ../Images/root
-	cp -f ReadCmdline ../Images/root
-	cp -f FactoryConfig ../Images/root
-
-Clean: CleanObj CleanExecute
-
-CleanObj:
-	rm -f *.o
-
-CleanExecute:
-	rm -f main
-	rm -f Module_EvComm
-	rm -f Module_EventLogging
-	rm -f Module_InternalComm
-	rm -f Module_LcmControl
-	rm -f Module_PrimaryComm
-	rm -f Module_PsuComm
-	rm -f ReadCmdline
-	rm -f FactoryConfig
+-include ../../../../Rules.make
+export PATH=/bin:/sbin:/usr/bin:$(SDK_PATH_TARGET)/usr/bin:$PATH
+
+#define library variable
+Internal485ProtocolLib = -L ../../../Modularization/Internal485Protocol -lInternal485Protocol
+Lib_SQLite3 = "-L../../../Modularization/ocppfiles" -lsqlite3
+
+all: CreateOutputFolder BuildFactorys BuildApps CopyExecuteFiles Clean
+
+BuildFactorys: FactoryConfigBin
+
+BuildApps: MainTask EvCommTask InternalCommTask FactoryConfigApp ReadCmdlineTask
+#EvCommTask EventLoggingTask InternalCommTask LcmControlTask PrimaryCommTask PsuCommTask ReadCmdlineTask FactoryConfigApp
+
+MainTask:
+	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -include../../../Modularization/ocppfiles/sqlite3.h -include../../../Modularization/Module_RFID.h -include../../../Modularization/Module_Upgrade.h -O0 -g3 -Wall -c -fmessage-length=0 -o main.o main.c
+	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -O0 -g3 -Wall -c -fmessage-length=0 -o timeout.o timeout.c
+	$(CC) -o main main.o timeout.o ${Lib_Module_RFID} ${Lib_Module_Upgrade} ${Lib_SQLite3}
+EvCommTask:
+	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o Ev_Comm.o Ev_Comm.c
+	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o Module_EvComm.o Module_EvComm.c
+	$(CC) -o Module_EvComm Ev_Comm.o Module_EvComm.o
+
+EventLoggingTask:
+	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o Module_EventLogging.o Module_EventLogging.c
+	$(CC) -o Module_EventLogging Module_EventLogging.o
+
+InternalCommTask:
+	$(CC) -D $(Project) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o internalComm.o internalComm.c
+	$(CC) -D $(Project) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o Module_InternalComm.o Module_InternalComm.c
+	$(CC) -o Module_InternalComm Module_InternalComm.o internalComm.o 	
+
+LcmControlTask:
+	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o Module_LcmControl.o Module_LcmControl.c
+	$(CC) -o Module_LcmControl Module_LcmControl.o
+
+PrimaryCommTask:
+	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o Module_PrimaryComm.o Module_PrimaryComm.c
+	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o PrimaryComm.o PrimaryComm.c
+	$(CC) -o Module_PrimaryComm Module_PrimaryComm.o PrimaryComm.o
+
+PsuCommTask:
+	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -include../../../Modularization/Infypwr_PsuCommObj.h -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o Module_PsuComm.o Module_PsuComm.c
+	$(CC) -o Module_PsuComm Module_PsuComm.o ../../../Modularization/libInfypwr_PsuCommObj.a
+
+ReadCmdlineTask:
+	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o ReadCmdline.o ReadCmdline.c
+	$(CC) -o ReadCmdline ReadCmdline.o
+
+FactoryConfigApp:
+	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -O0 -g3 -Wall -c -fmessage-length=0 -o FactoryConfig.o FactoryConfig.c
+	$(CC) -o FactoryConfig FactoryConfig.o
+
+FactoryConfigBin:
+	gcc -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) "-I../../" -o FactoryConfig "./FactoryConfig.c"
+	mkdir -p /Storage/SystemLog
+	./FactoryConfig -f;true
+	cp /mnt/FactoryDefaultConfig.bin ../Images
+	rm -f FactoryConfig
+
+OtherTools:
+	cp -f init.sh ../Images/root
+	cp -f kill.sh ../Images/root
+
+CreateOutputFolder: 
+	rm -rfv ../Images/root
+	mkdir -p ../Images/root
+
+CopyExecuteFiles: OtherTools
+	cp -f main ../Images/root
+	cp -f Module_EvComm ../Images/root
+	#cp -f Module_EventLogging ../Images/root
+	cp -f Module_InternalComm ../Images/root
+	#cp -f Module_LcmControl ../Images/root
+	#cp -f Module_PrimaryComm ../Images/root
+	#cp -f Module_PsuComm ../Images/root
+	cp -f ReadCmdline ../Images/root
+	cp -f FactoryConfig ../Images/root
+
+Clean: CleanObj CleanExecute
+
+CleanObj:
+	rm -f *.o
+
+CleanExecute:
+	rm -f main
+	rm -f Module_EvComm
+	#rm -f Module_EventLogging
+	rm -f Module_InternalComm
+	#rm -f Module_LcmControl
+	#rm -f Module_PrimaryComm
+	#rm -f Module_PsuComm
+	rm -f ReadCmdline
+	rm -f FactoryConfig

+ 1543 - 3355
EVSE/Projects/ATE/Apps/Module_EvComm.c

@@ -1,214 +1,96 @@
-#include <sys/time.h>
-#include <sys/timeb.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <sys/ipc.h>
-#include <sys/shm.h>
-#include <sys/shm.h>
-#include <sys/mman.h>
-#include <linux/can.h>
-#include <linux/can/raw.h>
-#include <linux/wireless.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
-
-#include <unistd.h>
-#include <stdarg.h>
-#include <stdio.h>      /*標準輸入輸出定義*/
-#include <stdlib.h>     /*標準函數庫定義*/
-#include <unistd.h>     /*Unix 標準函數定義*/
-#include <fcntl.h>      /*檔控制定義*/
-#include <termios.h>    /*PPSIX 終端控制定義*/
-#include <errno.h>      /*錯誤號定義*/
-#include <errno.h>
-#include <string.h>
-#include <time.h>
-#include <ctype.h>
-#include <ifaddrs.h>
-#include "../../define.h"
-#include "Module_EvComm.h"
-
-#define ARRAY_SIZE(A)       (sizeof(A) / sizeof(A[0]))
-#define PASS                1
-#define FAIL                -1
-#define START               1
-#define STOP                0
-#define YES                 1
-#define NO                  0
-#define EQUAL               0
+#include 	<sys/time.h>
+#include 	<sys/timeb.h>
+#include    <sys/types.h>
+#include    <sys/stat.h>
+#include 	<sys/types.h>
+#include 	<sys/ioctl.h>
+#include 	<sys/socket.h>
+#include 	<sys/ipc.h>
+#include 	<sys/shm.h>
+#include 	<sys/shm.h>
+#include 	<sys/mman.h>
+#include 	<linux/can.h>
+#include 	<linux/can/raw.h>
+#include 	<linux/wireless.h>
+#include 	<arpa/inet.h>
+#include 	<netinet/in.h>
+
+#include 	<unistd.h>
+#include 	<stdarg.h>
+#include    <stdio.h>      /*標準輸入輸出定義*/
+#include    <stdlib.h>     /*標準函數庫定義*/
+#include    <unistd.h>     /*Unix 標準函數定義*/
+#include    <fcntl.h>      /*檔控制定義*/
+#include    <termios.h>    /*PPSIX 終端控制定義*/
+#include    <errno.h>      /*錯誤號定義*/
+#include 	<errno.h>
+#include 	<string.h>
+#include	<time.h>
+#include	<ctype.h>
+#include 	<ifaddrs.h>
+#include	"../../define.h"
+#include 	"Config.h"
+#include 	"Module_EvComm.h"
+#include 	"VCCU.h"
+
+#define Debug
+#define ARRAY_SIZE(A)		(sizeof(A) / sizeof(A[0]))
+#define PASS				1
+#define FAIL				-1
+#define START				1
+#define STOP				0
+#define YES					1
+#define NO					0
+#define DEMO 				0
 
 struct SysConfigAndInfo         *ShmSysConfigAndInfo;
 struct StatusCodeData           *ShmStatusCodeData;
 struct FanModuleData            *ShmFanModuleData;
-struct CHAdeMOData              *ShmCHAdeMOData;
-struct GBTData                  *ShmGBTData;
-struct CcsData                  *ShmCcsData;
-
-byte gun_count;
+struct RelayModuleData          *ShmRelayModuleData;
+struct LedModuleData            *ShmLedModuleData;
+struct PsuData                  *ShmPsuData;
+struct OCPP16Data               *ShmOCPP16Data;
+byte gunCount;
+byte gun_count = CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY;
 int chargingTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 
-float _pow_1 = 0;
-float _cur_1 = 0;
-float _pow_2 = 0;
-float _cur_2 = 0;
-
-float _outVol_1 = 0;
-float _outCur_1 = 0;
-float _outVol_2 = 0;
-float _outCur_2 = 0;
-
-// 限制最大充電電壓,因應不同 type 槍線來限制
-// Chademo : 500V, 125A,
-// GB : 750, 120A
-// CCS : 950V, 120A
-float maxChargingVol[2] = { 9500, 9500 };           // 限制最大充電電壓,如依照模塊則填上 0
-// 限制最大充電電流與能量透過 Web
-float maxChargingCur[2] = { 600, 600 };             // 限制最大充電電流,如依照模塊則填上 0
-float maxChargingPow = 0;                           // 限制最大充電能量,如依照模塊則填上 0
+float maxChargingVol = 5000;			// 限制最大充電電壓,如依照模塊則填上 0
+float maxChargingCur = 100;				// 限制最大充電電流,如依照模塊則填上 0
+int maxValue = 950;
+
+int gbmaxValue = 7500;
+int whileLoopTime = 500000;//45000;//500ms//10000; // 10 ms
 
+int soc = 70;
 // 槍資訊
 struct ChargingInfoData *_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 
+byte normalStop = 0x01;
+byte stopReason[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+byte evstaus[5] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
+
 struct Ev_Board_Cmd Ev_Cmd={
-        0,
-        0x00000200,
-        0x00000400,
-        0x00000500,
-        0x00000600,
-        0x00000700,
-        0x00000800,
-        0x00000900,
-        0x00000A00,
-        0x00000C00,
-        0x00000D00,
-
-        0x00000E00,
-        0x00000F00,
-        0x00001000,
-        0x00001100,
-
-        0x00001200,
-        0x00001400,
-        0x00001500,
+		0,
+		0x00000200,
+		0x00000400,
+		0x00000500,
+		0x00000600,
+		0x00000700,
+		0x00000800,
+		0x00000900,
+		0x00000A00,
+		0x00000C00,
+		0x00000D00,
+
+		0x00000E00,
+		0x00000F00,
+		0x00001000,
+		0x00001100,
+
+		0x00001200,
+		0x00001500,
 };
 
-unsigned char mask_table[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
-
-void PRINTF_FUNC(char *string, ...);
-
-void GetMaxVolAndCurMethod(byte index, float *vol, float *cur);
-void GetMaxPowerMethod(byte index, float *pow);
-unsigned long GetTimeoutValue(struct timeval _sour_time);
-
-#define DEBUG_INFO(format, args...)     StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
-#define DEBUG_WARN(format, args...)     StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
-#define DEBUG_ERROR(format, args...)    StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
-
-unsigned long GetTimeoutValue(struct timeval _sour_time)
-{
-    struct timeval _end_time;
-    gettimeofday(&_end_time, NULL);
-
-    return 1000000 * (_end_time.tv_sec - _sour_time.tv_sec) + _end_time.tv_usec - _sour_time.tv_usec;
-}
-
-int StoreLogMsg(const char *fmt, ...)
-{
-    char Buf[4096+256];
-    char buffer[4096];
-    va_list args;
-    struct timeb  SeqEndTime;
-    struct tm *tm;
-
-    va_start(args, fmt);
-    int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
-    va_end(args);
-
-    memset(Buf,0,sizeof(Buf));
-    ftime(&SeqEndTime);
-    SeqEndTime.time = time(NULL);
-    tm=localtime(&SeqEndTime.time);
-
-    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
-    {
-        sprintf(Buf,"%02d:%02d:%02d.%03d - %s",
-                tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm, buffer);
-        printf("%s \n", Buf);
-    }
-    else
-    {
-        sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
-                tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
-                buffer,
-                tm->tm_year+1900,tm->tm_mon+1);
-        system(Buf);
-    }
-
-    return rc;
-}
-
-int DiffTimeb(struct timeb ST, struct timeb ET)
-{
-    //return milli-second
-    unsigned int StartTime,StopTime;
-
-    StartTime=(unsigned int)ST.time;
-    StopTime=(unsigned int)ET.time;
-    return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
-}
-
-void PRINTF_FUNC(char *string, ...)
-{
-    va_list args;
-    char buffer[4096];
-    va_start(args, string);
-    vsnprintf(buffer, sizeof(buffer), string, args);
-    va_end(args);
-
-    DEBUG_INFO("%s \n", buffer);
-}
-
-//=================================
-// Common routine
-//=================================
-void getTimeString(char *buff)
-{
-    time_t timep;
-    struct tm *p;
-    time(&timep);
-    p=gmtime(&timep);
-
-    sprintf(buff, "[%04d-%02d-%02d %02d:%02d:%02d]", (1900+p->tm_year), (1+p->tm_mon), p->tm_mday, p->tm_hour, p->tm_hour, p->tm_sec);
-}
-
-bool CheckUniqNumber(byte value)
-{
-    for (byte index = 0; index < gun_count; index++)
-    {
-        if (_chargingData[index]->Evboard_id == value)
-        {
-            struct timeval _end_time;
-            gettimeofday(&_end_time, NULL);
-            unsigned long diff = 1000000 *  (_end_time.tv_sec - _id_assign_time.tv_sec) + _end_time.tv_usec - _id_assign_time.tv_usec;
-            if (diff >= 3000000)
-            {
-                gettimeofday(&_id_assign_time, NULL);
-                return true;
-            }
-            else
-            {
-                return false;
-            }
-        }
-    }
-
-    gettimeofday(&_id_assign_time, NULL);
-    return true;
-}
-
 //==========================================
 // Init all share memory
 //==========================================
@@ -217,143 +99,151 @@ int InitShareMemory()
     int result = PASS;
     int MeterSMId;
 
-    //initial ShmSysConfigAndInfo
-    if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo),  0777)) < 0)
+    if ((MeterSMId = shmget(ShmSysConfigAndInfoKey,	sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
     {
         #ifdef SystemLogMessage
-        DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
+    	printf("EV shmget ShmSysConfigAndInfo NG\n");
         #endif
         result = FAIL;
     }
     else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
     {
         #ifdef SystemLogMessage
-        DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
+    	printf("[shmat ShmSysConfigAndInfo NG\n");
         #endif
         result = FAIL;
-    }
-    else
-    {}
+     }
 
-    //initial ShmStatusCodeData
-    if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData),  0777)) < 0)
+    if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData),   IPC_CREAT | 0777)) < 0)
     {
         #ifdef SystemLogMessage
-        DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
+    	printf("shmget ShmStatusCodeData NG\n");
         #endif
         result = FAIL;
     }
     else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
     {
         #ifdef SystemLogMessage
-        DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
+    	printf("shmat ShmStatusCodeData NG\n");
         #endif
         result = FAIL;
     }
-    else
-    {}
 
-    if(CHAdeMO_QUANTITY > 0)
+    if ((MeterSMId = shmget(ShmFanBdKey, sizeof(struct FanModuleData),   IPC_CREAT | 0777)) < 0)
+    {
+        #ifdef SystemLogMessage
+    	printf("shmget ShmFanModuleData NG\n");
+        #endif
+        result = FAIL;
+    }
+    else if ((ShmFanModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+    {
+        #ifdef SystemLogMessage
+    	printf("shmat ShmFanModuleData NG\n");
+        #endif
+        result = FAIL;
+     }
+     memset(ShmFanModuleData,0,sizeof(struct FanModuleData));
+
+    if ((MeterSMId = shmget(ShmRelayBdKey, sizeof(struct RelayModuleData),   IPC_CREAT | 0777)) < 0)
+    {
+        #ifdef SystemLogMessage
+    	printf("shmget ShmRelayModuleData NG\n");
+        #endif
+        result = FAIL;
+    }
+    else if ((ShmRelayModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
     {
-        if ((MeterSMId = shmget(ShmCHAdeMOCommKey, sizeof(struct CHAdeMOData),  IPC_CREAT | 0777)) < 0)
-        {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR("[shmget ShmCHAdeMOData NG \n");
-            #endif
-            return FAIL;
-        }
-        else if ((ShmCHAdeMOData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-        {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR("shmat ShmCHAdeMOData NG \n");
-            #endif
-            return FAIL;
-        }
-        else
-        {}
+        #ifdef SystemLogMessage
+    	printf("shmat ShmRelayModuleData NG\n");
+        #endif
+        result = FAIL;
     }
+    memset(ShmRelayModuleData,0,sizeof(struct RelayModuleData));
 
-    if(GB_QUANTITY > 0)
+    if ((MeterSMId = shmget(ShmLedBdKey, sizeof(struct LedModuleData),  IPC_CREAT |  0777)) < 0)
+    {
+        #ifdef SystemLogMessage
+    	printf("shmget ShmLedModuleData NG\n");
+        #endif
+        result = FAIL;
+    }
+    else if ((ShmLedModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
     {
-        if ((MeterSMId = shmget(ShmGBTCommKey, sizeof(struct GBTData),  IPC_CREAT | 0777)) < 0)
-        {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR("[shmget ShmGBTData NG \n");
-            #endif
-            return FAIL;
-        }
-        else if ((ShmGBTData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-        {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR("shmat ShmGBTData NG \n");
-            #endif
-            return FAIL;
-        }
-        else
-        {}
+        #ifdef SystemLogMessage
+    	printf("shmat ShmLedModuleData NG\n");
+        #endif
+        result = FAIL;
     }
+    memset(ShmLedModuleData,0,sizeof(struct LedModuleData));
 
-    if(CCS_QUANTITY > 0)
+    if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData),   IPC_CREAT | 0777)) < 0)
+    {
+        #ifdef SystemLogMessage
+    	printf("shmget ShmPsuData NG \n");
+        #endif
+        result = FAIL;
+    }
+    else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
     {
-        if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData),  IPC_CREAT | 0777)) < 0)
-        {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR("shmget ShmCcsData NG \n");
-            #endif
-            return FAIL;
-        }
-        else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1) {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR("shmat ShmCcsData NG \n");
-            #endif
-            return FAIL;
-        }
-        else
-        {}
+        #ifdef SystemLogMessage
+    	printf("shmat ShmPsuData NG \n");
+        #endif
+        result = FAIL;
     }
 
+
     return result;
 }
 
-//================================================
-// initial can-bus
-//================================================
 int InitCanBus()
 {
-    int                     s0,nbytes;
-    struct timeval          tv;
-    struct ifreq            ifr0;
-    struct sockaddr_can     addr0;
-
-    system("/sbin/ip link set can0 down");
+    int s0, nbytes;
+    struct timeval tv;
+    struct ifreq ifr0;
+    struct sockaddr_can addr0;
+    /*
+    //can0
+    system("/sbin/ip link set can0 down");//先將interface disable
     system("/sbin/ip link set can0 type can bitrate 500000 restart-ms 100");
     system("/sbin/ip link set can0 up");
+    */
 
-    s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW);
+    //can1
+    system("/sbin/ip link set can0 down");//先將interface disable
+    system("/sbin/ip link set can0 type can bitrate 250000 restart-ms 100");
+    system("/sbin/ip link set can0 up");
 
+    s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW);
     tv.tv_sec = 0;
     tv.tv_usec = 10000;
-    if (setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct  timeval)) < 0)
+
+    if(setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
     {
         #ifdef SystemLogMessage
-        DEBUG_ERROR("Set SO_RCVTIMEO NG");
+            //StoreLogMsg("[CsuComm]InitCanBus:Set SO_RCVTIMEO NG");
         #endif
     }
-    nbytes=40960;
-    if (setsockopt(s0, SOL_SOCKET,  SO_RCVBUF, &nbytes, sizeof(int)) < 0)
+
+    nbytes = 40960;
+
+    if(setsockopt(s0, SOL_SOCKET,  SO_RCVBUF, &nbytes, sizeof(int)) < 0)
     {
         #ifdef SystemLogMessage
-        DEBUG_ERROR("Set SO_RCVBUF NG");
+            //StoreLogMsg("[CsuComm]InitCanBus:Set SO_RCVBUF NG");
         #endif
     }
-    nbytes=40960;
-    if (setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0)
+
+    nbytes = 40960;
+
+    if(setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0)
     {
         #ifdef SystemLogMessage
-        DEBUG_ERROR("Set SO_SNDBUF NG");
+            //StoreLogMsg("[CsuComm]InitCanBus:Set SO_SNDBUF NG");
         #endif
     }
 
+    //strcpy(ifr0.ifr_name, "can0" );
     strcpy(ifr0.ifr_name, "can0" );
     ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
     addr0.can_family = AF_CAN;
@@ -362,3137 +252,1435 @@ int InitCanBus()
     return s0;
 }
 
-//================================================
-//================================================
-// CANBUS receive task
-//================================================
-//================================================
-bool FindChargingInfoData(byte target, struct ChargingInfoData **chargingData)
+int CHROMAInitCanBus()
 {
-    for (byte index = 0; index < CHAdeMO_QUANTITY; index++)
-    {
-        if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == target)
-        {
-            chargingData[target] = &ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index];
-            return true;
-        }
-    }
-
-    for (byte index = 0; index < CCS_QUANTITY; index++)
-    {
-        if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == target)
-        {
-            chargingData[target] = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[index];
-            return true;
-        }
-    }
+	int 					s0,nbytes;
+		struct timeval			tv;
+		struct ifreq 			ifr0;
+		struct sockaddr_can		addr0;
+
+		system("/sbin/ip link set can1 down");
+		system("/sbin/ip link set can1 type can bitrate 500000 restart-ms 100");
+		system("/sbin/ip link set can1 up");
+
+		s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW);
+
+		tv.tv_sec = 0;
+		tv.tv_usec = 10000;
+	   	if (setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct	timeval)) < 0)
+		{
+			#ifdef SystemLogMessage
+			//DEBUG_ERROR("Set SO_RCVTIMEO NG");
+			#endif
+		}
+		nbytes=40960;
+		if (setsockopt(s0, SOL_SOCKET,  SO_RCVBUF, &nbytes, sizeof(int)) < 0)
+		{
+			#ifdef SystemLogMessage
+			//DEBUG_ERROR("Set SO_RCVBUF NG");
+			#endif
+		}
+		nbytes=40960;
+		if (setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0)
+		{
+			#ifdef SystemLogMessage
+			//DEBUG_ERROR("Set SO_SNDBUF NG");
+			#endif
+		}
+
+	   	strcpy(ifr0.ifr_name, "can1" );
+		ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
+		addr0.can_family = AF_CAN;
+		addr0.can_ifindex = ifr0.ifr_ifindex;
+		bind(s0, (struct sockaddr *)&addr0, sizeof(addr0));
+		return s0;
+}
 
-    for (byte index = 0; index < GB_QUANTITY; index++)
-    {
-        if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == target)
-        {
-            chargingData[target] = &ShmSysConfigAndInfo->SysInfo.GbChargingData[index];
-            return true;
-        }
-    }
 
-    return false;
+bool CheckUniqNumber(byte value)
+{
+	for (byte index = 0; index < gun_count; index++)
+	{
+		if (_chargingData[index]->Evboard_id == value)
+		{
+			struct timeval _end_time;
+			gettimeofday(&_end_time, NULL);
+			unsigned long diff = 1000000 *	(_end_time.tv_sec - _id_assign_time.tv_sec) + _end_time.tv_usec - _id_assign_time.tv_usec;
+			if (diff >= 3000000)
+			{
+				gettimeofday(&_id_assign_time, NULL);
+				return true;
+			}
+			else
+			{
+				return false;
+			}
+		}
+	}
+
+	gettimeofday(&_id_assign_time, NULL);
+	return true;
 }
 
 void AddrAssignment(byte *data)
 {
-    byte target_number[8];
-    byte index = 0x00;
+	byte target_number[8];
+	byte index = 0x00;
 
-    memcpy(target_number, data, sizeof(target_number));
-    index = *(data + 4);
+	memcpy(target_number, data, sizeof(target_number));
+	index = *(data + 4);
 
-    if (gun_count == 1)
-        index = 0x01;
-//  if (CheckUniqNumber(index))
-    {
-        PRINTF_FUNC("EV board id = %x \n", index);
-//      PRINTF_FUNC("target_number[0] = %x \n", target_number[0]);
-//      PRINTF_FUNC("target_number[1] = %x \n", target_number[1]);
-//      PRINTF_FUNC("target_number[2] = %x \n", target_number[2]);
-//      PRINTF_FUNC("target_number[3] = %x \n", target_number[3]);
-//      PRINTF_FUNC("target_number[4] = %x \n", target_number[4]);
-
-        PRINTF_FUNC("SetTargetAddr = %d, type = %d \n", index, _chargingData[index - 1]->Type);
-        SetTargetAddr(target_number, index);
-    }
+	if (CheckUniqNumber(index))
+	{
+		//printf("EV board id = %x \n", index);
+		if (index < 1)
+			return;
+
+		printf("SetTargetAddr \n");
+		SetTargetAddr(target_number, index);
+	}
 }
 
-void ClearAbnormalStatus_Chademo(byte gun_index)
+void setATEMode(byte gun_index, byte mode)
 {
-    bool isCleanCheck = false;
-    char code[7];
+	_chargingData[gun_index]->ATEStatus = mode;
+}
 
-    if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "", 6) == EQUAL)
-        return;
+void setStatusMode(byte gun_index, byte mode)
+{
+	_chargingData[gun_index]->ATEStatus = mode;
+}
 
-    if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023700", 6) == EQUAL &&
-        ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoEvCommFail == YES)
-    {
-        memcpy(code, "023700", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023704", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryMalfun == YES)
-    {
-        memcpy(code, "023704", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023705", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoNoPermission == YES)
-    {
-        memcpy(code, "023705", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023706", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryIncompatibility == YES)
-    {
-        memcpy(code, "023706", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023707", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryOVP == YES)
-    {
-        memcpy(code, "023707", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023708", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryUVP == YES)
-    {
-        memcpy(code, "023708", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023709", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryOTP == YES)
-    {
-        memcpy(code, "023709", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023710", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryCurrentDiff == YES)
-    {
-        memcpy(code, "023710", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023711", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryVoltageDiff == YES)
-    {
-        memcpy(code, "023711", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023712", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoShiftPosition == YES)
-    {
-        memcpy(code, "023712", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023713", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryOtherFault == YES)
-    {
-        memcpy(code, "023713", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023714", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargingSystemError == YES)
-    {
-        memcpy(code, "023714", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023715", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoEvNormalStop == YES)
-    {
-        memcpy(code, "023715", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023716", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoTempSensorBroken == YES)
-    {
-        memcpy(code, "023716", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023717", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoConnectorLockFail == YES)
-    {
-        memcpy(code, "023717", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023718", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoD1OnNoReceive == YES)
-    {
-        memcpy(code, "023718", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023719", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsKtoJTimeout == YES)
-    {
-        memcpy(code, "023719", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023720", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsChargeAllowTimeout == YES)
-    {
-        memcpy(code, "023720", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023721", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoWaitGfdTimeout == YES)
-    {
-        memcpy(code, "023721", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023722", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsEvRelayTimeout == YES)
-    {
-        memcpy(code, "023722", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023723", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsReqCurrentTimeout == YES)
-    {
-        memcpy(code, "023723", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023724", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsKtoJOffTimeout == YES)
-    {
-        memcpy(code, "023724", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023725", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsEvRelayOffTimeout == YES)
-    {
-        memcpy(code, "023725", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023726", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoAdcMoreThan10V == YES)
-    {
-        memcpy(code, "023726", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023727", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoAdcMoreThan20V == YES)
-    {
-        memcpy(code, "023727", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023728", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsChargeBeforeStop == YES)
-    {
-        memcpy(code, "023728", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023729", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargerGetNormalStop == YES)
-    {
-        memcpy(code, "023729", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023730", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargerGetEmergencyStop == YES)
-    {
-        memcpy(code, "023730", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023731", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoIsolationResultFail == YES)
-    {
-        memcpy(code, "023731", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023732", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoMissLinkWithMotherBoard == YES)
-    {
-        memcpy(code, "023732", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023733", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoOutputVolMoreThanLimit == YES)
-    {
-        memcpy(code, "023733", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023734", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoReqCurrentMoreThanLimit == YES)
-    {
-        memcpy(code, "023734", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023735", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoReCapBmsEqrCurrentExceed == YES)
-    {
-        memcpy(code, "023735", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023736", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargeRemainCountDown == YES)
-    {
-        memcpy(code, "023736", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
+unsigned char isStatusChange(unsigned char gun_index)
+{
+	unsigned char result = NO;
+	if(_chargingData[gun_index]->ATEStatus != _chargingData[gun_index]->PreviousATEStatus)
+	{
+		result = YES;
+		_chargingData[gun_index]->PreviousATEStatus = _chargingData[gun_index]->ATEStatus;
+
+	}
+	return result;
+}
 
-    if (isCleanCheck)
-    {
-        for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++)
-        {
-            if (index != gun_index || ShmSysConfigAndInfo->SysConfig.TotalConnectorCount == 1)
-            {
-                PRINTF_FUNC("CHA clean error : index = %d, EvConnAlarmCode = %s, code = %s \n", index, _chargingData[index]->EvConnAlarmCode, code);
-                if (strncmp((char *)_chargingData[index]->EvConnAlarmCode, code, 6) != EQUAL)
-                {
-                    if (strncmp(code, "023700", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoEvCommFail = NO;
-                    if (strncmp(code, "023704", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryMalfun = NO;
-                    if (strncmp(code, "023705", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoNoPermission = NO;
-                    if (strncmp(code, "023706", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryIncompatibility = NO;
-                    if (strncmp(code, "023707", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryOVP = NO;
-                    if (strncmp(code, "023708", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryUVP = NO;
-                    if (strncmp(code, "023709", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryOTP = NO;
-                    if (strncmp(code, "023710", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryCurrentDiff = NO;
-                    if (strncmp(code, "023711", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryVoltageDiff = NO;
-                    if (strncmp(code, "023712", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoShiftPosition = NO;
-                    if (strncmp(code, "023713", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryOtherFault = NO;
-                    if (strncmp(code, "023714", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargingSystemError = NO;
-                    if (strncmp(code, "023715", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoEvNormalStop = NO;
-                    if (strncmp(code, "023716", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoTempSensorBroken = NO;
-                    if (strncmp(code, "023717", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoConnectorLockFail = NO;
-                    if (strncmp(code, "023718", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoD1OnNoReceive = NO;
-                    if (strncmp(code, "023719", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsKtoJTimeout = NO;
-                    if (strncmp(code, "023720", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsChargeAllowTimeout = NO;
-                    if (strncmp(code, "023721", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoWaitGfdTimeout = NO;
-                    if (strncmp(code, "023722", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsEvRelayTimeout = NO;
-                    if (strncmp(code, "023723", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsReqCurrentTimeout = NO;
-                    if (strncmp(code, "023724", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsKtoJOffTimeout = NO;
-                    if (strncmp(code, "023725", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsEvRelayOffTimeout = NO;
-                    if (strncmp(code, "023726", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoAdcMoreThan10V = NO;
-                    if (strncmp(code, "023727", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoAdcMoreThan20V = NO;
-                    if (strncmp(code, "023728", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsChargeBeforeStop = NO;
-                    if (strncmp(code, "023729", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargerGetNormalStop = NO;
-                    if (strncmp(code, "023730", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargerGetEmergencyStop = NO;
-                    if (strncmp(code, "023731", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoIsolationResultFail = NO;
-                    if (strncmp(code, "023732", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoMissLinkWithMotherBoard = NO;
-                    if (strncmp(code, "023733", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoOutputVolMoreThanLimit = NO;
-                    if (strncmp(code, "023734", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoReqCurrentMoreThanLimit = NO;
-                    if (strncmp(code, "023735", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoReCapBmsEqrCurrentExceed = NO;
-                    if (strncmp(code, "023736", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargeRemainCountDown = NO;
-                }
-            }
-        }
-    }
+int bitExtracted(byte number, int k, int p)
+{
+    return (((1 << k) - 1) & (number >> (p - 1)));
 }
 
-void ClearAbnormalStatus_GB(byte gun_index)
+unsigned short bitextract(unsigned short value, int begin, int end)
 {
-    bool isCleanCheck = false;
-    char code[7];
+	unsigned short mask = (1 << (end - begin)) - 1;
+    return (value >> begin) & mask;
+}
 
-    if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "", 6) == EQUAL)
-        return;
+//接收can
+void CANReceiver()
+{
+	pid_t canRecPid;
+	canRecPid = fork();
+	if(canRecPid > 0){
+		int nbytes;
+		struct can_frame frame;
+		int intCmd;
+		while (1){
+			if(ShmSysConfigAndInfo->ate.ATEState  == 1){
+				//清空 canbus recever buf
+				memset(&frame, 0, sizeof(struct can_frame));
+				//讀取 canbus 是否有接收到封包
+				nbytes = read(CanFd, &frame, sizeof(struct can_frame));
+				//如果有收到 canbus 封包
+				if (nbytes > 0){
+					intCmd = (int) (frame.can_id & CAN_EFF_MASK);//extended frame format
+					#ifdef Debug
+						//printf("hsout0StatusChange Get-INFYPWR-Msg : %08x - %02x %02x %02x %02x %02x %02x %02x %02x\n ", intCmd, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
+						//printf(" Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
+					#endif
+					switch (intCmd){
+						case VCCU_ChargeFromVehicleId:{
+							//memcpy(&ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle, &frame.data, frame.can_dlc);
+
+							ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.VCCU_Vehicle_ContactorVoltage = ((short) frame.data[1] << 8) + (short) frame.data[0];
+							ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.VCCU_Vehicle_LinkVoltage = ((short) frame.data[3] << 8) + (short) frame.data[2];
+							ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_IsolationMeasurem = bitextract(frame.data[4],0, 2);//((short) frame.data[4] >> 0)+((short) frame.data[4] >> 1);//((short) frame.data[4] << 2);
+							ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_PlugLockPermissio = bitextract(frame.data[4],2, 4);//((short) frame.data[4] >> 2)+((short) frame.data[4] >> 3);
+							ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_PlugUnlockPermiss = bitextract(frame.data[4],4, 6);//((short) frame.data[4] >> 4)+((short) frame.data[4] >> 5);
+							ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_ChargePermission  = bitextract(frame.data[4],6, 8);//((short) frame.data[4] >> 6)+((short) frame.data[4] >> 7);
+							ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.bits.VCCU_Vehicle_ContactorStatus  = bitextract(frame.data[5],0, 2);
+
+							//memset(&ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle,*frame.data, frame.can_dlc);
+							break;
+						}
+						case VCCU_ControlPilotStatusId:{
+							//memcpy(&ShmSysConfigAndInfo->ate.vccu.controlPilotStatus, &frame.data, frame.can_dlc);
+							ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_Frequency.bits.VCCU_ControlPilot_Frequency = ((short) frame.data[1] << 8) + (short) frame.data[0];
+							ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_DutyCycle.bits.value = ((short) frame.data[2] ) ;
+							ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_Voltage.bits.value = ((short) frame.data[3] << 8) + (short) frame.data[4];
+							ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ControlPilot_Wakeup = bitextract(((short) (frame.data[5])), 0, 2);
+							ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_Mode = bitextract(frame.data[5],2, 5);
+							ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State = bitextract(((short) (frame.data[5])), 5, 8);
+							ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ChargeUnit_MaxCurrent = ((short) frame.data[6] );
+							//memset(&ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_Voltage,frame.data[5], frame.can_dlc);
+							break;
+						}
+						case VCCU_V2G_StateMId:{
+							//memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_StateM, &frame.data, frame.can_dlc);
+							ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_EnergyTransfer = (short) frame.data[0];
+							ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineEr = (short) frame.data[1];
+							ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineMe = (short) frame.data[2];
+							ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt = (short) frame.data[3];
+							ShmSysConfigAndInfo->ate.vccu.v2g_StateM.DATA.bits.VCCU_V2G_StateM_InternetAvaila = bitextract(frame.data[4],0, 1);
+							ShmSysConfigAndInfo->ate.vccu.v2g_StateM.DATA.bits.VCCU_V2G_Appl_SccChargeModeReq = bitextract(frame.data[4],1, 4);
+							ShmSysConfigAndInfo->ate.vccu.v2g_StateM.DATA.bits.VCCU_V2G_Appl_SccFuncModeReq = bitextract(frame.data[4],4, 6);
+							//memset(&ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt,*frame.data, frame.can_dlc);
+							break;
+						}
+						case VCCU_InletStatusId:{
+							//memcpy(&ShmSysConfigAndInfo->ate.vccu.inletStatus, &frame.data, frame.can_dlc);
+							ShmSysConfigAndInfo->ate.vccu.inletStatus.VCCU_POSFeedback_Voltage = ((short) frame.data[1] << 8) + (short) frame.data[0];
+							ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_SelfDiagnosti = bitextract(frame.data[2],0, 3);
+							ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Resistance = bitextract(frame.data[2],3, 6);
+							ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Status = bitextract(frame.data[2],6, 8);
+							ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA3.VCCU_PlugPresent_Wakeup = bitextract(frame.data[3],0, 2);
+							ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA3.VCCU_POSFeedback_SelfDiagnosti = bitextract(frame.data[3],2, 5);
+							ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA3.VCCU_PlugLock_MotorStatus = bitextract(frame.data[3],5, 8);
+							ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA4.VCCU_PlugLock_Output0_SelfDiag = bitextract(frame.data[4],0, 3);
+							ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA4.VCCU_PlugLock_Output1_SelfDiag = bitextract(frame.data[4],3, 6);
+							ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA4.VCCU_Inlet_HWVariant = bitextract(frame.data[4],6, 8);
+							ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_DigitalInput_Status = bitextract(frame.data[5],0, 2);
+							ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_DigitalInput_Wakeup = bitextract(frame.data[5],2, 4);
+							ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus = bitextract(frame.data[5],4, 7);
+							ShmSysConfigAndInfo->ate.vccu.inletStatus.VCCU_Inlet_MaxCurrent = (short) frame.data[6];
+							ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_DigitalInput_DebouncedSta = bitextract(frame.data[7],0, 2);
+							ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_Inlet_ConnectionStatus = bitextract(frame.data[7],2, 4);
+							ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_S3Switch_Status = bitextract(frame.data[7],4, 6);
+							ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_S3Switch_DebouncedStatus = bitextract(frame.data[7],6, 8);
+							//memset(&ShmSysConfigAndInfo->ate.vccu.inletStatus,*frame.data, frame.can_dlc);
+							//printf("VCCU_ControlPilotStatus Get-INFYPWR-Msg : %08x - %02x %02x %02x %02x %02x %02x %02x %02x\n ", intCmd, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
+							break;
+						}
+						case VCCU_ChargeToVehicleId:{
+							//memcpy(&ShmSysConfigAndInfo->ate.vccu.chargeToVehicle, &frame.data, frame.can_dlc);
+							//ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.Data.bits.VCCU_Vehicle_IsolationMea_0000 = bitextract(frame.data[0],0, 2);
+							ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_IsolationMea_0000 = bitextract(frame.data[0],0, 2);
+							ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest = bitextract(frame.data[0],2, 4);
+							//memset(&ShmSysConfigAndInfo->ate.vccu.chargeToVehicle,*frame.data, frame.can_dlc);
+							//printf("VCCU_ControlPilotStatus Get-INFYPWR-Msg : %08x - %02x %02x %02x %02x %02x %02x %02x %02x\n ", intCmd, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
+							break;
+						}
+						case VCCU_V2G_EVMaximumVoltageLimitId:{
+							//memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumVoltageLimit, &frame.data, frame.can_dlc);
+							//memset(&ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumVoltageLimit,*frame.data, frame.can_dlc);
+							break;
+						}
+						case VCCU_V2G_EVSEMaximumCurrentLimId:{
+							ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.DATA.VCCU_V2G_EVSEMaximumCurre_0002 = bitextract(frame.data[0],0, 4);
+							ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.DATA.VCCU_V2G_EVSEMaximumCurrentLim = bitextract(frame.data[0],4, 6);
+							ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.VCCU_V2G_EVSEMaximumCurre_0003 = (short) frame.data[1];
+							ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.VCCU_V2G_EVSEMaximumCurre_0000 = ((short) frame.data[3] << 8) + (short) frame.data[2];
+							ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.VCCU_V2G_EVSEMaximumCurre_0001 = (short) frame.data[4];//樁的電流
+
+							//printf("VCCU_V2G_EVSEMaximumCurrentLimId Get-INFYPWR-Msg :  VCCU_V2G_EVSEMaximumCurre_0000 = %d \n ", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.VCCU_V2G_EVSEMaximumCurre_0000);
+
+							//memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumCurrentLimit, &frame.data, frame.can_dlc);
+							//memset(&ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumCurrentLimit,*frame.data, frame.can_dlc);
+							break;
+						}
+						case VCCU_V2G_EVTargetCurrentId:{
+							//memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetCurrent, &frame.data, frame.can_dlc);
+							//memset(&ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetCurrent,*frame.data, frame.can_dlc);
+							break;
+						}
+						case VCCU_V2G_EVTargetVoltageId:{
+							//memcpy(&ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetVoltage, &frame.data, frame.can_dlc);
+							//memset(&ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetVoltage,*frame.data, frame.can_dlc);
+							break;
+						}
+						case VCCU_V2G_EVSEPresentVoltageId:{
+
+							ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va = ((short) frame.data[3] << 8) + (short) frame.data[2];
+							//printf("EVSEPresentVoltage = %d\n ", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va );
+							ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va = ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va / 10;
+							//printf("EVSEPresentVoltage = %d\n ", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va );
+							/*
+							if(ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va != 0){
+								ShmSysConfigAndInfo->ate.targetVoltage_Value = ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va;
+
+							}
+							*/
+							break;
+						}
+
+
+						default:
+							break;
+					}
+				}
+				usleep(2000);
+
+			}else if(ShmSysConfigAndInfo->ate.ATEState  == 2){
+				memset(&frame, 0, sizeof(struct can_frame));
+				nbytes = read(CanFd, &frame, sizeof(struct can_frame));
+				if (nbytes > 0)
+				{
+					intCmd = (int) (frame.can_id & CAN_EFF_MASK);
+					#ifdef Debug
+						//printf("hsout0StatusChange Get-INFYPWR-Msg : %08x - %02x %02x %02x %02x %02x %02x %02x %02x\n ", intCmd, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
+						//printf(" Get-Msg2 : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
+					#endif
+					if (intCmd == ADDRESS_REQ)
+					{
+						AddrAssignment(frame.data);
+						continue;
+					}
+
+					intCmd = (int) (frame.can_id & CAN_EFF_MASK & 0xFFFFFF00);
+
+
+					if(intCmd == 256)
+					{
+						continue;
+					}
+
+					//gettimeofday(&_cmd_ack_timeout[targetGun], NULL);
+					//printf ("intCmd = %x \n", intCmd);
+					switch (intCmd)
+					{
+					case EV_BOARD_STATUS_NOTIFICATION:
+						{
+							//printf(" EV_BOARD_STATUS_NOTIFICATION\n ");
+
+							ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal = frame.data[2];
+							ShmSysConfigAndInfo->ate.chademo.id03.state = frame.data[3];
+							//printf(" EV_BOARD_STATUS_NOTIFICATION %d \n ", ShmSysConfigAndInfo->ate.chademo.id03.state);
+							//printf(" EV_BOARD_STATUS_NOTIFICATION Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
+
+							//printf("EVBoardStatusNotification Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
+
+							//printf("ConnectorPlugIn = %x, data[0] = %x \n", _chargingData[target]->ConnectorPlugIn, frame.data[0]);
+							//printf("ConnectorPlugIn = %x \n", (-120 + frame.data[1]) / 10);
+						}
+							break;
+						case ACK_EV_FW_VERSION:
+						{
+							printf(" ACK_EV_FW_VERSION\n ");
+							/*
+							if (_chargingData[targetGun]->Type == _Type_Chademo)
+							{
+								memcpy(ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].version, frame.data, ARRAY_SIZE(frame.data));
+								ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
+							}
+							else if (_chargingData[targetGun]->Type == _Type_CCS)
+							{
+								if (ShmCcsData->CommProtocol == 0x01)
+								{
+									memcpy(&ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].version, frame.data, ARRAY_SIZE(frame.data));
+									ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
+								}
+							}
+							*/
+						}
+							break;
+						case ACK_EV_HW_VERSION:
+						{
+							printf("Get EV HW = %s \n", frame.data);
+						}
+							break;
+
+						case ACK__GET_EVSE_OUTPUT_STATUS:
+						{
+							//printf(" ACK__GET_EVSE_OUTPUT_STATUS\n ");
+							//printf(" ACK__GET_EVSE_OUTPUT_STATUS\n ");
+
+							//printf(" Get EVSE output status Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
+							ShmSysConfigAndInfo->ate.chademo.id09_ack.DcEvState = frame.data[0];//EV模擬器
+							ShmSysConfigAndInfo->ate.chademo.id09_ack.ChargingMode = frame.data[1];
+							ShmSysConfigAndInfo->ate.chademo.id09_ack.EvsePresentOutputVoltage = ((short) frame.data[3] << 8) + (short) frame.data[2];//充電樁輸出電壓
+							ShmSysConfigAndInfo->ate.chademo.id09_ack.EvsePresentOutputCurrent = ((short) frame.data[5] << 8) + (short) frame.data[4];//充電樁輸出電流
+							ShmSysConfigAndInfo->ate.chademo.id09_ack.RemainingTimeSec = ((short) frame.data[7] << 8) + (short) frame.data[6];//剩餘時間
+
+							/*
+							_chargingData[targetGun]->EvBatterySoc = frame.data[1];
+							_chargingData[targetGun]->EvBatterytargetVoltage = ((short) frame.data[3] << 8) + (short) frame.data[2];
+							_chargingData[targetGun]->EvBatterytargetCurrent = ((short) frame.data[5] << 8) + (short) frame.data[4];
+							_chargingData[targetGun]->PresentChargedDuration = ((short) frame.data[7] << 8) + (short) frame.data[6];
+
+							if (_chargingData[targetGun]->Type == _Type_Chademo)
+							{
+								if (ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].EvDetection != frame.data[0])
+								{
+									// log
+								}
+
+								ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].EvDetection = frame.data[0];
+								ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].SOC = _chargingData[targetGun]->EvBatterySoc;
+								ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].TargetBatteryVoltage = _chargingData[targetGun]->EvBatterytargetVoltage;
+								ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].ChargingCurrentRequest = _chargingData[targetGun]->EvBatterytargetCurrent;
+							}
+							else if (_chargingData[targetGun]->Type == _Type_CCS)
+							{
+								if(ShmCcsData->CommProtocol == 0x01)
+								{
+									ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].PresentMsgFlowStatus = frame.data[0];
+								}
+							}
+							*/
+							//printf("frame.data_2 = %x, frame.data_3 = %x \n", frame.data[2], frame.data[3]);
+							//printf("EvBatterytargetVoltage = %f \n", _chargingData[targetGun]->EvBatterytargetVoltage);
+							//printf("EvBatterytargetCurrent = %f \n", _chargingData[targetGun]->EvBatterytargetCurrent);
+							//printf("BatteryVoltage = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].TargetBatteryVoltage);
+							//printf("CurrentRequest = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].ChargingCurrentRequest);
+						}
+							break;
+						case ACK_GET_EVSE_Capacity_INFO:
+						{
+							ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMaxChargeVoltage = ((short) frame.data[1] << 8) + (short) frame.data[0];//樁的最大電壓
+							ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMaxChargeCurrent = ((short) frame.data[3] << 8) + (short) frame.data[2];//樁的最大電流
+							ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMinChargeVoltage = ((short) frame.data[5] << 8) + (short) frame.data[4];
+							ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMinChargeCurrent = ((short) frame.data[7] << 8) + (short) frame.data[6];
+
+							/*
+							//_chargingData[target].EvACorDCcharging = frame.data[0];
+							//_chargingData[target]->TotalBatteryCap = ((float) frame.data[4] << 8) + (short) frame.data[3];
+							_chargingData[targetGun]->EvBatteryMaxVoltage = ((short) frame.data[4] << 8) + (short) frame.data[3];
+							//_chargingData[target]->EvBatteryMaxCurrent = ((float) frame.data[4] << 8) + (short) frame.data[3];
+							//_chargingData[target].MaxiBatteryCurrent = ((short) frame.data[6] << 8) + (short) frame.data[5];
+							if (_chargingData[targetGun]->Type == _Type_Chademo)
+							{
+								ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].TotalBatteryCapacity = ((short) frame.data[2] << 8) + (short) frame.data[1];
+								ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].MaxiBatteryVoltage = _chargingData[targetGun]->EvBatteryMaxVoltage;
+
+								//printf("EvBatteryMaxVoltage = %f \n", _chargingData[target]->EvBatteryMaxVoltage);
+								//printf("TotalBatteryCapacity = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].TotalBatteryCapacity);
+								//printf("MaxiBatteryVoltage = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].MaxiBatteryVoltage);
+							}
+							else if (_chargingData[targetGun]->Type == _Type_CCS)
+							{
+								if(ShmCcsData->CommProtocol == 0x01)
+								{
+
+								}
+							}
+							*/
+						}
+							break;
+						case ACK_GET_MISCELLANEOUS_INFO:
+						{
+							//printf(" ACK_GET_MISCELLANEOUS_INFO\n ");
+							//printf(" ACK_GET_MISCELLANEOUS_INFO\n ");
+							ShmSysConfigAndInfo->ate.chademo.id0D_ack.K1K2OnOff = frame.data[5];
+							if(ShmSysConfigAndInfo->ate.chademo.relaystatus == 0){
+								ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status = ShmSysConfigAndInfo->ate.chademo.id0D_ack.K1K2OnOff;
+								setStatusMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status);
+
+								int status = isStatusChange(CCS_QUANTITY);
+								if(status){
+									/*
+									if(ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status == 1){
+										if(ShmSysConfigAndInfo->ate.ATEState  == 1){
+
+
+											//usleep(whileLoopTime);
+
+											//outputRelay.relay_event.bits.Gun1_Parallel_N = 0x00;
+											//outputRelay.relay_event.bits.Gun1_Parallel_P = 0x00;
+											//Config_Relay_Output(Uart5Fd, Addr.Relay, &outputRelay);
+										}else if(ShmSysConfigAndInfo->ate.ATEState  == 2){
+											//outputRelay.relay_event.bits.Gun1_Parallel_N = 0x01;
+											//outputRelay.relay_event.bits.Gun1_Parallel_P = 0x01;
+											//Config_Relay_Output(Uart5Fd, Addr.Relay, &outputRelay);
+										}
+									}else{
+
+									}
+									*/
+								}
+							}
+							//memcpy(&ShmSysConfigAndInfo->ate.chademo.id0D_ack, &frame.data, frame.can_dlc);
+							//printf("%d %d\n", ShmSysConfigAndInfo->ate.chademo.id0D_ack.K1K2OnOff, ShmSysConfigAndInfo->ate.chademo.id0D_ack.EvBoardState);
+							//printf(" Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
+	/*
+							float pilotVol = (float)(-120 + frame.data[3]) / 10;
+
+	//						if (pilotVol != _chargingData[targetGun]->PilotVoltage)
+	//							DEBUG_INFO("PilotVoltage = %f \n", _chargingData[targetGun]->PilotVoltage);
+
+							if (_chargingData[targetGun]->Type == _Type_Chademo)
+							{
+								_chargingData[targetGun]->GunLocked = frame.data[0];
+								ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureP = frame.data[1];
+								ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureN = frame.data[2];
+								_chargingData[targetGun]->PilotVoltage = pilotVol;
+								ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].EvboardStatus = frame.data[7];
+							}
+							else if (_chargingData[targetGun]->Type == _Type_CCS)
+							{
+								if (ShmCcsData->CommProtocol == 0x01)
+								{
+									_chargingData[targetGun]->GunLocked = frame.data[0];
+									//ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index]. .ConnectorTemperatureP = frame.data[1];
+									//ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index]. .ConnectorTemperatureN = frame.data[2];
+									_chargingData[targetGun]->PilotVoltage = pilotVol;
+								}
+							}
+							*/
+
+							//printf("ConnectorPlug locked = %x \n", frame.data[0]);
+							//printf("ConnectorTemp 0= %d \n", ShmCHAdeMOData->evse[_chargingData[target]->type_index].ConnectorTemperatureP);
+							//printf("ConnectorTemp 1= %d \n", ShmCHAdeMOData->evse[_chargingData[target]->type_index].ConnectorTemperatureN);
+						}
+							break;
+						case ACK_EVSE_ISOLATION_STATUS: { }	break;
+						case ACK_EVSE_PRECHAGE_INFO:
+						{
+							//_chargingData[targetGun]->PrechargeStatus = frame.data[0];
+						}
+							break;
+						case NOTIFICATION_EV_STOP:
+						{
+							printf(" ACK_GET_MISCELLANEOUS_INFO\n ");
+
+							ShmSysConfigAndInfo->ate.chademo.id0B.EvStopReason = frame.data[0];
+							ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode1 = frame.data[1];
+							ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode2 = frame.data[2];
+							ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode3 = frame.data[3];
+							ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode4 = frame.data[4];
+							ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode5 = frame.data[5];
+							ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode6 = frame.data[6];
+							printf("EvStopReason = %d %d %d %d %d %d %d \n", ShmSysConfigAndInfo->ate.chademo.id0B.EvStopReason, ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode1, ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode2, ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode3, ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode4, ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode5, ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode6);
+							//byte normalStop = 0x01;
+							//byte stopReason[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+							//byte evstaus[5] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
+
+							//ShmSysConfigAndInfo->ate.Permission = STOP;
+							//setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
+							//ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
+							//SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
+							//EvseStopChargingEvent(normalStop, stopReason, 1);
+							setEVStatus1(evstaus[4]);
+							ShmSysConfigAndInfo->ate.Permission = STOP;
+							setStatusMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
+							ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
+							SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
+							EvseStopChargingEvent(normalStop, stopReason, 1);
+							/*
+							ShmSysConfigAndInfo->ate.Permission = STOP;
+							setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
+							ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
+							SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
+*/
+							/*
+							time_t CurrentTime;
+							struct tm *tm;
+							CurrentTime = time(NULL);
+							tm = localtime(&	CurrentTime);
+							printf(" Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
+
+							printf("NOTIFICATION_EV_STOP : %04d-%02d-%02d %02d:%02d:%02d \n",
+									tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
+							// 車端要求停止
+							// frame.data[0] : 0x01 => normal stop, 0x02 => ev emergency stop
+							if (frame.data[0] == 0x02)
+							{
+								//printf("NOTIFICATION_EV_STOP -----------------------------\n");
+								AbnormalStopAnalysis(targetGun, frame.data + 1);
+							}
+							_chargingData[targetGun]->StopChargeFlag = YES;
+							*/
+						}
+							break;
+						default:
+							//printf("Ack none defined. intCmd = %d  \n", intCmd);
+							break;
+					}
+				}
+				usleep(10000);
+			}
+		}
+	}
+}
 
-    if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023702", 6) == EQUAL &&
-        ShmStatusCodeData->InfoCode.InfoEvents.bits.GbEvCommFail == YES)
-    {
-        memcpy(code, "023702", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023900", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_LOS_CC1 == YES)
-    {
-        memcpy(code, "023900", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023901", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_CONNECTOR_LOCK_FAIL == YES)
-    {
-        memcpy(code, "023901", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023902", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_BATTERY_INCOMPATIBLE == YES)
-    {
-        memcpy(code, "023902", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023903", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_BMS_BROAA_TIMEOUT == YES)
-    {
-        memcpy(code, "023903", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023904", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_CSU_PRECHARGE_TIMEOUT == YES)
-    {
-        memcpy(code, "023904", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023905", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_BMS_PRESENT_VOLTAGE_FAULT == YES)
-    {
-        memcpy(code, "023905", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023906", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_BMS_VOLTAGE_OVER_RANGE == YES)
-    {
-        memcpy(code, "023906", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023907", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_BSM_CHARGE_ALLOW_00_10MIN_COUUNTDONE == YES)
-    {
-        memcpy(code, "023907", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023908", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_WAIT_GROUNDFAULT_TIMEOUT == YES)
-    {
-        memcpy(code, "023908", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023909", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_ADC_MORE_THAN_10V == YES)
-    {
-        memcpy(code, "023909", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023910", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_ADC_MORE_THAN_60V == YES)
-    {
-        memcpy(code, "023910", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023911", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_CHARGER_GET_NORMAL_STOP_CMD == YES)
-    {
-        memcpy(code, "023911", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023912", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_CHARGER_GET_EMERGENCY_STOP_CMD == YES)
-    {
-        memcpy(code, "023912", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023913", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_ISOLATION_RESULT_FAIL == YES)
-    {
-        memcpy(code, "023913", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023914", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_MOTHER_BOARD_MISS_LINK == YES)
-    {
-        memcpy(code, "023914", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023915", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_OUTPUT_VOLTAGE_MORE_THAN_LIMIT == YES)
-    {
-        memcpy(code, "023915", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023916", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_REQ_CURRENT_MORE_THAN_LIMIT == YES)
-    {
-        memcpy(code, "023916", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023917", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_OUTPUT_VOLTAGE_MORE_THAN_10_PERCENT == YES)
-    {
-        memcpy(code, "023917", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023918", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_OUTPUT_VOLTAGE_DIFF_BCS_5_PERCENT == YES)
-    {
-        memcpy(code, "023918", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023919", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_STOP_ADC_MORE_THAN_10V == YES)
-    {
-        memcpy(code, "023919", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023930", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BHM_TIMEOUT == YES)
-    {
-        memcpy(code, "023930", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023931", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BRM_TIMEOUT == YES)
-    {
-        memcpy(code, "023931", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023932", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BCP_TIMEOUT == YES)
-    {
-        memcpy(code, "023932", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023933", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BRO_TIMEOUT == YES)
-    {
-        memcpy(code, "023933", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023934", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BCL_TIMEOUT == YES)
-    {
-        memcpy(code, "023934", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023935", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BCS_TIMEOUT == YES)
-    {
-        memcpy(code, "023935", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023936", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BSM_TIMEOUT == YES)
-    {
-        memcpy(code, "023936", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023937", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BST_TIMEOUT == YES)
-    {
-        memcpy(code, "023937", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023938", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BSD_TIMEOUT == YES)
-    {
-        memcpy(code, "023938", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023939", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BEM_OTHER_TIMEOUT == YES)
-    {
-        memcpy(code, "023939", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023940", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CRM_TIMEOUT == YES)
-    {
-        memcpy(code, "023940", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023941", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CRMAA_TIMEOUT == YES)
-    {
-        memcpy(code, "023941", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023942", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CTS_CML_TIMEOUT == YES)
-    {
-        memcpy(code, "023942", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023943", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CRO_TIMEOUT == YES)
-    {
-        memcpy(code, "023943", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023944", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CCS_TIMEOUT == YES)
-    {
-        memcpy(code, "023944", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023945", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CST_TIMEOUT == YES)
-    {
-        memcpy(code, "023945", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023946", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CSD_TIMEOUT == YES)
-    {
-        memcpy(code, "023946", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023947", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_BEM_OTHER_TIMEOUT == YES)
-    {
-        memcpy(code, "023947", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023950", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_SOC_GOAL == YES)
-    {
-        memcpy(code, "023950", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023951", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_TOTAL_VOLTAGE_GOAL == YES)
-    {
-        memcpy(code, "023951", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023952", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_CELL_VOLTAGE_GOAL == YES)
-    {
-        memcpy(code, "023952", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023953", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_GET_CST == YES)
-    {
-        memcpy(code, "023953", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023954", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_ISOLATION == YES)
-    {
-        memcpy(code, "023954", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023955", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_OUTPUT_CONNECTOR_OTP == YES)
-    {
-        memcpy(code, "023955", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023956", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_COMPONENT == YES)
-    {
-        memcpy(code, "023956", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023957", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_CHARGE_CONNECTOR == YES)
-    {
-        memcpy(code, "023957", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023958", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_OTP == YES)
-    {
-        memcpy(code, "023958", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023959", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_OTHER == YES)
-    {
-        memcpy(code, "023959", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023960", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_HIGH_V == YES)
-    {
-        memcpy(code, "023960", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023961", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_CC2 == YES)
-    {
-        memcpy(code, "023961", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023962", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_CURRENT == YES)
-    {
-        memcpy(code, "023962", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023963", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_VOLTAGE == YES)
-    {
-        memcpy(code, "023963", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023964", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GET_BST_NO_REASON == YES)
-    {
-        memcpy(code, "023964", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023970", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_CELL_OVER_VOLTAGE == YES)
-    {
-        memcpy(code, "023970", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023971", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_CELL_UNDER_VOLTAGE == YES)
-    {
-        memcpy(code, "023971", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023972", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_OVER_SOC == YES)
-    {
-        memcpy(code, "023972", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023973", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_UNDER_SOC == YES)
-    {
-        memcpy(code, "023973", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023974", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_CURRENT == YES)
-    {
-        memcpy(code, "023974", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023975", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_TEMPERATURE == YES)
-    {
-        memcpy(code, "023975", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023976", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_ISOLATE == YES)
-    {
-        memcpy(code, "023976", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023977", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_OUTPUT_CONNECTOR == YES)
-    {
-        memcpy(code, "023977", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-
-    if (isCleanCheck)
-    {
-        for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++)
-        {
-            if (index != gun_index || ShmSysConfigAndInfo->SysConfig.TotalConnectorCount == 1)
-            {
-                PRINTF_FUNC("GBT clean error : index = %d, EvConnAlarmCode = %s, code = %s \n", index, _chargingData[index]->EvConnAlarmCode, code);
-                if (strncmp((char *)_chargingData[index]->EvConnAlarmCode, code, 6) != EQUAL)
-                {
-                    if (strncmp(code, "023702", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.GbEvCommFail = NO;
-                    if (strncmp(code, "023900", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_LOS_CC1 = NO;
-                    if (strncmp(code, "023901", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_CONNECTOR_LOCK_FAIL = NO;
-                    if (strncmp(code, "023902", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_BATTERY_INCOMPATIBLE = NO;
-                    if (strncmp(code, "023903", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_BMS_BROAA_TIMEOUT = NO;
-                    if (strncmp(code, "023904", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_CSU_PRECHARGE_TIMEOUT = NO;
-                    if (strncmp(code, "023905", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_BMS_PRESENT_VOLTAGE_FAULT = NO;
-                    if (strncmp(code, "023906", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_BMS_VOLTAGE_OVER_RANGE = NO;
-                    if (strncmp(code, "023907", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_BSM_CHARGE_ALLOW_00_10MIN_COUUNTDONE = NO;
-                    if (strncmp(code, "023908", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_WAIT_GROUNDFAULT_TIMEOUT = NO;
-                    if (strncmp(code, "023909", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_ADC_MORE_THAN_10V = NO;
-                    if (strncmp(code, "023910", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_ADC_MORE_THAN_60V = NO;
-                    if (strncmp(code, "023911", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_CHARGER_GET_NORMAL_STOP_CMD = NO;
-                    if (strncmp(code, "023912", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_CHARGER_GET_EMERGENCY_STOP_CMD = NO;
-                    if (strncmp(code, "023913", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_ISOLATION_RESULT_FAIL = NO;
-                    if (strncmp(code, "023914", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_MOTHER_BOARD_MISS_LINK = NO;
-                    if (strncmp(code, "023915", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_OUTPUT_VOLTAGE_MORE_THAN_LIMIT = NO;
-                    if (strncmp(code, "023916", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_REQ_CURRENT_MORE_THAN_LIMIT = NO;
-                    if (strncmp(code, "023917", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_OUTPUT_VOLTAGE_MORE_THAN_10_PERCENT = NO;
-                    if (strncmp(code, "023918", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_OUTPUT_VOLTAGE_DIFF_BCS_5_PERCENT = NO;
-                    if (strncmp(code, "023919", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_STOP_ADC_MORE_THAN_10V = NO;
-                    if (strncmp(code, "023930", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BHM_TIMEOUT = NO;
-                    if (strncmp(code, "023931", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BRM_TIMEOUT = NO;
-                    if (strncmp(code, "023932", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BCP_TIMEOUT = NO;
-                    if (strncmp(code, "023933", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BRO_TIMEOUT = NO;
-                    if (strncmp(code, "023934", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BCL_TIMEOUT = NO;
-                    if (strncmp(code, "023935", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BCS_TIMEOUT = NO;
-                    if (strncmp(code, "023936", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BSM_TIMEOUT = NO;
-                    if (strncmp(code, "023937", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BST_TIMEOUT = NO;
-                    if (strncmp(code, "023938", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BSD_TIMEOUT = NO;
-                    if (strncmp(code, "023939", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BEM_OTHER_TIMEOUT = NO;
-                    if (strncmp(code, "023940", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CRM_TIMEOUT = NO;
-                    if (strncmp(code, "023941", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CRMAA_TIMEOUT = NO;
-                    if (strncmp(code, "023942", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CTS_CML_TIMEOUT = NO;
-                    if (strncmp(code, "023943", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CRO_TIMEOUT = NO;
-                    if (strncmp(code, "023944", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CCS_TIMEOUT = NO;
-                    if (strncmp(code, "023945", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CST_TIMEOUT = NO;
-                    if (strncmp(code, "023946", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CSD_TIMEOUT = NO;
-                    if (strncmp(code, "023947", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_BEM_OTHER_TIMEOUT = NO;
-                    if (strncmp(code, "023950", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_SOC_GOAL = NO;
-                    if (strncmp(code, "023951", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_TOTAL_VOLTAGE_GOAL = NO;
-                    if (strncmp(code, "023952", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_CELL_VOLTAGE_GOAL = NO;
-                    if (strncmp(code, "023953", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_GET_CST = NO;
-                    if (strncmp(code, "023954", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_ISOLATION = NO;
-                    if (strncmp(code, "023955", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_OUTPUT_CONNECTOR_OTP = NO;
-                    if (strncmp(code, "023956", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_COMPONENT = NO;
-                    if (strncmp(code, "023957", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_CHARGE_CONNECTOR = NO;
-                    if (strncmp(code, "023958", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_OTP = NO;
-                    if (strncmp(code, "023959", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_OTHER = NO;
-                    if (strncmp(code, "023960", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_HIGH_V = NO;
-                    if (strncmp(code, "023961", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_CC2 = NO;
-                    if (strncmp(code, "023962", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_CURRENT = NO;
-                    if (strncmp(code, "023963", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_VOLTAGE = NO;
-                    if (strncmp(code, "023964", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GET_BST_NO_REASON = NO;
-                    if (strncmp(code, "023970", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_CELL_OVER_VOLTAGE = NO;
-                    if (strncmp(code, "023971", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_CELL_UNDER_VOLTAGE = NO;
-                    if (strncmp(code, "023972", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_OVER_SOC = NO;
-                    if (strncmp(code, "023973", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_UNDER_SOC = NO;
-                    if (strncmp(code, "023974", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_CURRENT = NO;
-                    if (strncmp(code, "023975", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_TEMPERATURE = NO;
-                    if (strncmp(code, "023976", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_ISOLATE = NO;
-                    if (strncmp(code, "023977", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_OUTPUT_CONNECTOR = NO;
-                }
-            }
-        }
-    }
-}
-
-void ClearAbnormalStatus_CCS(byte gun_index)
-{
-    bool isCleanCheck = false;
-    char code[7];
-
-    if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "", 6) == EQUAL)
-        return;
-
-    if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023701", 6) == EQUAL &&
-        ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEvCommFail == YES)
-    {
-        memcpy(code, "023701", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023737", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsRESTemperatureInhibit == YES)
-    {
-        memcpy(code, "023737", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023738", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEVShiftPosition == YES)
-    {
-        memcpy(code, "023738", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023739", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChargerConnectorLockFault == YES)
-    {
-        memcpy(code, "023739", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023740", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEVRESSMalfunction == YES)
-    {
-        memcpy(code, "023740", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023741", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChargingCurrentdifferential == YES)
-    {
-        memcpy(code, "023741", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023742", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChargingVoltageOutOfRange == YES)
-    {
-        memcpy(code, "023742", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023743", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChargingSystemIncompatibility == YES)
-    {
-        memcpy(code, "023743", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023744", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEmergencyEvent == YES)
-    {
-        memcpy(code, "023744", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023745", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsBreaker == YES)
-    {
-        memcpy(code, "023745", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023746", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsNoData == YES)
-    {
-        memcpy(code, "023746", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023747", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_DIN_A == YES)
-    {
-        memcpy(code, "023747", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023748", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_DIN_B == YES)
-    {
-        memcpy(code, "023748", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023749", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_DIN_C == YES)
-    {
-        memcpy(code, "023749", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023750", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_ISO_1 == YES)
-    {
-        memcpy(code, "023750", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023751", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_ISO_2 == YES)
-    {
-        memcpy(code, "023751", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023752", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_ISO_3 == YES)
-    {
-        memcpy(code, "023752", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023753", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_OEM_1 == YES)
-    {
-        memcpy(code, "023753", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023754", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_OEM_2 == YES)
-    {
-        memcpy(code, "023754", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023755", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_OEM_3 == YES)
-    {
-        memcpy(code, "023755", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023756", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_OEM_4 == YES)
-    {
-        memcpy(code, "023756", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023757", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_OEM_5 == YES)
-    {
-        memcpy(code, "023757", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023758", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSequenceError == YES)
-    {
-        memcpy(code, "023758", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023759", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSignatureError == YES)
-    {
-        memcpy(code, "023759", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023760", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsUnknownSession == YES)
-    {
-        memcpy(code, "023760", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023761", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsServiceIDInvalid == YES)
-    {
-        memcpy(code, "023761", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023762", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsPaymentSelectionInvalid == YES)
-    {
-        memcpy(code, "023762", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023763", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsIdentificationSelectionInvalid == YES)
-    {
-        memcpy(code, "023763", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023764", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsServiceSelectionInvalid == YES)
-    {
-        memcpy(code, "023764", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023765", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertificateExpired == YES)
-    {
-        memcpy(code, "023765", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023766", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertificateNotYetValid == YES)
-    {
-        memcpy(code, "023766", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023767", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertificateRevoked == YES)
-    {
-        memcpy(code, "023767", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023768", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsNoCertificateAvailable == YES)
-    {
-        memcpy(code, "023768", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023769", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertChainError == YES)
-    {
-        memcpy(code, "023769", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023770", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertValidationError == YES)
-    {
-        memcpy(code, "023770", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023771", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertVerificationError == YES)
-    {
-        memcpy(code, "023771", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023772", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsContractCanceled == YES)
-    {
-        memcpy(code, "023772", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023773", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChallengeInvalid == YES)
-    {
-        memcpy(code, "023773", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023774", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsWrongEnergyTransferMode == YES)
-    {
-        memcpy(code, "023774", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023775", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsWrongChargeParameter == YES)
-    {
-        memcpy(code, "023775", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023776", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChargingProfileInvalid == YES)
-    {
-        memcpy(code, "023776", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023777", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTariffSelectionInvalid == YES)
-    {
-        memcpy(code, "023777", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023778", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEVSEPresentVoltageToLow == YES)
-    {
-        memcpy(code, "023778", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023779", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsPowerDeliveryNotApplied == YES)
-    {
-        memcpy(code, "023779", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023780", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMeteringSignatureNotValid == YES)
-    {
-        memcpy(code, "023780", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023781", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsNoChargeServiceSelected == YES)
-    {
-        memcpy(code, "023781", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023782", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsContactorError == YES)
-    {
-        memcpy(code, "023782", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023783", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertificateNotAllowedAtThisEVSE == YES)
-    {
-        memcpy(code, "023783", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023784", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsGAChargeStop == YES)
-    {
-        memcpy(code, "023784", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023785", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsAlignmentError == YES)
-    {
-        memcpy(code, "023785", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023786", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsACDError == YES)
-    {
-        memcpy(code, "023786", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023787", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsAssociationError == YES)
-    {
-        memcpy(code, "023787", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023788", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEVSEChargeAbort == YES)
-    {
-        memcpy(code, "023788", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023789", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsNoSupportedAppProtocol == YES)
-    {
-        memcpy(code, "023789", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023790", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsContractNotAccepted == YES)
-    {
-        memcpy(code, "023790", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023791", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMOUnknown == YES)
-    {
-        memcpy(code, "023791", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023792", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsOEM_Prov_CertificateRevoke == YES)
-    {
-        memcpy(code, "023792", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023793", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsOEM_SubCA1_CertificateRevoked == YES)
-    {
-        memcpy(code, "023793", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023794", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsOEM_SubCA2_CertificateRevoked == YES)
-    {
-        memcpy(code, "023794", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023795", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsOEM_RootCA_CertificateRevoked == YES)
-    {
-        memcpy(code, "023795", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023796", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMO_Prov_CertificateRevoked == YES)
-    {
-        memcpy(code, "023796", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023797", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMO_SubCA1_CertificateRevoked == YES)
-    {
-        memcpy(code, "023797", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023798", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMO_SubCA2_CertificateRevoked == YES)
-    {
-        memcpy(code, "023798", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023799", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMO_RootCA_CertificateRevoked == YES)
-    {
-        memcpy(code, "023799", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023800", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPS_Prov_CertificateRevoked == YES)
-    {
-        memcpy(code, "023800", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023801", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPS_SubCA1_CertificateRevoked == YES)
-    {
-        memcpy(code, "023801", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023802", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPS_SubCA2_CertificateRevoked == YES)
-    {
-        memcpy(code, "023802", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023803", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPS_RootCA_CertificateRevoked == YES)
-    {
-        memcpy(code, "023803", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023809", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EVSE_SLAC_init == YES)
-    {
-        memcpy(code, "023809", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023810", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_match_response == YES)
-    {
-        memcpy(code, "023810", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023811", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_match_sequence == YES)
-    {
-        memcpy(code, "023811", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023812", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EVSE_match_MNBC == YES)
-    {
-        memcpy(code, "023812", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023813", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_EVSE_avg_atten_calc == YES)
-    {
-        memcpy(code, "023813", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023814", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_match_response == YES)
-    {
-        memcpy(code, "023814", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023815", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_EVSE_match_session == YES)
-    {
-        memcpy(code, "023815", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023816", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EVSE_assoc_session == YES)
-    {
-        memcpy(code, "023816", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023817", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EVSE_vald_toggle == YES)
-    {
-        memcpy(code, "023817", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023823", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsUDP_TT_match_join == YES)
-    {
-        memcpy(code, "023823", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023824", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTCP_TT_match_join == YES)
-    {
-        memcpy(code, "023824", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023825", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_amp_map_exchange == YES)
-    {
-        memcpy(code, "023825", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023826", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_link_ready_notification == YES)
-    {
-        memcpy(code, "023826", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023832", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSupportedAppProtocolRes == YES)
-    {
-        memcpy(code, "023832", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023833", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSessionSetupRes == YES)
-    {
-        memcpy(code, "023833", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023834", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsServiceDiscoveryRes == YES)
-    {
-        memcpy(code, "023834", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023835", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsServicePaymentSelectionRes == YES)
-    {
-        memcpy(code, "023835", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023836", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsContractAuthenticationRes == YES)
-    {
-        memcpy(code, "023836", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023837", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChargeParameterDiscoveryRes == YES)
-    {
-        memcpy(code, "023837", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023838", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsPowerDeliveryRes == YES)
-    {
-        memcpy(code, "023838", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023839", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCableCheckRes == YES)
-    {
-        memcpy(code, "023839", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023840", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsPreChargeRes == YES)
-    {
-        memcpy(code, "023840", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023841", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCurrentDemandRes == YES)
-    {
-        memcpy(code, "023841", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023842", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsWeldingDetectionRes == YES)
-    {
-        memcpy(code, "023842", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023843", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSessionStopRes == YES)
-    {
-        memcpy(code, "023843", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023844", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSequence_Time == YES)
-    {
-        memcpy(code, "023844", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023845", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsReadyToCharge_Performance_Time == YES)
-    {
-        memcpy(code, "023845", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023846", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCommunicationSetup_Performance_Time == YES)
-    {
-        memcpy(code, "023846", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023847", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCableCheck_Performance_Time == YES)
-    {
-        memcpy(code, "023847", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023848", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPState_Detection_Time == YES)
-    {
-        memcpy(code, "023848", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023849", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPOscillator_Retain_Time == YES)
-    {
-        memcpy(code, "023849", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023850", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutV2GPreChargePerformaceTime == YES)
-    {
-        memcpy(code, "023850", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023855", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_GET_EV_TARGET_INFO == YES)
-    {
-        memcpy(code, "023855", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023856", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_GET_EV_TARGET_INFO == YES)
-    {
-        memcpy(code, "023856", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023857", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_GET_EV_BATTERY_INFO == YES)
-    {
-        memcpy(code, "023857", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023858", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_GET_EV_BATTERY_INFO == YES)
-    {
-        memcpy(code, "023858", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023859", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_EV_STOP_EVENT == YES)
-    {
-        memcpy(code, "023859", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023860", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EV_STOP_EVENT == YES)
-    {
-        memcpy(code, "023860", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023861", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_EVSE_STOP_EVENT == YES)
-    {
-        memcpy(code, "023861", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023862", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EVSE_STOP_EVENT == YES)
-    {
-        memcpy(code, "023862", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023863", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_GET_MISC_INFO == YES)
-    {
-        memcpy(code, "023863", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023864", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_GET_MISC_INFO == YES)
-    {
-        memcpy(code, "023864", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023865", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_DOWNLOAD_REQUEST == YES)
-    {
-        memcpy(code, "023865", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023866", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_DOWNLOAD_REQUEST == YES)
-    {
-        memcpy(code, "023866", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023867", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_START_BLOCK_TRANSFER == YES)
-    {
-        memcpy(code, "023867", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023868", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_START_BLOCK_TRANSFER == YES)
-    {
-        memcpy(code, "023868", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023869", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_DATA_TRANSFER == YES)
-    {
-        memcpy(code, "023869", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023870", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_DATA_TRANSFER == YES)
-    {
-        memcpy(code, "023870", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023871", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_DOWNLOAD_FINISH == YES)
-    {
-        memcpy(code, "023871", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023872", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_DOWNLOAD_FINISH == YES)
-    {
-        memcpy(code, "023872", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023873", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_ISOLATION_STATUS == YES)
-    {
-        memcpy(code, "023873", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023874", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_ISOLATION_STATUS == YES)
-    {
-        memcpy(code, "023874", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023875", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_CONNECTOR_INFO == YES)
-    {
-        memcpy(code, "023875", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023876", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_CONNECTOR_INFO == YES)
-    {
-        memcpy(code, "023876", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023877", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_RTC_INFO == YES)
-    {
-        memcpy(code, "023877", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023878", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_RTC_INFO == YES)
-    {
-        memcpy(code, "023878", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023879", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_EVSE_PRECHARGE_INFO == YES)
-    {
-        memcpy(code, "023879", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023880", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EVSE_PRECHARGE_INFO == YES)
-    {
-        memcpy(code, "023880", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023881", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMSG_Sequence == YES)
-    {
-        memcpy(code, "023881", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023882", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCAN_MSG_Unrecognized_CMD_ID == YES)
-    {
-        memcpy(code, "023882", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023883", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsDIN_Msg_Decode_Error == YES)
-    {
-        memcpy(code, "023883", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023884", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsDIN_Msg_Encode_Error == YES)
-    {
-        memcpy(code, "023884", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023885", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsISO1_Msg_Decode_Error == YES)
-    {
-        memcpy(code, "023885", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023886", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsISO1_Msg_Encode_Error == YES)
-    {
-        memcpy(code, "023886", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023887", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsISO2_Msg_Decode_Error == YES)
-    {
-        memcpy(code, "023887", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023888", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsISO2_Msg_Encode_Error == YES)
-    {
-        memcpy(code, "023888", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023889", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCpStatus_Error == YES)
-    {
-        memcpy(code, "023889", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023890", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsUnexpectVolBeforeCharing_Error == YES)
-    {
-        memcpy(code, "023890", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023891", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccNotReadyForCharging == YES)
-    {
-        memcpy(code, "023891", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023892", 6) == EQUAL &&
-             ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutQCA7000Comm == YES)
-    {
-        memcpy(code, "023892", 6);
-        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
-        isCleanCheck = true;
-    }
-
-    if (isCleanCheck)
-    {
-        for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++)
-        {
-            if (index != gun_index || ShmSysConfigAndInfo->SysConfig.TotalConnectorCount == 1)
-            {
-                PRINTF_FUNC("CCS clean error : index = %d, EvConnAlarmCode = %s, code = %s \n", index, _chargingData[index]->EvConnAlarmCode, code);
-                if (strncmp((char *)_chargingData[index]->EvConnAlarmCode, code, 6) != EQUAL)
-                {
-                    if (strncmp(code, "023701", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEvCommFail = NO;
-                    if (strncmp(code, "023737", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsRESTemperatureInhibit = NO;
-                    if (strncmp(code, "023738", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEVShiftPosition = NO;
-                    if (strncmp(code, "023739", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChargerConnectorLockFault = NO;
-                    if (strncmp(code, "023740", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEVRESSMalfunction = NO;
-                    if (strncmp(code, "023741", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChargingCurrentdifferential = NO;
-                    if (strncmp(code, "023742", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChargingVoltageOutOfRange = NO;
-                    if (strncmp(code, "023743", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChargingSystemIncompatibility = NO;
-                    if (strncmp(code, "023744", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEmergencyEvent = NO;
-                    if (strncmp(code, "023745", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsBreaker = NO;
-                    if (strncmp(code, "023746", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsNoData = NO;
-                    if (strncmp(code, "023747", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_DIN_A = NO;
-                    if (strncmp(code, "023748", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_DIN_B = NO;
-                    if (strncmp(code, "023749", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_DIN_C = NO;
-                    if (strncmp(code, "023750", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_ISO_1 = NO;
-                    if (strncmp(code, "023751", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_ISO_2 = NO;
-                    if (strncmp(code, "023752", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_ISO_3 = NO;
-                    if (strncmp(code, "023753", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_OEM_1 = NO;
-                    if (strncmp(code, "023754", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_OEM_2 = NO;
-                    if (strncmp(code, "023755", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_OEM_3 = NO;
-                    if (strncmp(code, "023756", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_OEM_4 = NO;
-                    if (strncmp(code, "023757", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_OEM_5 = NO;
-                    if (strncmp(code, "023758", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSequenceError = NO;
-                    if (strncmp(code, "023759", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSignatureError = NO;
-                    if (strncmp(code, "023760", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsUnknownSession = NO;
-                    if (strncmp(code, "023761", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsServiceIDInvalid = NO;
-                    if (strncmp(code, "023762", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsPaymentSelectionInvalid = NO;
-                    if (strncmp(code, "023763", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsIdentificationSelectionInvalid = NO;
-                    if (strncmp(code, "023764", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsServiceSelectionInvalid = NO;
-                    if (strncmp(code, "023765", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertificateExpired = NO;
-                    if (strncmp(code, "023766", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertificateNotYetValid = NO;
-                    if (strncmp(code, "023767", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertificateRevoked = NO;
-                    if (strncmp(code, "023768", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsNoCertificateAvailable = NO;
-                    if (strncmp(code, "023769", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertChainError = NO;
-                    if (strncmp(code, "023770", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertValidationError = NO;
-                    if (strncmp(code, "023771", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertVerificationError = NO;
-                    if (strncmp(code, "023772", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsContractCanceled = NO;
-                    if (strncmp(code, "023773", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChallengeInvalid = NO;
-                    if (strncmp(code, "023774", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsWrongEnergyTransferMode = NO;
-                    if (strncmp(code, "023775", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsWrongChargeParameter = NO;
-                    if (strncmp(code, "023776", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChargingProfileInvalid = NO;
-                    if (strncmp(code, "023777", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTariffSelectionInvalid = NO;
-                    if (strncmp(code, "023778", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEVSEPresentVoltageToLow = NO;
-                    if (strncmp(code, "023779", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsPowerDeliveryNotApplied = NO;
-                    if (strncmp(code, "023780", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMeteringSignatureNotValid = NO;
-                    if (strncmp(code, "023781", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsNoChargeServiceSelected = NO;
-                    if (strncmp(code, "023782", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsContactorError = NO;
-                    if (strncmp(code, "023783", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertificateNotAllowedAtThisEVSE = NO;
-                    if (strncmp(code, "023784", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsGAChargeStop = NO;
-                    if (strncmp(code, "023785", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsAlignmentError = NO;
-                    if (strncmp(code, "023786", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsACDError = NO;
-                    if (strncmp(code, "023787", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsAssociationError = NO;
-                    if (strncmp(code, "023788", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEVSEChargeAbort = NO;
-                    if (strncmp(code, "023789", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsNoSupportedAppProtocol = NO;
-                    if (strncmp(code, "023790", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsContractNotAccepted = NO;
-                    if (strncmp(code, "023791", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMOUnknown = NO;
-                    if (strncmp(code, "023792", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsOEM_Prov_CertificateRevoke = NO;
-                    if (strncmp(code, "023793", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsOEM_SubCA1_CertificateRevoked = NO;
-                    if (strncmp(code, "023794", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsOEM_SubCA2_CertificateRevoked = NO;
-                    if (strncmp(code, "023795", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsOEM_RootCA_CertificateRevoked = NO;
-                    if (strncmp(code, "023796", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMO_Prov_CertificateRevoked = NO;
-                    if (strncmp(code, "023797", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMO_SubCA1_CertificateRevoked = NO;
-                    if (strncmp(code, "023798", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMO_SubCA2_CertificateRevoked = NO;
-                    if (strncmp(code, "023799", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMO_RootCA_CertificateRevoked = NO;
-                    if (strncmp(code, "023800", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPS_Prov_CertificateRevoked = NO;
-                    if (strncmp(code, "023801", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPS_SubCA1_CertificateRevoked = NO;
-                    if (strncmp(code, "023802", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPS_SubCA2_CertificateRevoked = NO;
-                    if (strncmp(code, "023803", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPS_RootCA_CertificateRevoked = NO;
-                    if (strncmp(code, "023809", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EVSE_SLAC_init = NO;
-                    if (strncmp(code, "023810", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_match_response = NO;
-                    if (strncmp(code, "023811", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_match_sequence = NO;
-                    if (strncmp(code, "023812", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EVSE_match_MNBC = NO;
-                    if (strncmp(code, "023813", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_EVSE_avg_atten_calc = NO;
-                    if (strncmp(code, "023814", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_match_response = NO;
-                    if (strncmp(code, "023815", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_EVSE_match_session = NO;
-                    if (strncmp(code, "023816", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EVSE_assoc_session = NO;
-                    if (strncmp(code, "023817", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EVSE_vald_toggle = NO;
-                    if (strncmp(code, "023823", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsUDP_TT_match_join = NO;
-                    if (strncmp(code, "023824", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTCP_TT_match_join = NO;
-                    if (strncmp(code, "023825", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_amp_map_exchange = NO;
-                    if (strncmp(code, "023826", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_link_ready_notification = NO;
-                    if (strncmp(code, "023832", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSupportedAppProtocolRes = NO;
-                    if (strncmp(code, "023833", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSessionSetupRes = NO;
-                    if (strncmp(code, "023834", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsServiceDiscoveryRes = NO;
-                    if (strncmp(code, "023835", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsServicePaymentSelectionRes = NO;
-                    if (strncmp(code, "023836", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsContractAuthenticationRes = NO;
-                    if (strncmp(code, "023837", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChargeParameterDiscoveryRes = NO;
-                    if (strncmp(code, "023838", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsPowerDeliveryRes = NO;
-                    if (strncmp(code, "023839", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCableCheckRes = NO;
-                    if (strncmp(code, "023840", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsPreChargeRes = NO;
-                    if (strncmp(code, "023841", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCurrentDemandRes = NO;
-                    if (strncmp(code, "023842", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsWeldingDetectionRes = NO;
-                    if (strncmp(code, "023843", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSessionStopRes = NO;
-                    if (strncmp(code, "023844", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSequence_Time = NO;
-                    if (strncmp(code, "023845", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsReadyToCharge_Performance_Time = NO;
-                    if (strncmp(code, "023846", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCommunicationSetup_Performance_Time = NO;
-                    if (strncmp(code, "023847", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCableCheck_Performance_Time = NO;
-                    if (strncmp(code, "023848", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPState_Detection_Time = NO;
-                    if (strncmp(code, "023849", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPOscillator_Retain_Time = NO;
-                    if (strncmp(code, "023850", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutV2GPreChargePerformaceTime = NO;
-                    if (strncmp(code, "023855", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_GET_EV_TARGET_INFO = NO;
-                    if (strncmp(code, "023856", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_GET_EV_TARGET_INFO = NO;
-                    if (strncmp(code, "023857", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_GET_EV_BATTERY_INFO = NO;
-                    if (strncmp(code, "023858", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_GET_EV_BATTERY_INFO = NO;
-                    if (strncmp(code, "023859", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_EV_STOP_EVENT = NO;
-                    if (strncmp(code, "023860", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EV_STOP_EVENT = NO;
-                    if (strncmp(code, "023861", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_EVSE_STOP_EVENT = NO;
-                    if (strncmp(code, "023862", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EVSE_STOP_EVENT = NO;
-                    if (strncmp(code, "023863", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_GET_MISC_INFO = NO;
-                    if (strncmp(code, "023864", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_GET_MISC_INFO = NO;
-                    if (strncmp(code, "023865", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_DOWNLOAD_REQUEST = NO;
-                    if (strncmp(code, "023866", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_DOWNLOAD_REQUEST = NO;
-                    if (strncmp(code, "023867", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_START_BLOCK_TRANSFER = NO;
-                    if (strncmp(code, "023868", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_START_BLOCK_TRANSFER = NO;
-                    if (strncmp(code, "023869", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_DATA_TRANSFER = NO;
-                    if (strncmp(code, "023870", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_DATA_TRANSFER = NO;
-                    if (strncmp(code, "023871", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_DOWNLOAD_FINISH = NO;
-                    if (strncmp(code, "023872", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_DOWNLOAD_FINISH = NO;
-                    if (strncmp(code, "023873", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_ISOLATION_STATUS = NO;
-                    if (strncmp(code, "023874", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_ISOLATION_STATUS = NO;
-                    if (strncmp(code, "023875", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_CONNECTOR_INFO = NO;
-                    if (strncmp(code, "023876", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_CONNECTOR_INFO = NO;
-                    if (strncmp(code, "023877", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_RTC_INFO = NO;
-                    if (strncmp(code, "023878", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_RTC_INFO = NO;
-                    if (strncmp(code, "023879", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_EVSE_PRECHARGE_INFO = NO;
-                    if (strncmp(code, "023880", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EVSE_PRECHARGE_INFO = NO;
-                    if (strncmp(code, "023881", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMSG_Sequence = NO;
-                    if (strncmp(code, "023882", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCAN_MSG_Unrecognized_CMD_ID = NO;
-                    if (strncmp(code, "023883", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsDIN_Msg_Decode_Error = NO;
-                    if (strncmp(code, "023884", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsDIN_Msg_Encode_Error = NO;
-                    if (strncmp(code, "023885", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsISO1_Msg_Decode_Error = NO;
-                    if (strncmp(code, "023886", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsISO1_Msg_Encode_Error = NO;
-                    if (strncmp(code, "023887", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsISO2_Msg_Decode_Error = NO;
-                    if (strncmp(code, "023888", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsISO2_Msg_Encode_Error = NO;
-                    if (strncmp(code, "023889", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCpStatus_Error = NO;
-                    if (strncmp(code, "023890", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsUnexpectVolBeforeCharing_Error = NO;
-                    if (strncmp(code, "023891", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccNotReadyForCharging = NO;
-                    if (strncmp(code, "023892", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutQCA7000Comm = NO;
-                }
-            }
-        }
-    }
-}
-
-void AbnormalStopAnalysis(byte gun_index, byte *errCode)
+//接收can
+void CHROMACANReceiver()
 {
-    char string[7];
-    sprintf(string, "%d%d%d%d%d%d", *(errCode + 0), *(errCode + 1), *(errCode + 2), *(errCode + 3), *(errCode + 4), *(errCode + 5));
-
-    PRINTF_FUNC("NOTIFICATION_EV_STOP : Err Code = %s \n", string);
-    if (strncmp(string, "000000", 6) == EQUAL ||
-        strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "", 6) != EQUAL)
-        return;
-
-    memcpy(_chargingData[gun_index]->EvConnAlarmCode, string, 6);
-    printf("NOTIFICATION_EV_STOP : EvConnAlarmCode = %s \n", _chargingData[gun_index]->EvConnAlarmCode);
-
-    if (strcmp(string, "023700") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoEvCommFail = YES;
-    if (strcmp(string, "023704") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryMalfun = YES;
-    if (strcmp(string, "023705") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoNoPermission = YES;
-    if (strcmp(string, "023706") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryIncompatibility = YES;
-    if (strcmp(string, "023707") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryOVP = YES;
-    if (strcmp(string, "023708") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryUVP = YES;
-    if (strcmp(string, "023709") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryOTP = YES;
-    if (strcmp(string, "023710") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryCurrentDiff = YES;
-    if (strcmp(string, "023711") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryVoltageDiff = YES;
-    if (strcmp(string, "023712") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoShiftPosition = YES;
-    if (strcmp(string, "023713") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryOtherFault = YES;
-    if (strcmp(string, "023714") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargingSystemError = YES;
-    if (strcmp(string, "023715") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoEvNormalStop = YES;
-    if (strcmp(string, "023716") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoTempSensorBroken = YES;
-    if (strcmp(string, "023717") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoConnectorLockFail = YES;
-    if (strcmp(string, "023718") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoD1OnNoReceive = YES;
-    if (strcmp(string, "023719") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsKtoJTimeout = YES;
-    if (strcmp(string, "023720") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsChargeAllowTimeout = YES;
-    if (strcmp(string, "023721") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoWaitGfdTimeout = YES;
-    if (strcmp(string, "023722") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsEvRelayTimeout = YES;
-    if (strcmp(string, "023723") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsReqCurrentTimeout = YES;
-    if (strcmp(string, "023724") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsKtoJOffTimeout = YES;
-    if (strcmp(string, "023725") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsEvRelayOffTimeout = YES;
-    if (strcmp(string, "023726") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoAdcMoreThan10V = YES;
-    if (strcmp(string, "023727") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoAdcMoreThan20V = YES;
-    if (strcmp(string, "023728") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBmsChargeBeforeStop = YES;
-    if (strcmp(string, "023729") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargerGetNormalStop = YES;
-    if (strcmp(string, "023730") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargerGetEmergencyStop = YES;
-    if (strcmp(string, "023731") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoIsolationResultFail = YES;
-    if (strcmp(string, "023732") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoMissLinkWithMotherBoard = YES;
-    if (strcmp(string, "023733") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoOutputVolMoreThanLimit = YES;
-    if (strcmp(string, "023734") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoReqCurrentMoreThanLimit = YES;
-    if (strcmp(string, "023735") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoReCapBmsEqrCurrentExceed = YES;
-    if (strcmp(string, "023736") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargeRemainCountDown = YES;
-
-    if (strcmp(string, "023701") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEvCommFail = YES;
-    if (strcmp(string, "023737") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsRESTemperatureInhibit = YES;
-    if (strcmp(string, "023738") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEVShiftPosition = YES;
-    if (strcmp(string, "023739") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChargerConnectorLockFault = YES;
-    if (strcmp(string, "023740") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEVRESSMalfunction = YES;
-    if (strcmp(string, "023741") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChargingCurrentdifferential = YES;
-    if (strcmp(string, "023742") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChargingVoltageOutOfRange = YES;
-    if (strcmp(string, "023743") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChargingSystemIncompatibility = YES;
-    if (strcmp(string, "023744") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEmergencyEvent = YES;
-    if (strcmp(string, "023745") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsBreaker = YES;
-    if (strcmp(string, "023746") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsNoData = YES;
-    if (strcmp(string, "023747") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_DIN_A = YES;
-    if (strcmp(string, "023748") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_DIN_B = YES;
-    if (strcmp(string, "023749") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_DIN_C = YES;
-    if (strcmp(string, "023750") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_ISO_1 = YES;
-    if (strcmp(string, "023751") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_ISO_2 = YES;
-    if (strcmp(string, "023752") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_ISO_3 = YES;
-    if (strcmp(string, "023753") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_OEM_1 = YES;
-    if (strcmp(string, "023754") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_OEM_2 = YES;
-    if (strcmp(string, "023755") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_OEM_3 = YES;
-    if (strcmp(string, "023756") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_OEM_4 = YES;
-    if (strcmp(string, "023757") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.Ccsreserved_by_OEM_5 = YES;
-    if (strcmp(string, "023758") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSequenceError = YES;
-    if (strcmp(string, "023759") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSignatureError = YES;
-    if (strcmp(string, "023760") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsUnknownSession = YES;
-    if (strcmp(string, "023761") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsServiceIDInvalid = YES;
-    if (strcmp(string, "023762") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsPaymentSelectionInvalid = YES;
-    if (strcmp(string, "023763") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsIdentificationSelectionInvalid = YES;
-    if (strcmp(string, "023764") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsServiceSelectionInvalid = YES;
-    if (strcmp(string, "023765") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertificateExpired = YES;
-    if (strcmp(string, "023766") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertificateNotYetValid = YES;
-    if (strcmp(string, "023767") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertificateRevoked = YES;
-    if (strcmp(string, "023768") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsNoCertificateAvailable = YES;
-    if (strcmp(string, "023769") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertChainError = YES;
-    if (strcmp(string, "023770") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertValidationError = YES;
-    if (strcmp(string, "023771") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertVerificationError = YES;
-    if (strcmp(string, "023772") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsContractCanceled = YES;
-    if (strcmp(string, "023773") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChallengeInvalid = YES;
-    if (strcmp(string, "023774") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsWrongEnergyTransferMode = YES;
-    if (strcmp(string, "023775") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsWrongChargeParameter = YES;
-    if (strcmp(string, "023776") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChargingProfileInvalid = YES;
-    if (strcmp(string, "023777") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTariffSelectionInvalid = YES;
-    if (strcmp(string, "023778") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEVSEPresentVoltageToLow = YES;
-    if (strcmp(string, "023779") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsPowerDeliveryNotApplied = YES;
-    if (strcmp(string, "023780") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMeteringSignatureNotValid = YES;
-    if (strcmp(string, "023781") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsNoChargeServiceSelected = YES;
-    if (strcmp(string, "023782") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsContactorError = YES;
-    if (strcmp(string, "023783") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCertificateNotAllowedAtThisEVSE = YES;
-    if (strcmp(string, "023784") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsGAChargeStop = YES;
-    if (strcmp(string, "023785") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsAlignmentError = YES;
-    if (strcmp(string, "023786") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsACDError = YES;
-    if (strcmp(string, "023787") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsAssociationError = YES;
-    if (strcmp(string, "023788") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEVSEChargeAbort = YES;
-    if (strcmp(string, "023789") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsNoSupportedAppProtocol = YES;
-    if (strcmp(string, "023790") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsContractNotAccepted = YES;
-    if (strcmp(string, "023791") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMOUnknown = YES;
-    if (strcmp(string, "023792") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsOEM_Prov_CertificateRevoke = YES;
-    if (strcmp(string, "023793") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsOEM_SubCA1_CertificateRevoked = YES;
-    if (strcmp(string, "023794") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsOEM_SubCA2_CertificateRevoked = YES;
-    if (strcmp(string, "023795") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsOEM_RootCA_CertificateRevoked = YES;
-    if (strcmp(string, "023796") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMO_Prov_CertificateRevoked = YES;
-    if (strcmp(string, "023797") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMO_SubCA1_CertificateRevoked = YES;
-    if (strcmp(string, "023798") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMO_SubCA2_CertificateRevoked = YES;
-    if (strcmp(string, "023799") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMO_RootCA_CertificateRevoked = YES;
-    if (strcmp(string, "023800") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPS_Prov_CertificateRevoked = YES;
-    if (strcmp(string, "023801") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPS_SubCA1_CertificateRevoked = YES;
-    if (strcmp(string, "023802") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPS_SubCA2_CertificateRevoked = YES;
-    if (strcmp(string, "023803") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPS_RootCA_CertificateRevoked = YES;
-    if (strcmp(string, "023809") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EVSE_SLAC_init = YES;
-    if (strcmp(string, "023810") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_match_response = YES;
-    if (strcmp(string, "023811") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_match_sequence = YES;
-    if (strcmp(string, "023812") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EVSE_match_MNBC = YES;
-    if (strcmp(string, "023813") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_EVSE_avg_atten_calc = YES;
-    if (strcmp(string, "023814") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_match_response = YES;
-    if (strcmp(string, "023815") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_EVSE_match_session = YES;
-    if (strcmp(string, "023816") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EVSE_assoc_session = YES;
-    if (strcmp(string, "023817") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EVSE_vald_toggle = YES;
-    if (strcmp(string, "023823") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsUDP_TT_match_join = YES;
-    if (strcmp(string, "023824") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTCP_TT_match_join = YES;
-    if (strcmp(string, "023825") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_amp_map_exchange = YES;
-    if (strcmp(string, "023826") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_link_ready_notification = YES;
-    if (strcmp(string, "023832") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSupportedAppProtocolRes = YES;
-    if (strcmp(string, "023833") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSessionSetupRes = YES;
-    if (strcmp(string, "023834") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsServiceDiscoveryRes = YES;
-    if (strcmp(string, "023835") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsServicePaymentSelectionRes = YES;
-    if (strcmp(string, "023836") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsContractAuthenticationRes = YES;
-    if (strcmp(string, "023837") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsChargeParameterDiscoveryRes = YES;
-    if (strcmp(string, "023838") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsPowerDeliveryRes = YES;
-    if (strcmp(string, "023839") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCableCheckRes = YES;
-    if (strcmp(string, "023840") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsPreChargeRes = YES;
-    if (strcmp(string, "023841") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCurrentDemandRes = YES;
-    if (strcmp(string, "023842") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsWeldingDetectionRes = YES;
-    if (strcmp(string, "023843") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSessionStopRes = YES;
-    if (strcmp(string, "023844") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSequence_Time = YES;
-    if (strcmp(string, "023845") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsReadyToCharge_Performance_Time = YES;
-    if (strcmp(string, "023846") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCommunicationSetup_Performance_Time = YES;
-    if (strcmp(string, "023847") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCableCheck_Performance_Time = YES;
-    if (strcmp(string, "023848") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPState_Detection_Time = YES;
-    if (strcmp(string, "023849") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPOscillator_Retain_Time = YES;
-    if (strcmp(string, "023850") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutV2GPreChargePerformaceTime = YES;
-    if (strcmp(string, "023855") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_GET_EV_TARGET_INFO = YES;
-    if (strcmp(string, "023856") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_GET_EV_TARGET_INFO = YES;
-    if (strcmp(string, "023857") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_GET_EV_BATTERY_INFO = YES;
-    if (strcmp(string, "023858") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_GET_EV_BATTERY_INFO = YES;
-    if (strcmp(string, "023859") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_EV_STOP_EVENT = YES;
-    if (strcmp(string, "023860") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EV_STOP_EVENT = YES;
-    if (strcmp(string, "023861") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_EVSE_STOP_EVENT = YES;
-    if (strcmp(string, "023862") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EVSE_STOP_EVENT = YES;
-    if (strcmp(string, "023863") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_GET_MISC_INFO = YES;
-    if (strcmp(string, "023864") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_GET_MISC_INFO = YES;
-    if (strcmp(string, "023865") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_DOWNLOAD_REQUEST = YES;
-    if (strcmp(string, "023866") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_DOWNLOAD_REQUEST = YES;
-    if (strcmp(string, "023867") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_START_BLOCK_TRANSFER = YES;
-    if (strcmp(string, "023868") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_START_BLOCK_TRANSFER = YES;
-    if (strcmp(string, "023869") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_DATA_TRANSFER = YES;
-    if (strcmp(string, "023870") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_DATA_TRANSFER = YES;
-    if (strcmp(string, "023871") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_DOWNLOAD_FINISH = YES;
-    if (strcmp(string, "023872") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_DOWNLOAD_FINISH = YES;
-    if (strcmp(string, "023873") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_ISOLATION_STATUS = YES;
-    if (strcmp(string, "023874") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_ISOLATION_STATUS = YES;
-    if (strcmp(string, "023875") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_CONNECTOR_INFO = YES;
-    if (strcmp(string, "023876") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_CONNECTOR_INFO = YES;
-    if (strcmp(string, "023877") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_RTC_INFO = YES;
-    if (strcmp(string, "023878") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_RTC_INFO = YES;
-    if (strcmp(string, "023879") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_EVSE_PRECHARGE_INFO = YES;
-    if (strcmp(string, "023880") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_EVSE_PRECHARGE_INFO = YES;
-    if (strcmp(string, "023881") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsMSG_Sequence = YES;
-    if (strcmp(string, "023882") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCAN_MSG_Unrecognized_CMD_ID = YES;
-    if (strcmp(string, "023883") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsDIN_Msg_Decode_Error = YES;
-    if (strcmp(string, "023884") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsDIN_Msg_Encode_Error = YES;
-    if (strcmp(string, "023885") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsISO1_Msg_Decode_Error = YES;
-    if (strcmp(string, "023886") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsISO1_Msg_Encode_Error = YES;
-    if (strcmp(string, "023887") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsISO2_Msg_Decode_Error = YES;
-    if (strcmp(string, "023888") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsISO2_Msg_Encode_Error = YES;
-    if (strcmp(string, "023889") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCpStatus_Error = YES;
-    if (strcmp(string, "023890") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsUnexpectVolBeforeCharing_Error = YES;
-    if (strcmp(string, "023891") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccNotReadyForCharging = YES;
-    if (strcmp(string, "023892") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutQCA7000Comm = YES;
-
-    if (strcmp(string, "023702") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.GbEvCommFail = YES;
-    if (strcmp(string, "023900") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_LOS_CC1 = YES;
-    if (strcmp(string, "023901") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_CONNECTOR_LOCK_FAIL = YES;
-    if (strcmp(string, "023902") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_BATTERY_INCOMPATIBLE = YES;
-    if (strcmp(string, "023903") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_BMS_BROAA_TIMEOUT = YES;
-    if (strcmp(string, "023904") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_CSU_PRECHARGE_TIMEOUT = YES;
-    if (strcmp(string, "023905") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_BMS_PRESENT_VOLTAGE_FAULT = YES;
-    if (strcmp(string, "023906") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_BMS_VOLTAGE_OVER_RANGE = YES;
-    if (strcmp(string, "023907") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_BSM_CHARGE_ALLOW_00_10MIN_COUUNTDONE = YES;
-    if (strcmp(string, "023908") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_WAIT_GROUNDFAULT_TIMEOUT = YES;
-    if (strcmp(string, "023909") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_ADC_MORE_THAN_10V = YES;
-    if (strcmp(string, "023910") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_ADC_MORE_THAN_60V = YES;
-    if (strcmp(string, "023911") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_CHARGER_GET_NORMAL_STOP_CMD = YES;
-    if (strcmp(string, "023912") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_CHARGER_GET_EMERGENCY_STOP_CMD = YES;
-    if (strcmp(string, "023913") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_ISOLATION_RESULT_FAIL = YES;
-    if (strcmp(string, "023914") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_MOTHER_BOARD_MISS_LINK = YES;
-    if (strcmp(string, "023915") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_OUTPUT_VOLTAGE_MORE_THAN_LIMIT = YES;
-    if (strcmp(string, "023916") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_REQ_CURRENT_MORE_THAN_LIMIT = YES;
-    if (strcmp(string, "023917") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_OUTPUT_VOLTAGE_MORE_THAN_10_PERCENT = YES;
-    if (strcmp(string, "023918") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_OUTPUT_VOLTAGE_DIFF_BCS_5_PERCENT = YES;
-    if (strcmp(string, "023919") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_STOP_ADC_MORE_THAN_10V = YES;
-    if (strcmp(string, "023930") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BHM_TIMEOUT = YES;
-    if (strcmp(string, "023931") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BRM_TIMEOUT = YES;
-    if (strcmp(string, "023932") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BCP_TIMEOUT = YES;
-    if (strcmp(string, "023933") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BRO_TIMEOUT = YES;
-    if (strcmp(string, "023934") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BCL_TIMEOUT = YES;
-    if (strcmp(string, "023935") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BCS_TIMEOUT = YES;
-    if (strcmp(string, "023936") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BSM_TIMEOUT = YES;
-    if (strcmp(string, "023937") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BST_TIMEOUT = YES;
-    if (strcmp(string, "023938") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BSD_TIMEOUT = YES;
-    if (strcmp(string, "023939") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_CEM_BEM_OTHER_TIMEOUT = YES;
-    if (strcmp(string, "023940") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CRM_TIMEOUT = YES;
-    if (strcmp(string, "023941") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CRMAA_TIMEOUT = YES;
-    if (strcmp(string, "023942") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CTS_CML_TIMEOUT = YES;
-    if (strcmp(string, "023943") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CRO_TIMEOUT = YES;
-    if (strcmp(string, "023944") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CCS_TIMEOUT = YES;
-    if (strcmp(string, "023945") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CST_TIMEOUT = YES;
-    if (strcmp(string, "023946") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_CSD_TIMEOUT = YES;
-    if (strcmp(string, "023947") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BEM_BEM_OTHER_TIMEOUT = YES;
-    if (strcmp(string, "023950") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_SOC_GOAL = YES;
-    if (strcmp(string, "023951") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_TOTAL_VOLTAGE_GOAL = YES;
-    if (strcmp(string, "023952") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_CELL_VOLTAGE_GOAL = YES;
-    if (strcmp(string, "023953") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_GET_CST = YES;
-    if (strcmp(string, "023954") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_ISOLATION = YES;
-    if (strcmp(string, "023955") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_OUTPUT_CONNECTOR_OTP = YES;
-    if (strcmp(string, "023956") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_COMPONENT = YES;
-    if (strcmp(string, "023957") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_CHARGE_CONNECTOR = YES;
-    if (strcmp(string, "023958") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_OTP = YES;
-    if (strcmp(string, "023959") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_OTHER = YES;
-    if (strcmp(string, "023960") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_HIGH_V = YES;
-    if (strcmp(string, "023961") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_CC2 = YES;
-    if (strcmp(string, "023962") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_CURRENT = YES;
-    if (strcmp(string, "023963") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BST_VOLTAGE = YES;
-    if (strcmp(string, "023964") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GET_BST_NO_REASON = YES;
-    if (strcmp(string, "023970") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_CELL_OVER_VOLTAGE = YES;
-    if (strcmp(string, "023971") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_CELL_UNDER_VOLTAGE = YES;
-    if (strcmp(string, "023972") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_OVER_SOC = YES;
-    if (strcmp(string, "023973") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_UNDER_SOC = YES;
-    if (strcmp(string, "023974") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_CURRENT = YES;
-    if (strcmp(string, "023975") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_TEMPERATURE = YES;
-    if (strcmp(string, "023976") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_ISOLATE = YES;
-    if (strcmp(string, "023977") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_OUTPUT_CONNECTOR = YES;
+	pid_t canRecPid;
+	canRecPid = fork();
+	if(canRecPid > 0){
+		int nbytes;
+		struct can_frame frame;
+		int intCmd;
+		while (1){
+			//清空 canbus recever buf
+			memset(&frame, 0, sizeof(struct can_frame));
+			//讀取 canbus 是否有接收到封包
+			nbytes = read(CanFd2, &frame, sizeof(struct can_frame));
+			//如果有收到 canbus 封包
+			if (nbytes > 0){
+				intCmd = (int) (frame.can_id & CAN_EFF_MASK);//extended frame format
+						#ifdef Debug
+							//printf("hsout0StatusChange Get-INFYPWR-Msg : %08x - %02x %02x %02x %02x %02x %02x %02x %02x\n ", intCmd, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
+							//printf(" Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
+						#endif
+				//printf("hsout0StatusChange Get-INFYPWR-Msg : %08x - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
+				//printf("Ack none defined. intCmd = %08x  \n", intCmd);
+				switch (intCmd){
+					case bn_res1:{
+						/*
+						ShmSysConfigAndInfo->ate.ATEState = (short) frame.data[0];
+						setATEMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.ATEState);
+						printf("00010102 Get-Msg : %d %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", ShmSysConfigAndInfo->ate.ATEState, frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
+						*/
+
+						break;
+					}
+					case bn_res2:{
+						//printf(" Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7] );
+						break;
+					}
+					case ATE_Connector2:{
+
+						/*
+						ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetVoltage =  ((short) frame.data[1] << 8) + (short) frame.data[0];//
+						ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetCurrent =  ((short) frame.data[3] << 8) + (short) frame.data[2];//
+						ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentVoltage  = ((short) frame.data[5] << 8) + (short) frame.data[4];
+						ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentCurrent = ((short) frame.data[7] << 8) + (short) frame.data[6];
+						//ShmSysConfigAndInfo->ate.linkVoltage = ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentVoltage;
+						ShmSysConfigAndInfo->ate.targetVoltage_Value = ((short) frame.data[1] << 8) + (short) frame.data[0];
+						ShmSysConfigAndInfo->ate.targetCurrent_Value = ((short) frame.data[3] << 8) + (short) frame.data[2];
+						//ShmSysConfigAndInfo->ate.maximumVoltage_value = ShmSysConfigAndInfo->ate.targetVoltage_Value+(ShmSysConfigAndInfo->ate.targetVoltage_Value*0.1);
+						ShmSysConfigAndInfo->ate.maximumVoltage_value = ShmSysConfigAndInfo->ate.targetVoltage_Value+10;
+						ShmSysConfigAndInfo->ate.linkVoltage = ShmSysConfigAndInfo->ate.targetVoltage_Value;
+						*/
+						//printf("targetVoltage_Value= %d targetCurrent_Value =%d maximumVoltage_value = %d linkVoltage = %d \n",ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.targetCurrent_Value, ShmSysConfigAndInfo->ate.maximumVoltage_value, ShmSysConfigAndInfo->ate.linkVoltage);
+						//printf("ATE_Connector2 Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x %d %d %d %d %d %d  \n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7], ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetVoltage, ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetCurrent, ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentVoltage, ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentCurrent, ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.targetCurrent_Value);
+						break;
+					}
+					case ATE_Connector1:{
+
+						if(ShmSysConfigAndInfo->ate.ATEState == 1){//ccs
+							ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetVoltage =  ((short) frame.data[1] << 8) + (short) frame.data[0];//
+							ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetCurrent =  ((short) frame.data[3] << 8) + (short) frame.data[2];//
+							ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentVoltage  = ((short) frame.data[5] << 8) + (short) frame.data[4];
+							ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentCurrent = ((short) frame.data[7] << 8) + (short) frame.data[6];
+							//ShmSysConfigAndInfo->ate.linkVoltage = ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentVoltage;
+							//ShmSysConfigAndInfo->ate.targetVoltage_Value = ((short) frame.data[1] << 8) + (short) frame.data[0];
+							int voltage = ((short) frame.data[1] << 8) + (short) frame.data[0];
+							int evseMaxCurrent = ShmSysConfigAndInfo->ate.vccu.v2g_EVSEMaximumCurrentLim.VCCU_V2G_EVSEMaximumCurre_0000 / 10;
+							//int evseMaxvoltage = ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va / 10;
+							ShmSysConfigAndInfo->ate.targetCurrent_Value = ((short) frame.data[3] << 8) + (short) frame.data[2];
+							//ShmSysConfigAndInfo->ate.maximumVoltage_value = ShmSysConfigAndInfo->ate.targetVoltage_Value+(ShmSysConfigAndInfo->ate.targetVoltage_Value*0.1);
+							//ShmSysConfigAndInfo->ate.maximumVoltage_value = ShmSysConfigAndInfo->ate.targetVoltage_Value+10;
+							//ShmSysConfigAndInfo->ate.maximumVoltage_value = 0;
+							//ShmSysConfigAndInfo->ate.targetVoltage_Value = 0;
+
+
+							if(voltage > (maxValue - 10)){
+								ShmSysConfigAndInfo->ate.maximumVoltage_value = maxValue;
+								ShmSysConfigAndInfo->ate.targetVoltage_Value = maxValue - 20;
+								ShmSysConfigAndInfo->ate.linkVoltage = maxValue - 20;
+							}else{
+								ShmSysConfigAndInfo->ate.maximumVoltage_value = voltage + 10;
+								ShmSysConfigAndInfo->ate.targetVoltage_Value = voltage - 10;
+								ShmSysConfigAndInfo->ate.linkVoltage = voltage - 10;
+							}
+
+							if((ShmSysConfigAndInfo->ate.targetCurrent_Value > evseMaxCurrent)  && (evseMaxCurrent > 0)){
+								ShmSysConfigAndInfo->ate.targetCurrent_Value = evseMaxCurrent;
+							}
+						}else if (ShmSysConfigAndInfo->ate.ATEState == 2){//gb
+							ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetVoltage =  ((short) frame.data[1] << 8) + (short) frame.data[0];//
+							ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetCurrent =  ((short) frame.data[3] << 8) + (short) frame.data[2];//
+							ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentVoltage  = ((short) frame.data[5] << 8) + (short) frame.data[4];
+							ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentCurrent = ((short) frame.data[7] << 8) + (short) frame.data[6];
+							int voltage = ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetVoltage * 10;
+							int current = ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetCurrent * 10;
+
+							if(voltage > (gbmaxValue - 100)){
+								//ShmSysConfigAndInfo->ate.targetVoltage_Value = maxValue - 100;
+								ShmSysConfigAndInfo->ate.chademoTargetVoltage_Value = gbmaxValue - 100;
+								ShmSysConfigAndInfo->ate.RequireVoltage = gbmaxValue -100;
+								ShmSysConfigAndInfo->ate.MaxBatteryVoltage = gbmaxValue;
+
+							}else{
+								ShmSysConfigAndInfo->ate.chademoTargetVoltage_Value = voltage;
+								ShmSysConfigAndInfo->ate.RequireVoltage = voltage;
+								ShmSysConfigAndInfo->ate.MaxBatteryVoltage = gbmaxValue;
+							}
+							//ShmSysConfigAndInfo->ate.targetVoltage_Value = voltage;
+							ShmSysConfigAndInfo->ate.chademoTargetCurrent_Value = current;
+							ShmSysConfigAndInfo->ate.RequireCurrent = current;
+							//printf("voltage= %d cstatus = %d current= %d voltage =%d %02x %02x \n", ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.chademo.id03.state , current, voltage, frame.data[1], frame.data[0]);
+
+
+						}else if (ShmSysConfigAndInfo->ate.ATEState == 3){//chademo
+
+						}
+						//printf("targetVoltage_Value= %d targetCurrent_Value =%d maximumVoltage_value = %d linkVoltage = %d \n",ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.targetCurrent_Value, ShmSysConfigAndInfo->ate.maximumVoltage_value, ShmSysConfigAndInfo->ate.linkVoltage);
+						//printf("ATE_Connector1 Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x %d %d %d %d %d %d  \n ", frame.can_id, frame.data[0], frame.data[1], frame.data[2], frame.data[3],frame.data[4], frame.data[5], frame.data[6], frame.data[7], ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetVoltage, ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetCurrent, ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentVoltage, ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentCurrent, ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.targetCurrent_Value );
+						break;
+					}
+
+					default:
+
+					break;
+				}
+			}
+			usleep(2000);
+			//usleep(100000);
+		}
+	}
 }
 
-void CANReceiver()
+int DiffTimeb(struct timeb ST, struct timeb ET)
 {
-    pid_t canRecPid;
+	//return milli-second
+	unsigned int StartTime,StopTime;
 
-    canRecPid = fork();
-
-    if(canRecPid > 0)
-    {
-        int nbytes;
-        struct can_frame frame;
-        int intCmd;
-
-        // 槍資訊
-        struct ChargingInfoData *_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
-        struct timeval _cmd_ack_timeout[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
-
-        bool isPass = false;
-        gun_count = ShmSysConfigAndInfo->SysConfig.TotalConnectorCount;
-
-        while(!isPass)
-        {
-            isPass = true;
-            for (byte _index = 0; _index < gun_count; _index++)
-            {
-                if (!FindChargingInfoData(_index, &_chargingData[0]))
-                {
-                    DEBUG_ERROR("EvComm (main) : FindChargingInfoData false \n");
-                    isPass = false;
-                    break;
-                }
-            }
-        }
-
-        for (byte _index = 0; _index < gun_count; _index++)
-            gettimeofday(&_cmd_ack_timeout[_index], NULL);
-
-        while (1)
-        {
-            memset(&frame, 0, sizeof(struct can_frame));
-            nbytes = read(CanFd, &frame, sizeof(struct can_frame));
-
-            for (byte _index = 0; _index < gun_count; _index++)
-            {
-                if (GetTimeoutValue(_cmd_ack_timeout[_index]) >= 5000000)
-                {
-                    // ACK timeout
-                    //PRINTF_FUNC("gun = %x, ack timeout \n", _index);
-                }
-            }
-
-            if (nbytes > 0)
-            {
-                byte target;
-                byte targetGun = 0x00;
-                intCmd = (int) (frame.can_id & CAN_EFF_MASK);
-
-                if (intCmd == ADDRESS_REQ)
-                {
-                    AddrAssignment(frame.data);
-                    continue;
-                }
-
-                intCmd = (int) (frame.can_id & CAN_EFF_MASK & 0xFFFFFF00);
-                target = ((byte) (frame.can_id & 0x000000FF));      // 0x01 or 0x02
-
-                for (byte _index = 0; _index < gun_count; _index++)
-                {
-                    if (_chargingData[_index]->Evboard_id == target)
-                    {
-                        targetGun = _index;
-                        break;
-                    }
-                }
-
-                if(targetGun < 0 || targetGun >= CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)
-                {
-                    PRINTF_FUNC("EvComm (CANReceiver) : Target index = %x is < 0 or > QUANTITY \n", targetGun);
-                    continue;
-                }
-                if(intCmd == 256)
-                {
-                    continue;
-                }
-
-                gettimeofday(&_cmd_ack_timeout[targetGun], NULL);
-                switch (intCmd)
-                {
-                    case NOTIFICATION_EV_STATUS:
-                    {
-                        if (_chargingData[targetGun]->ConnectorPlugIn != frame.data[0])
-                            PRINTF_FUNC("index = %d, ConnectorPlugIn = %x, data[0] = %x \n", targetGun, _chargingData[targetGun]->ConnectorPlugIn, frame.data[0]);
-
-                        _chargingData[targetGun]->ConnectorPlugIn = frame.data[0];
-                        _chargingData[targetGun]->PilotVoltage = frame.data[1];
-
-                        //PRINTF_FUNC("index = %d, ConnectorPlugIn = %x, data[0] = %x \n", targetGun, _chargingData[targetGun]->ConnectorPlugIn, frame.data[0]);
-                        //PRINTF_FUNC("ConnectorPlugIn = %x \n", (-120 + frame.data[1]) / 10);
-                    }
-                        break;
-                    case ACK_EV_FW_VERSION:
-                    {
-                        byte ver[16];
-
-                        memset(ver, 0, sizeof(ver));
-                        if (_chargingData[targetGun]->Type == _Type_Chademo)
-                        {
-                            memcpy(ver, frame.data, frame.can_dlc);
-                            memcpy(ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].version, ver, ARRAY_SIZE(ver));
-                            ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
-                            PRINTF_FUNC("chademo ver. : %s\n", ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].version);
-                        }
-                        else if (_chargingData[targetGun]->Type == _Type_GB)
-                        {
-                            memcpy(ver, frame.data, frame.can_dlc);
-                            memcpy(ShmGBTData->evse[_chargingData[targetGun]->type_index].version, ver, ARRAY_SIZE(ver));
-                            ShmGBTData->evse[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
-                            PRINTF_FUNC("gbt ver. : %s\n", ShmGBTData->evse[_chargingData[targetGun]->type_index].version);
-                        }
-                        else if (_chargingData[targetGun]->Type == _Type_CCS_2)
-                        {
-                            if (ShmCcsData->CommProtocol == 0x01)
-                            {
-                                for (byte _vCount = 0, _vPoint = 0; _vCount < frame.can_dlc; _vCount++)
-                                {
-                                    if (_vCount % 2 == 0 && _vCount != 0)
-                                    {
-                                        ver[_vCount + _vPoint] = 0x2E;
-                                        _vPoint++;
-                                    }
-
-                                    ver[_vCount + _vPoint] = frame.data[_vCount];
-                                }
-
-                                memcpy(&ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].version, ver, ARRAY_SIZE(ver));
-                                ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
-                                PRINTF_FUNC("CCS FW = %s \n", ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].version);
-                            }
-                        }
-
-                        if (targetGun == 0)
-                        {
-                            memset(ShmSysConfigAndInfo->SysInfo.Connector1FwRev, 0, sizeof(ShmSysConfigAndInfo->SysInfo.Connector1FwRev));
-                            memcpy(ShmSysConfigAndInfo->SysInfo.Connector1FwRev, ver, ARRAY_SIZE(ver));
-                        }
-                        else
-                        {
-                            memset(ShmSysConfigAndInfo->SysInfo.Connector2FwRev, 0, sizeof(ShmSysConfigAndInfo->SysInfo.Connector2FwRev));
-                            memcpy(ShmSysConfigAndInfo->SysInfo.Connector2FwRev, ver, ARRAY_SIZE(ver));
-                        }
-                    }
-                        break;
-                    case ACK_EV_HW_VERSION:
-                    {
-                        //PRINTF_FUNC("Get EV HW = %s \n", frame.data);
-                    }
-                        break;
-                    case ACK_GET_OUTPUT_REQ:
-                    {
-                        _chargingData[targetGun]->EvBatterySoc = frame.data[1];
-                        _chargingData[targetGun]->EvBatterytargetVoltage = (((short) frame.data[3] << 8) + (short) frame.data[2]) / 10;
-                        _chargingData[targetGun]->EvBatterytargetCurrent = (((short) frame.data[5] << 8) + (short) frame.data[4]) / 10;
-                        _chargingData[targetGun]->RemainChargingDuration = ((short) frame.data[7] << 8) + (short) frame.data[6];
-
-                        if (_chargingData[targetGun]->Type == _Type_Chademo)
-                        {
-                            ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].PresentMsgFlowStatus = frame.data[0];
-                            ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].EvDetection = frame.data[0];
-                            ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].SOC = _chargingData[targetGun]->EvBatterySoc;
-                            ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].TargetBatteryVoltage = (_chargingData[targetGun]->EvBatterytargetVoltage * 10);
-                            ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].ChargingCurrentRequest = (_chargingData[targetGun]->EvBatterytargetCurrent * 10);
-                        }
-                        else if (_chargingData[targetGun]->Type == _Type_GB)
-                        {
-                            ShmGBTData->ev[_chargingData[targetGun]->type_index].PresentMsgFlowStatus = frame.data[0];
-                            ShmGBTData->ev[_chargingData[targetGun]->type_index].EvDetection = frame.data[0];
-                            ShmGBTData->ev[_chargingData[targetGun]->type_index].SOC = _chargingData[targetGun]->EvBatterySoc;
-                            ShmGBTData->ev[_chargingData[targetGun]->type_index].TargetBatteryVoltage = (_chargingData[targetGun]->EvBatterytargetVoltage * 10);
-                            ShmGBTData->ev[_chargingData[targetGun]->type_index].ChargingCurrentRequest = (_chargingData[targetGun]->EvBatterytargetCurrent * 10);
-                        }
-                        else if (_chargingData[targetGun]->Type == _Type_CCS_2)
-                        {
-                            if(ShmCcsData->CommProtocol == 0x01)
-                            {
-                                ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].PresentMsgFlowStatus = frame.data[0];
-                            }
-                        }
-
-                        //PRINTF_FUNC("EvBatterytargetVoltage = %f \n", _chargingData[targetGun]->EvBatterytargetVoltage);
-                        //PRINTF_FUNC("EvBatterytargetCurrent = %f \n", _chargingData[targetGun]->EvBatterytargetCurrent);
-                        //PRINTF_FUNC("BatteryVoltage = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].TargetBatteryVoltage);
-                        //PRINTF_FUNC("CurrentRequest = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].ChargingCurrentRequest);
-                    }
-                        break;
-                    case ACK_GET_EV_BATTERY_INFO:
-                    {
-                        //_chargingData[target].EvACorDCcharging = frame.data[0];
-                        //_chargingData[target]->TotalBatteryCap = ((float) frame.data[4] << 8) + (short) frame.data[3];
-                        _chargingData[targetGun]->EvBatteryMaxVoltage = (((short) frame.data[4] << 8) + (short) frame.data[3]) / 10;
-                        //_chargingData[target]->EvBatteryMaxCurrent = ((float) frame.data[4] << 8) + (short) frame.data[3];
-                        //_chargingData[target].MaxiBatteryCurrent = ((short) frame.data[6] << 8) + (short) frame.data[5];
-                        if (_chargingData[targetGun]->Type == _Type_Chademo)
-                        {
-                            ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].TotalBatteryCapacity = ((short) frame.data[2] << 8) + (short) frame.data[1];
-                            ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].MaxiBatteryVoltage = _chargingData[targetGun]->EvBatteryMaxVoltage;
-
-                            //PRINTF_FUNC("EvBatteryMaxVoltage = %f \n", _chargingData[target]->EvBatteryMaxVoltage);
-                            //PRINTF_FUNC("TotalBatteryCapacity = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].TotalBatteryCapacity);
-                            //PRINTF_FUNC("MaxiBatteryVoltage = %d \n", ShmCHAdeMOData->ev[_chargingData[target]->type_index].MaxiBatteryVoltage);
-                        }
-                        else if (_chargingData[targetGun]->Type == _Type_GB)
-                        {
-                            ShmGBTData->ev[_chargingData[targetGun]->type_index].TotalBatteryCapacity = ((short) frame.data[2] << 8) + (short) frame.data[1];
-                            ShmGBTData->ev[_chargingData[targetGun]->type_index].MaxiBatteryVoltage = _chargingData[targetGun]->EvBatteryMaxVoltage;
-                        }
-                        else if (_chargingData[targetGun]->Type == _Type_CCS_2)
-                        {
-
-                        }
-                    }
-                        break;
-                    case ACK_GET_MISCELLANEOUS_INFO:
-                    {
-                        _chargingData[targetGun]->GunLocked = frame.data[0];
-                        _chargingData[targetGun]->PilotVoltage = (float)(-120 + frame.data[3]) / 10;
-
-                        if (_chargingData[targetGun]->Type == _Type_Chademo)
-                        {
-                            ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureP = frame.data[1];
-                            ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureN = frame.data[2];
-                            ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].EvboardStatus = frame.data[7];
-                        }
-                        else if (_chargingData[targetGun]->Type == _Type_GB)
-                        {
-                            ShmGBTData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureP = frame.data[1];
-                            ShmGBTData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureN = frame.data[2];
-                            ShmGBTData->evse[_chargingData[targetGun]->type_index].EvboardStatus = frame.data[7];
-                        }
-                        else if (_chargingData[targetGun]->Type == _Type_CCS_2)
-                        {
-                            if (ShmCcsData->CommProtocol == 0x01)
-                            {
-                                //ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index]. .ConnectorTemperatureP = frame.data[1];
-                                //ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index]. .ConnectorTemperatureN = frame.data[2];
-                            }
-                        }
-
-                        //PRINTF_FUNC("EvboardStatus = %x \n", ShmCHAdeMOData->evse[_chargingData[target]->type_index].EvboardStatus);
-                        //PRINTF_FUNC("ConnectorPlug locked = %x \n", frame.data[0]);
-                        //PRINTF_FUNC("ConnectorTemp 0= %d \n", ShmCHAdeMOData->evse[_chargingData[target]->type_index].ConnectorTemperatureP);
-                        //PRINTF_FUNC("ConnectorTemp 1= %d \n", ShmCHAdeMOData->evse[_chargingData[target]->type_index].ConnectorTemperatureN);
-                        //PRINTF_FUNC("PilotVoltage = %x \n", (-120 + frame.data[3]) / 10);
-                    }
-                        break;
-                    case ACK_EVSE_ISOLATION_STATUS: {}
-                        break;
-                    case ACK_EVSE_PRECHAGE_INFO:
-                    {
-                        _chargingData[targetGun]->PrechargeStatus = frame.data[0];
-                    }
-                        break;
-                    case NOTIFICATION_EV_STOP:
-                    {
-                        // 車端要求停止
-                        // frame.data[0] : 0x01 => normal stop, 0x02 => ev emergency stop
-                        PRINTF_FUNC("(%d) NOTIFICATION_EV_STOP err level = %d-----------------------------\n", targetGun, frame.data[0]);
-
-                        AbnormalStopAnalysis(targetGun, frame.data + 1);
-                        _chargingData[targetGun]->StopChargeFlag = YES;
-                    }
-                        break;
-                    default:
-                        PRINTF_FUNC("EV board = %d, Ack none defined. intCmd = %d  \n", targetGun, intCmd);
-                        break;
-                }
-            }
-            usleep(10000);
-        }
-    }
+	StartTime=(unsigned int)ST.time;
+	StopTime=(unsigned int)ET.time;
+	//return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
+	return (StopTime-StartTime);
 }
 
-//================================================
-// Main process
-//================================================
-// 檢查 Byte 中某個 Bit 的值
-// _byte : 欲改變的 byte
-// _bit : 該 byte 的第幾個 bit
-unsigned char EvDetectionStatus(unsigned char _byte, unsigned char _bit)
+unsigned short MaxValue(unsigned short value1, unsigned short value2)
 {
-    return ( _byte & mask_table[_bit] ) != 0x00;
+	return value1 >= value2 ? value1 : value2;
 }
 
-bool IsConnectorPlugIn(struct ChargingInfoData *chargingData)
+void Initialization()
 {
-    return (chargingData->ConnectorPlugIn == 0x01) ? true : false;
+    _chargingData[CCS_QUANTITY] = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[CCS_QUANTITY];
 }
 
-void SetPresentChargingOutputPower(struct ChargingInfoData *chargingData_1, struct ChargingInfoData *chargingData_2)
-{
-    float vol1 = 0, cur1 = 0;
-    float vol2 = 0, cur2 = 0;
-
-    vol1 = chargingData_1->FireChargingVoltage;
-    cur1 = (chargingData_1->PresentChargingCurrent * 10);
-
-    vol2 = chargingData_2->FireChargingVoltage;
-    cur2 = (chargingData_2->PresentChargingCurrent * 10);
-
-    if (_outVol_1 != vol1 ||
-        _outCur_1 != cur1 ||
-        _outVol_2 != vol2 ||
-        _outCur_2 != cur2)
-    {
-        PRINTF_FUNC("G1 -> Output Vol = %f, Output Cur = %f -- G2 -> Output Vol = %f, Output Cur = %f \n",
-                    vol1, cur1, vol2, cur2);
-
-        _outVol_1 = vol1; _outCur_1 = cur1; _outVol_2 = vol2; _outCur_2 = cur2;
-    }
-
-    SetPresentOutputPower(vol1, cur1, vol2, cur2);
+void VCCU_Requests(int LED0, int LED1, int LED2,
+		int HighSideOut0, int HighSideOut1, int HighSideOut2, int HighSideOut3,
+		int HighSideOut4, int RTC_TimerRequest, int PlugLock,
+		int RTC_TimerValue,
+		int ControlPilot, int ChargeUnit, int Inlet){
+	struct VCCU_Requests obj;
+	obj.VCCU_LED0_Request = LED0;//0.0
+	obj.VCCU_LED1_Request = LED1;//0.0
+	obj.VCCU_LED2_Request = LED2;//0.0
+	obj.byte3.VCCU_HighSideOut0_Request = HighSideOut0;//3
+	obj.byte3.VCCU_HighSideOut1_Request = HighSideOut1;//3
+	obj.byte3.VCCU_HighSideOut2_Request = HighSideOut2;//3
+	obj.byte3.VCCU_HighSideOut3_Request = HighSideOut3;//3
+	obj.byte4.VCCU_HighSideOut4_Request = HighSideOut4;//3
+	obj.byte4.VCCU_RTC_TimerRequest = RTC_TimerRequest;//3
+	obj.byte4.VCCU_PlugLock_MotorRequest = PlugLock;//7
+	obj.VCCU_RTC_TimerValue= RTC_TimerValue;//0
+	obj.byte6.VCCU_ControlPilot_ChargeModeRe = ControlPilot;//7
+	obj.byte6.VCCU_ChargeUnit_Request = ChargeUnit;//3
+	obj.byte6.VCCU_Inlet_MotorRequest = Inlet;//3
+
+
+	byte data[7];
+	data[0] = *((UBYTE *) &obj.VCCU_LED0_Request);
+	data[1] = *((UBYTE *) &obj.VCCU_LED1_Request);
+	data[2] = *((UBYTE *) &obj.VCCU_LED2_Request);
+	data[3] = *((UBYTE *) &obj.byte3);
+	data[4] = *((UBYTE *) &obj.byte4);
+	data[5] = *((UBYTE *) &obj.VCCU_RTC_TimerValue);
+	data[6] = *((UBYTE *) &obj.byte6);
+	//printf("%02x %02x %02x %02x %02x %02x %02x  \n", data[0], data[1], data[2], data[3], data[4], data[5] , data[6]);
+	setVCCU_Requests(data, sizeof(data));
 }
 
-void SetPresentChargingOutputCap(struct ChargingInfoData *chargingData_1, struct ChargingInfoData *chargingData_2)
-{
-    float pow1 = 0, cur1 = 0;
-    float pow2 = 0, cur2 = 0;
-    float vol = 0;
-
-    pow1 = chargingData_1->AvailableChargingPower;
-    cur1 = chargingData_1->AvailableChargingCurrent;
-
-    vol = chargingData_1->MaximumChargingVoltage;
-    GetMaxVolAndCurMethod(chargingData_1->Index, &vol, &cur1);
-    GetMaxPowerMethod(chargingData_1->Index, &pow1);
-
-    pow2 = chargingData_2->AvailableChargingPower;
-    cur2 = chargingData_2->AvailableChargingCurrent;
-    vol = chargingData_2->MaximumChargingVoltage;
-
-    GetMaxVolAndCurMethod(chargingData_2->Index, &vol, &cur2);
-    GetMaxPowerMethod(chargingData_2->Index, &pow2);
-
-    if (_pow_1 != pow1 ||
-        _cur_1 != cur1 ||
-        _pow_2 != pow2 ||
-        _cur_2 != cur2)
-    {
-        PRINTF_FUNC("To EV (Real) Power_1 = %f, Cur_1 = %f, Power_2 = %f, Cur_2 = %f \n",
-                    pow1, cur1, pow2, cur2);
-        _pow_1 = pow1; _cur_1 = cur1; _pow_2 = pow2; _cur_2 = cur2;
-        chargingData_1->RealMaxCurrent = _cur_1;
-        chargingData_1->RealMaxPower = pow1;
-
-        if (gun_count == 2)
-        {
-            chargingData_2->RealMaxCurrent = cur2;
-            chargingData_2->RealMaxPower = pow2;
-        }
-    }
 
-    SetPresentOutputCapacity(pow1, cur1, pow2, cur2);
+void VCCU_ChargeFromVehicle(int canfd, int linkVoltage, int contactorVoltage,
+		int chargePermission, int isolationMeasurem,
+		int plugLockPermissio, int plugUnlockPermiss, int contactorStatus){
+
+	struct VCCU_ChargeFromVehicle obj;
+	obj.VCCU_Vehicle_LinkVoltage= linkVoltage;//500
+	obj.VCCU_Vehicle_ContactorVoltage = contactorVoltage;//0
+	obj.DATA.bits.VCCU_Vehicle_ChargePermission = chargePermission;//Not_allowed
+	obj.DATA.bits.VCCU_Vehicle_IsolationMeasurem = isolationMeasurem;//Active
+	obj.DATA.bits.VCCU_Vehicle_PlugLockPermissio = plugLockPermissio;//Allowed//Not_allowed;
+	obj.DATA.bits.VCCU_Vehicle_PlugUnlockPermiss = plugUnlockPermiss;//Not_allowed
+	obj.bits.VCCU_Vehicle_ContactorStatus = contactorStatus;//Open
+	obj.bits.VCCU_Vehicle_StopCharge = 3;//Open
+	obj.bits.VCCU_Vehicle_ChargeSelection = 3;//Open
+	byte* data1;
+	data1 = (byte*) &(*((UWORD *) &obj.VCCU_Vehicle_ContactorVoltage));
+	byte* data2;
+	data2 = (byte*) &(*((UWORD *) &obj.VCCU_Vehicle_LinkVoltage));
+	byte data[6];
+	data[0] = data1[0];
+	data[1] = data1[1];
+	data[2] = data2[0];
+	data[3] = data2[1];
+	data[4] = *((UBYTE *) &obj.DATA);
+	data[5] = *((UBYTE *) &obj.bits);
+	setVCCU_ChargeFromVehicle(data, sizeof(data));
 }
 
-void Initialization()
-{
-    bool isPass = false;
-    while(!isPass)
-    {
-        isPass = true;
-        for (byte _index = 0; _index < gun_count; _index++)
-        {
-            if (!FindChargingInfoData(_index, &_chargingData[0]))
-            {
-                DEBUG_ERROR("EvComm (main) : FindChargingInfoData false \n");
-                isPass = false;
-                break;
-            }
-        }
-    }
+void VCVCCU_V2G_RemainingTimeToFullSO(int remainingTime){
+	struct VCCU_V2G_RemainingTimeToFullSO obj;
+	obj.VCCU_V2G_RemainingTimeToB_0000.value = remainingTime;
+	obj.DATA.VCCU_V2G_RemainingTimeToFullSO = 1;
+	obj.DATA.VCCU_V2G_RemainingTimeToF_0002 = 0;//520
+	obj.VCCU_V2G_RemainingTimeToB_0001.value = 0;//1
+	obj.VCCU_V2G_RemainingTimeToB_0003.value = 0;//0
+	byte* data1;
+	data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_RemainingTimeToB_0000));
+	byte data[5];
+	data[0] = data1[0];
+	data[1] = data1[1];
+	data[2] = *((UBYTE *) &obj.VCCU_V2G_RemainingTimeToB_0003);
+	data[3] = *((UBYTE *) &obj.VCCU_V2G_RemainingTimeToB_0001);
+	data[4] = *((UBYTE *) &obj.DATA);
+	setVCCU_V2G_RemainingTimeToFullSO(data, sizeof(data));
 }
 
-void GetMaxVolAndCurMethod(byte index, float *vol, float *cur)
-{
-    if (maxChargingVol[index] != 0 && maxChargingVol[index] <= *vol)
-        *vol = maxChargingVol[index];
+void VCCU_V2G_EVMaximumVoltageLimit(int VMaximumVoltageLimit,
+		int EVMaximumVoltage_0002,
+		int EVMaximumVoltage_0000,
+		int EVMaximumVoltage_0001,
+		int EVMaximumVoltage_0003){
+
+	struct VCCU_V2G_EVMaximumVoltageLimit obj;
+	obj.DATA1.VCCU_V2G_EVMaximumVoltageLimit = VMaximumVoltageLimit;//1
+	obj.DATA1.VCCU_V2G_EVMaximumVoltage_0002 = EVMaximumVoltage_0002;//5
+	obj.VCCU_V2G_EVMaximumVoltage_0000.value = EVMaximumVoltage_0000;//520
+	obj.VCCU_V2G_EVMaximumVoltage_0001.value = EVMaximumVoltage_0001;//1
+	obj.VCCU_V2G_EVMaximumVoltage_0003.value = EVMaximumVoltage_0003;//0
+	byte* data1;
+	data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVMaximumVoltage_0000));
+	byte data[5];
+	data[0] = *((UBYTE *) &obj.DATA1);
+	data[1] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumVoltage_0003);
+	data[2] = data1[0];
+	data[3] = data1[1];
+	data[4] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumVoltage_0001);
+	//printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
+	setVCCU_V2G_EVMaximumVoltageLimit(data, sizeof(data));
+}
 
-    if (maxChargingCur[index] != 0 && maxChargingCur[index] <= *cur)
-        *cur = maxChargingCur[index];
+void VCCU_V2G_EVMaximumCurrentLimit(int EVMaximumCurrentLimit,
+		int EVMaximumCurrent_0000,
+		int EVMaximumCurrent_0001,
+		int EVMaximumCurrent_0002,
+		int EVMaximumCurrent_0003){
+
+	struct VCCU_V2G_EVMaximumCurrentLimit obj;
+	obj.DATA1.VCCU_V2G_EVMaximumCurrentLimit = EVMaximumCurrentLimit;//1
+	obj.DATA1.VCCU_V2G_EVMaximumCurrent_0000 = EVMaximumCurrent_0000;//3
+	obj.VCCU_V2G_EVMaximumCurrent_0001.value = EVMaximumCurrent_0001;//1
+	obj.VCCU_V2G_EVMaximumCurrent_0002.value = EVMaximumCurrent_0002;//0
+	obj.VCCU_V2G_EVMaximumCurrent_0003.value = EVMaximumCurrent_0003;//10
+	byte* data1;
+	data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVMaximumCurrent_0003));
+	byte data[5];
+	data[0] = *((UBYTE *) &obj.DATA1);
+	data[1] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumCurrent_0002);
+	data[2] = data1[0];
+	data[3] = data1[1];
+	data[4] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumCurrent_0001);
+	//printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
+	setVCCU_V2G_EVMaximumCurrentLimit(data, sizeof(data));
+}
 
-    if (_chargingData[index]->SystemStatus == S_CHARGING &&
-        _chargingData[index]->ChargingProfileCurrent > 0 &&
-        _chargingData[index]->ChargingProfileCurrent <= *cur)
-    {
-        *cur = _chargingData[index]->ChargingProfileCurrent;
-    }
+void VCCU_V2G_EVTargetVoltage(int EVTargetVoltage_Value,
+		int EVTargetVoltage_Unit,
+		int EVTargetVoltage_UnitF,
+		int EVTargetVoltage_Multi){//C2 01 00 01 05
+
+	struct VCCU_V2G_EVTargetVoltage obj;
+	obj.VCCU_V2G_EVTargetVoltage_Value.value = EVTargetVoltage_Value;//450
+	obj.VCCU_V2G_EVTargetVoltage_Unit.value = EVTargetVoltage_Unit;//5
+	obj.VCCU_V2G_EVTargetVoltage_UnitF.value = EVTargetVoltage_UnitF;//1
+	obj.VCCU_V2G_EVTargetVoltage_Multi.value = EVTargetVoltage_Multi;//0
+
+	byte* data1;
+	data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVTargetVoltage_Value));
+	byte data[5];
+	data[0] = data1[0];
+	data[1] = data1[1];
+	data[2] = *((UBYTE *) &obj.VCCU_V2G_EVTargetVoltage_Multi);
+	data[3] = *((UBYTE *) &obj.VCCU_V2G_EVTargetVoltage_UnitF);
+	data[4] = *((UBYTE *) &obj.VCCU_V2G_EVTargetVoltage_Unit);
+	//printf("%d %02x %02x \n",obj.VCCU_V2G_EVTargetVoltage_Value.value, data[0], data[1]);
+	//printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
+	setVCCU_V2G_EVTargetVoltage(data, sizeof(data));
 }
 
-void GetMaxPowerMethod(byte index, float *pow)
-{
-    if (maxChargingPow != 0 && maxChargingPow <= *pow)
-        *pow = maxChargingPow;
+void VCCU_V2G_EVTargetCurrent(int EVTargetCurrent_Unit,
+		int EVTargetCurrent_Value,
+		int EVTargetCurrent_UnitF,
+		int EVTargetCurrent_Multi){//05 00 00 01 03
+
+	struct VCCU_V2G_EVTargetCurrent obj;
+	obj.VCCU_V2G_EVTargetCurrent_Unit.value = EVTargetCurrent_Unit;//3
+	obj.VCCU_V2G_EVTargetCurrent_Value.value = EVTargetCurrent_Value;//5
+	obj.VCCU_V2G_EVTargetCurrent_UnitF.value = EVTargetCurrent_UnitF;//1
+	obj.VCCU_V2G_EVTargetCurrent_Multi.value = EVTargetCurrent_Multi;//0
+	byte* data1;
+	data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVTargetCurrent_Value));
+	byte data[5];
+	data[0] = data1[0];
+	data[1] = data1[1];
+	data[2] = *((UBYTE *) &obj.VCCU_V2G_EVTargetCurrent_Multi);
+	data[3] = *((UBYTE *) &obj.VCCU_V2G_EVTargetCurrent_UnitF);
+	data[4] = *((UBYTE *) &obj.VCCU_V2G_EVTargetCurrent_Unit);
+	//printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
+	setVCCU_V2G_EVTargetCurrent(data, sizeof(data));
+}
 
-    if (_chargingData[index]->SystemStatus == S_CHARGING &&
-        _chargingData[index]->ChargingProfilePower > 0 &&
-        _chargingData[index]->ChargingProfilePower <= *pow)
-    {
-        *pow = _chargingData[index]->ChargingProfilePower;
-    }
+void VCCU_V2G_VehicleStatus(int canfd, int EnergyTra, int EVErrorCode,
+		int EVPowerDeliveryParame, int EVRESSSOC,
+		int EVRESSConditioningFla, int EVRESSConditionin, int EVReady,
+		int BulkChargingCompleteF, int EVCabinConditioningFl, int EVCabinConditioning,
+		int ChargingComplete, int FullSOCFlag, int FullSOC,
+		int BulkSOCFlag, int BulkSOC, int BulkChargingComplete,
+		int BulkChargingCompleteFValue){
+	struct VCCU_V2G_VehicleStatus obj;
+	obj.DATA4.VCCU_V2G_StateM_EnergyTra_0000 = EnergyTra;//VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended;
+	obj.DATA1.VCCU_V2G_EVErrorCode = EVErrorCode;//0;
+	obj.DATA4.VCCU_V2G_EVPowerDeliveryParame = EVPowerDeliveryParame;//3;
+	obj.VCCU_V2G_EVRESSSOC.value = EVRESSSOC;//0;
+	obj.DATA3.VCCU_V2G_EVRESSConditioningFla = EVRESSConditioningFla;//3;
+	obj.DATA3.VCCU_V2G_EVRESSConditioning = EVRESSConditionin;//3;
+	obj.DATA3.VCCU_V2G_EVReady = EVReady;//3;
+	obj.DATA1.VCCU_V2G_BulkChargingCompleteF = BulkChargingCompleteF;//3;
+	obj.DATA3.VCCU_V2G_EVCabinConditioningFl = EVCabinConditioningFl;//3;
+	obj.DATA2.VCCU_V2G_EVCabinConditioning = EVCabinConditioning;//3;
+	obj.DATA2.VCCU_V2G_ChargingComplete = ChargingComplete;//3;
+	obj.DATA2.VCCU_V2G_FullSOCFlag = FullSOCFlag;//0;
+	obj.VCCU_V2G_FullSOC.value = FullSOC;//3;
+	obj.DATA2.VCCU_V2G_BulkSOCFlag = BulkSOCFlag;//3;
+	obj.VCCU_V2G_BulkSOC.value = BulkSOC;//0;
+	obj.DATA1.VCCU_V2G_BulkChargingComplete = BulkChargingComplete;//3;
+	obj.DATA1.VCCU_V2G_BulkChargingCompleteF = BulkChargingCompleteFValue;//3;
+	byte data[7];
+	data[0] = *((UBYTE *) &obj.DATA1);
+	data[1] = *((UBYTE *) &obj.DATA2);
+	data[2] = *((UBYTE *) &obj.DATA3);
+	data[3] = *((UBYTE *) &obj.DATA4);
+	data[4] = *((UBYTE *) &obj.VCCU_V2G_BulkSOC);
+	data[5] = *((UBYTE *) &obj.VCCU_V2G_FullSOC);
+	data[6] = *((UBYTE *) &obj.VCCU_V2G_EVRESSSOC);
+	setVCCU_V2G_VehicleStatus(data, sizeof(data));
 }
 
-time_t GetRtcInfoForEpoch()
+unsigned char isModeChange(unsigned char gun_index)
 {
-    struct timeb csuTime;
-    struct tm *tmCSU;
-    struct tm t;
-    time_t result;
-
-    ftime(&csuTime);
-    tmCSU = localtime(&csuTime.time);
-
-    t.tm_year = tmCSU->tm_year;
-    t.tm_mon = tmCSU->tm_mon;
-    t.tm_mday = tmCSU->tm_mday;
-    t.tm_hour = tmCSU->tm_hour;
-    t.tm_min = tmCSU->tm_min;
-    t.tm_sec = tmCSU->tm_sec;
-    t.tm_isdst = -1;
-    result = mktime(&t);
-
-    return result;
+	unsigned char result = NO;
+	if(_chargingData[gun_index]->SystemStatus != _chargingData[gun_index]->PreviousSystemStatus)
+	{
+		result = YES;
+		_chargingData[gun_index]->PreviousSystemStatus = _chargingData[gun_index]->SystemStatus;
+
+	}
+	return result;
 }
 
-byte GetStopChargingReasonByEvse(byte gunIndex, byte *reason)
+void setChargerMode(byte gun_index, byte mode)
 {
-    byte result = NO;
-
-    if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip == 0x01)
-    {
-        // 012251
-        *(reason + 5)  = 0;
-        *(reason + 4)  = 1;
-        *(reason + 3)  = 2;
-        *(reason + 2)  = 2;
-        *(reason + 1)  = 5;
-        *(reason + 0)  = 1;
-        result = YES;
-    }
+	_chargingData[gun_index]->SystemStatus = mode;
+}
 
-    if (_chargingData[gunIndex]->Type == _Type_Chademo)
-    {
-        if (ShmStatusCodeData->FaultCode.FaultEvents.bits.ChademoOutputRelayDrivingFault == YES)
-        {
-            // 011012
-            *(reason + 5) = 0;
-            *(reason + 4) = 1;
-            *(reason + 3) = 1;
-            *(reason + 2) = 0;
-            *(reason + 1) = 1;
-            *(reason + 0) = 2;
-            result = YES;
-        }
-        else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoOutputUVPFail == YES)
-        {
-            // 012289
-            *(reason + 5) = 0;
-            *(reason + 4) = 1;
-            *(reason + 3) = 2;
-            *(reason + 2) = 2;
-            *(reason + 1) = 8;
-            *(reason + 0) = 9;
-            result = YES;
-        }
-        else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGfdTrip == YES)
-        {
-            // 012234
-            *(reason + 5) = 0;
-            *(reason + 4) = 1;
-            *(reason + 3) = 2;
-            *(reason + 2) = 2;
-            *(reason + 1) = 3;
-            *(reason + 0) = 4;
-            result = YES;
-        }
-    }
-    else if (_chargingData[gunIndex]->Type == _Type_GB)
-    {
-        if (ShmStatusCodeData->FaultCode.FaultEvents.bits.ChademoOutputRelayDrivingFault == YES)
-        {
-            // 012290
-            *(reason + 5) = 0;
-            *(reason + 4) = 1;
-            *(reason + 3) = 2;
-            *(reason + 2) = 2;
-            *(reason + 1) = 9;
-            *(reason + 0) = 0;
-            result = YES;
-        }
-        else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip == YES)
-        {
-            // 012236
-            *(reason + 5) = 0;
-            *(reason + 4) = 1;
-            *(reason + 3) = 2;
-            *(reason + 2) = 2;
-            *(reason + 1) = 3;
-            *(reason + 0) = 6;
-            result = YES;
-        }
-    }
-    else if (_chargingData[gunIndex]->Type == _Type_CCS_2)
-    {
-        if (ShmStatusCodeData->FaultCode.FaultEvents.bits.CcsOutputRelayDrivingFault == YES)
-        {
-            // 011014
-            *(reason + 5) = 0;
-            *(reason + 4) = 1;
-            *(reason + 3) = 1;
-            *(reason + 2) = 0;
-            *(reason + 1) = 1;
-            *(reason + 0) = 4;
-            result = YES;
-        }
-        else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsOutputUVPFail == YES)
-        {
-            // 012288
-            *(reason + 5) = 0;
-            *(reason + 4) = 1;
-            *(reason + 3) = 2;
-            *(reason + 2) = 2;
-            *(reason + 1) = 8;
-            *(reason + 0) = 8;
-            result = YES;
-        }
-        else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGfdTrip == YES)
-        {
-            // 012236
-            *(reason + 5) = 0;
-            *(reason + 4) = 1;
-            *(reason + 3) = 2;
-            *(reason + 2) = 2;
-            *(reason + 1) = 3;
-            *(reason + 0) = 5;
-            result = YES;
-        }
-    }
+void handleEmulatorFaultStatus(){
+	setEVStatus1(evstaus[4]);
+	ShmSysConfigAndInfo->ate.Permission = STOP;
+	setStatusMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
+	ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
+	SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap,
+				ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
+	EvseStopChargingEvent(normalStop, stopReason, 1);
 
-    return result;
 }
 
 int main(int argc, char *argv[])
 {
-    if(InitShareMemory() == FAIL)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR("InitShareMemory NG\n");
-        #endif
-        if(ShmStatusCodeData != NULL)
-        {
-            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
-        }
-        sleep(5);
-        return 0;
-    }
-
-    gun_count = ShmSysConfigAndInfo->SysConfig.TotalConnectorCount;
-    Initialization();
-    CanFd = InitCanBus();
-    CANReceiver();
-
-    byte priorityLow = 1;
-    time_t rtc = GetRtcInfoForEpoch();
-    while(CanFd)
-    {
-        for(byte _index = 0; _index < gun_count; _index++)
-        {
-            if (priorityLow == 1)
-            {
-                // 優先權較低 - 只要有回應即不會再詢問
-                if (_chargingData[_index]->Type == _Type_Chademo &&
-                    ShmCHAdeMOData->evse[_chargingData[_index]->type_index].SelfTest_Comp != PASS)
-                {
-                    SyncRtcInfo(_index, _chargingData[_index]->Evboard_id, (int)rtc);
-                    GetFirmwareVersion(_index, _chargingData[_index]->Evboard_id);
-                }
-                else if (_chargingData[_index]->Type == _Type_GB &&
-                         ShmGBTData->evse[_chargingData[_index]->type_index].SelfTest_Comp != PASS)
-                {
-                    SyncRtcInfo(_index, _chargingData[_index]->Evboard_id, (int)rtc);
-                    GetFirmwareVersion(_index, _chargingData[_index]->Evboard_id);
-                }
-                else if (_chargingData[_index]->Type == _Type_CCS_2)
-                {
-                    if (ShmCcsData->CommProtocol == 0x01 &&
-                        ShmCcsData->V2GMessage_DIN70121[_chargingData[_index]->type_index].SelfTest_Comp != PASS)
-                    {
-                        SyncRtcInfo(_index, _chargingData[_index]->Evboard_id, (int)rtc);
-                        GetFirmwareVersion(_index, _chargingData[_index]->Evboard_id);
-                    }
-                }
-
-                // 固定要取得的資訊 : 1.槍鎖狀態, 2."Connector 1" 溫度, 3."Connector 2" 溫度, 4.Pilot Voltage
-                //PRINTF_FUNC("GetMiscellaneousInfo. index = %d, Eid = %d \n", _index, _chargingData[_index]->Evboard_id);
-                GetMiscellaneousInfo(_index,
-                                     _chargingData[_index]->RelayK1K2Status,
-                                     _chargingData[_index]->PresentChargedEnergy,
-                                     (_chargingData[_index]->PresentChargingVoltage * 10),
-                                     _chargingData[_index]->Evboard_id);
-            }
-
-            switch (_chargingData[_index]->SystemStatus)
-            {
-                case S_IDLE:
-                case S_RESERVATION:
-                    if (_chargingData[_index]->Type == _Type_Chademo)
-                    {
-                        ClearAbnormalStatus_Chademo(_index);
-                    }
-                    else if (_chargingData[_index]->Type == _Type_GB)
-                    {
-                        ClearAbnormalStatus_GB(_index);
-                    }
-                    else if (_chargingData[_index]->Type == _Type_CCS_2)
-                    {
-                        ClearAbnormalStatus_CCS(_index);
-                    }
-
-                    if (priorityLow == 1)
-                    {
-                        _chargingData[_index]->PresentChargedEnergy = 0;
-                        _chargingData[_index]->PresentChargingPower = 0;
-                        _chargingData[_index]->GroundFaultStatus = GFD_WAIT;
-                        _chargingData[_index]->RealRatingPower = 0;
-                        _chargingData[_index]->StopChargeFlag = NO;
-                        _chargingData[_index]->ChargingFee = 0.0;
-                        _chargingData[_index]->EvBatterySoc = 0;
-                        _chargingData[_index]->PresentChargingVoltage = 0;
-                        _chargingData[_index]->PresentChargingCurrent = 0;
-                        _chargingData[_index]->EvBatteryMaxVoltage = 0;
-
-                        chargingTime[_index] = 0;
-
-                        maxChargingPow = (ShmSysConfigAndInfo->SysConfig.MaxChargingPower * 10);
-                    }
-                    break;
-                case S_PREPARNING:
-                {
-                    // 設定當前輸出
-                    if (gun_count == 1)
-                        SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
-                    else if (gun_count == 2)
-                        SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
-                }
-                    break;
-                case S_PREPARING_FOR_EV:
-                {
-                    // 開始確認車端是否同意開始充電 : 1.SOC, 2.Target Vol, 3.Target Cur, 4.Charging remaining time
-                    GetOutputReq(_index, _chargingData[_index]->Evboard_id);
-
-//                  PRINTF_FUNC("PresentChargingVoltage = %f \n", _chargingData[_index]->PresentChargingVoltage);
-//                  PRINTF_FUNC("PresentChargingCurrent = %f \n", _chargingData[_index]->PresentChargingCurrent);
-//                  PRINTF_FUNC("AvailableChargingPower = %f \n", _chargingData[_index]->AvailableChargingPower);
-//                  PRINTF_FUNC("AvailableChargingCurrent = %f \n", _chargingData[_index]->AvailableChargingCurrent);
-//                  PRINTF_FUNC("MaximumChargingVoltage = %f \n", _chargingData[_index]->MaximumChargingVoltage);
-
-                    // 設定當前輸出
-                    if (gun_count == 1)
-                        SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
-                    else if (gun_count == 2)
-                        SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
-
-                    if (priorityLow == 1)
-                    {
-                        float maxVol, maxCur;
-                        // 樁端輸出能力
-                        maxVol = _chargingData[_index]->MaximumChargingVoltage;
-                        maxCur = _chargingData[_index]->AvailableChargingCurrent;
-
-                        GetMaxVolAndCurMethod(_index, &maxVol, &maxCur);
-
-                        PRINTF_FUNC("To EV_%d Max_Vol = %f, Cap_Cur = %f, Cap_Pow = %f \n",
-                                    _index, maxVol, maxCur, _chargingData[_index]->AvailableChargingPower);
-                        _chargingData[_index]->RealMaxVoltage = maxVol;
-
-                        SetChargingPermission(_index, START,
-                                              _chargingData[_index]->AvailableChargingPower,
-                                              maxCur,
-                                              maxVol,
-                                              _chargingData[_index]->Evboard_id);
-
-                        // 取得車端電池資訊 : 1.AC or DC ? 2.Total battery cap, 3.Max battery vol, 4.Max battery cur
-                        GetEvBatteryInfo(_index, _chargingData[_index]->Evboard_id);
-                    }
-                }
-                    break;
-                case S_PREPARING_FOR_EVSE:
-                case S_CCS_PRECHARGE_ST0:
-                case S_CCS_PRECHARGE_ST1:
-                {
-                    // 開始確認車端是否同意開始充電
-                    GetOutputReq(_index, _chargingData[_index]->Evboard_id);
-
-                    // 設定當前輸出
-                    if (gun_count == 1)
-                        SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
-                    else if (gun_count == 2)
-                        SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
-
-                    if (priorityLow % 5 == 1)
-                    {
-                        // 樁端輸出能力改變
-                        if (gun_count == 1)
-                            SetPresentChargingOutputCap(_chargingData[0], _chargingData[0]);
-                        else if (gun_count == 2)
-                            SetPresentChargingOutputCap(_chargingData[0], _chargingData[1]);
-                    }
-
-                    // 持續通知 Isolation 測試狀態
-                    if (priorityLow == 1)
-                    {
-                        // 拉 500 V 如果在一秒鐘內 GFD 都符合則 PASS
-//                      if (_chargingData[_index]->FireChargingVoltage >= 3500)
-//                          _chargingData[_index]->GroundFaultStatus = GFD_PASS;
-
-                        //PRINTF_FUNC("To EV_%d GFD = %d \n",   _index, _chargingData[_index]->GroundFaultStatus);
-
-                        unsigned char _result = GFD_WAIT;
-                        _result = _chargingData[_index]->GroundFaultStatus;
-
-                        if(_chargingData[_index]->Type == _Type_Chademo ||
-                           _chargingData[_index]->Type == _Type_GB)
-                        {
-                            if (_result == GFD_WARNING)
-                            {
-                                _result = GFD_PASS;
-                            }
-                        }
-
-                        if(_result < GFD_WAIT &&
-                           _result > GFD_WARNING)
-                        {
-                            PRINTF_FUNC("Unexpected GFD status : %d \n", _result);
-                            _result = GFD_WAIT;
-                        }
-
-                        SetIsolationStatus(_index, _result, _chargingData[_index]->Evboard_id);
-
-                        if(_chargingData[_index]->SystemStatus == S_CCS_PRECHARGE_ST0 &&
-                           _chargingData[_index]->PrechargeStatus == PRECHARGE_READY)
-                        {
-                            SetEvsePrechargeInfo(_index, PRECHARGE_PRERELAY_PASS, _chargingData[_index]->Evboard_id);
-                        }
-                    }
-                }
-                    break;
-                case S_CHARGING:
-                {
-                    // 計算 Power
-                    _chargingData[_index]->PresentChargingPower = ((float)((_chargingData[_index]->PresentChargingVoltage) * (_chargingData[_index]->PresentChargingCurrent)) / 1000);
-
-                    if (chargingTime[_index] == 0)
-                    {
-                        chargingTime[_index] = _chargingData[_index]->PresentChargedDuration;
-                    }
-                    else
-                    {
-                        int passTime = _chargingData[_index]->PresentChargedDuration - chargingTime[_index];
-
-                        if (passTime > 0)
-                        {
-                            float changingPow = (_chargingData[_index]->PresentChargingPower) * passTime / 3600;
-                            if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
-                            {
-                                _chargingData[_index]->ChargingFee += changingPow * ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee;
-                            }
-
-                            _chargingData[_index]->PresentChargedEnergy += changingPow;
-                            chargingTime[_index] = _chargingData[_index]->PresentChargedDuration;
-                        }
-                    }
-
-                    // 開始確認車端是否同意開始充電
-                    GetOutputReq(_index, _chargingData[_index]->Evboard_id);
-
-                    // 設定當前輸出
-                    if (gun_count == 1)
-                        SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
-                    else if (gun_count == 2)
-                        SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
-
-                    // for test end
-                    if (priorityLow % 5 == 0)
-                    {
-                        // 樁端輸出能力改變
-                        if (gun_count == 1)
-                            SetPresentChargingOutputCap(_chargingData[0], _chargingData[0]);
-                        else if (gun_count == 2)
-                            SetPresentChargingOutputCap(_chargingData[0], _chargingData[1]);
-                    }
-
-                    if (priorityLow == 1)
-                    {
-                        // Chademo & GB/T GFD 失敗再通知
-                        if(_chargingData[_index]->Type == _Type_Chademo || _chargingData[_index]->Type == _Type_GB)
-                        {
-                            if(_chargingData[_index]->GroundFaultStatus == GFD_FAIL)
-                            {
-                                SetIsolationStatus(_index, _chargingData[_index]->GroundFaultStatus, _chargingData[_index]->Evboard_id);
-                            }
-                        }
-                        // CCS will be continuous notify GFD state
-                        else if(_chargingData[_index]->Type == _Type_CCS_2)
-                        {
-                            SetIsolationStatus(_index, _chargingData[_index]->GroundFaultStatus, _chargingData[_index]->Evboard_id);
-                        }
-                        else
-                        {
-                            //NULL
-                        }
-
-                        if(_chargingData[_index]->Type == _Type_CCS_2 &&
-                           _chargingData[_index]->PrechargeStatus == PRECHARGE_READY)
-                        {
-                            SetEvsePrechargeInfo(_index, PRECHARGE_CHARELAY_PASS, _chargingData[_index]->Evboard_id);
-                        }
-                    }
-                }
-                    break;
-                case S_TERMINATING:
-                {
-                    // 設定當前輸出
-                    if (gun_count == 1)
-                        SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
-                    else if (gun_count == 2)
-                        SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
-
-                    // 槍鎖還在,則代表是樁端要求的停止
-                    if (_chargingData[_index]->GunLocked == START ||
-                        _chargingData[_index]->Type == _Type_CCS_2)
-                    {
-                        byte normalStop = 0x01;
-                        byte stopReason[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
-
-                        if (GetStopChargingReasonByEvse(_index, stopReason))
-                        {
-                            normalStop = 0x02;
-                        }
-
-                        EvseStopChargingEvent(normalStop, stopReason, _chargingData[_index]->Evboard_id);
-                    }
-                    GetOutputReq(_index, _chargingData[_index]->Evboard_id);
-                }
-                    break;
-                case S_COMPLETE:
-                {
-                    if (priorityLow == 1)
-                    {
-                        float maxVol, maxCur;
-
-                        // 樁端輸出能力
-                        maxVol = _chargingData[_index]->MaximumChargingVoltage;
-                        maxCur = _chargingData[_index]->AvailableChargingCurrent;
-
-                        GetMaxVolAndCurMethod(_index, &maxVol, &maxCur);
-                        SetChargingPermission(_index, STOP,
-                                              _chargingData[_index]->AvailableChargingPower,
-                                              maxCur,
-                                              maxVol,
-                                              _chargingData[_index]->Evboard_id);
-                    }
-                }
-                    break;
-            }
-        }
-        priorityLow >= 20 ? priorityLow = 1 : priorityLow++;
-        usleep(45000); //EV 小板通訊 (50 ms)
-    }
-    DEBUG_INFO("Module_EvComm : Can-bus port = %d \n", CanFd);
-    return FAIL;
+	if(InitShareMemory() == FAIL)
+	{
+		#ifdef SystemLogMessage
+		printf("InitShareMemory NG\n");
+		#endif
+		if(ShmStatusCodeData != NULL)
+		{
+			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
+		}
+		sleep(5);
+		return 0;
+	}
+
+	Initialization();
+	CanFd = InitCanBus();
+	CanFd2 = CHROMAInitCanBus();
+	CANReceiver();
+	CHROMACANReceiver();
+
+	//printf("%08X %08X  %d %d %d ....................\n" , bn1, (bn1 | 0x80000000), CanFd, CanFd2, ShmSysConfigAndInfo->ate.ATEState);
+
+/*
+	sleep(2);
+	system("killall Module_InternalComm");
+	system("killall Module_EvComm");
+	return 0;
+	*/
+
+	printf("EvComm %d....................\n" , ShmSysConfigAndInfo->ate.ATEState);
+	while(true){
+
+		if(ShmSysConfigAndInfo->ate.ATEState  == 1){//VCCU
+
+			setBootNotification1();
+			VCCU_TD();
+			VCCU_Requests(0, 0, 0,
+									3, 3, 3, 3,
+									3, 3, 7,
+									0,
+									7, 3, 3);
+
+			int status = isModeChange(CCS_QUANTITY);
+			VCVCCU_V2G_RemainingTimeToFullSO(8000);
+			switch(_chargingData[CCS_QUANTITY]->SystemStatus){
+				case V_IDLE:{
+					if (status){
+						printf("CCS IDLE Processing 1....................\n");
+					}
+					setEVStatus1(evstaus[0]);
+					break;
+				}
+				case V_UNMATEDPLUG:{
+					if (status){
+						printf("CCS UNMATEDPLUG Processing 2....................\n");
+					}
+					setEVStatus1(evstaus[0]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Not_allowed, Not_allowed, Opened);
+
+					break;
+				}
+				case V_MATED_PLUG_INLET_UNLOCKED:{
+					if (status){
+						if(ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Status == VCCU_InletStatus_Connected){
+
+						}
+						printf("CCS MATED_PLUG_INLET_UNLOCKED Processing 3....................\n");
+					}
+					setEVStatus1(evstaus[0]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+					//VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+					break;
+				}
+				case V_INLETLOCKING:{
+					if (status){
+						printf("CCS INLETLOCKING Processing 4....................\n");
+					}
+					setEVStatus1(evstaus[0]);
+					break;
+				}
+				case V_INLETLOCKED:{
+					if (status){
+						printf("CCS INLETLOCKED Processing 5....................\n");
+					}
+					setEVStatus1(evstaus[1]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+							3, soc,
+							3, 3, TRUE,
+							3, 3, 3,
+							3, 3, 0,
+							3, 0, 3,
+							3);
+					/*
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					*/
+					break;
+				}
+				case V_SLAC:{
+					if (status){
+						printf("CCS SLAC Processing 6....................\n");
+					}
+					setEVStatus1(evstaus[1]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+					/*
+					 VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					 VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					 */
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+										3, soc,
+										3, 3, TRUE,
+										3, 3, 3,
+										3, 3, 0,
+										3, 0, 3,
+										3);
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+					break;
+				}
+				case V_DEFINITION:{
+					if (status){
+						printf("CCS DEFINITION Processing 7....................\n");
+					}
+					setEVStatus1(evstaus[1]);
+					/*
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0, 3, 0,
+											3, 3, TRUE, 3, 3, 3, 3, 3, 0, 3, 0, 3, 3);
+					*/
+					/*
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, 500, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, 10);
+
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					*/
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+										3, soc,
+										3, 3, TRUE,
+										3, 3, 3,
+										3, 3, 0,
+										3, 0, 3,
+										3);
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+					break;
+				}
+				case V_CABLECHECK:{
+					if (status){
+						printf("CCS CABLECHECK Processing 8....................\n");
+					}
+					setEVStatus1(evstaus[1]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Allowed, Active, Allowed, Not_allowed, Opened);
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+															3, soc,
+															3, 3, TRUE,
+															3, 3, 3,
+															3, 3, 0,
+															3, 0, 3,
+															3);
+
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+
+					break;
+				}
+				case V_ISOLATION:{
+					if (status){
+						printf("CCS ISOLATION Processing 9....................\n");
+					}
+					setEVStatus1(evstaus[1]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Allowed, Not_Active, Allowed, Not_allowed, Opened);
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+							3, soc,
+							3, 3, TRUE,
+							3, 3, 3,
+							3, 3, 0,
+							3, 0, 3,
+							3);
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+					break;
+				}
+				case V_VOLTAGEDIFFERENCE:{
+					if (status){
+						printf("CCS VOLTAGEDIFFERENCE Processing 10....................\n");
+					}
+					setEVStatus1(evstaus[1]);
+					/*
+					int val = (ShmSysConfigAndInfo->ate.linkVoltage - ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va);
+
+					printf("linkVoltage = %d v2g_EVSEPresentVoltage = %d val = %d RemainChargingDuration = %d....................\n", ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, val, _chargingData[CCS_QUANTITY]->RemainChargingDuration);
+*/
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Allowed, Not_Active, Allowed, Not_allowed, Opened);
+					//VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+							3, soc,
+							3, 3, TRUE,
+							3, 3, 3,
+							3, 3, 0,
+							3, 0, 3,
+							3);
+
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+
+
+
+					break;
+				}
+				case V_CONTACTORSCLOSED:{
+					if (status){
+						printf("CCS CONTACTORSCLOSED Processing 11....................\n");
+						//printf("EVSEPresentVoltage = %d\n ", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va );
+
+
+					}
+					setEVStatus1(evstaus[1]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Allowed, Not_Active, Allowed, Not_allowed, Closed);
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+							3, soc,
+							3, 3, TRUE,
+							3, 3, 3,
+							3, 3, 0,
+							3, 0, 3,
+							3);
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+					break;
+				}
+				case V_POWERDELIVERY:{
+					if (status){
+						printf("CCS POWERDELIVERY Processing 12....................\n");
+					}
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Allowed, Not_Active, Allowed, Not_allowed, Closed);
+					/*
+					if(ShmSysConfigAndInfo->ate.ATEStatus == 0){
+						VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Allowed, Not_Active, Allowed, Not_allowed, Closed);
+					}else{
+						VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Not_allowed, Not_Active, Allowed, Not_allowed, Opened);
+					}
+					*/
+					//VCCU_V2G_EVTargetVoltage(400, U_V, TRUE, 0);
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+							3, soc,
+							3, 3, TRUE,
+							3, 3, 3,
+							3, 3, 0,
+							3, 0, 3,
+							3);
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+
+					setEVStatus1(evstaus[1]);
+					break;
+				}
+				case V_CURRENTDEMAND:{
+					if (status){
+						printf("CCS CURRENTDEMAND Processing 13 %d....................\n", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va);
+						//ShmSysConfigAndInfo->ate.linkVoltage = ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va;
+						//printf("maximumVoltage_value = %d  Voltage = %d  maximumCurrent_value = %d  Current = %d....................\n", ShmSysConfigAndInfo->ate.maximumVoltage_value, ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.maximumCurrent_value, ShmSysConfigAndInfo->ate.targetCurrent_Value);
+					}
+					setEVStatus1(evstaus[2]);
+					if(ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va <= 1){
+						VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Not_allowed, Not_Active, Allowed, Not_allowed, Closed);
+					}else{
+						VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Allowed, Not_Active, Allowed, Not_allowed, Closed);
+					}
+					/*
+					if(ShmSysConfigAndInfo->ate.ATEStatus == 0){
+						//VCCU_ChargeFromVehicle(CanFd, 500, 500, Allowed, Not_Active, Allowed, Not_allowed, Closed);
+						VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Allowed, Not_Active, Allowed, Not_allowed, Closed);
+					}else{
+						//VCCU_ChargeFromVehicle(CanFd, 500, 500, Not_allowed, Not_Active, Allowed, Not_allowed, Closed);
+						VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, Not_allowed, Not_Active, Allowed, Not_allowed, Closed);
+					}
+					*/
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+							3, soc,
+							3, 3, TRUE,
+							3, 3, 3,
+							3, 3, 0,
+							3, 0, 3,
+							3);
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+					break;
+				}
+				case V_POWERDELIVERYFALSE:{
+					if (status){
+						printf("CCS POWERDELIVERYFALSE Processing 14....................\n");
+					}
+					setEVStatus1(evstaus[3]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Not_allowed, Not_Active, Allowed, Not_allowed, Opened);
+					break;
+				}
+				case V_DETECTION:{
+					if (status){
+						printf("CCS DETECTION Processing 15....................\n");
+					}
+					setEVStatus1(evstaus[3]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+					break;
+				}
+				case V_SESSION_STOP:{
+					if (status){
+						printf("CCS SESSION_STOP Processing 16....................\n");
+					}
+					setEVStatus1(evstaus[3]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+					break;
+				}
+				case V_STOP_COMMUNICATION_SESSION:{
+					if (status){
+						printf("CCS STOP_COMMUNICATION_SESSION Processing 17....................\n");
+					}
+					setEVStatus1(evstaus[3]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+					break;
+				}
+				case V_FINISHED:{
+					if (status){
+						printf("CCS FINISHED Processing 18....................\n");
+					}
+					setEVStatus1(evstaus[3]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+					break;
+				}
+				default:{
+					break;
+				}
+			}
+			//usleep(25000);
+			usleep(40000);
+
+			//setBootNotification1();
+		}else if(ShmSysConfigAndInfo->ate.ATEState  == 2){//GB
+			if(ShmSysConfigAndInfo->ate.status == 0){
+				int status = isModeChange(CCS_QUANTITY);
+				setBootNotification1();
+				usleep(1000);
+
+				setMisc(1, ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status, ShmSysConfigAndInfo->ate.chademo.id0D_req.Soc);
+
+				if(ShmSysConfigAndInfo->ate.ATEStatus == 1){
+					//ShmSysConfigAndInfo->ate.Permission = START;
+					//setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
+					//printf("ATEStatus == 1 %d \n",ShmSysConfigAndInfo->ate.ATEStatus);
+				}else if(ShmSysConfigAndInfo->ate.ATEStatus == 2){
+					ShmSysConfigAndInfo->ate.Permission = STOP;
+					setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
+					//printf("ATEStatus == 2 %d \n",ShmSysConfigAndInfo->ate.ATEStatus);
+					ShmSysConfigAndInfo->ate.ATEStatus = 0;
+				}else if(ShmSysConfigAndInfo->ate.ATEStatus == 3){
+					//setEVStatus1(evstaus[4]);
+					ShmSysConfigAndInfo->ate.Permission = STOP;
+					setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
+					ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
+					SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
+					EvseStopChargingEvent(normalStop, stopReason, 1);
+				}else{
+
+				}
+				//printf("state ==  %d  permission = %d \n",ShmSysConfigAndInfo->ate.chademo.id03.state, ShmSysConfigAndInfo->ate.Permission);
+				if(ShmSysConfigAndInfo->ate.chademo.id03.state == 0 && ShmSysConfigAndInfo->ate.Permission == 0){
+					//SetChargingPermission(CCS_QUANTITY, START, 1000, 1200, 6000, 1);
+					//setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
+					ShmSysConfigAndInfo->ate.Permission = START;
+					setChargerMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
+					SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
+
+					setEVStatus1(evstaus[0]);
+				}else  if(ShmSysConfigAndInfo->ate.chademo.id03.state ==1){
+					ShmSysConfigAndInfo->ate.Permission = STOP;
+					setEVStatus1(evstaus[0]);
+				}else  if(ShmSysConfigAndInfo->ate.chademo.id03.state ==2){
+					ShmSysConfigAndInfo->ate.Permission = STOP;
+					setEVStatus1(evstaus[1]);
+				}else  if(ShmSysConfigAndInfo->ate.chademo.id03.state ==3){
+					ShmSysConfigAndInfo->ate.Permission = STOP;
+					//setEVStatus1(evstaus[1]);
+					setEVStatus1(evstaus[1]);
+				}else  if(ShmSysConfigAndInfo->ate.chademo.id03.state ==4){
+					ShmSysConfigAndInfo->ate.Permission = STOP;
+					//setEVStatus1(evstaus[1]);
+					setEVStatus1(evstaus[1]);
+				}else  if(ShmSysConfigAndInfo->ate.chademo.id03.state == 5){
+					ShmSysConfigAndInfo->ate.Permission = STOP;
+					setEVStatus1(evstaus[1]);
+				}else  if(ShmSysConfigAndInfo->ate.chademo.id03.state == 6){
+					ShmSysConfigAndInfo->ate.Permission = STOP;
+					setEVStatus1(evstaus[1]);
+				}else  if(ShmSysConfigAndInfo->ate.chademo.id03.state == 7){
+					ShmSysConfigAndInfo->ate.Permission = STOP;
+					setEVStatus1(evstaus[2]);
+					//setEVStatus2(evstaus[2]);
+				}else  if(ShmSysConfigAndInfo->ate.chademo.id03.state == 8){
+					ShmSysConfigAndInfo->ate.Permission = STOP;
+					//outputRelay.relay_event.bits.Gun1_Parallel_N = 0x00;
+					//outputRelay.relay_event.bits.Gun1_Parallel_P = 0x00;
+					setEVStatus1(evstaus[2]);
+					//setEVStatus2(evstaus[2]);
+				}//else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 16 ){
+				else if(ShmSysConfigAndInfo->ate.chademo.id03.state >= 13 ){
+					handleEmulatorFaultStatus();
+					//setEVStatus1(evstaus[3]);
+				}else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 14 ){
+					handleEmulatorFaultStatus();
+					//setEVStatus1(evstaus[3]);
+				}else if(ShmSysConfigAndInfo->ate.chademo.id03.state == 9 || ShmSysConfigAndInfo->ate.chademo.id03.state == 10
+						|| ShmSysConfigAndInfo->ate.chademo.id03.state == 11 || ShmSysConfigAndInfo->ate.chademo.id03.state == 12
+						//|| ShmSysConfigAndInfo->ate.chademo.id03.state == 13
+						//|| ShmSysConfigAndInfo->ate.chademo.id03.state == 15
+						){
+					ShmSysConfigAndInfo->ate.Permission = STOP;
+					setEVStatus1(evstaus[3]);
+					//setEVStatus1(evstaus[3]);
+					handleEmulatorFaultStatus();
+				}else{
+					setEVStatus1(evstaus[0]);
+					//printf("4 %d %d\n",ShmSysConfigAndInfo->ate.chademo.id03.state,ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status);
+				}
+
+				if(ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal == 0){
+					//printf("1 %d ===== \n", ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal);
+
+					//printf("ProximitySignal=====%d  \n", ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal);
+					setEVStatus1(evstaus[3]);
+				}else if(ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal == 1 && ShmSysConfigAndInfo->ate.chademo.id03.state != 7 &&
+						ShmSysConfigAndInfo->ate.chademo.id03.state != 9 && ShmSysConfigAndInfo->ate.chademo.id03.state != 10
+						&& ShmSysConfigAndInfo->ate.chademo.id03.state != 11 && ShmSysConfigAndInfo->ate.chademo.id03.state != 12
+						&& ShmSysConfigAndInfo->ate.chademo.id03.state != 13
+						&& ShmSysConfigAndInfo->ate.chademo.id03.state != 15){
+					//printf("2 %d ===== \n", ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal);
+					setEVStatus1(evstaus[1]);
+				}
+				if(status){
+					//printf("status change1 %d ===== \n", status);
+					SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
+				}else{
+					if(ShmSysConfigAndInfo->ate.Permission == STOP ){
+						if(ShmSysConfigAndInfo->ate.chademo.id03.state == 0){
+							//printf("status change0 %d ===== \n", status);
+							//SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
+							SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
+						}
+
+					}
+				}
+				//SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
+				//SetChargingPermission(CCS_QUANTITY, START, 1000, 1200, 6000, 1);
+				//usleep(1000);
+				//給火線電壓
+				SetPresentInputPower(ShmSysConfigAndInfo->ate.RequireVoltage, ShmSysConfigAndInfo->ate.RequireCurrent, 1);
+				//usleep(1000);
+				//SetPresentInputRequirement(4800, 6000, 1920, 20);
+				SetPresentInputRequirement(ShmSysConfigAndInfo->ate.RequireVoltage, ShmSysConfigAndInfo->ate.RequireCurrent, ShmSysConfigAndInfo->ate.PresentBattVoltage, ShmSysConfigAndInfo->ate.MinimumChargeCurrent, 1);
+
+			}
+		}
+
+	}
+
+	#if (!DEMO)
+
+	#else
+
+	#endif
+	return FAIL;
 }

+ 60 - 41
EVSE/Projects/ATE/Apps/Module_EvComm.h

@@ -1,78 +1,97 @@
 #ifndef MODULE_EVCOMM_H_
 #define MODULE_EVCOMM_H_
 
-#include <stdbool.h>
-
+#include 	<stdbool.h>
 int CanFd;
+int CanFd2;
+
+
+typedef unsigned char 		byte;
+
 
-typedef unsigned char       byte;
 
 extern struct Ev_Board_Cmd
 {
-    int none;                           // 0
-    int address_assignment;             // 0x00000200
-    int get_firmware_ver;               // 0x00000400
-    int get_hardware_ver;               // 0x00000500
-    int charging_permission;            // 0x00000600
-    int present_output_power;           // 0x00000700
-    int present_output_cap;             // 0x00000800
-    int get_output_req;                 // 0x00000900
-    int get_battery_info;               // 0x00000A00
-    int evse_stop_charging;             // 0x00000C00
-    int get_miscellaneous_info;         // 0x00000D00
-
-    int download_req;                   // 0x00000E00
-    int start_block_transfer;           // 0x00000F00
-    int data_transfer;                  // 0x00001000
-    int download_finish;                // 0x00001100
-
-    int isolation_status;               // 0x00001200
-    int sync_rtc_info;                  // 0x00001400
-    int evse_precharge_info;            // 0x00001500
+	int none;
+	int address_assignment;
+	int get_firmware_ver;
+	int get_hardware_ver;
+	int charging_permission;
+	int present_input_power;
+	int present_input_requirement;
+	int get_evse_output_status;
+	int get_evse_capacity_info;
+	int evse_stop_charging;
+	int get_miscellaneous_info;
+
+	int download_req;
+	int start_block_transfer;
+	int data_transfer;
+	int download_finish;
+
+	int isolation_status;
+	int evse_precharge_info;
 }Ev_Cmd;
 
 extern struct Ev_Cmd_Dir
 {
-    unsigned short master_to_slave;
-    unsigned short slave_to_master;
+	unsigned short master_to_slave;
+	unsigned short slave_to_master;
 }Ev_Dir;
 
+
+
+
 struct timeval _id_assign_time;
 
 // Send msg to can-bus
 void SetTargetAddr(byte *target_number, byte index);
 
 void GetFirmwareVersion(byte gun_index, byte toId);
-void SyncRtcInfo(byte gun_index, byte toId, int epoch);
 void GetHardwareVersion(byte gun_index, byte toId);
 void SetChargingPermission(byte gun_index, byte permissionStatus, short aOutputPw, short aOutputVol, short aOutputCur, byte toId);
 void SetPresentOutputPower(short outputVol_b1, short outputCur_b1, short outputVol_b2, short outputCur_b2);
 void SetPresentOutputCapacity(short aOutputPw_b1, short aOutputCur_b1, short aOutputPw_b2, short aOutputCur_b2);
 void GetOutputReq(byte gun_index, byte toId);
 void GetEvBatteryInfo(byte gun_index, byte toId);
-void GetMiscellaneousInfo(byte gun_index, byte relayStatus, float power, float voltage, byte toId);
+void GetMiscellaneousInfo(byte gun_index, byte toId, short K1K2Status, short soc);
 void SetIsolationStatus(byte gun_index, byte result, byte toId);
 void SetEvsePrechargeInfo(byte gun_index, byte result, byte toId);
 // 發送電樁主動停止充電結果及原因
 void EvseStopChargingEvent(byte stopResult, byte *stopReason, byte toId);
-
+void setBootNotification1();
+void setVCCU_Requests(byte *data, byte dataLen);
+void setVCCU_ChargeFromVehicle(byte *data, byte dataLen);
+void setVCCU_V2G_EVMaximumVoltageLimit(byte *data, byte dataLen);
+void setVCCU_V2G_EVMaximumCurrentLimit(byte *data, byte dataLen);
+void setVCCU_V2G_EVTargetVoltage(byte *data, byte dataLen);
+void setVCCU_V2G_EVTargetCurrent(byte *data, byte dataLen);
+void setVCCU_V2G_VehicleStatus(byte *data, byte dataLen);
+void setVCCU_V2G_RemainingTimeToFullSO(byte *data, byte dataLen);
+void setEVStatus1(byte evstatus);
+void setEVStatus2(byte evstatus);
+void setMisc(byte toId, float K1K2Status, float soc);
+void VCCU_TD();
+void SetPresentInputPower(short outputVol_b1, short outputCur_b1, byte toId);
+void SetPresentInputRequirement(short aOutputPw_b1, short aOutputCur_b1, short aOutputPw_b2, short aOutputCur_b2, byte toId);
 // Receive msg From can-bus.
 
 enum Receieve_PSU_msgf
 {
-    // 車端主動
-    ADDRESS_REQ                         = 0x080001FF,
-    NOTIFICATION_EV_STATUS              = 0x08000300,
-    NOTIFICATION_EV_STOP                = 0x08000B00,
-
-    // 車端回應
-    ACK_EV_FW_VERSION                   = 0x08000400,
-    ACK_EV_HW_VERSION                   = 0x08000500,
-    ACK_GET_OUTPUT_REQ                  = 0x08000900,
-    ACK_GET_EV_BATTERY_INFO             = 0x08000A00,
-    ACK_GET_MISCELLANEOUS_INFO          = 0x08000D00,
-    ACK_EVSE_ISOLATION_STATUS           = 0x08001200,
-    ACK_EVSE_PRECHAGE_INFO              = 0x08001500,
+	// 車端主動
+	ADDRESS_REQ = 						0x080001FF,
+	EV_BOARD_STATUS_NOTIFICATION = 		0x08000300,//03
+	NOTIFICATION_EV_STOP = 				0x08000B00,
+
+	// 車端回應
+	ACK_EV_FW_VERSION = 				0x08000400,//04
+	ACK_EV_HW_VERSION = 				0x08000500,//05
+	ACK__GET_EVSE_OUTPUT_STATUS =		0x08000900,//
+	ACK_GET_EVSE_Capacity_INFO =		0x08000A00,
+	ACK_GET_MISCELLANEOUS_INFO = 		0x08000D00,
+	ACK_EVSE_ISOLATION_STATUS = 		0x08001200,
+	ACK_EVSE_PRECHAGE_INFO = 			0x08001500,
 };
 
 #endif /* MODULE_EVCOMM_H_ */
+

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 145 - 532
EVSE/Projects/ATE/Apps/Module_InternalComm.c


+ 806 - 1127
EVSE/Projects/ATE/Apps/ReadCmdline.c

@@ -1,1153 +1,832 @@
-/*
- * Main.c
- *
- *  Created on: 2019年8月6日
- *      Author: 7564
- */
-
-#include <sys/time.h>
-#include <sys/timeb.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <sys/ipc.h>
-#include <sys/shm.h>
-#include <sys/shm.h>
-#include <sys/mman.h>
-#include <linux/wireless.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
-
-#include <unistd.h>
-#include <stdarg.h>
-#include <stdio.h>      /*標準輸入輸出定義*/
-#include <stdlib.h>     /*標準函數庫定義*/
-#include <unistd.h>     /*Unix 標準函數定義*/
-#include <fcntl.h>      /*檔控制定義*/
-#include <termios.h>    /*PPSIX 終端控制定義*/
-#include <errno.h>      /*錯誤號定義*/
-#include <errno.h>
-#include <string.h>
-#include <time.h>
-#include <ctype.h>
-#include <ifaddrs.h>
-#include <math.h>
-#include <stdbool.h>
-#include "../../define.h"
-
-typedef unsigned char           byte;
-#define PASS                1
-#define FAIL                -1
-#define ARRAY_SIZE(A)       (sizeof(A) / sizeof(A[0]))
-#define NO_DEFINE           255
-#define DEFAULT_AC_INDEX    2
-
-#define TTY_PATH            "/dev/tty"
-#define STTY_US             "stty raw -echo -F "
-#define STTY_DEF            "stty -raw echo -F "
-
-struct SysConfigAndInfo         *ShmSysConfigAndInfo;
-struct StatusCodeData           *ShmStatusCodeData;
-struct PrimaryMcuData           *ShmPrimaryMcuData;
-struct CHAdeMOData              *ShmCHAdeMOData;
-struct CcsData                  *ShmCcsData;
-struct GBTData                  *ShmGBTData;
-struct FanModuleData            *ShmFanModuleData;
-struct RelayModuleData          *ShmRelayModuleData;
-struct LedModuleData            *ShmLedModuleData;
-struct PsuData                  *ShmPsuData;
-
-struct ChargingInfoData         *_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
-struct ChargingInfoData         *ac_chargingInfo[AC_QUANTITY];
-
-char *msg = "state  : get gun state (index) \n"
-            "card   : scanning card (x) : \n"
-            "gun    : get gun plugit state (index) \n"
-            "lock   : get gun locked state (index) \n"
-            "self   : self test state (x) \n"
-            "ver    : ver of board (407 or index or rb or fan) \n"
-            "ac     : get ac relay state (x) \n";
-
-bool FindChargingInfoData(byte target, struct ChargingInfoData **chargingData)
-{
-    for (byte index = 0; index < CHAdeMO_QUANTITY; index++)
-    {
-        if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == target)
-        {
-            chargingData[target] = &ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index];
-            return true;
-        }
-    }
-
-    for (byte index = 0; index < CCS_QUANTITY; index++)
-    {
-        if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == target)
-        {
-            chargingData[target] = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[index];
-            return true;
-        }
-    }
-
-    for (byte index = 0; index < GB_QUANTITY; index++)
-    {
-        if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == target)
-        {
-            chargingData[target] = &ShmSysConfigAndInfo->SysInfo.GbChargingData[index];
-            return true;
-        }
-    }
-
-    return false;
-}
-
-bool FindAcChargingInfoData(byte target, struct ChargingInfoData **acChargingData)
-{
-    if (target < AC_QUANTITY)
-    {
-        acChargingData[target] = &ShmSysConfigAndInfo->SysInfo.AcChargingData[target];
-        return true;
-    }
 
-    return false;
-}
+#include 	<sys/time.h>
+#include 	<sys/timeb.h>
+#include    <sys/types.h>
+#include    <sys/stat.h>
+#include 	<sys/types.h>
+#include 	<sys/ioctl.h>
+#include 	<sys/socket.h>
+#include 	<sys/ipc.h>
+#include 	<sys/shm.h>
+#include 	<sys/shm.h>
+#include 	<sys/mman.h>
+#include 	<linux/wireless.h>
+#include 	<arpa/inet.h>
+#include 	<netinet/in.h>
+
+#include 	<unistd.h>
+#include 	<stdarg.h>
+#include    <stdio.h>      /*標準輸入輸出定義*/
+#include    <stdlib.h>     /*標準函數庫定義*/
+#include    <unistd.h>     /*Unix 標準函數定義*/
+#include    <fcntl.h>      /*檔控制定義*/
+#include    <termios.h>    /*PPSIX 終端控制定義*/
+#include    <errno.h>      /*錯誤號定義*/
+#include 	<errno.h>
+#include 	<string.h>
+#include	<time.h>
+#include	<ctype.h>
+#include 	<ifaddrs.h>
+#include 	<math.h>
+#include 	<stdbool.h>
+#include 	"../../define.h"
+#include 	"VCCU.h"
+
+typedef unsigned char			byte;
+#define PASS				1
+#define FAIL				-1
+#define ARRAY_SIZE(A)		(sizeof(A) / sizeof(A[0]))
+
+struct SysConfigAndInfo			*ShmSysConfigAndInfo;
+struct StatusCodeData 			*ShmStatusCodeData;
+struct PrimaryMcuData			*ShmPrimaryMcuData;
+struct CHAdeMOData				*ShmCHAdeMOData;
+struct CcsData					*ShmCcsData;
+struct FanModuleData			*ShmFanModuleData;
+struct RelayModuleData			*ShmRelayModuleData;
+struct ATE 						*ate;
+
+struct ChargingInfoData 		*_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
+int gunCount = CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY;
+char *msg = "stop : set ate stop (x) : \n"
+		"targetCurrent 	: set&get ate targetCurrent (x) : \n"
+		"targetVoltage 	: get ate targetVoltage (x) \n"
+		"maximumCurrent 	: set&get ate maximumCurrent (x) \n"
+		"maximumVoltage 	: set&get ate maximumVoltage (x) \n"
+		"presentVoltage 	: set&get ccs presentVoltage (x) \n"
+		"linkVoltage 	: set&get ate linkVoltage (x) \n"
+		"contactorVoltage 	: set&get ate contactorVoltage (x) \n"
+		"chademoPrmission 	: set chademo ate ChargingPermission (x) \n"
+		"totalBatteryCap 	: set chademo ate totalBatteryCap (x) \n"
+		"maxBatteryCurrent 	: set chademo ate maxBatteryCurrent (x) \n"
+		"maxBatteryVoltage 	: set chademo ate maxBatteryVoltage (x) \n"
+		"requireVoltage 	: set&get chademo ate requireVoltage (x) \n"
+		"requireCurrent 	: set&get chademo ate requireCurrent (x) \n"
+		"presentBattVoltage 	: set&get chademo ate presentBattVoltage (x) \n"
+		"minimumChargeCurrent 	: set&get chademo ate minimumChargeCurrent (x) \n"
+		"soc 	: set chademo ate soc (x) \n"
+		"relay 	: set chademo ate relay (x) \n"
+		"cstate 	: set chademo ate state (x) \n"
+		"startstate 	: set start ate state (x) \n"
+		"crelaystate 	: set chademo relay ate state (x) \n"
+		"ccstate 	: set chademo relay 192 state (x) \n"
+		"vccuinfo 	: show vccuinfo state  \n"
+		"chademoinfo 	: chademoinfo state  \n"
+		"chromainfo 	: chromainfo state  \n"
+		"modeChange 	: modeChange state (x) \n"
+		"ateState 	: ateState (x) \n";
+
+
+#define ShmATEKey		        1020
 
 int InitShareMemory()
 {
-    int result = PASS;
-    int MeterSMId;
+	int result = PASS;
+	int MeterSMId;
 
-    //initial ShmSysConfigAndInfo
-    if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo),  0777)) < 0)
+	//initial ShmSysConfigAndInfo
+	if ((MeterSMId = shmget(ShmSysConfigAndInfoKey,	sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
     {
-        result = FAIL;
-    }
-    else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+		result = FAIL;
+	}
+	else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0))	== (void *) -1)
     {
-        result = FAIL;
-    }
+    	result = FAIL;
+   	 }
     else
     {}
-
-    //initial ShmStatusCodeData
-    if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData),  0777)) < 0)
+/*
+   	//initial ShmStatusCodeData
+   	if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData),  0777)) < 0)
     {
-        result = FAIL;
-    }
+   		result = FAIL;
+	}
     else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
     {
-        result = FAIL;
-    }
+    	result = FAIL;
+   	}
     else
     {}
 
-    if (CHAdeMO_QUANTITY > 0) {
-        if ((MeterSMId = shmget(ShmCHAdeMOCommKey, sizeof(struct CHAdeMOData), IPC_CREAT | 0777)) < 0)
-        {
-            result = FAIL;
-        }
-        else if ((ShmCHAdeMOData = shmat(MeterSMId, NULL, 0)) == (void *) -1) {
-            result = FAIL;
-        }
-        else
-        {
-            //NULL
-        }
-    }
-
-    if (CCS_QUANTITY > 0)
-    {
-        if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0)
-        {
-            result = FAIL;
-        }
-        else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-        {
-            result = FAIL;
-        } else
-        {
-            //NULL
-        }
-    }
-
-    if (GB_QUANTITY > 0)
-    {
-        if ((MeterSMId = shmget(ShmGBTCommKey, sizeof(struct GBTData), IPC_CREAT | 0777)) < 0)
-        {
-            return 0;
-        }
-        else if ((ShmGBTData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-        {
-            return 0;
-        }
-        memset(ShmGBTData, 0, sizeof(struct GBTData));
-    }
-
-    if ((MeterSMId = shmget(ShmPrimaryMcuKey, sizeof(struct PrimaryMcuData), IPC_CREAT | 0777)) < 0)
-    {
-        result = FAIL;
-    }
-    else if ((ShmPrimaryMcuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-        result = FAIL;
-    }
-
-    if ((MeterSMId = shmget(ShmFanBdKey, sizeof(struct FanModuleData),  IPC_CREAT | 0777)) < 0)
-    {
-        result = FAIL;
-    }
-    else if ((ShmFanModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-        result = FAIL;
-    }
-
-    if ((MeterSMId = shmget(ShmRelayBdKey, sizeof(struct RelayModuleData),  IPC_CREAT | 0777)) < 0)
-    {
-        result = FAIL;
-    }
-    else if ((ShmRelayModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-        result = FAIL;
-    }
-
-    if ((MeterSMId = shmget(ShmLedBdKey, sizeof(struct LedModuleData),  0777)) < 0)
-    {
-        result = FAIL;
-    }
-    else if ((ShmLedModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-        result = FAIL;
-    }
-
-    if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData),  IPC_CREAT | 0777)) < 0)
-    {
-        result = FAIL;
-    }
-    else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-        result = FAIL;
-    }
+   	if(CHAdeMO_QUANTITY > 0)
+   	{
+		if ((MeterSMId = shmget(ShmCHAdeMOCommKey, sizeof(struct CHAdeMOData),
+				IPC_CREAT | 0777)) < 0) {
+			result = FAIL;
+		} else if ((ShmCHAdeMOData = shmat(MeterSMId, NULL, 0))
+				== (void *) -1) {
+			result = FAIL;
+		} else {
+		}
+   	}
+
+	if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData),
+					IPC_CREAT | 0777)) < 0) {
+				result = FAIL;
+			} else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1) {
+				result = FAIL;
+			} else {
+			}*/
+/*
+   	if ((MeterSMId = shmget(ShmPrimaryMcuKey, sizeof(struct PrimaryMcuData), IPC_CREAT | 0777)) < 0)
+   	{
+   		result = FAIL;
+   	}
+   	else if ((ShmPrimaryMcuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+   	{
+   		result = FAIL;
+   	}
+
+   	if ((MeterSMId = shmget(ShmFanBdKey, sizeof(struct FanModuleData),	IPC_CREAT | 0777)) < 0)
+   	{
+   		result = FAIL;
+   	}
+   	else if ((ShmFanModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+   	{
+   		result = FAIL;
+   	}
+
+   	if ((MeterSMId = shmget(ShmRelayBdKey, sizeof(struct RelayModuleData),	IPC_CREAT | 0777)) < 0)
+   	{
+   		result = FAIL;
+   	}
+   	else if ((ate = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+   	{
+   		result = FAIL;
+   	}
+   	*/
+   	if ((MeterSMId = shmget(ShmATEKey, sizeof(struct ATE),	IPC_CREAT | 0777)) < 0)
+   	{
+   		result = FAIL;
+   	}
+   	else if ((ate = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+   	{
+   		result = FAIL;
+   	}
 
     return result;
 }
 
-unsigned long GetTimeoutValue(struct timeval _sour_time)
-{
-    struct timeval _end_time;
-    gettimeofday(&_end_time, NULL);
-
-    return 1000000 * (_end_time.tv_sec - _sour_time.tv_sec) + _end_time.tv_usec - _sour_time.tv_usec;
-}
-
-void RunStatusProc(char *v1, char *v2)
-{
-    if (strcmp(v1, "ac") == 0)
-    {
-        if (!FindAcChargingInfoData(0, &ac_chargingInfo[0]))
-        {
-            printf("FindChargingInfoData (AC) false \n");
-        }
-        printf("AC Status = %d \n", ac_chargingInfo[0]->ConnectorPlugIn);
-        return;
-    }
-
-    int _index = atoi(v1);
-    if (_index <= 1)
-    {
-        if (!FindChargingInfoData(_index, &_chargingData[0]))
-        {
-            printf ("FindChargingInfoData error\n");
-            return;
-        }
-
-        if (strcmp(v2, "-1") == 0 || strcmp(v2, "") == 0)
-        {
-            // get
-            printf ("index = %x, status = %x (%d)\n", _index, _chargingData[_index]->SystemStatus, _chargingData[_index]->IsAvailable);
-            printf ("SystemTimeoutFlag = %d, PageIndex = %d\n",
-                    ShmSysConfigAndInfo->SysInfo.SystemTimeoutFlag, ShmSysConfigAndInfo->SysInfo.PageIndex);
-        }
-        else
-        {
-            // set
-            _chargingData[_index]->SystemStatus = atoi(v2);
-        }
-    }
-    else
-    {
-        if (!FindAcChargingInfoData(0, &ac_chargingInfo[0]))
-        {
-            printf("FindChargingInfoData (AC) false \n");
-        }
-
-        if (strcmp(v2, "-1") == 0 || strcmp(v2, "") == 0)
-        {
-            // get
-            printf ("AC Type, status = %x (%d)\n", ac_chargingInfo[0]->SystemStatus, ac_chargingInfo[0]->IsAvailable);
-        }
-        else
-        {
-            // set
-            ac_chargingInfo[0]->SystemStatus = atoi(v2);
-        }
-    }
-}
-
-void RunCardProc(char *v1, char *v2)
-{
-    if (strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0)
-    {
-        if (ShmSysConfigAndInfo->SysInfo.WaitForPlugit)
-        {
-            ShmSysConfigAndInfo->SysInfo.WaitForPlugit = 0x00;
-            printf ("SysInfo.WaitForPlugit = %x \n", ShmSysConfigAndInfo->SysInfo.WaitForPlugit);
-        }
-        else
-        {
-            ShmSysConfigAndInfo->SysInfo.WaitForPlugit = 0x01;
-            printf ("SysInfo.WaitForPlugit = %x \n", ShmSysConfigAndInfo->SysInfo.WaitForPlugit);
-        }
-    }
-    else
-    {
-        strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
-        memcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, v1, strlen(v1));
-        ShmSysConfigAndInfo->SysConfig.UserId[strlen(v1)] = '\0';
-        printf("StartUserId = %s \n", ShmSysConfigAndInfo->SysConfig.UserId);
-    }
-}
-
-void RunGunPlugitProc(char *v1, char *v2)
-{
-    int _index = atoi(v1);
-    if (!FindChargingInfoData(_index, &_chargingData[0]))
-    {
-        printf("FindChargingInfoData error\n");
-        return;
-    }
-
-    if (strcmp(v2, "-1") == 0 || strcmp(v2, "") == 0)
-    {
-        // get
-        printf("index = %x, plug it = %x\n", _index, _chargingData[_index]->ConnectorPlugIn);
-    }
-    else
-    {
-        // set
-        _chargingData[_index]->ConnectorPlugIn = atoi(v2);
-    }
-}
-
-void GetGunLockStatusProc(char *v1, char *v2)
-{
-    int _index = atoi(v1);
-    if (!FindChargingInfoData(_index, &_chargingData[0]))
-    {
-        printf("FindChargingInfoData error\n");
-        return;
-    }
-    if (strcmp(v2, "-1") != 0 && strcmp(v2, "") != 0)
-    {
-        _chargingData[_index]->GunLocked = atoi(v2);
-    }
-
-    printf("Gun Locked Status = %d \n", _chargingData[_index]->GunLocked);
-}
-
-void SetSystemIDProc()
-{
-    char *systemId = "Alston_Test";
-    memcpy(&ShmSysConfigAndInfo->SysConfig.SystemId, systemId, strlen(systemId));
-}
-
-void RunSelfProc()
-{
-    printf("self test status = %x\n", ShmSysConfigAndInfo->SysInfo.SelfTestSeq);
-}
-
-void GetFwVerProc(char *v1)
-{
-    if (strcmp(v1, "407") == 0)
-    {
-        printf("407 FW Version = %s \n", ShmPrimaryMcuData->version);
-    }
-    else if (strcmp(v1, "0") == 0 || strcmp(v1, "1") == 0)
-    {
-        int _index = atoi(v1);
-
-        if (_index == 0)
-            printf("Gun 0 FW Version = %s \n", ShmSysConfigAndInfo->SysInfo.Connector1FwRev);
-        else if (_index == 1)
-            printf("Gun 1 FW Version = %s \n", ShmSysConfigAndInfo->SysInfo.Connector2FwRev);
-    }
-    else if (strcmp(v1, "rb") == 0)
-    {
-        printf("RB Version = %s \n", ShmSysConfigAndInfo->SysInfo.RelayModuleFwRev);
-    }
-    else if (strcmp(v1, "fan") == 0)
-    {
-        printf("FAN Version = %s \n", ShmSysConfigAndInfo->SysInfo.FanModuleFwRev);
-    }
-    else if (strcmp(v1, "dc") == 0)
-    {
-        printf("DC Main Version = %s \n", ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev);
-    }
-    else if (strcmp(v1, "led") == 0)
-    {
-        printf("LED Version = %s \n", ShmSysConfigAndInfo->SysInfo.LedModuleFwRev);
-    }
-    else if (strcmp(v1, "ac") == 0)
-    {
-        if (!FindAcChargingInfoData(0, &ac_chargingInfo[0]))
-        {
-            printf("FindChargingInfoData (AC) false \n");
-        }
-        printf("AC Version = %s \n", ac_chargingInfo[0]->version);
-    }
-}
-
-void CreateOneError(char *v1)
-{
-    int value = atoi(v1);
-
-    ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PrimaryStestFail = value;
-    ShmSysConfigAndInfo->SysConfig.BillingData.isBilling = value;
-}
-
-void GetAuthorizeFlag(char *v1)
-{
-    if (strcmp(v1, "-1") == 0|| strcmp(v1, "") == 0)
-        printf("AuthorizeFlag = %d \n", ShmSysConfigAndInfo->SysInfo.AuthorizeFlag);
-    else
-        ShmSysConfigAndInfo->SysInfo.AuthorizeFlag = atoi(v1);
-}
-
-void GetOrClearId(char *v1)
-{
-    int _index = atoi(v1);
-
-    if (!FindChargingInfoData(_index, &_chargingData[0]))
-    {
-        printf("FindChargingInfoData error\n");
-        return;
-    }
-    printf("Card Number = %s \n", _chargingData[_index]->StartUserId);
-}
 
-void FwUpdateFlagProc()
-{
-    ShmSysConfigAndInfo->SysInfo.FirmwareUpdate = 0x01;
-}
-
-void CheckAcStatus(char *v1)
-{
-    if (strcmp(v1, "-1") == 0|| strcmp(v1, "") == 0)
-    {
-        printf("AC Status = %d \n", ShmSysConfigAndInfo->SysInfo.AcContactorStatus);
-    }
-}
-
-void SetCableChkStatus(char *v1, char *v2)
-{
-    int _index = atoi(v1);
-    if (!FindChargingInfoData(_index, &_chargingData[0]))
-    {
-        printf ("FindChargingInfoData error\n");
-        return;
-    }
-
-    _chargingData[_index]->GroundFaultStatus = atoi(v2);
-}
-
-void SetPowerValue(char *v1, char *v2)
-{
-    int _index = atoi(v1);
-    float _Current = atof(v2);
-    // 盲沖的時候才允許使用~
-    if (_chargingData[_index]->Type != 9)
-        return;
-
-    if (!FindChargingInfoData(_index, &_chargingData[0]))
-    {
-        printf ("FindChargingInfoData error\n");
-        return;
-    }
-
-    _chargingData[_index]->EvBatterytargetCurrent = _Current;
-}
-
-void GetSystemInfo()
-{
-    printf ("ModelName = %s \n", ShmSysConfigAndInfo->SysConfig.ModelName);
-    printf ("SerialNumber = %s \n", ShmSysConfigAndInfo->SysConfig.SerialNumber);
-    printf ("InternetConn = %d \n", ShmSysConfigAndInfo->SysInfo.InternetConn);
-
-    printf ("MaxChargingPower = %d, MaxChargingCurrent = %d \n",
-            ShmSysConfigAndInfo->SysConfig.MaxChargingPower,
-            ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent);
-}
-
-void ChangeGunNum()
-{
-    if (ShmSysConfigAndInfo->SysInfo.CurGunSelected + 1 < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount)
-    {
-        ShmSysConfigAndInfo->SysInfo.CurGunSelected += 1;
-        ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = NO_DEFINE;
-    }
-    else if (ShmSysConfigAndInfo->SysConfig.AcConnectorCount > 0 &&
-             ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == NO_DEFINE)
-        ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = DEFAULT_AC_INDEX;
-    else
-    {
-        ShmSysConfigAndInfo->SysInfo.CurGunSelected = 0;
-        ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = NO_DEFINE;
-    }
-}
-
-void GetGunSelectedNum(char *v1)
-{
-    if (strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0)
-    {
-        if (AC_QUANTITY > 0 &&
-            ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc != NO_DEFINE)
-        {
-            printf("connector select changed = AC \n");
-        }
-        else
-            printf("connector selected = %d \n", ShmSysConfigAndInfo->SysInfo.CurGunSelected);
-    }
-    else
-    {
-        int _index = atoi(v1);
-        if (_index <= 1)
-        {
-            ShmSysConfigAndInfo->SysInfo.CurGunSelected = _index;
-            ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = NO_DEFINE;
-            printf("connector select changed = %d \n", _index);
-        }
-        else if (AC_QUANTITY > 0)
-        {
-            ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = DEFAULT_AC_INDEX;
-            printf("connector select changed = AC \n");
-        }
-    }
-}
-
-void SetFanSpeed(char *v1)
-{
-    int speed = atoi(v1);
-
-    ShmFanModuleData->TestFanSpeed = speed;
-}
-
-void GetFanSpeed()
-{
-    printf("ShmFanModuleData->PresentFan1Speed = %d \n", ShmFanModuleData->PresentFan1Speed);
-    printf("ShmFanModuleData->PresentFan2Speed = %d \n", ShmFanModuleData->PresentFan2Speed);
-    printf("ShmFanModuleData->PresentFan3Speed = %d \n", ShmFanModuleData->PresentFan3Speed);
-    printf("ShmFanModuleData->PresentFan4Speed = %d \n", ShmFanModuleData->PresentFan4Speed);
-}
-
-void SetDebugMode(char *v1)
-{
-    int mode = atoi(v1);
-
-    ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag = mode;
-}
-
-void SetGFDMode(char *v1)
-{
-    int mode = atoi(v1);
-
-    ShmSysConfigAndInfo->SysConfig.AlwaysGfdFlag = mode;
-}
-
-void GetPsuTemp()
-{
-    for (byte index = 0; index < ShmPsuData->GroupCount; index++)
-    {
-        for (byte count = 0; count < ShmPsuData->PsuGroup[index].GroupPresentPsuQuantity; count++)
-        {
-            printf("PSU Temp = %d \n", ShmPsuData->PsuGroup[index].PsuModule[count].ExletTemp);
-        }
-    }
-}
-
-void GetAcInputVol()
-{
-    printf("L1N_L12 = %f, L2N_L23 = %f, L3N_L31 = %f \n",
-           ShmSysConfigAndInfo->SysInfo.InputVoltageR,
-           ShmSysConfigAndInfo->SysInfo.InputVoltageS,
-           ShmSysConfigAndInfo->SysInfo.InputVoltageT);
-}
-
-void GetPsuInformation(char *v1)
-{
-    printf("**********************AC Contact needed*************************\n");
-    if(strcmp(v1, "count") == 0)
-    {
-        for (int i = 0; i < 4; i++)
-        {
-            printf("Group Index = %d, Module Count = %d \n", i, ShmPsuData->PsuGroup[i].GroupPresentPsuQuantity);
-        }
-    }
-    else if(strcmp(v1, "ver") == 0)
-    {
-        for (int i = 0; i < ShmPsuData->SystemPresentPsuQuantity; i++)
-        {
-            printf("Psu Index = %d, PriVersion = %s, SecVersion = %s \n",
-                   i, ShmPsuData->PsuVersion[i].FwPrimaryVersion, ShmPsuData->PsuVersion[i].FwSecondVersion);
-        }
-
-        for (int i = 0; i < ShmPsuData->GroupCount; i++)
-        {
-            for (int j = 0; j < ShmPsuData->PsuGroup[i].GroupPresentPsuQuantity; j++)
-            {
-                printf("Group Index = %d, Psu Index = %d, Version = %s \n",
-                       i, j, ShmPsuData->PsuGroup[i].PsuModule[j].FwVersion);
-            }
-        }
-    }
-    else if(strcmp(v1, "cap") == 0)
-    {
-        for (int i = 0; i < ShmPsuData->GroupCount; i++)
-        {
-            printf("Group Index = %d, MaxCur = %d, Power = %d \n",
-                   i, ShmPsuData->PsuGroup[i].GroupAvailableCurrent, ShmPsuData->PsuGroup[i].GroupAvailablePower);
-        }
-    }
-    else if (strcmp(v1, "output") == 0)
-    {
-        for (int i = 0; i < ShmPsuData->GroupCount; i++)
-        {
-            printf("Group Index = %d, OutputV = %d, OutputC = %d \n",
-                   i, ShmPsuData->PsuGroup[i].GroupPresentOutputVoltage, ShmPsuData->PsuGroup[i].GroupPresentOutputCurrent);
-        }
-    }
-    printf("*************************************************\n");
-}
-
-void GetConnectorCapInfo(char *v1)
-{
-    int _GunIndex = atoi(v1);
-
-    if (!FindChargingInfoData(_GunIndex, &_chargingData[0]))
-    {
-        printf ("FindChargingInfoData error\n");
-        return;
-    }
-
-    printf ("Charger Max Current = %d, Max Power = %d \n",
-            ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent * 10,
-            ShmSysConfigAndInfo->SysConfig.MaxChargingPower * 10);
-
-    printf ("Index = %d, MaxPow = %f, MaxVol = %f, MaxCur = %f\n",
-            _GunIndex,
-            _chargingData[_GunIndex]->RealMaxPower,
-            _chargingData[_GunIndex]->RealMaxVoltage,
-            _chargingData[_GunIndex]->RealMaxCurrent);
-}
-
-static void get_char(char *word)
+bool FindChargingInfoData(byte target, struct ChargingInfoData **chargingData)
 {
-    fd_set rfds;
-    struct timeval tv;
-
-    FD_ZERO(&rfds);
-    FD_SET(0, &rfds);
-    tv.tv_sec = 0;
-    tv.tv_usec = 10; //wait input timout time
-
-    //if input
-    if (select(1, &rfds, NULL, NULL, &tv) > 0)
-    {
-        fgets(word, 128, stdin);
-    }
+	for (byte index = 0; index < CHAdeMO_QUANTITY; index++)
+	{
+		if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == target)
+		{
+			chargingData[target] = &ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index];
+			return true;
+		}
+	}
+
+	for (byte index = 0; index < CCS_QUANTITY; index++)
+	{
+		if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == target)
+		{
+			chargingData[target] = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[index];
+			return true;
+		}
+	}
+
+	for (byte index = 0; index < GB_QUANTITY; index++)
+	{
+		if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == target)
+		{
+			chargingData[target] = &ShmSysConfigAndInfo->SysInfo.GbChargingData[index];
+			return true;
+		}
+	}
+
+	return false;
 }
 
-void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
+void RunStatusProc(char *v1, char *v2)
 {
-    int _GunIndex = atoi(v1);
-    float _Voltage = atof(v2);
-    float _Current = atof(v3);
-    unsigned char PreviousSystemStatus = 0xff;
-
-    if (!FindChargingInfoData(_GunIndex, &_chargingData[0]))
-    {
-        printf ("FindChargingInfoData error\n");
-        return;
-    }
-
-    printf ("ReqVoltage = %f, ReqCurrent = %f\n", _Voltage, _Current);
-
-    if(_Voltage > 1000 || _Voltage < 50)
-    {
-        printf ("Input Voltage over range\n");
-        return;
-    }
-
-//    if(_Current > 100 || _Current < 2){
-//
-//        printf ("Input Current over range\n");
-//        return;
-//    }
-
-    //測試期間先跳過自我測試 _STEST_COMPLETE = 0xfe
-    //ShmSysConfigAndInfo->SysInfo.SelfTestSeq = 0xfe;
-
-    //kill ev task
-    system("killall Module_EvComm");
-
-    //_Voltage = (_Voltage * 10);
-    //_Current = (_Current * 10);
-
-    //system(STTY_US TTY_PATH);
-
-    while(true)
-    {
-        //fix gun 1
-        ShmSysConfigAndInfo->SysInfo.CurGunSelected = _GunIndex;
-
-        switch(_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus)
-        {
-            case S_IDLE:
-            {
-                if(PreviousSystemStatus != _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus)
-                {
-                    PreviousSystemStatus = _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus;
-
-                    printf ("[UnconditionalCharge - S_IDLE]\n");
-
-                }
-
-                ShmSysConfigAndInfo->SysInfo.StartToChargingFlag = 0x01;
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_PREPARNING;
-            }
-            break;
-
-            case S_PREPARNING:
-            {
-                if(PreviousSystemStatus != _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus)
-                {
-                    PreviousSystemStatus = _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus;
-
-                    printf ("[UnconditionalCharge - S_PREPARNIN]\n");
-
-                    //等待 AC Relay 搭上且找到模組 (main 在此 statue 其它 task 會去做完)
-                    printf ("wait find module\n");
-                }
-                //main 會在此階段判斷以下資料跳到下一個 state
-                //用來得知 AC 是否有搭上 (搭上模組的資訊才會出來) 因為每次  AC_Contactor
-
-
-                //ShmPsuData->SystemPresentPsuQuantity;
-                //ShmPsuData->PsuGroup[gun_index].GroupPresentPsuQuantity;
-                //ShmPsuData->PsuGroup[gun_index].GroupAvailablePower;
-                //_chargingData[gun_index]->AvailableChargingPower;
-
-                //等待 AC Relay 搭上且找到模組 (main 在此 statue 其它 task 會去做完)
-                //sleep(10);
-
-                //清除 main timeout 機制
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->TimeoutFlag = 0;
-                //不論是什麼 type 的槍都固意設成 Chademo 不跑 Prechage step
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->Type = 9;
-            }
-            break;
-
-            case S_PREPARING_FOR_EV:
-            {
-                if(PreviousSystemStatus != _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus)
-                {
-                    PreviousSystemStatus = _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus;
-
-                    printf ("[UnconditionalCharge - S_PREPARING_FOR_EV]\n");
-                    printf ("ReqVoltage = %f, ReqCurrent = %f \n", _Voltage * 10,_Current * 10);
-
-                }
-                //清除 main timeout 機制
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->TimeoutFlag = 0;
-                //不論是什麼 type 的槍都固意設成 Chademo 不跑 Prechage step
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->Type = 9;
-
-                //充電電壓電流
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterySoc = 50;
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = 500;
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = 2;
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->AvailableChargingCurrent = 1000;
-
-                //****** 注意~此行為是防止 K1K2 先開導到無法升壓 ( Relay Board 在此 state 還未搭上 K1K2 )
-                //確定模組己升壓完成
-                //if(_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingVoltage <=  (3000+500) &&
-                //  _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingVoltage >=  (3000-500) )
-                {
-                    printf ("Precharge Done = %f \n", _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingVoltage);
-                    //EV done
-                    _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_PREPARING_FOR_EVSE;
-                }
-
-            }
-            break;
-
-            case S_PREPARING_FOR_EVSE:
-            {
-                if(PreviousSystemStatus != _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus)
-                {
-                    PreviousSystemStatus = _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus;
-
-                    printf ("[UnconditionalCharge - S_PREPARING_FOR_EVSE]\n");
-                }
-                //printf ("tar vol = %d \n", _Voltage);
-                //printf ("tar cur = %d \n", _Current);
-
-                //清除 main timeout 機制
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->TimeoutFlag = 0;
-                //不論是什麼 type 的槍都固意設成 Chademo 不跑 Prechage step
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->Type = 9;
-
-                //充電電壓電流
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterySoc = 50;
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = 500;
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = 2;
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->AvailableChargingCurrent = 1000;
-
-                //printf ("tar vol_ = %d \n", _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage);
-               // printf ("tar cur_ = %d \n", _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent);
-
-                //****** 注意~此行為是防止 K1K2 先開導到無法升壓 ( Relay Board 在此 state 還未搭上 K1K2 )
-                //確定模組己升壓完成
-                if(_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus == 0x01 ||
-                    _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus == 0x03)
-                {
-                    printf ("First Ground Fault State (%d)\n",_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus);
-                    printf ("Wait K1K2 = %f \n", _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingVoltage);
-                    sleep(5);
-                    //EV done
-                    _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_CHARGING;
-                }
-                else if (_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus > 0x02)
-                {
-                    printf ("First Ground Fault check Fail (%d)\n",_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus);
-                    _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_TERMINATING;
-                }
-
-            }
-            break;
-
-            case S_CHARGING:
-            {
-                if(PreviousSystemStatus != _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus)
-                {
-                    PreviousSystemStatus = _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus;
-
-                    //充電電壓電流
-                    _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterySoc = 50;
-                    _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = _Voltage;
-                    _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = _Current;
-                    _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->AvailableChargingCurrent = 1000;
-
-                    printf ("[UnconditionalCharge - S_CHARGING]\n");
-                }
-
-                //ev task do this
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingPower =
-                        ((float)((_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingVoltage) * (_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->PresentChargingCurrent)) / 1000);
-
-                if (_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus == 0x02)
-                {
-                    printf ("Charging Ground Fault check Fail (%d)\n",_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus);
-                    _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_TERMINATING;
-                }
-            }
-            break;
-
-            case S_TERMINATING:
-            {
-                if(PreviousSystemStatus != _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus)
-                {
-                    PreviousSystemStatus = _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus;
-                    system("/root/Module_EvComm &");
-
-                    printf ("[UnconditionalCharge - S_TERMINATING]\n");
-                    //無阻塞偵測 keybaord 結束
-                    system(STTY_DEF TTY_PATH);
-                }
-
-                sleep(3);
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_COMPLETE;
-                return;
-            }
-            break;
-
-            case S_COMPLETE:
-            {
-                if(PreviousSystemStatus != _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus)
-                {
-                    PreviousSystemStatus = _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus;
-
-                    printf ("[UnconditionalCharge - S_COMPLETE]\n");
-                }
-                sleep(3);
-                return;
-            }
-            break;
-        }
-
-        char word[128];
-        char newString[7][10];
-        int i,j,ctr;
-
-        memset(word, 0x00, sizeof(word));
-        get_char(word);
-
-        if (strlen(word) == 0)
-            continue;
-
-        j=0; ctr=0;
-        strcpy(newString[1], "-1");
-        strcpy(newString[2], "-1");
-        for (i = 0; i <= (strlen(word)); i++)
-        {
-            if (word[i] == ' ' || word[i] == '\0' || word[i] == 10)
-            {
-                newString[ctr][j] = '\0';
-                ctr++;
-                j = 0;
-            }
-            else
-            {
-                newString[ctr][j] = word[i];
-                j++;
-            }
-        }
-
-        if(strcmp(newString[0], "chg") == 0)
-        {
-            if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0)
-                continue;
-            if (strcmp(newString[2], "-1") == 0 || strcmp(newString[2], "") == 0)
-                continue;
-
-            float _vol = atof(newString[1]);
-            float _cur = atof(newString[2]);
-
-            if (_cur <= 0 || _cur <= 0)
-                continue;
-
-            printf("vol = %f, cur = %f \n", _vol, _cur);
-            _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = _vol;
-            _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = _cur;
-        }
-        else if (strcmp(newString[0], "c") == 0)
-        {
-            printf("stop \n\r");
-            ShmSysConfigAndInfo->SysInfo.StartToChargingFlag = 0x00;
-            _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_TERMINATING;
-        }
-
-        usleep(100000);
-    }
+	int _index = atoi(v1);
+	if (!FindChargingInfoData(_index, &_chargingData[0]))
+	{
+		printf ("FindChargingInfoData error\n");
+		return;
+	}
+
+	if (strcmp(v2, "-1") == 0 || strcmp(v2, "") == 0)
+	{
+		// get
+		printf ("index = %x, status = %x\n", _index, _chargingData[_index]->SystemStatus);
+	}
+	else
+	{
+		// set
+		_chargingData[_index]->SystemStatus = atoi(v2);
+	}
+}
+
+void StopATE( char *v1){
+
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("ATEStatus = %d \n", ShmSysConfigAndInfo->ate.ATEStatus);
+	}else{
+		if(strcmp(v1, "0") == 0 ){
+			ShmSysConfigAndInfo->ate.ATEStatus = 0;
+		}else if(strcmp(v1, "1") == 0 ){
+			ShmSysConfigAndInfo->ate.ATEStatus = 1;
+		}else if(strcmp(v1, "2") == 0 ){
+			ShmSysConfigAndInfo->ate.ATEStatus = 2;
+		}else if(strcmp(v1, "3") == 0 ){
+			ShmSysConfigAndInfo->ate.ATEStatus = 3;
+		}
+	}
+}
+
+void targetCurrent(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("targetCurrent = %d \n", ShmSysConfigAndInfo->ate.targetCurrent_Value);
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.targetCurrent_Value = value;
+		printf("targetCurrent = %d \n", ShmSysConfigAndInfo->ate.targetCurrent_Value);
+	}
+}
+
+void targetVoltage(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("targetVoltage = %d \n", ShmSysConfigAndInfo->ate.targetVoltage_Value);
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.targetVoltage_Value = value;
+		printf("targetVoltage = %d \n", ShmSysConfigAndInfo->ate.targetVoltage_Value);
+	}
+}
+
+void maximumCurrent(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("maximumCurrent = %d \n", ShmSysConfigAndInfo->ate.maximumCurrent_value);
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.maximumCurrent_value = value;
+		printf("maximumCurrent = %d \n", ShmSysConfigAndInfo->ate.maximumCurrent_value);
+	}
+}
+
+void maximumVoltage(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("maximumVoltage = %d \n", ShmSysConfigAndInfo->ate.maximumVoltage_value);
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.maximumVoltage_value = value;
+		printf("maximumVoltage = %d \n", ShmSysConfigAndInfo->ate.maximumVoltage_value);
+	}
+}
+
+void presentVoltage(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("presentVoltage = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va);
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va = value;
+		printf("presentVoltage = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va);
+	}
+}
+
+
+void linkVoltage(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("linkVoltage = %d \n", ShmSysConfigAndInfo->ate.linkVoltage);
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.linkVoltage = value;
+		printf("linkVoltage = %d \n", ShmSysConfigAndInfo->ate.linkVoltage);
+	}
+}
+
+void contactorVoltage(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("contactorVoltage = %d \n", ShmSysConfigAndInfo->ate.contactorVoltage);
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.contactorVoltage = value;
+		printf("contactorVoltage = %d \n", ShmSysConfigAndInfo->ate.contactorVoltage);
+	}
+}
+
+void setChademoPrmission(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("Permission = %d \n", ShmSysConfigAndInfo->ate.Permission);
+		//return;
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.Permission = value;
+		printf("Permission = %d ", ShmSysConfigAndInfo->ate.Permission);
+	}
+}
+
+void setTotalBatteryCap(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("TotalBatteryCap = %d \n", ShmSysConfigAndInfo->ate.TotalBatteryCap);
+		//return;
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.TotalBatteryCap = value * 10;
+		printf("TotalBatteryCap = %d ", ShmSysConfigAndInfo->ate.TotalBatteryCap);
+	}
+}
+
+void setMaxBatteryCurrent(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("MaxBatteryCurrent = %d \n", ShmSysConfigAndInfo->ate.MaxBatteryCurrent);
+		//return;
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.MaxBatteryCurrent = value * 10;
+		printf("MaxBatteryCurrent = %d ", ShmSysConfigAndInfo->ate.MaxBatteryCurrent);
+	}
+}
+void setMaxBatteryVoltage(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("MaxBatteryVoltage = %d \n", ShmSysConfigAndInfo->ate.MaxBatteryVoltage);
+		//return;
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.MaxBatteryVoltage = value * 10;
+		printf("MaxBatteryVoltage = %d ", ShmSysConfigAndInfo->ate.MaxBatteryVoltage);
+	}
+}
+
+void SetChargingPermission(char *v1, char *v2, char *v3, char *v4){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("Permission = %d \n", ShmSysConfigAndInfo->ate.Permission);
+		//return;
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.Permission = value;
+		//printf("Permission = %d ", ShmSysConfigAndInfo->ate.Permission);
+	}
+
+	if(strcmp(v2, "-1") == 0 || strcmp(v2, "") == 0 ){
+			//printf("Permission = %d \n", ShmSysConfigAndInfo->ate.Permission);
+
+	}else{
+		int value = atoi(v2);
+		ShmSysConfigAndInfo->ate.TotalBatteryCap = value * 10;
+		//printf("TotalBatteryCapa = %d ", ShmSysConfigAndInfo->ate.TotalBatteryCapacity);
+	}
+
+	if(strcmp(v3, "-1") == 0 || strcmp(v3, "") == 0 ){
+				//printf("Permission = %d \n", ShmSysConfigAndInfo->ate.MaximumBatteryCurrent);
+
+	}else{
+		int value = atoi(v3);
+		if(value > 0){
+			ShmSysConfigAndInfo->ate.MaxBatteryCurrent = value * 10;
+		}else{
+			if(strcmp(v3, "0") == 0 ){
+				ShmSysConfigAndInfo->ate.MaxBatteryCurrent = value * 10;
+			}
+		}
+		printf("=====%d, %d \n", value, ShmSysConfigAndInfo->ate.MaxBatteryCurrent);
+		//printf("MaximumBatteryCurrent = %d ", ShmSysConfigAndInfo->ate.MaximumBatteryCurrent);
+	}
+	if(strcmp(v4, "-1") == 0 || strcmp(v4, "") == 0 ){
+
+		//printf("Permission = %d \n", ShmSysConfigAndInfo->ate.Permission);
+	}else{
+		int value = atoi(v4);
+
+		ShmSysConfigAndInfo->ate.MaxBatteryVoltage = value * 10;
+
+		printf("=====%d, %d \n", value, ShmSysConfigAndInfo->ate.MaxBatteryVoltage);
+		//printf("MaximumBatteryCurrent = %d ", ShmSysConfigAndInfo->ate.MaximumBatteryVoltage);
+	}
+	printf(" Permission : %d, TotalBatteryCapacity : %d, MaximumBatteryCurrent : %d, MaximumBatteryCurrent : %d  \n", ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage);
+}
+
+
+void SetRequireVoltage(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("RequireVoltage = %d \n", ShmSysConfigAndInfo->ate.RequireVoltage);
+		//return;
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.RequireVoltage = value * 10;
+		printf("RequireVoltage = %d ", ShmSysConfigAndInfo->ate.RequireVoltage);
+	}
+}
+
+void SetRequireCurrent(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("RequireCurrent = %d \n", ShmSysConfigAndInfo->ate.RequireCurrent);
+		//return;
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.RequireCurrent = value * 10;
+		printf("RequireCurrent = %d ", ShmSysConfigAndInfo->ate.RequireCurrent);
+	}
+}
+
+void SetPresentBattVoltage(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("PresentBattVoltage = %d \n", ShmSysConfigAndInfo->ate.PresentBattVoltage);
+		//return;
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.PresentBattVoltage = value * 10;
+		printf("PresentBattVoltage = %d ", ShmSysConfigAndInfo->ate.PresentBattVoltage);
+	}
+}
+void SetMinimumChargeCurrent(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("MinimumChargeCurrent = %d \n", ShmSysConfigAndInfo->ate.MinimumChargeCurrent);
+		//return;
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.MinimumChargeCurrent = value * 10;
+		printf("MinimumChargeCurrent = %d ", ShmSysConfigAndInfo->ate.MinimumChargeCurrent);
+	}
 }
-
-int main(void)
-{
-    if(InitShareMemory() == FAIL)
-    {
-        printf ("InitShareMemory = FAIL \n");
-        if(ShmStatusCodeData != NULL)
-        {
-            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
-        }
-        sleep(5);
-        return 0;
-    }
-
-    for(;;)
-    {
-        char word[128];
-        char newString[7][10];
-        int i,j,ctr;
-
-        fgets(word, sizeof(word), stdin);
-
-        j=0; ctr=0;
-        strcpy(newString[1], "-1");
-        strcpy(newString[2], "-1");
-        for (i = 0; i <= (strlen(word)); i++)
-        {
-            if (word[i] == ' ' || word[i] == '\0' || word[i] == 10)
-            {
-                newString[ctr][j] = '\0';
-                ctr++;
-                j = 0;
-            }
-            else
-            {
-                newString[ctr][j] = word[i];
-                j++;
-            }
-        }
-
-        if(strcmp(newString[0], "state") == 0)
-        {
-            if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0)
-                continue;
-
-            // 槍狀態
-            RunStatusProc(newString[1], newString[2]);
-        }
-        else if(strcmp(newString[0], "card") == 0)
-        {
-            // 刷卡狀態
-            RunCardProc(newString[1], newString[2]);
-        }
-        else if(strcmp(newString[0], "gun") == 0)
-        {
-            if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0)
-                continue;
-
-            // 插槍狀態
-            RunGunPlugitProc(newString[1], newString[2]);
-        }
-        else if(strcmp(newString[0], "lock") == 0)
-        {
-            if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0)
-                continue;
-
-            // 插槍狀態
-            GetGunLockStatusProc(newString[1], newString[2]);
-        }
-        else if(strcmp(newString[0], "sysid") == 0)
-        {
-            // 測試 sys id
-            SetSystemIDProc();
-        }
-        else if(strcmp(newString[0], "self") == 0)
-        {
-            // CSU 自我檢測狀態
-            RunSelfProc(newString[1]);
-        }
-        else if(strcmp(newString[0], "ver") == 0)
-        {
-            if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0)
-                continue;
-            // 取 FW 版號
-            GetFwVerProc(newString[1]);
-        }
-        else if (strcmp(newString[0], "update") == 0)
-        {
-            // 更新
-            FwUpdateFlagProc(newString[1]);
-        }
-        else if (strcmp(newString[0], "ac") == 0)
-        {
-            // AC contactor 狀態
-            CheckAcStatus(newString[1]);
-        }
-        else if (strcmp(newString[0], "cable") == 0)
-        {
-            if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0)
-                continue;
-            // cable check pass
-            SetCableChkStatus(newString[1], newString[2]);
-        }
-        else if (strcmp(newString[0], "pow") == 0)
-        {
-            if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0)
-                continue;
-            // cable check pass
-            SetPowerValue(newString[1], newString[2]);
-        }
-        else if (strcmp(newString[0], "model") == 0)
-        {
-            GetSystemInfo();
-        }
-        else if(strcmp(newString[0], "select") == 0)
-        {
-            // 取得 / 設定 當前選的槍號
-            GetGunSelectedNum(newString[1]);
-        }
-        else if(strcmp(newString[0], "change") == 0)
-        {
-            // 模擬按鈕改變選槍
-            ChangeGunNum();
-        }
-        else if(strcmp(newString[0], "fan") == 0)
-        {
-            // 設定風扇速度
-            SetFanSpeed(newString[1]);
-        }
-        else if(strcmp(newString[0], "speed") == 0)
-        {
-            // 取得風扇速度
-            GetFanSpeed();
-        }
-        else if(strcmp(newString[0], "debug") == 0)
-        {
-            // 設定 debug mode
-            SetDebugMode(newString[1]);
-        }
-        else if (strcmp(newString[0], "gfd") == 0)
-        {
-            // 設定盲沖使用 GFD 功能
-            SetGFDMode(newString[1]);
-        }
-        else if(strcmp(newString[0], "temp") == 0)
-        {
-            // 取得 PSU 溫度
-            GetPsuTemp();
-        }
-        else if(strcmp(newString[0], "acin") == 0)
-        {
-            // 取得三向輸入電壓
-            GetAcInputVol();
-        }
-        else if(strcmp(newString[0], "psu") == 0)
-        {
-            //如果連一個參數都沒有 (此命令不理會) 加上判斷第二參數
-            if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0)
-            {
-                printf ("PSU : Param fail..Please retry again......\n");
-                continue;
-            }
-
-            // 取得 PSU 資訊
-            GetPsuInformation(newString[1]);
-        }
-        else if (strcmp(newString[0], "cap") == 0)
-        {
-            GetConnectorCapInfo(newString[1]);
-        }
-        else if(strcmp(newString[0], "error") == 0)
-        {
-            CreateOneError(newString[1]);
-        }
-        else if (strcmp(newString[0], "auth") == 0)
-        {
-            GetAuthorizeFlag(newString[1]);
-        }
-        else if (strcmp(newString[0], "id") == 0)
-        {
-            GetOrClearId(newString[1]);
-        }
-        else if(strcmp(newString[0], "strchg") == 0)
-        {
-            //如果連一個參數都沒有 (此命令不理會) 加上判斷第二參數
-            if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0 ||
-                strcmp(newString[2], "-1") == 0 || strcmp(newString[2], "") == 0)
-            {
-                printf ("Input cmd fail ------  strchg [vol 150-1000] [cru 2-100]\n");
-                continue;
-            }
-
-            // 槍狀態
-            RunUnconditionalChargeIndex1(newString[1], newString[2], newString[3]);
-        }
-        else
-            printf ("%s\n", msg);
-        usleep(100000);
-    }
-
-    return 0;
+/*
+void SetPresentInputRequirement(char *v1, char *v2, char *v3, char *v4){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		//printf("Permission = %d \n", ShmSysConfigAndInfo->ate.Permission);
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.RequireVoltage = value * 10;
+		//printf("Permission = %d ", ShmSysConfigAndInfo->ate.Permission);
+	}
+
+	if(strcmp(v2, "-1") == 0 || strcmp(v2, "") == 0 ){
+			//printf("Permission = %d \n", ShmSysConfigAndInfo->ate.Permission);
+	}else{
+		int value = atoi(v2);
+		ShmSysConfigAndInfo->ate.RequireCurrent = value * 10;
+		//printf("TotalBatteryCapacity = %d ", ShmSysConfigAndInfo->ate.TotalBatteryCapacity);
+	}
+
+	if(strcmp(v3, "-1") == 0 || strcmp(v3, "") == 0 ){
+				//printf("Permission = %d \n", ShmSysConfigAndInfo->ate.MaximumBatteryCurrent);
+	}else{
+		int value = atoi(v3);
+		ShmSysConfigAndInfo->ate.PresentBattVoltage = value * 10;
+		//printf("MaximumBatteryCurrent = %d ", ShmSysConfigAndInfo->ate.MaximumBatteryCurrent);
+	}
+	if(strcmp(v4, "-1") == 0 || strcmp(v4, "") == 0 ){
+		//printf("Permission = %d \n", ShmSysConfigAndInfo->ate.Permission);
+	}else{
+		int value = atoi(v4);
+		ShmSysConfigAndInfo->ate.MinimumChargeCurrent = value * 10;
+		//printf("MaximumBatteryCurrent = %d ", ShmSysConfigAndInfo->ate.MaximumBatteryVoltage);
+	}
+	printf(" RequireVoltage : %d, RequireCurrent : %d, PresentBattVoltage : %d, MinimumChargeCurrent : %d  \n", ShmSysConfigAndInfo->ate.RequireVoltage, ShmSysConfigAndInfo->ate.RequireCurrent, ShmSysConfigAndInfo->ate.PresentBattVoltage, ShmSysConfigAndInfo->ate.MinimumChargeCurrent);
+
+}
+*/
+void SetSoc(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("Soc = %d \n", ShmSysConfigAndInfo->ate.chademo.id0D_req.Soc);
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.chademo.id0D_req.Soc = value;
+		printf("Soc = %d ", ShmSysConfigAndInfo->ate.chademo.id0D_req.Soc);
+	}
+	printf("%d \n",ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_DutyCycle.bits.value);
+}
+void SetRelay(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("relay = %d \n", ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status);
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status = value;
+		printf("relay = %d ", ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status);
+	}
+
+}
+
+void SetState(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("state = %d \n", ShmSysConfigAndInfo->ate.chademo.id03.state);
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.chademo.id03.state = value;
+		printf("state = %d ", ShmSysConfigAndInfo->ate.chademo.id03.state);
+	}
+
+}
+
+void SetCState(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("cstatus = %d \n", ShmSysConfigAndInfo->ate.cstatus );
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.cstatus  = value;
+		printf("cstatus = %d ", ShmSysConfigAndInfo->ate.cstatus );
+	}
+
+}
+void SetStartState(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("start state = %d \n", ShmSysConfigAndInfo->ate.status);
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.status = value;
+		printf("start state = %d ", ShmSysConfigAndInfo->ate.status);
+	}
+
+}
+void SetRelayState(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("relay state = %d \n", ShmSysConfigAndInfo->ate.chademo.relaystatus);
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.chademo.relaystatus = value;
+		printf("relay state = %d ", ShmSysConfigAndInfo->ate.chademo.relaystatus);
+	}
+
+}
+
+void SetATEState(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("ATEState = %d \n", ShmSysConfigAndInfo->ate.ATEState);
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.ATEState = value;
+		printf("ATEState = %d ", ShmSysConfigAndInfo->ate.ATEState);
+	}
+
+}
+
+void getVCCUInfo(){
+	printf("VCCU_Vehicle_LinkVoltage = %d \n", ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.VCCU_Vehicle_LinkVoltage);
+	printf("VCCU_Vehicle_ContactorVoltage = %d \n", ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.VCCU_Vehicle_ContactorVoltage);
+	printf("VCCU_Vehicle_ContactorStatus = %d \n", ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.bits.VCCU_Vehicle_ContactorStatus);
+	printf("VCCU_Vehicle_ChargePermission = %d \n", ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_ChargePermission);
+	printf("VCCU_Vehicle_IsolationMeasurem = %d \n", ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_IsolationMeasurem);
+	printf("VCCU_Vehicle_PlugLockPermissio = %d \n", ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_PlugLockPermissio);
+	printf("VCCU_Vehicle_PlugUnlockPermiss = %d \n", ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_PlugUnlockPermiss);
+	printf("VCCU_ControlPilot_Frequency = %d \n", ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_Frequency.bits.VCCU_ControlPilot_Frequency);
+	printf("ControlPilot_Voltage = %d \n", ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_Voltage.bits.value);
+	printf("VCCU_ChargeUnit_Mode = %d \n", ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_Mode);
+	printf("VCCU_ChargeUnit_State = %d \n", ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State);
+	printf("VCCU_ControlPilot_Wakeup = %d \n", ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ControlPilot_Wakeup);
+	printf("ControlPilot_Voltage = %d \n", ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ChargeUnit_MaxCurrent);
+	printf("ControlPilot_Voltage = %d \n", ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_DutyCycle.bits.value);
+	printf("VCCU_Vehicle_ContactorRequest = %d \n", ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest);
+	printf("VCCU_Vehicle_IsolationMea_0000 = %d \n", ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_IsolationMea_0000);
+	printf("VCCU_PlugPresent_Status = %d \n", ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Status);
+	printf("VCCU_PlugPresent_SelfDiagnosti = %d \n", ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_SelfDiagnosti);
+	printf("VCCU_PlugPresent_Resistance = %d \n", ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Resistance);
+	printf("VCCU_PlugPresent_Wakeup = %d \n", ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA3.VCCU_PlugPresent_Wakeup);
+	printf("VCCU_PlugLock_MotorStatus = %d \n", ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA3.VCCU_PlugLock_MotorStatus);
+	printf("VCCU_POSFeedback_SelfDiagnosti = %d \n", ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA3.VCCU_POSFeedback_SelfDiagnosti);
+	printf("VCCU_Inlet_HWVariant = %d \n", ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA4.VCCU_Inlet_HWVariant);
+	printf("VCCU_PlugLock_Output0_SelfDiag = %d \n", ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA4.VCCU_PlugLock_Output0_SelfDiag);
+	printf("VCCU_PlugLock_Output1_SelfDiag = %d \n", ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA4.VCCU_PlugLock_Output1_SelfDiag);
+	printf("VCCU_Inlet_MotorStatus = %d \n", ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus);
+	printf("VCCU_DigitalInput_Wakeup = %d \n", ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_DigitalInput_Wakeup);
+	printf("VCCU_DigitalInput_Status = %d \n", ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_DigitalInput_Status);
+	printf("VCCU_S3Switch_Status = %d \n", ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_S3Switch_Status);
+	printf("VCCU_S3Switch_DebouncedStatus = %d \n", ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_S3Switch_DebouncedStatus);
+	printf("VCCU_Inlet_ConnectionStatus = %d \n", ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_Inlet_ConnectionStatus);
+	printf("VCCU_DigitalInput_DebouncedSta = %d \n", ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_DigitalInput_DebouncedSta);
+	printf("VCCU_Inlet_MaxCurrent = %d \n", ShmSysConfigAndInfo->ate.vccu.inletStatus.VCCU_Inlet_MaxCurrent);
+	printf("VCCU_POSFeedback_Voltage = %d \n", ShmSysConfigAndInfo->ate.vccu.inletStatus.VCCU_POSFeedback_Voltage);
+	printf("VCCU_V2G_EVErrorCode = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_VehicleStatus.DATA1.VCCU_V2G_EVErrorCode);
+	printf("VCCU_V2G_BulkChargingCompleteF = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_VehicleStatus.DATA1.VCCU_V2G_BulkChargingCompleteF);
+	printf("VCCU_V2G_BulkChargingComplete = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_VehicleStatus.DATA1.VCCU_V2G_BulkChargingComplete);
+	printf("VCCU_V2G_BulkSOCFlag = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_VehicleStatus.DATA2.VCCU_V2G_BulkSOCFlag);
+	printf("VCCU_V2G_ChargingComplete = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_VehicleStatus.DATA2.VCCU_V2G_ChargingComplete);
+	printf("VCCU_V2G_EVCabinConditioning = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_VehicleStatus.DATA2.VCCU_V2G_EVCabinConditioning);
+	printf("VCCU_V2G_FullSOCFlag = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_VehicleStatus.DATA2.VCCU_V2G_FullSOCFlag);
+	printf("VCCU_V2G_EVReady = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_VehicleStatus.DATA3.VCCU_V2G_EVReady);
+	printf("VCCU_V2G_EVRESSConditioningFla = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_VehicleStatus.DATA3.VCCU_V2G_EVRESSConditioningFla);
+	printf("VCCU_V2G_EVRESSConditioning = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_VehicleStatus.DATA3.VCCU_V2G_EVRESSConditioning);
+	printf("VCCU_V2G_EVCabinConditioningFl = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_VehicleStatus.DATA3.VCCU_V2G_EVCabinConditioningFl);
+	printf("VCCU_V2G_EVPowerDeliveryParame = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_VehicleStatus.DATA4.VCCU_V2G_EVPowerDeliveryParame);
+	printf("VCCU_V2G_StateM_EnergyTra_0000 = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_VehicleStatus.DATA4.VCCU_V2G_StateM_EnergyTra_0000);
+	printf("VCCU_V2G_StateM_StateMachineSt = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt);
+	printf("VCCU_V2G_StateM_StateMachineMe = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineMe);
+	printf("VCCU_V2G_StateM_StateMachineEr = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineEr);
+	printf("VCCU_V2G_StateM_EnergyTransfer = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_EnergyTransfer);
+	printf("VCCU_V2G_StateM_InternetAvaila = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_StateM.DATA.bits.VCCU_V2G_StateM_InternetAvaila);
+	printf("VCCU_V2G_Appl_SccFuncModeReq = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_StateM.DATA.bits.VCCU_V2G_Appl_SccFuncModeReq);
+	printf("VCCU_V2G_Appl_SccChargeModeReq = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_StateM.DATA.bits.VCCU_V2G_Appl_SccChargeModeReq);
+	printf("VCCU_V2G_EVTargetVoltage_Value = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetVoltage.VCCU_V2G_EVTargetVoltage_Value.value);
+	printf("VCCU_V2G_EVTargetVoltage_UnitF = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetVoltage.VCCU_V2G_EVTargetVoltage_UnitF.value);
+	printf("VCCU_V2G_EVTargetVoltage_Unit = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetVoltage.VCCU_V2G_EVTargetVoltage_Unit.value);
+	printf("VCCU_V2G_EVTargetVoltage_Multi = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetVoltage.VCCU_V2G_EVTargetVoltage_Multi.value);
+	printf("VCCU_V2G_EVTargetCurrent_Value = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetCurrent.VCCU_V2G_EVTargetCurrent_Value.value);
+	printf("VCCU_V2G_EVTargetCurrent_UnitF = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetCurrent.VCCU_V2G_EVTargetCurrent_UnitF.value);
+	printf("VCCU_V2G_EVTargetCurrent_Unit = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetCurrent.VCCU_V2G_EVTargetCurrent_Unit.value);
+	printf("VCCU_V2G_EVTargetCurrent_Multi = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVTargetCurrent.VCCU_V2G_EVTargetCurrent_Multi.value);
+	printf("VCCU_V2G_EVMaximumVoltage_0003 = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumVoltageLimit.VCCU_V2G_EVMaximumVoltage_0003.value);
+	printf("VCCU_V2G_EVMaximumVoltage_0001 = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumVoltageLimit.VCCU_V2G_EVMaximumVoltage_0001.value);
+	printf("VCCU_V2G_EVMaximumVoltage_0000 = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumVoltageLimit.VCCU_V2G_EVMaximumVoltage_0000.value);
+	printf("VCCU_V2G_EVMaximumVoltageLimit = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumVoltageLimit.DATA1.VCCU_V2G_EVMaximumVoltageLimit);
+	printf("VCCU_V2G_EVMaximumVoltage_0002 = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumVoltageLimit.DATA1.VCCU_V2G_EVMaximumVoltage_0002);
+	printf("VCCU_V2G_EVMaximumCurrent_0003 = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumCurrentLimit.VCCU_V2G_EVMaximumCurrent_0003.value);
+	printf("VCCU_V2G_EVMaximumCurrent_0002 = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumCurrentLimit.VCCU_V2G_EVMaximumCurrent_0002.value);
+	printf("VCCU_V2G_EVMaximumCurrent_0001 = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumCurrentLimit.VCCU_V2G_EVMaximumCurrent_0001.value);
+	printf("VCCU_V2G_EVMaximumCurrentLimit = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumCurrentLimit.DATA1.VCCU_V2G_EVMaximumCurrentLimit);
+	printf("VCCU_V2G_EVMaximumCurrent_0000 = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_EVMaximumCurrentLimit.DATA1.VCCU_V2G_EVMaximumCurrent_0000);
+
+}
+
+void getChademoInfo(){
+	printf("id03 state = %d \n", ShmSysConfigAndInfo->ate.chademo.id03.state);
+	printf("id03 ProximitySignal = %d \n", ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal);
+	printf("id03 PilotVoltage = %d \n", ShmSysConfigAndInfo->ate.chademo.id03.PilotVoltage);
+	printf("id03 AlarmCode2 = %d \n", ShmSysConfigAndInfo->ate.chademo.id03.AlarmCode2);
+	printf("id03 AlarmCode3 = %d \n", ShmSysConfigAndInfo->ate.chademo.id03.AlarmCode3);
+	printf("id03 AlarmCode4 = %d \n", ShmSysConfigAndInfo->ate.chademo.id03.AlarmCode4);
+	printf("id03 AlarmCode5 = %d \n", ShmSysConfigAndInfo->ate.chademo.id03.AlarmCode5);
+	printf("id03 AlarmCode6 = %d \n", ShmSysConfigAndInfo->ate.chademo.id03.AlarmCode6);
+	printf("id06 TotalBatteryCapacity = %d \n", ShmSysConfigAndInfo->ate.chademo.id06.TotalBatteryCapacity);
+	printf("id06 Permission = %d \n", ShmSysConfigAndInfo->ate.chademo.id06.Permission);
+	printf("id06 MaximumBatteryVoltage = %d \n", ShmSysConfigAndInfo->ate.chademo.id06.MaximumBatteryVoltage);
+	printf("id06 MaximumBatteryCurrent = %d \n", ShmSysConfigAndInfo->ate.chademo.id06.MaximumBatteryCurrent);
+	printf("id06 MaxChargingTimeMin = %d \n", ShmSysConfigAndInfo->ate.chademo.id06.MaxChargingTimeMin);
+	printf("id07 PresentInputVoltage = %d \n", ShmSysConfigAndInfo->ate.chademo.id07.PresentInputVoltage);
+	printf("id07 PresentInputCurrent = %d \n", ShmSysConfigAndInfo->ate.chademo.id07.PresentInputCurrent);
+	printf("id08 RequireVoltage = %d \n", ShmSysConfigAndInfo->ate.chademo.id08.RequireVoltage);
+	printf("id08 RequireCurrent = %d \n", ShmSysConfigAndInfo->ate.chademo.id08.RequireCurrent);
+	printf("id08 PresentBattVoltage = %d \n", ShmSysConfigAndInfo->ate.chademo.id08.PresentBattVoltage);
+	printf("id08 MinimumChargeCurrent = %d \n", ShmSysConfigAndInfo->ate.chademo.id08.MinimumChargeCurrent);
+	printf("id08 ChargeAllow = %d \n", ShmSysConfigAndInfo->ate.chademo.id08.ChargeAllow);
+	printf("id09_ack ChargingMode = %d \n", ShmSysConfigAndInfo->ate.chademo.id09_ack.ChargingMode);
+	printf("id09_ack DcEvState = %d \n", ShmSysConfigAndInfo->ate.chademo.id09_ack.DcEvState);
+	printf("id09_ack EvsePresentOutputCurrent = %d \n", ShmSysConfigAndInfo->ate.chademo.id09_ack.EvsePresentOutputCurrent);
+	printf("id09_ack EvsePresentOutputVoltage = %d \n", ShmSysConfigAndInfo->ate.chademo.id09_ack.EvsePresentOutputVoltage);
+	printf("id09_ack RemainingTimeSec = %d \n", ShmSysConfigAndInfo->ate.chademo.id09_ack.RemainingTimeSec);
+	printf("id0A_ack EvseMinChargeVoltage = %d \n", ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMaxChargeCurrent);
+	printf("id0A_ack EvseMaxChargeVoltage = %d \n", ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMaxChargeVoltage);
+	printf("id0A_ack EvseMinChargeCurrent = %d \n", ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMinChargeCurrent);
+	printf("id0A_ack EvseMinChargeCurrent = %d \n", ShmSysConfigAndInfo->ate.chademo.id0A_ack.EvseMinChargeVoltage);
+	printf("id0B AlarmCode1 = %d \n", ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode1);
+	printf("id0B AlarmCode2 = %d \n", ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode2);
+	printf("id0B AlarmCode3 = %d \n", ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode3);
+	printf("id0B AlarmCode4 = %d \n", ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode4);
+	printf("id0B AlarmCode5 = %d \n", ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode5);
+	printf("id0B AlarmCode6 = %d \n", ShmSysConfigAndInfo->ate.chademo.id0B.AlarmCode6);
+	printf("id0B EvStopReason = %d \n", ShmSysConfigAndInfo->ate.chademo.id0B.EvStopReason);
+	printf("id0D_ack soc = %d \n", ShmSysConfigAndInfo->ate.chademo.id0D_ack.soc);
+	printf("id0D_ack soc = %d \n", ShmSysConfigAndInfo->ate.chademo.id0D_ack.K1K2OnOff);
+	printf("id0D_req K1K2Status = %d \n", ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status);
+	printf("id0D_req Soc = %d \n", ShmSysConfigAndInfo->ate.chademo.id0D_req.Soc);
+	printf("relaystatus = %d \n", ShmSysConfigAndInfo->ate.chademo.relaystatus);
+}
+
+void getChromaInfo(){
+	printf("EVStatus = %d \n", ShmSysConfigAndInfo->ate.chroma.evstaus.data);
+	printf("Connector_2 TargetVoltage = %d \n", ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetVoltage);
+	printf("Connector_2 TargetCurrent = %d \n", ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.TargetCurrent);
+	printf("Connector_2 PresentVoltage = %d \n", ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentVoltage);
+	printf("Connector_2 PresentCurrent = %d \n", ShmSysConfigAndInfo->ate.chroma.ate_Connector_2.PresentCurrent);
+	printf("Connector_1 TargetVoltage = %d \n", ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetVoltage);
+	printf("Connector_1 TargetCurrent = %d \n", ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.TargetCurrent);
+	printf("Connector_1 PresentVoltage = %d \n", ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentVoltage);
+	printf("Connector_1 PresentCurrent = %d \n", ShmSysConfigAndInfo->ate.chroma.ate_Connector_1.PresentCurrent);
+	printf("Boot_Notification1 = %d \n", ShmSysConfigAndInfo->ate.chroma.bootNotification.boo1);
+	printf("Boot_Notification2 = %d \n", ShmSysConfigAndInfo->ate.chroma.bootNotification.boo2);
+}
+
+void setModeChange(char *v1){
+	if(strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0 ){
+		printf("mode change = %d \n", ShmSysConfigAndInfo->ate.ateMode);
+	}else{
+		int value = atoi(v1);
+		ShmSysConfigAndInfo->ate.ateMode = value;
+		printf("setModeChange = %d ", ShmSysConfigAndInfo->ate.ateMode);
+	}
+}
+
+int main()
+{
+	if(InitShareMemory() == FAIL)
+		{
+			printf ("InitShareMemory = FAIL \n");
+			if(ShmStatusCodeData != NULL)
+			{
+				ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
+			}
+			sleep(5);
+			return 0;
+		}
+
+	for(;;)
+	{
+		char word[256];
+		char newString[7][20];
+		int i,j,ctr;
+
+		fgets(word, sizeof(word), stdin);
+
+		j=0; ctr=0;
+		strcpy(newString[1], "-1");
+		strcpy(newString[2], "-1");
+		for (i = 0; i <= (strlen(word)); i++)
+		{
+			if (word[i] == ' ' || word[i] == '\0' || word[i] == 10)
+			{
+				newString[ctr][j] = '\0';
+				ctr++;
+				j = 0;
+			}
+			else
+			{
+				newString[ctr][j] = word[i];
+				j++;
+			}
+		}
+
+		//printf("=====%s %s\n", newString[0], newString[1]);
+		if(strcmp(newString[0], "stop") == 0)
+		{
+			//if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0)
+				//continue;
+			// 槍狀態
+			StopATE(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "targetCurrent") == 0){//
+			targetCurrent(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "targetVoltage") == 0){//
+			targetVoltage(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "maximumCurrent") == 0){//
+			maximumCurrent(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "maximumVoltage") == 0){//
+			maximumVoltage(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "presentVoltage") == 0){//
+			presentVoltage(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "linkVoltage") == 0){//
+			linkVoltage(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "contactorVoltage") == 0){//
+			contactorVoltage(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "chademoPrmission") == 0){
+			//SetChargingPermission(newString[1], newString[2], newString[3], newString[4]);
+			setChademoPrmission(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "totalBatteryCap") == 0){
+			setTotalBatteryCap(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "maxBatteryCurrent") == 0){
+			setMaxBatteryCurrent(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "maxBatteryVoltage") == 0){
+			setMaxBatteryVoltage(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "requireVoltage") == 0){
+			SetRequireVoltage(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "requireCurrent") == 0){
+			SetRequireCurrent(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "presentBattVoltage") == 0){
+			SetPresentBattVoltage(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "minimumChargeCurrent") == 0){//
+			SetMinimumChargeCurrent(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "soc") == 0){//
+			SetSoc(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "relay") == 0){//
+			SetRelay(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "cstate") == 0){//
+			SetState(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "startstate") == 0){//
+			SetStartState(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "crelaystate") == 0){//
+			SetRelayState(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "ccstate") == 0){//
+			SetCState(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "vccuinfo") == 0){//
+			getVCCUInfo();
+			continue;
+		}else if(strcmp(newString[0], "chademoinfo") == 0){//
+			getChademoInfo();
+			continue;
+		}else if(strcmp(newString[0], "chromainfo") == 0){//
+			getChromaInfo();
+			continue;
+		}else if(strcmp(newString[0], "modeChange") == 0){//
+			setModeChange(newString[1]);
+			continue;
+		}else if(strcmp(newString[0], "ateState") == 0){//
+			SetATEState(newString[1]);
+			continue;
+		}
+
+		printf ("%s\n", msg);
+		usleep(100000);
+	}
+   return(0);
 }

+ 85 - 568
EVSE/Projects/ATE/Apps/internalComm.c

@@ -27,7 +27,6 @@
 #include <fcntl.h>      /*檔控制定義*/
 #include <termios.h>    /*PPSIX 終端控制定義*/
 #include <errno.h>      /*錯誤號定義*/
-#include <errno.h>
 #include <string.h>
 #include <time.h>
 #include <ctype.h>
@@ -38,9 +37,8 @@
 #define PASS                1
 #define FAIL                -1
 
-struct Address Addr={0x01,0x02,0x03,0x05,0x06,0xFF};
-struct Command Cmd={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x24,0x27,0x28,0x29,0x2C,0x81,0x83,
-                    0x85,0x86,0x87,0x88,0x089,0x8A,0x8B,0x8C,0x90,0x93,0xe0,0xe1,0xe2,0xe3};
+struct Address Addr={0x01,0x02,0x03,0x04,0xFF};
+struct Command Cmd={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x81,0x85,0x86,0xe0,0xe1,0xe2,0xe3};
 
 int tranceiveRelDelayTime(int fd, unsigned char* cmd, unsigned char cmd_len, unsigned char* rx, unsigned short _delay)
 {
@@ -381,50 +379,45 @@ unsigned char Query_Relay_Output(unsigned char fd, unsigned char targetAddr, Rel
 
 unsigned char Query_Gfd_Adc(unsigned char fd, unsigned char targetAddr, Gfd *Ret_Buf)
 {
-    unsigned char result = FAIL;
-    unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Gfd_Adc, 0x00, 0x00, 0x00};
-    unsigned char rx[512];
-    unsigned char chksum = 0x00;
-    unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
-
-//  for(int i = 0; i < 7; i++)
-//      printf ("tx = %d \n", tx[i]);
-    if(len > 6)
-    {
-        if (len < 6+(rx[4] | rx[5]<<8))
-        {
-            //printf("Query_Gfd_Adc fail \n");
-            return result;
-        }
-
-//      for(int i = 0; i < len; i++)
-//          printf ("rx = %d \n", rx[i]);
-
-        for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
-        {
-            chksum ^= rx[6+idx];
-        }
-
-        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
-           (rx[2] == tx[1]) &&
-           (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
-        {
-            Ret_Buf->Resister_conn1 = (rx[6] | (rx[7] << 8));
-            Ret_Buf->voltage_conn1 = (rx[8] | (rx[9] << 8));
-            Ret_Buf->result_conn1 = rx[10];
-            Ret_Buf->rb_step_1 = rx[11];
-
-            Ret_Buf->Resister_conn2 = (rx[12] | (rx[13] << 8));
-            Ret_Buf->voltage_conn2 = (rx[14] | (rx[15] << 8));
-            Ret_Buf->result_conn2 = rx[16];
-            Ret_Buf->rb_step_2 = rx[17];
-
-            result = PASS;
-        }
-    }
-
-    return result;
+	unsigned char result = FAIL;
+	unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Gfd_Adc, 0x00, 0x00, 0x00};
+	unsigned char rx[512];
+	unsigned char chksum = 0x00;
+	unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
+
+	if(len > 6)
+	{
+		if (len < 6+(rx[4] | rx[5]<<8))
+			return result;
+
+		for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
+		{
+			chksum ^= rx[6+idx];
+		}
+
+		printf("chksum = %d \n", chksum);
+		printf("rx[2] == %d tx[1] = %d \n", rx[2], tx[1]);
+		printf("rx[1] == %d tx[2] = %d \n", rx[1], tx[2]);
+		printf("rx[3] == %d tx[3] = %d \n", rx[3], tx[3]);
+		printf("chksum = %d \n", chksum);
+//		if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
+//		   (rx[2] == tx[1]) &&
+//		   (rx[1] == tx[2]) &&
+//		   (rx[3] == tx[3]))
+		if(
+				   (rx[2] == tx[1]) &&
+				   (rx[1] == tx[2]) &&
+				   (rx[3] == tx[3]))
+		{
+			Ret_Buf->Resister = (rx[6] | (rx[7]<<8) | (rx[8]<<16) | (rx[9]<<24));
+			Ret_Buf->voltage = rx[10] | (rx[11]<<8);
+			Ret_Buf->result = rx[12];
+
+			result = PASS;
+		}
+	}
+
+	return result;
 }
 
 unsigned char Query_Gpio_Input(unsigned char fd, unsigned char targetAddr, Gpio_in *Ret_Buf)
@@ -475,36 +468,6 @@ unsigned char Query_Gpio_Input(unsigned char fd, unsigned char targetAddr, Gpio_
     return result;
 }
 
-unsigned char Query_Model_Name(unsigned char fd, unsigned char targetAddr, unsigned char *modelname)
-{
-    unsigned char result = FAIL;
-    unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Model_Name, 0x00, 0x00, 0x00};
-    unsigned char rx[512];
-    unsigned char chksum = 0x00;
-    unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
-
-    if(len > 6)
-    {
-        if (len < 6+(rx[4] | rx[5]<<8))
-            return result;
-
-        for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
-        {
-            chksum ^= rx[6+idx];
-        }
-
-        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
-           (rx[2] == tx[1]) &&
-           (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
-        {
-            strncpy((char *)modelname, (char *)(rx + 6), (rx[4] | rx[5]<<8));
-            result = PASS;
-        }
-    }
-
-    return result;
-}
 
 unsigned char Config_Fan_Speed(unsigned char fd, unsigned char targetAddr, FanSpeed *Set_Buf)
 {
@@ -589,7 +552,6 @@ unsigned char Config_Relay_Output(unsigned char fd, unsigned char targetAddr, Re
 
     return result;
 }
-
 unsigned char Config_Gpio_Output(unsigned char fd, unsigned char targetAddr, Gpio_out *Set_Buf)
 {
     unsigned char result = FAIL;
@@ -597,29 +559,23 @@ unsigned char Config_Gpio_Output(unsigned char fd, unsigned char targetAddr, Gpi
     unsigned char rx[512];
     unsigned char chksum = 0x00;
 
-    tx[6] |= (Set_Buf->AC_Connector?0x01:0x00);
+    for (int idx = 0; idx < 2; idx++)
+        tx[6] |= (Set_Buf->Button_LED[idx] ? 0x01:0x00) << (0+idx);
 
-    for(int idx = 0;idx<2;idx++)
-        tx[6] |= (Set_Buf->Button_LED[idx]?0x01:0x00)<<(1+idx);
+    for (int idx = 0; idx < 4; idx++)
+            tx[6] |= (Set_Buf->System_LED[idx] ? 0x01:0x00) << (2+idx);
 
-    for(int idx = 0;idx<4;idx++)
-        tx[6] |= (Set_Buf->System_LED[idx]?0x01:0x00)<<(3+idx);
+    tx[6] |= (Set_Buf->AC_Connector ? 0x01:0x00) << 6;
+    tx[6] |= (Set_Buf->AC_Breaker ? 0x01:0x00) << 7;
 
-    for(int idx = 0;idx<(tx[4] | tx[5]<<8);idx++)
+    for (int idx = 0; idx < (tx[4] | tx[5] << 8); idx++)
         chksum ^= tx[6+idx];
+    tx[7] = chksum;
 
-    tx[14] = chksum;
-
-    unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
-
-    if(len > 6)
+    if (tranceive(fd, tx, sizeof(tx), rx) > 0)
     {
-        if (len < 6+(rx[4] | rx[5]<<8))
-            return result;
-
         chksum = 0x00;
-
-        for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
+        for(int idx=0;idx<(rx[4] | rx[5]<<8);idx++)
         {
             chksum ^= rx[6+idx];
         }
@@ -627,7 +583,8 @@ unsigned char Config_Gpio_Output(unsigned char fd, unsigned char targetAddr, Gpi
         if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
            (rx[2] == tx[1]) &&
            (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
+           (rx[3] == tx[3]) &&
+           (rx[6] == tx[6]))
         {
             result = PASS;
         }
@@ -636,127 +593,49 @@ unsigned char Config_Gpio_Output(unsigned char fd, unsigned char targetAddr, Gpi
     return result;
 }
 
-unsigned char Config_Gfd_Value(unsigned char fd, unsigned char targetAddr, Gfd_config *Set_Buf)
-{
-    unsigned char result = FAIL;
-    unsigned char tx[9] = {0xaa, 0x00, targetAddr, Cmd.config_Gfd_Value, 0x02, 0x00, 0x00, 0x00, 0x00};
-    unsigned char rx[512];
-    unsigned char chksum = 0x00;
-
-    tx[6] = Set_Buf->index;
-    tx[7] = Set_Buf->state;
-
-    for(int idx = 0; idx<(tx[4] | tx[5]<<8);idx++)
-        chksum ^= tx[6+idx];
-
-    tx[8] = chksum;
 
-    unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
-
-    if(len > 6)
-    {
-        if (len < 6+(rx[4] | rx[5]<<8))
-            return result;
-
-        chksum = 0x00;
-
-        for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
-        {
-            chksum ^= rx[6+idx];
-        }
-
-        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
-           (rx[2] == tx[1]) &&
-           (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
-        {
-            result = PASS;
-        }
-    }
-
-    return result;
-}
-
-unsigned char Config_Model_Name(unsigned char fd, unsigned char targetAddr, unsigned char *modelname)
+unsigned char Config_Gfd_Value(unsigned char fd, unsigned char targetAddr, Gfd_config *Set_Buf)
 {
-    unsigned char result = FAIL;
-    unsigned char tx[21] = {0xaa, 0x00, targetAddr, Cmd.config_Model_Name, 0x0E, 0x00,
-                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-    unsigned char rx[512];
-    unsigned char chksum = 0x00;
+	unsigned char result = FAIL;
+	unsigned char tx[11] = {0xaa, 0x00, targetAddr, Cmd.config_Gfd_Value, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00};
+	unsigned char rx[512];
+	unsigned char chksum = 0x00;
 
-    memcpy(tx + 6, modelname, 14);
+	tx[6] = (unsigned char)(Set_Buf->reqVol) & 0xff;
+	tx[7] = ((unsigned char)(Set_Buf->reqVol) >> 8) & 0xff;
+	tx[8] = (unsigned char)(Set_Buf->resister) & 0xff;
+	tx[9] = ((unsigned char)(Set_Buf->resister) >> 8) & 0xff;
 
-    for(int idx = 0; idx<(tx[4] | tx[5]<<8);idx++)
-        chksum ^= tx[6+idx];
+	for(int idx = 0;idx<(tx[4] | tx[5]<<8);idx++)
+		chksum ^= tx[6+idx];
+	tx[10] = chksum;
 
-    tx[20] = chksum;
-
-//  for(int i = 0; i < 21; i++)
-//              printf ("tx = %x \n", tx[i]);
-    unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
-//  for(int i = 0; i < len; i++)
-//                  printf ("rx = %x \n", rx[i]);
-    if(len > 6)
-    {
-        if (len < 6+(rx[4] | rx[5]<<8))
-            return result;
+	unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
 
-        chksum = 0x00;
+	if(len > 6)
+	{
+		if (len < 6+(rx[4] | rx[5]<<8))
+			return result;
 
-        for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
-        {
-            chksum ^= rx[6+idx];
-        }
+		chksum = 0x00;
+		for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
+		{
+			chksum ^= rx[6+idx];
+		}
 
-        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
-           (rx[2] == tx[1]) &&
-           (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]) &&
-           rx[6] == PASS)
-        {
-            result = PASS;
-        }
-    }
+		if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
+		   (rx[2] == tx[1]) &&
+		   (rx[1] == tx[2]) &&
+		   (rx[3] == tx[3]) &&
+		   (rx[6] == tx[6]))
+		{
+			result = PASS;
+		}
+	}
 
-    return result;
+	return result;
 }
 
-unsigned char Config_Rtc_Data(unsigned char fd, unsigned char targetAddr, Rtc *Set_Buf)
-{
-    unsigned char result = FAIL;
-    unsigned char tx[21] = {0xaa, 0x00, targetAddr, Cmd.config_Rtc_Data, 0x0E, 0x00, Set_Buf->RtcData[0], Set_Buf->RtcData[1],
-                            Set_Buf->RtcData[2], Set_Buf->RtcData[3], Set_Buf->RtcData[4], Set_Buf->RtcData[5], Set_Buf->RtcData[6], Set_Buf->RtcData[7],
-                            Set_Buf->RtcData[8], Set_Buf->RtcData[9], Set_Buf->RtcData[10], Set_Buf->RtcData[11], Set_Buf->RtcData[12], Set_Buf->RtcData[13]};
-    unsigned char rx[512];
-    unsigned char chksum = 0x00;
-
-    for (int idx = 0; idx < (tx[4] | tx[5] << 8); idx++)
-        chksum ^= tx[6 + idx];
-
-    tx[20] = chksum;
-
-    if (tranceive(fd, tx, sizeof(tx), rx) > 0)
-    {
-        chksum = 0x00;
-
-        for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
-        {
-            chksum ^= rx[6 + idx];
-        }
-
-        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
-           (rx[2] == tx[1]) &&
-           (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]) &&
-           rx[6] == PASS)
-        {
-            result = PASS;
-        }
-    }
-
-    return result;
-}
 
 unsigned char Update_Start(unsigned char fd, unsigned char targetAddr, unsigned int crc32)
 {
@@ -909,366 +788,4 @@ unsigned char Update_Finish(unsigned char fd, unsigned char targetAddr)
     return result;
 }
 
-unsigned char Query_AC_Status(unsigned char fd, unsigned char targetAddr, Ac_Status *Ret_Buf)
-{
-    unsigned char result = FAIL;
-    unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_ac_status, 0x00, 0x00, 0x00};
-    unsigned char rx[512];
-    unsigned char chksum = 0x00;
-    unsigned char len = tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100);
-
-    if(len > 6)
-    {
-        if (len < 6+(rx[4] | rx[5]<<8))
-            return result;
-
-        for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
-        {
-            chksum ^= rx[6+idx];
-        }
-
-        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
-           (rx[2] == tx[1]) &&
-           (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
-        {
-            Ret_Buf->CpStatus = rx[6];
-            Ret_Buf->CurLimit = (rx[7] | (rx[8] << 8));
-            Ret_Buf->PilotVol_P = (rx[9] | (rx[10] << 8));
-            Ret_Buf->PilotVol_N = (rx[11] | (rx[12] << 8));
-            Ret_Buf->LockStatus = rx[13];
-            Ret_Buf->RelayStatus = rx[14];
-            Ret_Buf->ShutterStatus = rx[15];
-            Ret_Buf->MeterStatus = rx[16];
-            Ret_Buf->PpStatus = rx[17];
-            Ret_Buf->MaxCurrent = rx[18];
-            Ret_Buf->RotateSwitchStatus = rx[19];
-//
-//          Ret_Buf->AC_Connector       = (rx[6] >> 0) & 0x01;
-//          Ret_Buf->AC_MainBreaker     = (rx[6] >> 1) & 0x01;
-//          Ret_Buf->SPD                = (rx[6] >> 2) & 0x01;
-//          Ret_Buf->Door_Open          = (rx[6] >> 3) & 0x01;
-//          Ret_Buf->GFD[0]             = (rx[6] >> 4) & 0x01;
-//          Ret_Buf->GFD[1]             = (rx[6] >> 5) & 0x01;
-//          Ret_Buf->AC_Drop            = (rx[6] >> 6) & 0x01;
-//
-//          Ret_Buf->Emergency_IO       = (rx[7] >> 0) & 0x01;
-//
-//          Ret_Buf->Button_Emergency_Press = (rx[8] >> 0) & 0x01;
-//          Ret_Buf->Button_On_Press    = (rx[8] >> 1) & 0x01;
-//          Ret_Buf->Button_Off_Press   = (rx[8] >> 2) & 0x01;
-//          Ret_Buf->Key_1_Press        = (rx[8] >> 3) & 0x01;
-//          Ret_Buf->Key_2_Press        = (rx[8] >> 4) & 0x01;
-//          Ret_Buf->Key_3_Press        = (rx[8] >> 5) & 0x01;
-//          Ret_Buf->Key_4_Press        = (rx[8] >> 6) & 0x01;
-
-            result = PASS;
-        }
-    }
-
-    return result;
-}
-
-unsigned char Query_AC_Alarm_Code(unsigned char fd, unsigned char targetAddr, Ac_Alarm_code *Ret_Buf)
-{
-    unsigned char result = FAIL;
-    unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_ac_alarm_code, 0x00, 0x00};
-    unsigned char rx[512];
-    unsigned char chksum = 0x00;
-    unsigned char len = tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100);
-
-    if(len > 6)
-    {
-        if (len < 6+(rx[4] | rx[5]<<8))
-            return result;
 
-        for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
-        {
-            chksum ^= rx[6+idx];
-        }
-
-        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
-           (rx[2] == tx[1]) &&
-           (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
-        {
-            Ret_Buf->AcAlarmCode = rx[6] + (rx[7] << 8) + (rx[8] << 16) + (rx[9] << 24);
-            result = PASS;
-        }
-    }
-
-    return result;
-}
-
-unsigned char Query_Charging_Energy(unsigned char fd, unsigned char targetAddr, Ac_Charging_energy *Ret_Buf)
-{
-    unsigned char result = FAIL;
-    unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_ac_output_energy, 0x00, 0x00,0x00};
-    unsigned char rx[512];
-    unsigned char chksum = 0x00;
-    unsigned char len = tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100);
-
-    if(len > 6)
-    {
-        if (len < 6+(rx[4] | rx[5]<<8))
-            return result;
-
-        for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
-        {
-            chksum ^= rx[6+idx];
-        }
-
-        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
-           (rx[2] == tx[1]) &&
-           (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
-        {
-            Ret_Buf->Energy = rx[6] + (rx[7] << 8) + (rx[8] << 16) + (rx[9] << 24);
-            result = PASS;
-        }
-    }
-
-    return result;
-}
-
-unsigned char Query_Charging_Current(unsigned char fd, unsigned char targetAddr, Ac_Charging_current *Ret_Buf)
-{
-    unsigned char result = FAIL;
-    unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_ac_output_current, 0x00, 0x00, 0x00};
-    unsigned char rx[512];
-    unsigned char chksum = 0x00;
-    unsigned char len = tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100);
-
-    if(len > 6)
-    {
-        if (len < 6+(rx[4] | rx[5]<<8))
-            return result;
-
-        for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
-        {
-            chksum ^= rx[6+idx];
-        }
-
-        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
-           (rx[2] == tx[1]) &&
-           (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
-        {
-            Ret_Buf->OuputCurrentL1 = rx[6] + (rx[7] << 8);
-            Ret_Buf->OuputCurrentL2 = rx[8] + (rx[9] << 8);
-            Ret_Buf->OuputCurrentL3 = rx[10] + (rx[11] << 8);
-            result = PASS;
-        }
-    }
-
-    return result;
-}
-
-unsigned char Config_LED_Status(unsigned char fd, unsigned char targetAddr, Ac_Led_Status *Ret_Buf)
-{
-    unsigned char result = FAIL;
-    unsigned char tx[12] = {0xaa, 0x00, targetAddr, Cmd.config_ac_led_status, 0x05, 0x00, Ret_Buf->ActionMode, (Ret_Buf->AcAlarmCode >> 0) & 0xFF,
-                            (Ret_Buf->AcAlarmCode >> 8) & 0xFF, (Ret_Buf->AcAlarmCode >> 16) & 0xFF, (Ret_Buf->AcAlarmCode >> 24) & 0xFF};
-    unsigned char rx[512];
-    unsigned char chksum = 0x00;
-
-    for (int idx = 0; idx < (tx[4] | tx[5] << 8); idx++)
-        chksum ^= tx[6 + idx];
-
-    tx[11] = chksum;
-
-    if (tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100) > 0)
-    {
-        chksum = 0x00;
-        for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
-        {
-            chksum ^= rx[6 + idx];
-        }
-
-        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
-            (rx[2] == tx[1]) &&
-            (rx[1] == tx[2]) &&
-            (rx[3] == tx[3]) &&
-            rx[6] == PASS)
-        {
-            result = PASS;
-        }
-    }
-
-    return result;
-}
-
-unsigned char Config_Legacy_Req(unsigned char fd, unsigned char targetAddr, unsigned char _switch)
-{
-    unsigned char result = FAIL;
-    unsigned char tx[9] = {0xaa, 0x00, targetAddr, Cmd.config_Legacy_Req, 0x02, 0x00, _switch, 0x00};
-    unsigned char rx[512];
-    unsigned char chksum = 0x00;
-
-    for (int idx = 0; idx < (tx[4] | tx[5] << 8); idx++)
-        chksum ^= tx[6 + idx];
-
-    tx[8] = chksum;
-
-    if (tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100) > 0)
-    {
-        chksum = 0x00;
-
-        for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
-        {
-            chksum ^= rx[6 + idx];
-        }
-
-        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
-           (rx[2] == tx[1]) &&
-           (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]) &&
-           rx[6] == PASS)
-        {
-            result = PASS;
-        }
-    }
-
-    return result;
-}
-
-unsigned char Config_Ac_Duty(unsigned char fd, unsigned char targetAddr, unsigned char _value)
-{
-    unsigned char result = FAIL;
-    unsigned char tx[8] = {0xaa, 0x00, targetAddr, Cmd.config_ac_duty, 0x01, 0x00, _value};
-    unsigned char rx[512];
-    unsigned char chksum = 0x00;
-
-    for (int idx = 0; idx < (tx[4] | tx[5] << 8); idx++)
-        chksum ^= tx[6 + idx];
-
-    tx[7] = chksum;
-
-    if (tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100) > 0)
-    {
-        chksum = 0x00;
-
-        for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
-        {
-            chksum ^= rx[6 + idx];
-        }
-
-        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
-           (rx[2] == tx[1]) &&
-           (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]) &&
-           rx[6] == PASS)
-        {
-            result = PASS;
-        }
-    }
-
-    return result;
-}
-
-unsigned char Config_CSU_Mode(unsigned char fd, unsigned char targetAddr)
-{
-    unsigned char result = FAIL;
-    unsigned char tx[9] = {0xaa, 0x00, targetAddr, Cmd.config_csu_mode, 0x02, 0x00, 0x01, 0x00};
-    unsigned char rx[512];
-    unsigned char chksum = 0x00;
-
-    for (int idx = 0; idx < (tx[4] | tx[5] << 8); idx++)
-        chksum ^= tx[6 + idx];
-
-    tx[7] = chksum;
-
-    if (tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100) > 0)
-    {
-        chksum = 0x00;
-
-        for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
-        {
-            chksum ^= rx[6 + idx];
-        }
-
-        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
-           (rx[2] == tx[1]) &&
-           (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]) &&
-           rx[6] == PASS)
-        {
-            result = PASS;
-        }
-    }
-
-    return result;
-}
-
-unsigned char Config_Reset_MCU(unsigned char fd, unsigned char targetAddr)
-{
-    unsigned char result = FAIL;
-    unsigned char tx[9] = {0xaa, 0x00, targetAddr, Cmd.config_reset_mcu, 0x02, 0x00, 0x01, 0x00};
-    unsigned char rx[512];
-    unsigned char chksum = 0x00;
-
-    for (int idx = 0; idx < (tx[4] | tx[5] << 8); idx++)
-        chksum ^= tx[6 + idx];
-
-    tx[7] = chksum;
-
-    if (tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100) > 0)
-    {
-        chksum = 0x00;
-
-        for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
-        {
-            chksum ^= rx[6 + idx];
-        }
-
-        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
-           (rx[2] == tx[1]) &&
-           (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]) &&
-           rx[6] == PASS)
-        {
-            result = PASS;
-        }
-    }
-
-    return result;
-}
-
-unsigned char Config_Led_Color(unsigned char fd, unsigned char targetAddr, Led_Color *Ret_Buf)
-{
-    unsigned char result = FAIL;
-    unsigned char tx[13] = {0xaa, 0x00, targetAddr, Cmd.config_led_color, 0x06, 0x00,
-                            Ret_Buf->Connect_1_Red, Ret_Buf->Connect_1_Green, Ret_Buf->Connect_1_Blue,
-                            Ret_Buf->Connect_2_Red, Ret_Buf->Connect_2_Green, Ret_Buf->Connect_2_Blue};
-    unsigned char rx[512];
-    unsigned char chksum = 0x00;
-
-    for (int idx = 0; idx < (tx[4] | tx[5] << 8); idx++)
-        chksum ^= tx[6 + idx];
-
-    tx[13] = chksum;
-
-    unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
-
-    if(len > 6)
-    {
-        if (len < 6+(rx[4] | rx[5]<<8))
-            return result;
-
-        for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
-        {
-            chksum ^= rx[6 + idx];
-        }
-
-        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
-           (rx[2] == tx[1]) &&
-           (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]) &&
-           (rx[6] == PASS))
-        {
-            result = PASS;
-        }
-    }
-
-    return result;
-}

+ 99 - 195
EVSE/Projects/ATE/Apps/internalComm.h

@@ -1,244 +1,162 @@
 /*
  * internalComm.h
  *
- *  Created on: 2019年5月7日
+ *  Created on: 2019ฆ~5ค๋7ค้
  *      Author: foluswen
  */
 
-#ifndef INTERNALCOMM_H_
-#define INTERNALCOMM_H_
+
 
 extern struct Address
 {
-    unsigned char Aux;
-    unsigned char Fan;
-    unsigned char Relay;
-    unsigned char AcPlug;
-    unsigned char Led;
-    unsigned char Broadcast;
+	unsigned char Aux;
+	unsigned char Fan;
+	unsigned char Relay;
+    unsigned char IoExtend;
+	unsigned char Broadcast;
 }Addr;
 
 extern struct Command
 {
-    unsigned char query_FW_Ver;                 //0x01
-    unsigned char query_HW_Ver;                 //0x02
-    unsigned char query_Present_InputVoltage;   //0x03
-    unsigned char query_Present_OutputVoltage;  //0x04
-    unsigned char query_Fan_Speed;              //0x05
-    unsigned char query_Temperature;            //0x06
-    unsigned char query_Aux_PowerVoltage;       //0x07
-    unsigned char query_Relay_Output;           //0x08
-    unsigned char query_Gfd_Adc;                //0x09
-    unsigned char query_Gpio_In;                //0x0a
-
-    unsigned char query_Model_Name;             //0x24
-    unsigned char query_ac_output_current;      //0x27
-    unsigned char query_ac_status;              //0x28
-    unsigned char query_ac_alarm_code;          //0x29
-
-    unsigned char query_ac_output_energy;       //0x2C
-
-    unsigned char config_Fan_Speed;             //0x81
-    unsigned char config_Model_Name;            //0x83
-    unsigned char config_Relay_Output;          //0x85
-    unsigned char config_Gpio_Output;           //0x86
-    unsigned char config_Rtc_Data;              //0x87
-    unsigned char config_ac_led_status;         //0x88
-
-    unsigned char config_ac_duty;               //0x89
-    unsigned char config_Legacy_Req;            //0x8A
-    unsigned char config_Gfd_Value;             //0x8B
-    unsigned char config_reset_mcu;             //0x8C
-
-    unsigned char config_csu_mode;              //0x90
-
-    unsigned char config_led_color;             //0x93
-
-    unsigned char update_Start;                 //0xe0
-    unsigned char update_Abort;                 //0xe1
-    unsigned char update_Transfer;              //0xe2
-    unsigned char update_Finish;                //0xe3
+	unsigned char query_FW_Ver; 				//0x01
+	unsigned char query_HW_Ver; 				//0x02
+	unsigned char query_Present_InputVoltage;	//0x03
+	unsigned char query_Present_OutputVoltage;	//0x04
+	unsigned char query_Fan_Speed;				//0x05
+	unsigned char query_Temperature;			//0x06
+	unsigned char query_Aux_PowerVoltage;		//0x07
+	unsigned char query_Relay_Output;			//0x08
+	unsigned char query_Gfd_Adc;				//0x09
+	unsigned char query_Gpio_In;				//0x0a
+
+	unsigned char config_Fan_Speed;			//0x81
+	unsigned char config_Relay_Output;			//0x85
+	unsigned char config_Gpio_Output;			//0x86
+	unsigned char config_Gfd_Value;			//0x87
+
+	unsigned char update_Start;				//0xe0
+	unsigned char update_Abort;				//0xe1
+	unsigned char update_Transfer;				//0xe2
+	unsigned char update_Finish;				//0xe3
 
 }Cmd;
 
 typedef struct Verion
 {
-    char Version_FW[9];
-    char Version_HW[9];
+	char Version_FW[9];
+	char Version_HW[9];
 }Ver;
 
 typedef struct PRESENTINPUTVOLTAGE
 {
-    unsigned char inputType;    // 0x00: Line to Line       0x01: Line to Neutral
-    double L1N_L12;
-    double L2N_L23;
-    double L3N_L31;
+	unsigned char inputType;	// 0x00: Line to Line       0x01: Line to Neutral
+	double L1N_L12;
+	double L2N_L23;
+	double L3N_L31;
 }PresentInputVoltage;
 
 typedef struct PRESENTOUTPUTVOLTAGE
 {
-    double behindFuse_Voltage_C1;
-    double behindRelay_Voltage_C1;
-    double behindFuse_Voltage_C2;
-    double behindRelay_Voltage_C2;
+	double behindFuse_Voltage_C1;
+	double behindRelay_Voltage_C1;
+	double behindFuse_Voltage_C2;
+	double behindRelay_Voltage_C2;
 }PresentOutputVoltage;
 
 typedef struct FANSPEED
 {
-    unsigned short int speed[8];
+	unsigned short int speed[8];
 }FanSpeed;
 
 typedef struct TEMPERATURE
 {
-    unsigned char temperature[8];
+	unsigned char temperature[8];
 }Temperature;
 
 typedef struct AUXPOWER
 {
-    unsigned char voltage[8];
+	unsigned char voltage[8];
 }AuxPower;
 
 typedef struct RELAY
 {
-    union
-    {
-        unsigned char relay_status[8];
-        struct
-        {
-            unsigned char AC_Contactor :1;      //bit 0
-            unsigned char CCS_Precharge :1;     //bit 1
-            unsigned char :1;                   //bit 2 reserved
-            unsigned char :1;                   //bit 3 reserved
-            unsigned char :1;                   //bit 4 reserved
-            unsigned char :1;                   //bit 5 reserved
-            unsigned char :1;                   //bit 6 reserved
-            unsigned char :1;                   //bit 7 reserved
-
-            unsigned char Gun1_N :1;            //bit 0
-            unsigned char Gun1_P :1;            //bit 1
-            unsigned char Gun1_Parallel_N :1;   //bit 2
-            unsigned char Gun1_Parallel_P :1;   //bit 3
-            unsigned char :1;                   //bit 4 reserved
-            unsigned char :1;                   //bit 5 reserved
-            unsigned char :1;                   //bit 6 reserved
-            unsigned char :1;                   //bit 7 reserved
-
-            unsigned char Gun2_N :1;            //bit 0
-            unsigned char Gun2_P :1;            //bit 1
-            unsigned char :1;                   //bit 2 reserved
-            unsigned char :1;                   //bit 3 reserved
-            unsigned char :1;                   //bit 4 reserved
-            unsigned char :1;                   //bit 5 reserved
-            unsigned char :1;                   //bit 6 reserved
-            unsigned char :1;                   //bit 7 reserved
-        }bits;
-    }relay_event;
+	union
+	{
+		unsigned char relay_status[8];
+		struct
+		{
+			unsigned char AC_Contactor :1;		//bit 0
+			unsigned char CCS_Precharge :1;	//bit 1
+			unsigned char :1;  				//bit 2 reserved
+			unsigned char :1;					//bit 3 reserved
+			unsigned char :1;					//bit 4 reserved
+			unsigned char :1;					//bit 5 reserved
+			unsigned char :1;					//bit 6 reserved
+			unsigned char :1;					//bit 7 reserved
+
+			unsigned char Gun1_N :1;			//bit 0
+			unsigned char Gun1_P :1;			//bit 1
+			unsigned char Gun1_Parallel_N :1;  //bit 2
+			unsigned char Gun1_Parallel_P :1;	//bit 3
+			unsigned char :1;					//bit 4 reserved
+			unsigned char :1;					//bit 5 reserved
+			unsigned char :1;					//bit 6 reserved
+			unsigned char :1;					//bit 7 reserved
+
+			unsigned char Gun2_N :1;			//bit 0
+			unsigned char Gun2_P :1;			//bit 1
+			unsigned char :1; 					//bit 2 reserved
+			unsigned char :1;					//bit 3 reserved
+			unsigned char :1;					//bit 4 reserved
+			unsigned char :1;					//bit 5 reserved
+			unsigned char :1;					//bit 6 reserved
+			unsigned char :1;					//bit 7 reserved
+		}bits;
+	}relay_event;
 }Relay;
 
 typedef struct GFD
 {
-    unsigned short Resister_conn1;
-    unsigned short voltage_conn1;
-    unsigned char result_conn1;
-    unsigned char rb_step_1;
-
-    unsigned short Resister_conn2;
-    unsigned short voltage_conn2;
-    unsigned char result_conn2;
-    unsigned char rb_step_2;
+	unsigned int Resister;
+	float voltage;
+	unsigned char result;
 }Gfd;
 
 typedef struct Gfd_CONFIG
 {
-    unsigned char index;
-    unsigned char state;
+	float reqVol;
+	short resister;
 }Gfd_config;
 
+
 typedef struct GPIO_IN
 {
-    unsigned char AC_Connector;             // bit 0
-    unsigned char AC_MainBreaker;           // bit 1
-    unsigned char SPD;                      // bit 2
-    unsigned char Door_Open;                // bit 3
-    unsigned char GFD[2];                   // bit 4,5
-    unsigned char AC_Drop;                  // bit 6
-
-    unsigned char Emergency_IO;             // bit 0
-
-    unsigned char Button_Emergency_Press;   // bit 0
-    unsigned char Button_On_Press;          // bit 1
-    unsigned char Button_Off_Press;         // bit 2
-    unsigned char Key_1_Press;              // bit 3
-    unsigned char Key_2_Press;              // bit 4
-    unsigned char Key_3_Press;              // bit 5
-    unsigned char Key_4_Press;              // bit 6
+	unsigned char AC_Connector;			// bit 0
+	unsigned char AC_MainBreaker;			// bit 1
+	unsigned char SPD;						// bit 2
+	unsigned char Door_Open;				// bit 3
+	unsigned char GFD[2];					// bit 4,5
+	unsigned char AC_Drop;					// bit 6
+
+	unsigned char Emergency_IO;			// bit 0
+
+	unsigned char Button_Emergency_Press;	// bit 0
+	unsigned char Button_On_Press;			// bit 1
+	unsigned char Button_Off_Press;		// bit 2
+	unsigned char Key_1_Press;				// bit 3
+	unsigned char Key_2_Press;				// bit 4
+	unsigned char Key_3_Press;				// bit 5
+	unsigned char Key_4_Press;				// bit 6
 }Gpio_in;
 
 typedef struct GPIO_OUT
 {
-    unsigned char AC_Connector;
-    unsigned char Button_LED[2];
-    unsigned char System_LED[4];
+	unsigned char AC_Connector;
+	unsigned char Button_LED[2];
+	unsigned char System_LED[4];
+    unsigned char AC_Breaker;
 }Gpio_out;
 
-typedef struct RTC
-{
-    unsigned char RtcData[14];
-}Rtc;
-
-typedef struct LED_Color
-{
-    unsigned char Connect_1_Red;
-    unsigned char Connect_1_Green;
-    unsigned char Connect_1_Blue;
-    unsigned char Connect_2_Red;
-    unsigned char Connect_2_Green;
-    unsigned char Connect_2_Blue;
-}Led_Color;
-
-typedef struct AC_Status
-{
-    unsigned char       CpStatus;
-    unsigned short      CurLimit;
-    short               PilotVol_P;
-    short               PilotVol_N;
-    unsigned char       LockStatus;
-    unsigned char       RelayStatus;
-    unsigned char       ShutterStatus;
-    unsigned char       MeterStatus;
-    unsigned char       PpStatus;
-    unsigned char       MaxCurrent;
-    unsigned char       RotateSwitchStatus;
-}
-Ac_Status;
-
-typedef struct AC_LED_Status
-{
-    unsigned char       ActionMode;
-    unsigned long       AcAlarmCode;
-}
-Ac_Led_Status;
-
-typedef struct AC_Alarm_Code
-{
-    unsigned int        AcAlarmCode;
-}
-Ac_Alarm_code;
-
-typedef struct AC_Charging_Energy
-{
-    unsigned int        Energy;
-}
-Ac_Charging_energy;
-
-typedef struct AC_Charging_Current
-{
-    unsigned short      OuputCurrentL1;
-    unsigned short      OuputCurrentL2;
-    unsigned short      OuputCurrentL3;
-}
-Ac_Charging_current;
-
 extern unsigned char Query_FW_Ver(unsigned char fd, unsigned char targetAddr, Ver *Ret_Buf);
 extern unsigned char Query_HW_Ver(unsigned char fd, unsigned char targetAddr, Ver *Ret_Buf);
 extern unsigned char Query_Present_InputVoltage(unsigned char fd, unsigned char targetAddr, PresentInputVoltage *Ret_Buf);
@@ -249,28 +167,14 @@ extern unsigned char Query_Aux_PowerVoltage(unsigned char fd, unsigned char targ
 extern unsigned char Query_Relay_Output(unsigned char fd, unsigned char targetAddr, Relay *Ret_Buf);
 extern unsigned char Query_Gfd_Adc(unsigned char fd, unsigned char targetAddr, Gfd *Ret_Buf);
 extern unsigned char Query_Gpio_Input(unsigned char fd, unsigned char targetAddr, Gpio_in *Ret_Buf);
-extern unsigned char Query_Model_Name(unsigned char fd, unsigned char targetAddr, unsigned char *modelname);
 
 extern unsigned char Config_Fan_Speed(unsigned char fd, unsigned char targetAddr, FanSpeed *Set_Buf);
 extern unsigned char Config_Relay_Output(unsigned char fd, unsigned char targetAddr, Relay *Set_Buf);
 extern unsigned char Config_Gpio_Output(unsigned char fd, unsigned char targetAddr, Gpio_out *Set_Buf);
 extern unsigned char Config_Gfd_Value(unsigned char fd, unsigned char targetAddr, Gfd_config *Set_Buf);
-extern unsigned char Config_Model_Name(unsigned char fd, unsigned char targetAddr, unsigned char *modelname);
-extern unsigned char Config_Rtc_Data(unsigned char fd, unsigned char targetAddr, Rtc *Set_Buf);
 
 extern unsigned char Update_Start(unsigned char fd, unsigned char targetAddr, unsigned int crc32);
 extern unsigned char Update_Abord(unsigned char fd, unsigned char targetAddr);
 extern unsigned char Update_Transfer(unsigned char fd, unsigned char targetAddr, unsigned int startAddr, unsigned char *data, unsigned short int length);
 extern unsigned char Update_Finish(unsigned char fd, unsigned char targetAddr);
 
-extern unsigned char Query_AC_Status(unsigned char fd, unsigned char targetAddr, Ac_Status *Ret_Buf);
-extern unsigned char Query_AC_Alarm_Code(unsigned char fd, unsigned char targetAddr, Ac_Alarm_code *Ret_Buf);
-extern unsigned char Query_Charging_Energy(unsigned char fd, unsigned char targetAddr, Ac_Charging_energy *Ret_Buf);
-extern unsigned char Query_Charging_Current(unsigned char fd, unsigned char targetAddr, Ac_Charging_current *Ret_Buf);
-extern unsigned char Config_LED_Status(unsigned char fd, unsigned char targetAddr, Ac_Led_Status *Ret_Buf);
-extern unsigned char Config_Legacy_Req(unsigned char fd, unsigned char targetAddr, unsigned char _switch);
-extern unsigned char Config_Ac_Duty(unsigned char fd, unsigned char targetAddr, unsigned char _value);
-extern unsigned char Config_CSU_Mode(unsigned char fd, unsigned char targetAddr);
-extern unsigned char Config_Reset_MCU(unsigned char fd, unsigned char targetAddr);
-extern unsigned char Config_Led_Color(unsigned char fd, unsigned char targetAddr, Led_Color *Ret_Buf);
-#endif /* INTERNALCOMM_H_ */

+ 1 - 0
EVSE/Projects/ATE/Apps/kill.sh

@@ -1,3 +1,4 @@
+ipcrm -M 1001
 pkill Module_CSU
 pkill Module_PrimaryComm
 pkill Module_LcmControl

+ 1886 - 5262
EVSE/Projects/ATE/Apps/main.c

@@ -1,5439 +1,2063 @@
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/timeb.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <sys/ipc.h>
-#include <sys/shm.h>
-#include <sys/mman.h>
-#include <linux/wireless.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
-
-#include <unistd.h>
-#include <stdarg.h>
-#include <stdio.h>      /*標準輸入輸出定義*/
-#include <stdlib.h>     /*標準函數庫定義*/
-#include <unistd.h>     /*Unix 標準函數定義*/
-#include <fcntl.h>      /*檔控制定義*/
-#include <termios.h>    /*PPSIX 終端控制定義*/
-#include <errno.h>      /*錯誤號定義*/
-#include <errno.h>
-#include <string.h>
-#include <stdint.h>
-#include <time.h>
-#include <ctype.h>
-#include <ifaddrs.h>
-#include <math.h>
-#include "../../define.h"
-#include "Config.h"
-#include <stdbool.h>
-#include <dirent.h>
-#include "timeout.h"
-
-#define ARRAY_SIZE(A)       (sizeof(A) / sizeof(A[0]))
-#define PASS                1
-#define FAIL                -1
-#define BUFFER_SIZE         128
-#define YES                 1
-#define NO                  0
-#define NORMAL              0
-#define ABNORMAL            1
-#define EQUAL               0
-#define BTN_RELEASE         0
-#define BTN_PRESS           1
-#define MAX_BUF             64
-#define MtdBlockSize        0x600000
-#define SYSFS_GPIO_DIR      "/sys/class/gpio"
-#define UPGRADE_FAN         0x02
-#define UPGRADE_RB          0x03
-#define UPGRADE_PRI         0x04
-#define UPGRADE_AC          0x05
-#define UPGRADE_LED         0x06
-#define SYSTEM_MIN_VOL      150
-#define MIN_OUTPUT_CUR      0
-#define AC_OUTPUT_VOL       220
-
-#define NO_DEFINE           255
-#define DEFAULT_AC_INDEX    2
-#define PSU_MIN_CUR         100
-
-#define DB_FILE             "/Storage/ChargeLog/localCgargingRecord.db"
-
-char    *valid_Internet[2] = {"8.8.8.8", "180.76.76.76"};
-unsigned char mask_table[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
-int whileLoopTime = 10000; // 10 ms
-int wtdFd = -1;
-byte _authorizeIndex = NO_DEFINE;
-
-bool IsAuthorizingMode();
-void ClearAuthorizedFlag();
-bool isDetectPlugin();
-void ClearDetectPluginFlag();
-int mystrcmp(unsigned char *p1, unsigned char *p2);
-
-long long DiffTimebWithNow(struct timeb ST);
-unsigned char DetectBitValue(unsigned char _byte, unsigned char _bit);
-void SetBitValue(unsigned char *_byte, unsigned char _bit, unsigned char value);
-void ChargingTerminalProcess(byte gunIndex);
-void ChkPrimaryStatus();
-void StartSystemTimeoutDet(unsigned char flag);
-void StopSystemTimeoutDet();
-void StartGunInfoTimeoutDet(unsigned char gunIndex, unsigned char flag);
-void StopGunInfoTimeoutDet(unsigned char gunIndex);
-int StoreLogMsg(const char *fmt, ...);
-unsigned long GetTimeoutValue(struct timeval _sour_time);
-void gpio_set_value(unsigned int gpio, unsigned int value);
-void PRINTF_FUNC(char *string, ...);
-void ChangeGunSelectByIndex(byte sel);
-
-void RecordAlarmCode(byte gunIndex, char *code);
-void RecordWarningCode(byte gunIndex, char *code);
-void ReleaseWarningCodeByString(byte gunIndex, char *code);
-void ReleaseAlarmCode(byte gunIndex);
-
-int DB_Open(sqlite3 *db);
-int DB_Insert_Record(sqlite3 *db, int gun_index);
-int DB_Update_Operactive(sqlite3 *db, uint8_t gun_index, uint8_t IsAvailable);
-int DB_Get_Operactive(sqlite3 *db, uint8_t gun_index);
-
-#define DEBUG_INFO_MSG(format, args...)     StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
-#define DEBUG_WARN_MSG(format, args...)     StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
-#define DEBUG_ERROR_MSG(format, args...)    StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
-
-struct SysConfigAndInfo         *ShmSysConfigAndInfo;
-struct StatusCodeData           *ShmStatusCodeData;
-struct PsuData                  *ShmPsuData;
-struct CHAdeMOData              *ShmCHAdeMOData;
-struct GBTData                  *ShmGBTData;
-struct CcsData                  *ShmCcsData;
-struct PrimaryMcuData           *ShmPrimaryMcuData;
-struct FanModuleData            *ShmFanModuleData;
-struct RelayModuleData          *ShmRelayModuleData;
-struct LedModuleData            *ShmLedModuleData;
-struct OCPP16Data               *ShmOCPP16Data;
-
-struct ChargingInfoData         *chargingInfo[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
-struct ChargingInfoData         *ac_chargingInfo[AC_QUANTITY];
-struct timeb                    startChargingTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
-struct timeb                    endChargingTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
-
-// for initial index to check EV board type is correct
-byte _gunIndex = 0;
-byte _acgunIndex = 0;
-byte _chademoIndex = 0;
-byte _ccsIndex = 0;
-byte _gb_Index = 0;
-byte _ac_Index = 0;
-byte bd0_1_status = 0;
-byte bd0_2_status = 0;
-byte bd1_1_status = 0;
-byte bd1_2_status = 0;
-
-bool isCardScan = false;
-bool isModelNameMatch = true;
-
-int rfidFd = -1;
-char* rfidPortName = "/dev/ttyS2";
-char* fwVersion = "D5.17.00.0000.00";
-
-sqlite3 *localDb;
-bool isDb_ready;
-
-//================================================
-// initial can-bus
-//================================================
-int InitCanBus()
-{
-    int                     s0,nbytes;
-    struct timeval          tv;
-    struct ifreq            ifr0;
-    struct sockaddr_can     addr0;
-
-    system("/sbin/ip link set can0 down");
-    system("/sbin/ip link set can0 type can bitrate 500000 restart-ms 100");
-    system("/sbin/ip link set can0 up");
-
-    s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW);
-
-    tv.tv_sec = 0;
-    tv.tv_usec = 10000;
-    if (setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct  timeval)) < 0)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("Set SO_RCVTIMEO NG");
-        #endif
-    }
-    nbytes=40960;
-    if (setsockopt(s0, SOL_SOCKET,  SO_RCVBUF, &nbytes, sizeof(int)) < 0)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("Set SO_RCVBUF NG");
-        #endif
-    }
-    nbytes=40960;
-    if (setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("Set SO_SNDBUF NG");
-        #endif
-    }
-
-    strcpy(ifr0.ifr_name, "can0" );
-    ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
-    addr0.can_family = AF_CAN;
-    addr0.can_ifindex = ifr0.ifr_ifindex;
-    bind(s0, (struct sockaddr *)&addr0, sizeof(addr0));
-    return s0;
-}
-
-//================================================
-// initial uart port
-//================================================
-char *_priPortName = "/dev/ttyS1";
-char *_485PortName = "/dev/ttyS5";
-
-int InitComPort(byte target)
-{
-    int fd;
-    struct termios tios;
-
-    if(target == UPGRADE_PRI)
-        fd = open(_priPortName, O_RDWR);
-    else if (target == UPGRADE_FAN  ||
-             target == UPGRADE_RB   ||
-             target == UPGRADE_AC   ||
-             target == UPGRADE_LED)
-        fd = open(_485PortName, O_RDWR);
-
-    if(fd<=0)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("open 407 Communication port NG \n");
-        #endif
-        return -1;
-    }
-    ioctl (fd, TCGETS, &tios);
-    tios.c_cflag = B115200| CS8 | CLOCAL | CREAD;
-    tios.c_lflag = 0;
-    tios.c_iflag = 0;
-    tios.c_oflag = 0;
-    tios.c_cc[VMIN]=0;
-    tios.c_cc[VTIME]=(unsigned char)1;
-    tios.c_lflag=0;
-    tcflush(fd, TCIFLUSH);
-    ioctl (fd, TCSETS, &tios);
-
-    return fd;
-}
-
-//=================================
-// Common routine
-//=================================
-int InitWatchDog()
-{
-    int fd;
-    system("/usr/bin/fuser -k /dev/watchdog");
-    sleep(1);
-    system("echo V > /dev/watchdog");
-    sleep(1);
-    fd=open("/dev/watchdog", O_RDWR);
-
-    if(fd<=0)
-    {
-        DEBUG_ERROR_MSG("System watch dog initial fail.\r\n");
-    }
-    return fd;
-}
-
-int StoreLogMsg(const char *fmt, ...)
-{
-    char Buf[4096+256];
-    char buffer[4096];
-    va_list args;
-    struct timeb  SeqEndTime;
-    struct tm *tm;
-
-    va_start(args, fmt);
-    int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
-    va_end(args);
-
-    memset(Buf,0,sizeof(Buf));
-    ftime(&SeqEndTime);
-    SeqEndTime.time = time(NULL);
-    tm=localtime(&SeqEndTime.time);
-
-    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
-    {
-        sprintf(Buf,"%02d:%02d:%02d.%03d - %s",
-                tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm, buffer);
-        printf("%s \n", Buf);
-    }
-    else
-    {
-        sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
-                tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
-                buffer,
-                tm->tm_year+1900,tm->tm_mon+1);
-        system(Buf);
-    }
-
-    return rc;
-}
-
-unsigned long GetTimeoutValue(struct timeval _sour_time)
-{
-    struct timeval _end_time;
-    gettimeofday(&_end_time, NULL);
-
-    return 1000000 * (_end_time.tv_sec - _sour_time.tv_sec) + _end_time.tv_usec - _sour_time.tv_usec;
-}
-
-int mystrcmp(unsigned char *p1, unsigned char *p2)
-{
-    while(*p1==*p2)
-    {
-        if(*p1=='\0' || *p2=='\0')
-            break;
-        p1++;
-        p2++;
-    }
-    if(*p1=='\0' && *p2=='\0')
-        return(PASS);
-    else
-        return(FAIL);
-}
-
-int DiffTimeb(struct timeb ST, struct timeb ET)
-{
-    //return milli-second
-    unsigned int StartTime,StopTime;
-
-    StartTime=(unsigned int)ST.time;
-    StopTime=(unsigned int)ET.time;
-
-    return (StopTime-StartTime);
-}
-
-bool CheckTimeOut(struct timeb ST)
-{
-    struct timeb ET;
-    unsigned int StartTime, StopTime;
-
-    ftime(&ET);
-    StartTime = (unsigned int) ST.time;
-    StopTime = (unsigned int) ET.time;
-    return (StopTime > StartTime)? YES : NO;
-}
-
-void setChargerMode(byte gun_index, byte mode)
-{
-    chargingInfo[gun_index]->SystemStatus = mode;
-}
-
-void PRINTF_FUNC(char *string, ...)
-{
-    va_list args;
-    char buffer[4096];
-    va_start(args, string);
-    vsnprintf(buffer, sizeof(buffer), string, args);
-    va_end(args);
-
-    DEBUG_INFO_MSG("%s \n", buffer);
-}
-
-long long DiffTimebWithNow(struct timeb ST)
-{
-    //return milli-second
-    struct timeb ET;
-    long long StartTime,StopTime;
-
-    ftime(&ET);
-    StartTime=(long long)ST.time;
-    StopTime=(long long)ET.time;
-    return ((StopTime-StartTime)*1000) + (ET.millitm-ST.millitm);
-}
-
-//==========================================
-// Check interface status
-//==========================================
-int isInterfaceUp(const char *interface)
-{
-    int result = FAIL;
-
-    FILE *fp;
-    char cmd[256];
-    char buf[512];
-
-    strcpy(cmd, "ifconfig");
-    fp = popen(cmd, "r");
-    if(fp != NULL)
-    {
-        while(fgets(buf, sizeof(buf), fp) != NULL)
-        {
-            if(strstr(buf, interface) > 0)
-            {
-                result = PASS;
-            }
-        }
-    }
-    pclose(fp);
-
-    return result;
-}
-
-//=================================
-// Create all share memory
-//=================================
-int CreateShareMemory()
-{
-    int MeterSMId;
-
-    if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("[main]CreatShareMemory:shmget ShmSysConfigAndInfo NG \n");
-        #endif
-        return 0;
-    }
-    else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0))  == (void *) -1)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("[main]CreatShareMemory:shmat ShmSysConfigAndInfo NG \n");
-        #endif
-        return 0;
-    }
-    memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo));
-
-    if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("[main]CreatShareMemory:shmget ShmStatusCodeData NG \n");
-        #endif
-        return 0;
-    }
-    else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("[main]CreatShareMemory:shmat ShmStatusCodeData NG \n");
-        #endif
-        return 0;
-    }
-
-    memset(ShmStatusCodeData, 0, sizeof(struct StatusCodeData));
-
-    //creat ShmPsuData
-    if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData), IPC_CREAT | 0777)) < 0)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("[main]CreatShareMemory:shmget ShmPsuData NG \n");
-        #endif
-        return 0;
-    }
-    else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("[main]CreatShareMemory:shmat ShmPsuData NG \n");
-        #endif
-        return 0;
-    }
-    memset(ShmPsuData, 0, sizeof(struct PsuData));
-
-    if(CHAdeMO_QUANTITY > 0)
-    {
-        if ((MeterSMId = shmget(ShmCHAdeMOCommKey, sizeof(struct CHAdeMOData),  IPC_CREAT | 0777)) < 0)
-        {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR_MSG("[main]CreatShareMemory:shmget ShmCHAdeMOData NG \n");
-            #endif
-            return 0;
-        }
-        else if ((ShmCHAdeMOData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-        {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR_MSG("[main]CreatShareMemory:shmat ShmCHAdeMOData NG \n");
-            #endif
-            return 0;
-        }
-        memset(ShmCHAdeMOData, 0, sizeof(struct CHAdeMOData));
-    }
-
-    if(GB_QUANTITY > 0)
-    {
-        if ((MeterSMId = shmget(ShmGBTCommKey, sizeof(struct GBTData),  IPC_CREAT | 0777)) < 0)
-        {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR_MSG("[main]CreatShareMemory:shmget ShmGBTData NG \n");
-            #endif
-            return 0;
-        }
-        else if ((ShmGBTData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-        {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR_MSG("[main]CreatShareMemory:shmat ShmGBTData NG \n");
-            #endif
-            return 0;
-        }
-        memset(ShmGBTData, 0, sizeof(struct GBTData));
-    }
-
-    //creat ShmCcsData
-    if(CCS_QUANTITY > 0)
-    {
-        if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData),  IPC_CREAT | 0777)) < 0)
-        {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR_MSG("[main]CreatShareMemory:shmget ShmCcsData NG \n");
-            #endif
-            return 0;
-        }
-        else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-        {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR_MSG("[main]CreatShareMemory:shmat ShmCcsData NG \n");
-            #endif
-            return 0;
-        }
-        memset(ShmCcsData, 0, sizeof(struct CcsData));
-    }
-
-    //creat ShmPrimaryMcuData
-    if ((MeterSMId = shmget(ShmPrimaryMcuKey, sizeof(struct PrimaryMcuData), IPC_CREAT | 0777)) < 0)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("[main]CreatShareMemory:shmget ShmPrimaryMcuData NG \n");
-        #endif
-        return 0;
-    }
-    else if ((ShmPrimaryMcuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("[main]CreatShareMemory:shmat ShmPrimaryMcuData NG \n");
-        #endif
-        return 0;
-    }
-    memset(ShmPrimaryMcuData, 0, sizeof(struct PrimaryMcuData));
-
-    //creat ShmFanModuleData
-    if ((MeterSMId = shmget(ShmFanBdKey, sizeof(struct FanModuleData),  IPC_CREAT | 0777)) < 0)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("[main]CreatShareMemory:shmget ShmFanModuleData NG \n");
-        #endif
-        return 0;
-    }
-    else if ((ShmFanModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("[main]CreatShareMemory:shmat ShmFanModuleData NG \n");
-        #endif
-        return 0;
-    }
-    memset(ShmFanModuleData, 0, sizeof(struct FanModuleData));
-
-    //creat ShmRelayModuleData
-    if ((MeterSMId = shmget(ShmRelayBdKey, sizeof(struct RelayModuleData),  IPC_CREAT | 0777)) < 0)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("[main]CreatShareMemory:shmget ShmRelayModuleData NG \n");
-        #endif
-        return 0;
-    }
-    else if ((ShmRelayModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("[main]CreatShareMemory:shmat ShmRelayModuleData NG \n");
-        #endif
-        return 0;
-    }
-    memset(ShmRelayModuleData, 0, sizeof(struct RelayModuleData));
-
-    if ((MeterSMId = shmget(ShmLedBdKey, sizeof(struct LedModuleData), IPC_CREAT | 0777)) < 0)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("[main]CreatShareMemory:shmget ShmLedModuleData NG \n");
-        #endif
-        return 0;
-    }
-    else if ((ShmLedModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("[main]CreatShareMemory:shmat ShmLedModuleData NG \n");
-        #endif
-        return 0;
-    }
-    memset(ShmLedModuleData, 0, sizeof(struct LedModuleData));
-
-    //creat ShmOCPP16Data
-    if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data), IPC_CREAT | 0777)) < 0)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("[main]CreatShareMemory:shmget ShmOCPP16Data NG \n");
-        #endif
-        return 0;
-    }
-    else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("[main]CreatShareMemory:shmat ShmOCPP16Data NG \n");
-        #endif
-        return 0;
-    }
-    // memset(ShmOCPP16Data,0,sizeof(struct OCPP16Data));
-    return 1;
-}
-
-//=================================
-// LCM Page
-//=================================
-void ChangeLcmByIndex(byte page_index)
-{
-    if (ShmSysConfigAndInfo->SysWarningInfo.Level != 2 ||
-        page_index == _LCM_COMPLETE || page_index == _LCM_FIX)
-    {
-        ShmSysConfigAndInfo->SysInfo.PageIndex = page_index;
-    }
-}
-
-//======================================================
-// Peripheral initial
-//======================================================
-void InitGPIO()
-{
-    /*****************0~3, 4 bank, bank x 32+ num*********************/
-    /***************************************************************/
-    /*************** GPIO 0 ***************************************/
-    /***************************************************************/
-    /* GPMC_AD8         =>  GPIO0_22 *//*ID BD1_1*/
-    system("echo 22 > /sys/class/gpio/export");
-    system("echo \"in\" > /sys/class/gpio/gpio22/direction");
-    /* GPMC_AD9         =>  GPIO0_23 *//*ID BD1_2*/
-    system("echo 23 > /sys/class/gpio/export");
-    system("echo \"in\" > /sys/class/gpio/gpio23/direction");
-    /* GPMC_AD10        =>  GPIO0_26 *//*IO BD1_1*/
-    system("echo 26 > /sys/class/gpio/export");
-    system("echo \"out\" > /sys/class/gpio/gpio26/direction");
-    system("echo 1 > /sys/class/gpio/gpio26/value");
-    /* GPMC_AD11        =>  GPIO0_27 *//*IO BD1_2*/
-    system("echo 27 > /sys/class/gpio/export");
-    system("echo \"in\" > /sys/class/gpio/gpio27/direction");
-    /* RMII1_REF_CLK        =>  GPIO0_29 *//*USB 0 OCP detection*/
-    system("echo 29 > /sys/class/gpio/export");
-    system("echo \"in\" > /sys/class/gpio/gpio29/direction");
-    /*XDMA_EVENT_INTR0  =>  GPIO0_19 *//*AM_RFID_RST*/
-    system("echo 19 > /sys/class/gpio/export");
-    system("echo \"out\" > /sys/class/gpio/gpio19/direction");
-    system("echo 1 > /sys/class/gpio/gpio19/value");
-    /*XDMA_EVENT_INTR1  =>  GPIO0_20 *//*AM_RFID_ICC*/
-    system("echo 20 > /sys/class/gpio/export");
-    system("echo \"in\" > /sys/class/gpio/gpio20/direction");
-    /***************************************************************/
-    /*************** GPIO 1 ***************************************/
-    /***************************************************************/
-    /* GPMC_AD12    =>  GPIO1_12 *//*ID BD2_1*/
-    system("echo 44 > /sys/class/gpio/export");
-    system("echo \"in\" > /sys/class/gpio/gpio44/direction");
-    /* GPMC_AD13    =>  GPIO1_13 *//*ID BD2_2*/
-    system("echo 45 > /sys/class/gpio/export");
-    system("echo \"in\" > /sys/class/gpio/gpio45/direction");
-    /* GPMC_AD14    =>  GPIO1_14 *//*IO BD2_1*/
-    system("echo 46 > /sys/class/gpio/export");
-    system("echo \"out\" > /sys/class/gpio/gpio46/direction");
-    system("echo 0 > /sys/class/gpio/gpio46/value");
-    /* GPMC_AD15    =>  GPIO1_15 *//*IO BD2_2*/
-    system("echo 47 > /sys/class/gpio/export");
-    system("echo \"in\" > /sys/class/gpio/gpio47/direction");
-    /***************************************************************/
-    /*************** GPIO 2 ***************************************/
-    /***************************************************************/
-    /*LCD_AC_BIAS_EN    =>  GPIO2_25*//*RS-485 for module DE control*/
-    system("echo 89 > /sys/class/gpio/export");
-    system("echo \"out\" > /sys/class/gpio/gpio89/direction");
-    system("echo 1 > /sys/class/gpio/gpio89/value");
-    /*LCD_HSYNC     =>  GPIO2_23*//*RS-485 for module RE control*/
-    system("echo 87 > /sys/class/gpio/export");
-    system("echo \"out\" > /sys/class/gpio/gpio87/direction");
-    system("echo 0 > /sys/class/gpio/gpio87/value");
-    /*LCD_PCLK      =>  GPIO2_24*//*CCS communication board 1 proximity*/
-    system("echo 88 > /sys/class/gpio/export");
-    system("echo \"in\" > /sys/class/gpio/gpio88/direction");
-    /*LCD_VSYNC     =>  GPIO2_22*//*CCS communication board 2 proximity*/
-    system("echo 86 > /sys/class/gpio/export");
-    system("echo \"in\" > /sys/class/gpio/gpio86/direction");
-    /***************************************************************/
-    /*************** GPIO 3 ***************************************/
-    /***************************************************************/
-    /*MCASP0_FSX        =>  GPIO3_15*//*Emergency Stop button detect*/
-    system("echo 111 > /sys/class/gpio/export");
-    system("echo \"in\" > /sys/class/gpio/gpio111/direction");
-    /*MCASP0_ACLKR  =>  GPIO3_18*//*USB1 OCP detect*/
-    system("echo 114 > /sys/class/gpio/export");
-    system("echo \"in\" > /sys/class/gpio/gpio114/direction");
-    /*MCASP0_AHCLKR =>  GPIO3_17*//*Emergency IO for AM3352 and STM32F407*/
-    system("echo 113 > /sys/class/gpio/export");
-    system("echo \"in\" > /sys/class/gpio/gpio113/direction");
-    /*MCASP0_ACLKX  =>  GPIO3_14*//*Ethernet PHY reset*/
-    system("echo 110 > /sys/class/gpio/export");
-    system("echo \"out\" > /sys/class/gpio/gpio110/direction");
-    system("echo 0 > /sys/class/gpio/gpio110/value");
-    /* MCASP0_FSR       =>  GPIO3_19 *//*backplane circuit enable for CCS CP open/short feature*/
-    system("echo 115 > /sys/class/gpio/export");
-    system("echo \"out\" > /sys/class/gpio/gpio115/direction");
-    system("echo 1 > /sys/class/gpio/gpio115/value");
-    /* MCASP0_AXR0  =>  GPIO3_16 *//*CSU board function OK indicator.*/
-    system("echo 112 > /sys/class/gpio/export");
-    system("echo \"out\" > /sys/class/gpio/gpio112/direction");
-    system("echo 1 > /sys/class/gpio/gpio112/value");
-    /* MCASP0_AXR1  =>  GPIO3_20 *//*SMR Enable control_2 for Pskill_2*/
-    system("echo 116 > /sys/class/gpio/export");
-    system("echo \"out\" > /sys/class/gpio/gpio116/direction");
-    system("echo 0 > /sys/class/gpio/gpio116/value");
-#ifdef SystemLogMessage
-    DEBUG_INFO_MSG("[main]InitGPIO: Initial GPIO OK");
-#endif
-}
-
-int LoadSysConfigAndInfo(struct SysConfigData *ptr)
-{
-    int fd,wrd;
-    unsigned char *buf;
-    unsigned int ChkSum,ChkSumOrg;
-
-    if((buf=malloc(MtdBlockSize))==NULL)
-    {
-        DEBUG_ERROR_MSG("malloc buffer NG,rebooting..\r\n");
-        if(ShmStatusCodeData!=NULL)
-        {
-            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
-        }
-        sleep(5);
-        system("reboot -f");
-        sleep(5);
-        system("reboot -f");
-    }
-    memset(buf, 0, MtdBlockSize);
-
-    //================================================
-    // Load configuration from mtdblock10
-    //================================================
-    fd = open("/dev/mtdblock10", O_RDWR);
-    if (fd < 0)
-    {
-        free(buf);
-        DEBUG_ERROR_MSG("open mtdblock10 NG,rebooting..\r\n");
-        if(ShmStatusCodeData!=NULL)
-        {
-            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
-        }
-        sleep(5);
-        system("reboot -f");
-        sleep(5);
-        system("reboot -f");
-    }
-
-    wrd=read(fd, buf, MtdBlockSize);
-    close(fd);
-    if(wrd<MtdBlockSize)
-    {
-        free(buf);
-        DEBUG_ERROR_MSG("read SysConfigData data NG,rebooting..\r\n");
-        if(ShmStatusCodeData!=NULL)
-        {
-            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
-        }
-        sleep(5);
-        system("reboot -f");
-        sleep(5);
-        system("reboot -f");
-    }
-    ChkSum=0;
-    for(wrd=0;wrd<MtdBlockSize-4;wrd++)
-    {
-        ChkSum+=buf[wrd];
-    }
-    memcpy(&ChkSumOrg,buf+(0x00600000-4),sizeof(ChkSumOrg));
-
-    //================================================
-    // Load configuration from mtdblock11
-    //================================================
-    if(ChkSum!=ChkSumOrg)
-    {
-        DEBUG_ERROR_MSG("Primary SysConfigData checksum NG, read backup\r\n");
-        fd = open("/dev/mtdblock11", O_RDWR);
-        if (fd < 0)
-        {
-            free(buf);
-            DEBUG_ERROR_MSG("open mtdblock11 (backup) NG,rebooting..\r\n");
-            if(ShmStatusCodeData!=NULL)
-            {
-                ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
-            }
-            sleep(5);
-            system("reboot -f");
-            sleep(5);
-            system("reboot -f");
-        }
-
-        memset(buf, 0, MtdBlockSize);
-        wrd=read(fd, buf,MtdBlockSize);
-        close(fd);
-        if(wrd<MtdBlockSize)
-        {
-            free(buf);
-            DEBUG_ERROR_MSG("read backup SysConfigData data NG,rebooting..\r\n");
-            if(ShmStatusCodeData!=NULL)
-            {
-                ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
-            }
-            sleep(5);
-            system("reboot -f");
-            sleep(5);
-            system("reboot -f");
-        }
-        ChkSum=0;
-        for(wrd=0;wrd<MtdBlockSize-4;wrd++)
-        {
-            ChkSum+=buf[wrd];
-        }
-        memcpy(&ChkSumOrg,buf+(0x00600000-4),sizeof(ChkSumOrg));
-
-        //================================================
-        // Load configuration from mtdblock12 (Factory default)
-        //================================================
-        if(ChkSum!=ChkSumOrg)
-        {
-            DEBUG_ERROR_MSG("backup SysConfigData checksum NG, read Factory default\r\n");
-            fd = open("/dev/mtdblock12", O_RDWR);
-            if (fd < 0)
-            {
-                free(buf);
-                DEBUG_ERROR_MSG("open mtdblock12 (Factory default) NG,rebooting..\r\n");
-                if(ShmStatusCodeData!=NULL)
-                {
-                    ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
-                }
-                sleep(5);
-                system("reboot -f");
-                sleep(5);
-                system("reboot -f");
-            }
-            memset(buf, 0, MtdBlockSize);
-            wrd=read(fd, buf,MtdBlockSize);
-            close(fd);
-            if(wrd<MtdBlockSize)
-            {
-                free(buf);
-                DEBUG_ERROR_MSG("read factory default  SysConfigData data NG,rebooting..\r\n");
-                if(ShmStatusCodeData!=NULL)
-                {
-                    ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1;
-                }
-                sleep(5);
-                system("reboot -f");
-                sleep(5);
-                system("reboot -f");
-            }
-            ChkSum=0;
-            for(wrd=0;wrd<MtdBlockSize-4;wrd++)
-            {
-                ChkSum+=buf[wrd];
-            }
-            memcpy(&ChkSumOrg,buf+(0x00600000-4),sizeof(ChkSumOrg));
-            if(ChkSum!=ChkSumOrg)
-            {
-                DEBUG_ERROR_MSG("factory default  SysConfigData checksum NG, restore factory default\r\n");
-                free(buf);
-                system("cd /root;./FactoryConfig -m");
-                system("sync");
-                sleep(5);
-                system("reboot -f");
-                sleep(5);
-                system("reboot -f");
-
-                return FAIL;
-            }
-        }
-    }
-
-    //load OK
-    memcpy((struct SysConfigData *)ptr,buf,sizeof(struct SysConfigData));
-    free(buf);
-    DEBUG_INFO_MSG("Load SysConfigData OK\r\n");
-    return PASS;
-}
-
-int isReachableInternet()
-{
-    int result = FAIL;
-    FILE *fp;
-    char cmd[256];
-    char buf[512];
-
-    for(int idx=0;idx<ARRAY_SIZE(valid_Internet);idx++)
-    {
-        strcpy(cmd, "ping -c 1 -w 3 ");
-        strcat(cmd, valid_Internet[idx]);
-        fp = popen(cmd, "r");
-        if(fp != NULL)
-        {
-            while(fgets(buf, sizeof(buf), fp) != NULL)
-            {
-                if(strstr(buf, "transmitted") > 0)
-                {
-                    if(strstr(buf,"100%") != NULL)
-                    {
-                        //NULL
-                    }
-                    else
-                    {
-                        result = PASS;
-                    }
-                }
-            }
-        }
-        pclose(fp);
-    }
-
-    return result;
-}
-
-void InitEthernet()
-{
-    char tmpbuf[256];
-    // /sbin/ifconfig eth0 192.168.1.10 netmask 255.255.255.0 down
-    system("echo 1 > /sys/class/gpio/gpio110/value");//reset PHY
-    sleep(2);
-    //Init Eth0 for internet
-    memset(tmpbuf,0,256);
-    sprintf(tmpbuf,"/sbin/ifconfig eth0 %s netmask %s up",
-    ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress,
-    ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress);
-    system(tmpbuf);
-    memset(tmpbuf,0,256);
-    sprintf(tmpbuf,"route add default gw %s eth0 ",
-    ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthGatewayAddress);
-    system(tmpbuf);
-
-    //Init Eth1 for administrator tool
-    memset(tmpbuf,0,256);
-    sprintf(tmpbuf,"/sbin/ifconfig eth1 %s netmask %s up",
-    ShmSysConfigAndInfo->SysConfig.Eth1Interface.EthIpAddress,
-    ShmSysConfigAndInfo->SysConfig.Eth1Interface.EthSubmaskAddress);
-    system(tmpbuf);
-
-    //Run DHCP client if enabled
-    system("killall udhcpc");
-    system("rm -rf /etc/resolv.conf");
-    system("echo nameserver 8.8.8.8 > /etc/resolv.conf");       //Google DNS server
-    system("echo nameserver 180.76.76.76 > /etc/resolv.conf");  //Baidu DNS server
-
-    if(ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthDhcpClient == 0)
-    {
-        memset(tmpbuf,0,256);
-        sprintf(tmpbuf, "/sbin/udhcpc -i eth0 -x hostname:CSU3_%s -s /root/dhcp_script/eth0.script > /dev/null &", ShmSysConfigAndInfo->SysConfig.SystemId);
-        system(tmpbuf);
-    }
-
-    //Upgrade system id to /etc/hostname
-    memset(tmpbuf,0,256);
-    sprintf(tmpbuf, "echo %s > /etc/hostname", ShmSysConfigAndInfo->SysConfig.SystemId);
-    system(tmpbuf);
-
-    pid_t pid = fork();
-    uint8_t cnt_pingDNS_Fail;
-
-    if(pid == 0)
-    {
-        for(;;)
-        {
-            if(isReachableInternet() == PASS)
-            {
-                ShmSysConfigAndInfo->SysInfo.InternetConn = YES;
-                ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet= NO;
-                cnt_pingDNS_Fail = 0;
-            }
-            else
-            {
-                if(++cnt_pingDNS_Fail > 3)
-                {
-                    ShmSysConfigAndInfo->SysInfo.InternetConn = NO;
-                    //ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet= YES;
-                }
-            }
-
-            sleep(5);
-        }
-    }
-
-    #ifdef SystemLogMessage
-    DEBUG_INFO_MSG("[main]InitEthernet: Initial Ethernet OK");
-    #endif
-}
-
-int InitialRfidPort()
-{
-    int uartO2 = open(rfidPortName, O_RDWR);
-    struct termios tios;
-
-    if (uartO2 != FAIL)
-    {
-        ioctl (uartO2, TCGETS, &tios);
-        tios.c_cflag = B19200 | CS8 | CLOCAL | CREAD;
-        tios.c_lflag = 0;
-        tios.c_iflag = 0;
-        tios.c_oflag = 0;
-        tios.c_cc[VMIN] = 0;
-        tios.c_cc[VTIME] = (unsigned char) 1;
-        tios.c_lflag = 0;
-        tcflush(uartO2, TCIFLUSH);
-        ioctl(uartO2, TCSETS, &tios);
-    }
-
-    if (uartO2 < 0)
-    {
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RfidModuleCommFail = 1;
-    }
-
-    return uartO2;
-}
-
-void GetMacAddress()
-{
-    for (byte index = 0; index < 2; index++)
-    {
-        int fd;
-        struct ifreq ifr;
-        char tarEth[5];
-        char Mac[18];
-
-        sprintf(tarEth,"eth%d",index);
-        fd = socket(AF_INET, SOCK_DGRAM, 0);
-
-        ifr.ifr_addr.sa_family = AF_INET;
-        strncpy(ifr.ifr_name, tarEth, IFNAMSIZ - 1);
-
-        ioctl(fd, SIOCGIFHWADDR, &ifr);
-        close(fd);
-
-        sprintf(Mac, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
-                ifr.ifr_hwaddr.sa_data[0], ifr.ifr_hwaddr.sa_data[1], ifr.ifr_hwaddr.sa_data[2],
-                ifr.ifr_hwaddr.sa_data[3], ifr.ifr_hwaddr.sa_data[4], ifr.ifr_hwaddr.sa_data[5]);
-
-        if (index == 0)
-            strcpy((char *) ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthMacAddress, Mac);
-        else
-            strcpy((char *) ShmSysConfigAndInfo->SysConfig.Eth1Interface.EthMacAddress, Mac);
-    }
-}
-
-void GetFirmwareVersion()
-{
-    // Get CSU root file system version
-    sprintf((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev, fwVersion);
-
-    byte count = 0, chademo = 0, ccs = 0, gb = 0;
-    for(uint8_t idx=0;idx<3;idx++)
-    {
-        if (ShmSysConfigAndInfo->SysConfig.ModelName[7+idx] == 'J')
-        {
-            chademo++;
-            count++;
-        }
-        else if (ShmSysConfigAndInfo->SysConfig.ModelName[7+idx] == 'G')
-        {
-            gb++;
-            count++;
-        }
-        else if (ShmSysConfigAndInfo->SysConfig.ModelName[7+idx] == 'U' ||
-                 ShmSysConfigAndInfo->SysConfig.ModelName[7+idx] == 'E')
-        {
-            ccs++;
-            count++;
-        }
-    }
-
-    if (count == 1)
-    {
-        if (chademo > 0)
-            ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev[7] = '1';
-        else if (ccs > 0)
-            ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev[7] = '2';
-        else if (gb > 0)
-            ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev[7] = '3';
-    }
-    else
-    {
-        if (chademo > 0 && ccs > 0)
-            ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev[7] = '4';
-        else if (chademo > 0 && gb > 0)
-            ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev[7] = '5';
-        else if (ccs > 0 && gb > 0)
-            ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev[7] = '6';
-    }
-
-    // Get network option from model name
-    switch(ShmSysConfigAndInfo->SysConfig.ModelName[10])
-    {
-        case 'B':
-        case 'U':
-            //Blue tooth
-            ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev[9] = '3';
-            break;
-        case 'W':
-            // WIFI
-            ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev[9] = '1';
-            break;
-        case 'T':
-            // 3G/4G
-            ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev[9] = '2';
-            break;
-        default:
-            // LAN
-            ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev[9] = '0';
-            break;
-    }
-    // Get rating power from model name
-    memcpy(&ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev[10], &ShmSysConfigAndInfo->SysConfig.ModelName[4], 0x03);
-
-    // Get IEC or UL
-    char _buf[3] = {0};
-    memcpy(_buf, &ShmSysConfigAndInfo->SysConfig.ModelName[2], 2);
-
-    if (strcmp(_buf, "YE") == EQUAL ||
-        strcmp(_buf, "YC") == EQUAL)
-        ShmSysConfigAndInfo->SysInfo.ChargerType = _CHARGER_TYPE_IEC;
-    else if (strcmp(_buf, "WU") == EQUAL)
-        ShmSysConfigAndInfo->SysInfo.ChargerType = _CHARGER_TYPE_UL;
-}
-
-void InitialShareMemoryInfo()
-{
-    FILE *fp;
-    char cmd[512];
-    char buf[512];
-
-    sprintf((char *)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomApn, "Internet");
-    sprintf((char *)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomChapPapId, " ");
-    sprintf((char *)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomChapPapPwd, " ");
-
-    ShmSysConfigAndInfo->SysConfig.TotalConnectorCount = 0;
-    ShmSysConfigAndInfo->SysConfig.AcConnectorCount = 0;
-
-    ShmSysConfigAndInfo->SysInfo.FactoryConfiguration = 0;
-    ShmSysConfigAndInfo->SysInfo.InputVoltageR = 0;
-    ShmSysConfigAndInfo->SysInfo.InputVoltageS = 0;
-    ShmSysConfigAndInfo->SysInfo.InputVoltageT = 0;
-    ShmSysConfigAndInfo->SysInfo.SystemFanRotaSpeed = 0;
-    ShmSysConfigAndInfo->SysInfo.PsuFanRotaSpeed = 0;
-    ShmSysConfigAndInfo->SysInfo.AuxPower5V = 0;
-    ShmSysConfigAndInfo->SysInfo.AuxPower12V = 0;
-    ShmSysConfigAndInfo->SysInfo.AuxPower24V = 0;
-    ShmSysConfigAndInfo->SysInfo.AuxPower48V = 0;
-
-    sprintf((char *)ShmSysConfigAndInfo->SysInfo.CsuHwRev, "REV:5.0");
-    memcpy(ShmSysConfigAndInfo->SysInfo.CsuBootLoadFwRev, ShmSysConfigAndInfo->SysConfig.CsuBootLoadFwRev, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.CsuBootLoadFwRev));
-
-    sprintf(cmd, "/bin/uname -r");
-    fp = popen(cmd, "r");
-    if(fp == NULL)
-        sprintf((char*)ShmSysConfigAndInfo->SysInfo.CsuKernelFwRev, "Unknown version");
-    else
-    {
-        while(fgets(buf, sizeof(buf), fp) != NULL)
-        {
-            strcpy((char*)ShmSysConfigAndInfo->SysInfo.CsuKernelFwRev, buf);
-        }
-    }
-
-    // 雙槍 CCS + Chademo
-    GetFirmwareVersion();
-
-    sprintf((char *) ShmSysConfigAndInfo->SysInfo.CsuPrimFwRev, " ");
-    sprintf((char *) ShmSysConfigAndInfo->SysInfo.LcmHwRev, " ");
-    sprintf((char *) ShmSysConfigAndInfo->SysInfo.LcmFwRev, " ");
-    sprintf((char *) ShmSysConfigAndInfo->SysInfo.PsuHwRev, " ");
-    sprintf((char *) ShmSysConfigAndInfo->SysInfo.PsuPrimFwRev, " ");
-    sprintf((char *) ShmSysConfigAndInfo->SysInfo.PsuSecFwRev, " ");
-    sprintf((char *) ShmSysConfigAndInfo->SysInfo.AuxPwrHwRev, " ");
-    sprintf((char *) ShmSysConfigAndInfo->SysInfo.AuxPwrFwRev, " ");
-    sprintf((char *) ShmSysConfigAndInfo->SysInfo.FanModuleHwRev, " ");
-    sprintf((char *) ShmSysConfigAndInfo->SysInfo.FanModuleFwRev, " ");
-    sprintf((char *) ShmSysConfigAndInfo->SysInfo.RelayModuleHwRev, " ");
-    sprintf((char *) ShmSysConfigAndInfo->SysInfo.RelayModuleFwRev, " ");
-    sprintf((char *) ShmSysConfigAndInfo->SysInfo.TelcomModemFwRev, " ");
-    ShmSysConfigAndInfo->SysInfo.SystemAmbientTemp = 0;
-    ShmSysConfigAndInfo->SysInfo.SystemCriticalTemp = 0;
-    ShmSysConfigAndInfo->SysInfo.PsuAmbientTemp = 0;
-    ShmSysConfigAndInfo->SysInfo.CcsConnectorTemp = 0;
-    ShmSysConfigAndInfo->SysInfo.InternetConn = 0;
-    ShmSysConfigAndInfo->SysInfo.OcppConnStatus = 0;
-    ShmSysConfigAndInfo->SysInfo.OrderCharging = FAIL;
-
-    strcpy((char *) ShmSysConfigAndInfo->SysConfig.UserId, "");
-
-    ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RelayboardStestFail = NO;
-    ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FanboardStestFail = NO;
-    ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PrimaryStestFail = NO;
-    ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoboardStestFail = NO;
-    ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CCSboardStestFail = NO;
-    ShmStatusCodeData->AlarmCode.AlarmEvents.bits.AcContactStestFail = NO;
-    ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuModuleStestFail = NO;
-
-    memset(ShmSysConfigAndInfo->SysInfo.FanModuleFwRev, 0, ARRAY_SIZE(ShmSysConfigAndInfo->SysInfo.FanModuleFwRev));
-    memset(ShmSysConfigAndInfo->SysInfo.RelayModuleFwRev, 0, ARRAY_SIZE(ShmSysConfigAndInfo->SysInfo.RelayModuleFwRev));
-    ShmPrimaryMcuData->SelfTest_Comp = NO;
-    ShmRelayModuleData->SelfTest_Comp = NO;
-    ShmFanModuleData->SelfTest_Comp = NO;
-    ShmLedModuleData->SelfTest_Comp = NO;
-    ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_NONE;
-    ShmSysConfigAndInfo->SysInfo.MainChargingMode = _MAIN_CHARGING_MODE_MAX;
-    ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_NONE;
-    ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = NO_DEFINE;
-
-    ShmFanModuleData->TestFanSpeed = 0;
-
-    ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ModelNameNoneMatchStestFail = NO;
-    ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuNoResource = NO;
-
-    char EvsePower[2];
-
-    EvsePower[2] = '\0';
-    unsigned short buf_pow = 0;
-    if (strlen((char *) ShmSysConfigAndInfo->SysConfig.ModelName) >= 6)
-    {
-        strncpy(EvsePower, (char *)(ShmSysConfigAndInfo->SysConfig.ModelName + 4), 2);
-        if (strcmp(EvsePower, "15") == EQUAL)
-            buf_pow = 150;
-        else if (strcmp(EvsePower, "30") == EQUAL)
-            buf_pow = 30;
-        else if (strcmp(EvsePower, "60") == EQUAL)
-            buf_pow = 60;
-        else if (strcmp(EvsePower, "18") == EQUAL)
-            buf_pow = 180;
-        else if (strcmp(EvsePower, "36") == EQUAL)
-            buf_pow = 360;
-
-        ShmSysConfigAndInfo->SysConfig.RatingCurrent = (buf_pow / 30) * PSU_MIN_CUR;
-
-        if(ShmSysConfigAndInfo->SysConfig.MaxChargingPower == 0 ||
-           ShmSysConfigAndInfo->SysConfig.MaxChargingPower > buf_pow)
-        {
-            ShmSysConfigAndInfo->SysConfig.MaxChargingPower = buf_pow;
-        }
-    }
-    ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag = NO;
-    ShmSysConfigAndInfo->SysConfig.AlwaysGfdFlag = NO;
-}
-
-int Initialization()
-{
-    // 初始化卡號驗證的 Flag
-    ClearAuthorizedFlag();
-    // 初始化插槍驗證的 Flag
-    ClearDetectPluginFlag();
-
-    // UART 2 for Rfid
-    rfidFd = InitialRfidPort();
-
-    int pinOut[2] = { 115, 116 };
-    for (byte count = 0; count < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; count++)
-    {
-        if (chargingInfo[count]->Type == _Type_Chademo)
-        {
-            gpio_set_value(pinOut[count], 0x01);
-            ShmCHAdeMOData->evse[chargingInfo[count]->type_index].SelfTest_Comp = NO;
-        }
-        else if (chargingInfo[count]->Type == _Type_GB)
-        {
-            gpio_set_value(pinOut[count], 0x01);
-            ShmGBTData->evse[chargingInfo[count]->type_index].SelfTest_Comp = NO;
-        }
-        else if (chargingInfo[count]->Type == _Type_CCS_2)
-        {
-            if (ShmCcsData->CommProtocol == 0x01)
-            {
-                if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount == 1)
-                    gpio_set_value(pinOut[1], 0x00);
-                else
-                    gpio_set_value(pinOut[count], 0x00);
-
-                ShmCcsData->V2GMessage_DIN70121[chargingInfo[count]->type_index].SelfTest_Comp = NO;
-            }
-        }
-
-        strcpy((char *)ShmOCPP16Data->StatusNotification[count].ErrorCode, "NoError");
-    }
-
-    for (byte count = 0; count < ShmSysConfigAndInfo->SysConfig.AcConnectorCount; count++)
-    {
-        if (ac_chargingInfo[count]->Type == _Type_AC)
-        {
-            ac_chargingInfo[count]->SelfTest_Comp = NO;
-            strcpy((char *)ShmOCPP16Data->StatusNotification[count + ShmSysConfigAndInfo->SysConfig.TotalConnectorCount].ErrorCode, "NoError");
-        }
-    }
-
-    PRINTF_FUNC("Initialization OK \n");
-    return PASS;
-}
-
-bool InitialSystemDefaultConfig()
-{
-    bool result = true;
-
-    LoadSysConfigAndInfo(&ShmSysConfigAndInfo->SysConfig);
-    InitGPIO();
-    InitEthernet();
-    GetMacAddress();
-
-//  system("echo 1 > /sys/class/gpio/gpio110/value"); //reset PHY
-//  sleep(3);
-//  system("/sbin/ifconfig eth0 192.168.1.10 netmask 255.255.255.0 down");
-//  sleep(1);
-//  system("/sbin/ifconfig eth1 192.168.0.10 netmask 255.255.255.0 up");
-
-    return result;
-}
-
-void DisplaySelfTestFailReason()
-{
-    // RB、FB、407、EV 小板中有些板子無回應
-    if (ShmRelayModuleData->SelfTest_Comp == NO)
-    { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RelayboardStestFail = YES; }
-    if (ShmFanModuleData->SelfTest_Comp == NO)
-    { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FanboardStestFail = YES; }
-    if (ShmPrimaryMcuData->SelfTest_Comp == NO)
-    { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PrimaryStestFail = YES; }
-    for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++)
-    {
-        if (chargingInfo[index]->Type == _Type_Chademo)
-        {
-            if (ShmCHAdeMOData->evse[chargingInfo[index]->type_index].SelfTest_Comp == NO)
-            { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoboardStestFail = YES; }
-        }
-        else if (chargingInfo[index]->Type == _Type_GB)
-        {
-            if (ShmGBTData->evse[chargingInfo[index]->type_index].SelfTest_Comp == NO)
-            { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbtboardStestFail = YES; }
-        }
-        else if (chargingInfo[index]->Type == _Type_CCS_2)
-        {
-            if (ShmCcsData->CommProtocol == 0x01)
-            {
-                if (ShmCcsData->V2GMessage_DIN70121[chargingInfo[index]->type_index].SelfTest_Comp == NO)
-                { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CCSboardStestFail = YES; }
-            }
-        }
-    }
-    for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.AcConnectorCount; index++)
-    {
-        // 先借 GBT 顯示
-        if (ac_chargingInfo[index]->SelfTest_Comp == NO)
-        { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.AcConnectorStestFail = YES; }
-    }
-
-    if (ShmSysConfigAndInfo->SysInfo.AcContactorStatus == NO)
-    {
-        // AC Contact 未搭上
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.AcContactStestFail = YES;
-    }
-    else if (ShmPsuData->SystemAvailablePower <= 0 && ShmPsuData->SystemAvailableCurrent <= 0)
-    {
-        // PSU 通訊問題
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuModuleStestFail = YES;
-    }
-}
-
-void SelfTestRun()
-{
-    bool evInitFlag = false;
-
-    StartSystemTimeoutDet(Timeout_SelftestChk);
-    ShmSysConfigAndInfo->SysInfo.SelfTestSeq = _STEST_VERSION;
-    while (ShmSysConfigAndInfo->SysInfo.SelfTestSeq != _STEST_COMPLETE)
-    {
-        ChkPrimaryStatus();
-        if (ShmSysConfigAndInfo->SysWarningInfo.Level == 2)
-        {
-            ShmSysConfigAndInfo->SysInfo.SelfTestSeq = _STEST_FAIL;
-            return;
-        }
-
-        if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount > 0)
-        {
-            if (ShmPsuData->Work_Step == _NO_WORKING ||
-                ShmSysConfigAndInfo->SysInfo.SelfTestSeq == _STEST_FAIL)
-            {
-                ShmSysConfigAndInfo->SysInfo.SelfTestSeq = _STEST_FAIL;
-                return;
-            }
-
-            switch(ShmSysConfigAndInfo->SysInfo.SelfTestSeq)
-            {
-                case _STEST_VERSION:
-                {
-                    if (strlen((char *)ShmSysConfigAndInfo->SysInfo.RelayModuleFwRev) != 0 ||
-                        ShmSysConfigAndInfo->SysInfo.RelayModuleFwRev[0] != '\0')
-                    {
-                        //PRINTF_FUNC("RB pass \n");
-                        ShmRelayModuleData->SelfTest_Comp = YES;
-                    }
-
-                    if (strlen((char *)ShmSysConfigAndInfo->SysInfo.FanModuleFwRev) != 0 ||
-                        ShmSysConfigAndInfo->SysInfo.FanModuleFwRev[0] != '\0')
-                    {
-                        //PRINTF_FUNC("Fan pass \n");
-                        ShmFanModuleData->SelfTest_Comp = YES;
-                    }
-
-                    if (strlen((char *)ShmPrimaryMcuData->version) != 0 ||
-                        ShmPrimaryMcuData->version[0] != '\0')
-                    {
-                        //PRINTF_FUNC("407 pass \n");
-                        ShmPrimaryMcuData->SelfTest_Comp = YES;
-                    }
-                    // EV 小板
-                    if (!evInitFlag)
-                    {
-                        evInitFlag = YES;
-                        for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++)
-                        {
-                            if (chargingInfo[index]->Type == _Type_Chademo)
-                            {
-                                if (strlen((char *)ShmCHAdeMOData->evse[chargingInfo[index]->type_index].version) != 0 ||
-                                    ShmCHAdeMOData->evse[chargingInfo[index]->type_index].version[0] != '\0')
-                                {
-                                    //PRINTF_FUNC("chademo pass \n");
-                                    ShmCHAdeMOData->evse[chargingInfo[index]->type_index].SelfTest_Comp = YES;
-                                }
-                                else
-                                {
-                                    //PRINTF_FUNC("chademo fw lose...... %s \n", ShmCHAdeMOData->evse[chargingInfo[index]->type_index].version);
-                                    evInitFlag = NO;
-                                }
-                            }
-                            else if (chargingInfo[index]->Type == _Type_GB)
-                            {
-                                if (strlen((char *)ShmGBTData->evse[chargingInfo[index]->type_index].version) != 0 ||
-                                    ShmGBTData->evse[chargingInfo[index]->type_index].version[0] != '\0')
-                                {
-                                    //PRINTF_FUNC("GBT pass \n");
-                                    ShmGBTData->evse[chargingInfo[index]->type_index].SelfTest_Comp = YES;
-                                }
-                                else
-                                {
-                                    //PRINTF_FUNC("GBT fw lose...... %s \n", ShmCHAdeMOData->evse[chargingInfo[index]->type_index].version);
-                                    evInitFlag = NO;
-                                }
-                            }
-                            else if (chargingInfo[index]->Type == _Type_CCS_2)
-                            {
-                                if (ShmCcsData->CommProtocol == 0x01)
-                                {
-                                    if (strlen((char *)ShmCcsData->V2GMessage_DIN70121[chargingInfo[index]->type_index].version) != 0 ||
-                                        ShmCcsData->V2GMessage_DIN70121[chargingInfo[index]->type_index].version[0] != '\0')
-                                    {
-                                        //PRINTF_FUNC("ccs fw =  %s \n", ShmCcsData->V2GMessage_DIN70121[chargingInfo[index]->type_index].version);
-                                        ShmCcsData->V2GMessage_DIN70121[chargingInfo[index]->type_index].SelfTest_Comp = YES;
-                                    }
-                                    else
-                                    {
-                                        //PRINTF_FUNC("ccs fw lose...... %s \n", ShmCcsData->V2GMessage_DIN70121[chargingInfo[index]->type_index].version);
-                                        evInitFlag = NO;
-                                    }
-                                }
-                            }
-                        }
-
-                        for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.AcConnectorCount; index++)
-                        {
-                            if (ac_chargingInfo[index]->Type == _Type_AC)
-                            {
-                                if (strlen((char *)ac_chargingInfo[index]->version) != 0 ||
-                                    ac_chargingInfo[index]->version[0] != '\0')
-                                {
-                                    ac_chargingInfo[index]->SelfTest_Comp = YES;
-                                }
-                                else
-                                {
-                                    evInitFlag = NO;
-                                }
-                            }
-                        }
-                    }
-
-                    if (ShmFanModuleData->SelfTest_Comp &&
-                        ShmRelayModuleData->SelfTest_Comp &&
-                        ShmPrimaryMcuData->SelfTest_Comp &&
-                        evInitFlag)
-                    {
-                        ShmSysConfigAndInfo->SysInfo.SelfTestSeq = _STEST_AC_CONTACTOR;
-                    }
-                }
-                    break;
-                case _STEST_AC_CONTACTOR:
-                {
-                    //ShmPsuData->Work_Step = _TEST_COMPLETE;
-                    // 因為 30KW 以下沒有 Relay feedback 功能,所以暫時先直接跳過
-                    if (ShmSysConfigAndInfo->SysInfo.AcContactorStatus == YES)
-                    {
-                        ShmSysConfigAndInfo->SysInfo.SelfTestSeq = _STEST_PSU_DETECT;
-                        PRINTF_FUNC("Communication board pass. \n");
-                    }
-                }
-                    break;
-                case _STEST_PSU_DETECT:
-                {
-                    if (ShmPsuData->Work_Step >= GET_SYS_CAP)
-                    {
-                        ShmSysConfigAndInfo->SysInfo.SelfTestSeq = _STEST_PSU_CAP;
-                    }
-                }
-                    break;
-                case _STEST_PSU_CAP:
-                {
-                    // 此測試是要確認當前總輸出能力
-                    // 如果沒有 PSU 模組請 bypass
-                    if (ShmPsuData->Work_Step == BOOTING_COMPLETE)
-                    {
-                        sleep(1);
-                        ShmSysConfigAndInfo->SysInfo.SelfTestSeq = _STEST_COMPLETE;
-                        ShmSysConfigAndInfo->SysInfo.BootingStatus = BOOT_COMPLETE;
-                    }
-                }
-                    break;
-            }
-        }
-        else
-            break;
-
-        usleep(100000);
-    }
-}
-
-int SpawnTask()
-{
-    sleep(2);
-    system("/root/Module_EventLogging &");
-    system("/root/Module_PrimaryComm &");
-    system("/root/Module_EvComm &");
-    system("/root/Module_LcmControl &");
-    system("/root/Module_InternalComm &");
-    system("/root/Module_PsuComm &");
-    system("/root/Module_ProduceUtils &");
-
-    if(strcmp((char *)ShmSysConfigAndInfo->SysConfig.OcppServerURL, "") != EQUAL &&
-       strcmp((char *)ShmSysConfigAndInfo->SysConfig.ChargeBoxId, "") != EQUAL)
-    {
-        system("/root/OcppBackend &");
-    }
-
-    if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T')
-    {
-        system("/root/Module_4g &");
-    }
-
-    if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W')
-    {
-        system("/root/Module_Wifi &");
-    }
-
-    return PASS;
-}
-
-int StoreUsrConfigData(struct SysConfigData *UsrData)
-{
-    int result = PASS;
-    int fd,wrd;
-    unsigned int i,Chk;
-    unsigned char *ptr, *BufTmp;
-
-    Chk=0;
-    ptr=(unsigned char *)UsrData;
-    if((BufTmp = malloc(MtdBlockSize)) != NULL)
-    {
-        memset(BufTmp, 0, MtdBlockSize);
-        memcpy(BufTmp, ptr, sizeof(struct SysConfigData));
-        for(i=0; i<MtdBlockSize-4; i++)
-            Chk+=*(ptr+i);
-
-        memcpy(BufTmp + MtdBlockSize-4, &Chk, 4);
-        fd = open("/dev/mtdblock10", O_RDWR);
-        if (fd > 0)
-        {
-            wrd=write(fd, BufTmp, MtdBlockSize);
-            close(fd);
-            if(wrd >= MtdBlockSize)
-            {
-                fd = open("/dev/mtdblock11", O_RDWR);
-                if (fd > 0)
-                {
-                    wrd=write(fd, BufTmp, MtdBlockSize);
-                    close(fd);
-                    if(wrd < MtdBlockSize)
-                    {
-                        DEBUG_ERROR_MSG("write /dev/mtdblock11(backup) NG\r\n");
-                        result = FAIL;
-                    }
-                }
-                else
-                {
-                    DEBUG_ERROR_MSG("open /dev/mtdblock11(backup) NG\r\n");
-                    result = FAIL;
-                }
-            }
-            else
-            {
-                DEBUG_ERROR_MSG("write /dev/mtdblock10 NG\r\n");
-                result = FAIL;
-            }
-        }
-        else
-        {
-            DEBUG_ERROR_MSG("open /dev/mtdblock10 NG\r\n");
-            result = FAIL;
-        }
-    }
-    else
-    {
-        DEBUG_ERROR_MSG("alloc BlockSize NG\r\n");
-        result = FAIL;
-    }
-
-    if(BufTmp != NULL)
-        free(BufTmp);
-
-    return result;
-}
-
-//===============================================
-// Common Detect Chk - Stop Charging ?
-//===============================================
-bool isEvBoardStopChargeFlag(byte gunIndex)
-{
-    return chargingInfo[gunIndex]->StopChargeFlag;
-}
-
-//===============================================
-// 掃描插槍狀況
-//===============================================
-void ClearDetectPluginFlag()
-{
-    ShmSysConfigAndInfo->SysInfo.WaitForPlugit = NO;
-}
-
-void DetectPluginStart()
-{
-    ShmSysConfigAndInfo->SysInfo.WaitForPlugit = YES;
-}
-
-bool isDetectPlugin()
-{
-    if(ShmSysConfigAndInfo->SysInfo.WaitForPlugit == YES)
-        return YES;
-
-    return NO;
-}
-
-//===============================================
-// Common Detect Chk - Chademo
-//===============================================
-bool isEvGunLocked_chademo(byte gunIndex)
-{
-    return (DetectBitValue(chargingInfo[gunIndex]->GunLocked , 0) == 0)? NO : YES;
-}
-
-bool isEvContactorWelding_chademo(byte gunIndex)
-{
-    return DetectBitValue(ShmCHAdeMOData->ev[chargingInfo[gunIndex]->type_index].EvDetection, 3);
-}
-
-bool isEvStopReq_chademo(byte gunIndex)
-{
-    return DetectBitValue(ShmCHAdeMOData->ev[chargingInfo[gunIndex]->type_index].EvDetection, 4);
-}
-
-bool isEvStopCharging_chademo(byte gunIndex)
-{
-    if (isEvGunLocked_chademo(gunIndex) == NO)
-    {
-        // 無鎖槍 = 停止
-        PRINTF_FUNC("gun locked none (%d) \n", gunIndex);
-        return YES;
-    }
-
-    return NO;
-}
-
-byte isPrechargeStatus_chademo(byte gunIndex)
-{
-    byte result = 0x00;
-
-    result = ShmCHAdeMOData->ev[chargingInfo[gunIndex]->type_index].PresentMsgFlowStatus;
-
-    return result;
-}
-//===============================================
-// Common Detect Chk - GB
-//===============================================
-bool isEvGunLocked_gb(byte gunIndex)
-{
-    return (DetectBitValue(chargingInfo[gunIndex]->GunLocked , 0) == 0)? NO : YES;
-}
-
-bool isEvStopCharging_gb(byte gunIndex)
-{
-    if (isEvGunLocked_gb(gunIndex) == NO)
-    {
-        // 無鎖槍 = 停止
-        PRINTF_FUNC("gun locked none. \n");
-        return YES;
-    }
-
-    return NO;
-}
-
-byte isPrechargeStatus_gb(byte gunIndex)
-{
-    byte result = 0x00;
-
-    result = ShmGBTData->ev[chargingInfo[gunIndex]->type_index].PresentMsgFlowStatus;
-
-    return result;
-}
-
-//===============================================
-// Common Detect Chk - CCS
-//===============================================
-bool isEvGunLocked_ccs(byte gunIndex)
-{
-    return (DetectBitValue(chargingInfo[gunIndex]->GunLocked , 0) == 0)? NO : YES;
-}
-
-byte isPrechargeStatus_ccs(byte gunIndex)
-{
-    byte result = 0x00;
-
-    if (ShmCcsData->CommProtocol == 0x01)
-    {
-        result = ShmCcsData->V2GMessage_DIN70121[chargingInfo[gunIndex]->type_index].PresentMsgFlowStatus;
-    }
-
-    return result;
-}
-
-bool isEvStopCharging_ccs(byte gunIndex)
-{
-    if (isEvGunLocked_ccs(gunIndex) == NO)
-    {
-        // 無鎖槍 = 停止
-        PRINTF_FUNC("gun locked none. \n");
-        return YES;
-    }
-
-    return NO;
-}
-
-//===============================================
-// Callback
-//===============================================
-void DisplayChargingInfo()
-{
-    PRINTF_FUNC("*********** DisplayChargingInfo *********** \n");
-    for (byte i = 0; i < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; i++)
-    {
-        if (chargingInfo[i]->SystemStatus != S_IDLE &&
-            chargingInfo[i]->SystemStatus != S_RESERVATION)
-        {
-            ChangeGunSelectByIndex(i);
-            return;
-        }
-    }
-
-    if (ShmSysConfigAndInfo->SysConfig.AcConnectorCount > 0 &&
-        ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == NO_DEFINE &&
-        ac_chargingInfo[0]->SystemStatus >= S_PREPARNING && ac_chargingInfo[0]->SystemStatus <= S_COMPLETE)
-    {
-        ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = DEFAULT_AC_INDEX;
-    }
-
-    usleep(50000);
-    ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_NONE;
-}
-
-void _AutoReturnTimeout()
-{
-    PRINTF_FUNC("*********** _AutoReturnTimeout %d*********** \n", ShmSysConfigAndInfo->SysInfo.PageIndex);
-    if (ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_WAIT_FOR_PLUG)
-    {
-        ClearDetectPluginFlag();
-    }
-    else if (ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_AUTHORIZ_COMP)
-    {
-        DetectPluginStart();
-    }
-    usleep(50000);
-    ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_NONE;
-}
-
-void _SelfTestTimeout()
-{
-    if (ShmSysConfigAndInfo->SysInfo.BootingStatus != BOOT_COMPLETE)
-    {
-        for (byte gun_index = 0; gun_index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; gun_index++)
-        {
-            setChargerMode(gun_index, MODE_ALARM);
-        }
-    }
-    ShmPsuData->Work_Step = _NO_WORKING;
-    ShmSysConfigAndInfo->SysInfo.SelfTestSeq = _STEST_FAIL;
-    PRINTF_FUNC("Self test timeout. \n");
-}
-
-void _AuthorizedTimeout()
-{
-    if(IsAuthorizingMode())
-    {
-        PRINTF_FUNC("*********** _AuthorizedTimeout *********** \n");
-        isCardScan = false;
-        ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_AUTHORIZ_FAIL;
-        //ChangeLcmByIndex(_LCM_AUTHORIZ_FAIL);
-        strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
-        ClearAuthorizedFlag();
-    }
-}
-
-void _DetectPlugInTimeout()
-{
-    PRINTF_FUNC("*********** _DetectPlugInTimeout *********** \n");
-    strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
-    ClearDetectPluginFlag();
-    usleep(50000);
-    ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_NONE;
-}
-
-void _DetectEvChargingEnableTimeout(byte gunIndex)
-{
-    if (chargingInfo[gunIndex]->Type == _Type_Chademo)
-    {
-        if(!isEvGunLocked_chademo(gunIndex))
-        {
-            PRINTF_FUNC("*********** _DetectEvChargingEnableTimeout (chademo) ***********\n");
-        }
-    }
-    else if (chargingInfo[gunIndex]->Type == _Type_GB)
-    {
-        if(!isEvGunLocked_ccs(gunIndex))
-        {
-            PRINTF_FUNC("*********** _DetectEvChargingEnableTimeout (gb) ***********\n");
-        }
-    }
-    else if (chargingInfo[gunIndex]->Type == _Type_CCS_2)
-    {
-        if(!isEvGunLocked_ccs(gunIndex))
-        {
-            PRINTF_FUNC("*********** _DetectEvChargingEnableTimeout (ccs) ***********\n");
-        }
-    }
-    ChargingTerminalProcess(gunIndex);
-    _AutoReturnTimeout();
-}
-
-void _DetectEvseChargingEnableTimeout(byte gunIndex)
-{
-    PRINTF_FUNC("*********** _DetectEvseChargingEnableTimeout (GFD timeout) ***********\n");
-
-    setChargerMode(gunIndex, MODE_IDLE);
-    _AutoReturnTimeout();
-}
-
-void _PrepareTimeout(byte gunIndex)
-{
-    PRINTF_FUNC("*********** _PrepareTimeout ***********\n");
-    setChargerMode(gunIndex, MODE_IDLE);
-    ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuNoResource = YES;
-    _AutoReturnTimeout();
-}
-
-void _CcsPrechargeTimeout(byte gunIndex)
-{
-    PRINTF_FUNC("*********** _CcsPrechargeTimeout ***********\n");
-    setChargerMode(gunIndex, MODE_IDLE);
-}
-
-//===============================================
-// 取得卡號與卡號驗證
-//===============================================
-bool canStartCharging()
-{
-    char buf2[16] = "";
-    memset(buf2, 0, ARRAY_SIZE(buf2));
-
-    for (byte index = 0; index < strlen((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status); index++)
-    {
-        sprintf(buf2 + (index - 1) * 2, "%02X", ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status[index]);
-    }
-    sprintf(buf2, "%s", ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status);
-
-    // 因為無法得知實際的長度,所以只能用搜尋的方式
-    if(strcmp(buf2, "Accepted") == EQUAL)
-        return true;
-    else
-    {
-        //NULL
-    }
-
-    return false;
-}
-
-void AuthorizingStart()
-{
-    ShmOCPP16Data->SpMsg.bits.AuthorizeReq = YES;
-    ShmSysConfigAndInfo->SysInfo.AuthorizeFlag = YES;
-}
-
-void ClearAuthorizedFlag()
-{
-    ShmOCPP16Data->SpMsg.bits.AuthorizeConf = NO;
-    ShmSysConfigAndInfo->SysInfo.AuthorizeFlag = NO;
-}
-
-bool isAuthorizedComplete()
-{
-    if (ShmOCPP16Data->SpMsg.bits.AuthorizeConf == NO)
-        return false;
-
-    return true;
-}
-
-bool IsAuthorizingMode()
-{
-    if(ShmSysConfigAndInfo->SysInfo.AuthorizeFlag == NO)
-        return false;
-
-    return true;
-}
-
-//===============================================
-// 紀錄 Alarm Code
-//===============================================
-void RecordAlarmCode(byte gunIndex, char *code)
-{
-    memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, code, 6);
-
-    if (strcmp(code, "012234") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGfdTrip = YES;
-    if (strcmp(code, "012235") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGfdTrip = YES;
-    if (strcmp(code, "012236") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip = YES;
-    if (strcmp(code, "012288") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsOutputUVPFail = YES;
-    if (strcmp(code, "012289") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoOutputUVPFail = YES;
-    if (strcmp(code, "012290") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbtOutputUVPFail = YES;
-}
-
-void RecordWarningCode(byte gunIndex, char *code)
-{
-    memcpy(chargingInfo[gunIndex]->ConnectorWarningCode, code, 6);
-
-    if (strcmp(code, "012296") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning = YES;
-    if (strcmp(code, "012297") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning = YES;
-    if (strcmp(code, "012298") == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning = YES;
-}
-
-void ReleaseAlarmCode(byte gunIndex)
-{
-    bool isCleanCheck = false;
-    char code[7];
-
-    if (chargingInfo[gunIndex]->Type == _Type_Chademo)
-    {
-        if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012234", 6) == EQUAL &&
-            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGfdTrip == YES)
-        {
-            memcpy(code, "012234", 6);
-            memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, "", 6);
-            isCleanCheck = true;
-        }
-        else if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012289", 6) == EQUAL &&
-                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoOutputUVPFail == YES)
-        {
-            memcpy(code, "012289", 6);
-            memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, "", 6);
-            isCleanCheck = true;
-        }
-        else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning == YES)
-        {
-            ReleaseWarningCodeByString(gunIndex, "012296");
-        }
-    }
-    else if (chargingInfo[gunIndex]->Type == _Type_GB)
-    {
-        if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012236", 6) == EQUAL &&
-            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip == YES)
-        {
-            memcpy(code, "012236", 6);
-            memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, "", 6);
-            isCleanCheck = true;
-        }
-        else if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012290", 6) == EQUAL &&
-                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbtOutputUVPFail == YES)
-        {
-            memcpy(code, "012290", 6);
-            memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, "", 6);
-            isCleanCheck = true;
-        }
-        else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning == YES)
-        {
-            ReleaseWarningCodeByString(gunIndex, "012298");
-        }
-    }
-    else if (chargingInfo[gunIndex]->Type == _Type_CCS_2)
-    {
-        if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012235", 6) == EQUAL &&
-            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGfdTrip == YES)
-        {
-            memcpy(code, "012235", 6);
-            memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, "", 6);
-            isCleanCheck = true;
-        }
-        else if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012288", 6) == EQUAL &&
-                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsOutputUVPFail == YES)
-        {
-            memcpy(code, "012288", 6);
-            memcpy(chargingInfo[gunIndex]->ConnectorAlarmCode, "", 6);
-            isCleanCheck = true;
-        }
-        else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning == YES)
-        {
-            ReleaseWarningCodeByString(gunIndex, "012297");
-        }
-    }
-
-    if (isCleanCheck)
-    {
-        for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++)
-        {
-            if (index != gunIndex || ShmSysConfigAndInfo->SysConfig.TotalConnectorCount == 1)
-            {
-                if (strncmp((char *)chargingInfo[index]->ConnectorAlarmCode, code, 6) != EQUAL)
-                {
-                    if (strncmp(code, "012234", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGfdTrip = NO;
-                    if (strncmp(code, "012289", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoOutputUVPFail = NO;
-
-                    if (strncmp(code, "012236", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip = NO;
-                    if (strncmp(code, "012290", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbtOutputUVPFail = NO;
-
-                    if (strncmp(code, "012235", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGfdTrip = NO;
-                    if (strncmp(code, "012288", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsOutputUVPFail = NO;
-                }
-            }
-        }
-    }
-}
-
-void ReleaseWarningCodeByString(byte gunIndex, char *code)
-{
-    bool isCleanCheck = false;
-
-    if (strncmp((char *)chargingInfo[gunIndex]->ConnectorWarningCode, code, 6) == EQUAL &&
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning == YES)
-    {
-        memcpy(chargingInfo[gunIndex]->ConnectorWarningCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)chargingInfo[gunIndex]->ConnectorWarningCode, code, 6) == EQUAL &&
-             ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning == YES)
-    {
-        memcpy(chargingInfo[gunIndex]->ConnectorWarningCode, "", 6);
-        isCleanCheck = true;
-    }
-    else if (strncmp((char *)chargingInfo[gunIndex]->ConnectorWarningCode, code, 6) == EQUAL &&
-             ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning == YES)
-    {
-        memcpy(chargingInfo[gunIndex]->ConnectorWarningCode, "", 6);
-        isCleanCheck = true;
-    }
-
-    if (isCleanCheck)
-    {
-        for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++)
-        {
-            if (index != gunIndex || ShmSysConfigAndInfo->SysConfig.TotalConnectorCount == 1)
-            {
-                if (strncmp((char *)chargingInfo[index]->ConnectorWarningCode, code, 6) != EQUAL)
-                {
-                    if (strncmp(code, "012296", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning = NO;
-                    if (strncmp(code, "012297", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning = NO;
-                    if (strncmp(code, "012298", 6) == EQUAL) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning = NO;
-                }
-            }
-        }
-    }
-}
-//===============================================
-// EmergencyStop and Charging Stop
-//===============================================
-void ChargingTerminalProcess(byte gunIndex)
-{
-    setChargerMode(gunIndex, MODE_TERMINATING);
-}
-
-void AcChargingTerminalProcess()
-{
-    ac_chargingInfo[0]->SystemStatus = MODE_TERMINATING;
-}
-
-void StopChargingProcessByString(byte level)
-{
-    if (level > ShmSysConfigAndInfo->SysWarningInfo.Level)
-    {
-        ShmSysConfigAndInfo->SysWarningInfo.Level = level;
-    }
-}
-
-void ReleaseChargingProcessByString(byte level)
-{
-    if (level >= ShmSysConfigAndInfo->SysWarningInfo.Level)
-        ShmSysConfigAndInfo->SysWarningInfo.Level = 0;
-}
-
-// 一般錯誤停止充電處理函式
-void BoardErrOccurByString(byte index, char *code)
-{
-    byte level = 1;
-    if ((chargingInfo[index]->SystemStatus > S_IDLE && chargingInfo[index]->SystemStatus < S_TERMINATING) ||
-        (chargingInfo[index]->SystemStatus >= S_CCS_PRECHARGE_ST0 && chargingInfo[index]->SystemStatus <= S_CCS_PRECHARGE_ST1))
-    {
-        if (strncmp(code, "023730", 6) == EQUAL && ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargerGetEmergencyStop == NO)
-        {
-            ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargerGetEmergencyStop = YES;
-        }
-        ChargingTerminalProcess(index);
-    }
-
-    StopChargingProcessByString(level);
-}
-
-// 急停狀況的停止充電處理函式
-void EmcOccureByString(char *code)
-{
-    byte level = 2;
-    // 嚴重的急停有四種 : EMC 按鈕、Mainbreak、Dooropen、SPD Trip
-    // 其錯誤等級為 2
-    if (strncmp(code, "012251", 6) == EQUAL || strncmp(code, "012252", 6) == EQUAL ||
-        strncmp(code, "012237", 6) == EQUAL || strncmp(code, "012238", 6) == EQUAL)
-    {
-        for (byte gun = 0; gun < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; gun++)
-        {
-            if ((chargingInfo[gun]->SystemStatus > S_IDLE && chargingInfo[gun]->SystemStatus < S_TERMINATING) ||
-                (chargingInfo[gun]->SystemStatus >= S_CCS_PRECHARGE_ST0 && chargingInfo[gun]->SystemStatus <= S_CCS_PRECHARGE_ST1))
-            {
-                ChargingTerminalProcess(gun);
-            }
-
-            StopChargingProcessByString(level);
-        }
-    }
-}
-
-void ReleaseBoardErrOccurByString(byte index, char *code)
-{
-    bool isTrigger = false;
-    byte level = 1;
-
-    if (strncmp(code, "023730", 6) == 0 && ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargerGetEmergencyStop == YES)
-    {
-        isTrigger = true;
-        ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoChargerGetEmergencyStop = NO;
-    }
-
-    if (isTrigger)
-    {
-        ReleaseChargingProcessByString(level);
-    }
-}
-
-void ReleaseEmsOccureByString(byte index, char *code)
-{
-    bool isTrigger = false;
-    byte level = 2;
-
-    if (strncmp(code, "012251", 6) == 0 && ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip == YES)
-    {
-        isTrigger = true;
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip = NO;
-    }
-    else if (strncmp(code, "012252", 6) == 0 && ShmStatusCodeData->AlarmCode.AlarmEvents.bits.DoorOpen == YES)
-    {
-        isTrigger = true;
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.DoorOpen = NO;
-    }
-    else if (strncmp(code, "012237", 6) == 0 && ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SpdTrip == YES)
-    {
-        isTrigger = true;
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SpdTrip = NO;
-    }
-    else if (strncmp(code, "012238", 6) == 0 && ShmStatusCodeData->AlarmCode.AlarmEvents.bits.MainPowerBreakerTrip == YES)
-    {
-        isTrigger = true;
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.MainPowerBreakerTrip = NO;
-    }
-
-    if (isTrigger)
-    {
-        ReleaseChargingProcessByString(level);
-    }
-}
-
-//===============================================
-// 確認硬體 (按鈕) 狀態
-//===============================================
-bool leftBtnPush = false;
-bool rightBtnPush = false;
-
-void ChkPrimaryStatus()
-{
-    if (ShmPrimaryMcuData->InputDet.bits.EmergencyButton == ABNORMAL)
-    {
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip = YES;
-        EmcOccureByString("012251");
-    }
-    else
-        ReleaseEmsOccureByString(0, "012251");
-
-    if (ShmPrimaryMcuData->InputDet.bits.AcMainBreakerDetec == ABNORMAL)
-    {
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.MainPowerBreakerTrip = YES;
-        EmcOccureByString("012238");
-    }
-    else
-        ReleaseEmsOccureByString(0, "012238");
-
-    if (ShmPrimaryMcuData->InputDet.bits.SpdDetec == ABNORMAL)
-    {
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SpdTrip = YES;
-        //EmcOccureByString("012237");
-    }
-    else
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SpdTrip = NO;
-        //ReleaseEmsOccureByString(0, "012237");
-
-    if (ShmPrimaryMcuData->InputDet.bits.DoorOpen == ABNORMAL)
-    {
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.DoorOpen = YES;
-        EmcOccureByString("012252");
-    }
-    else
-        ReleaseEmsOccureByString(0, "012252");
-
-    if (ShmPrimaryMcuData->InputDet.bits.Button1 == BTN_PRESS && !leftBtnPush)
-    {
-        if(!leftBtnPush)
-        {
-            leftBtnPush = true;
-            PRINTF_FUNC("left btn down............................... \n");
-            if (ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc != NO_DEFINE)
-            {
-                switch(ac_chargingInfo[0]->SystemStatus)
-                {
-                    case S_IDLE:
-                    {
-                        if(isDetectPlugin())
-                        {
-                            _DetectPlugInTimeout();
-                            StopSystemTimeoutDet();
-                        }
-                    }
-                        break;
-                    case S_REASSIGN_CHECK:
-                    case S_REASSIGN:
-                    case S_PREPARNING:
-                    case S_PREPARING_FOR_EV:
-                    case S_PREPARING_FOR_EVSE:
-                    case S_CCS_PRECHARGE_ST0:
-                    case S_CCS_PRECHARGE_ST1:
-                    {
-                        // 取消充電
-                        AcChargingTerminalProcess();
-                    }
-                        break;
-                    case S_CHARGING:
-                    {
-                        if (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_DISABLE)
-                        {
-                            // 停止充電
-                            AcChargingTerminalProcess();
-                        }
-                    }
-                        break;
-                    case S_COMPLETE:
-                    {}
-                        break;
-                }
-            }
-
-            switch(chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus)
-            {
-                case S_IDLE:
-                {
-                    if(isDetectPlugin())
-                    {
-                        _DetectPlugInTimeout();
-                        StopSystemTimeoutDet();
-                    }
-                }
-                    break;
-                case S_REASSIGN_CHECK:
-                case S_REASSIGN:
-                case S_PREPARNING:
-                case S_PREPARING_FOR_EV:
-                case S_PREPARING_FOR_EVSE:
-                case S_CCS_PRECHARGE_ST0:
-                case S_CCS_PRECHARGE_ST1:
-                {
-                    // 取消充電
-                    if (ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc != NO_DEFINE)
-                        AcChargingTerminalProcess();
-                    else
-                        ChargingTerminalProcess(ShmSysConfigAndInfo->SysInfo.CurGunSelected);
-                }
-                    break;
-                case S_CHARGING:
-                {
-                    if (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_DISABLE)
-                    {
-                        // 停止充電
-                        ChargingTerminalProcess(ShmSysConfigAndInfo->SysInfo.CurGunSelected);
-                    }
-                }
-                    break;
-                case S_COMPLETE:
-                {
-                    // 回 IDLE
-                    //PRINTF_FUNC("right btn down.................S_COMPLETE \n");
-                    //chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_IDLE;
-                }
-                    break;
-            }
-        }
-    }
-    else if (ShmPrimaryMcuData->InputDet.bits.Button1 == BTN_RELEASE)
-    {
-        if(leftBtnPush)
-        {
-            leftBtnPush = false;
-            PRINTF_FUNC("left btn up............................... \n");
-        }
-    }
-
-    if (ShmPrimaryMcuData->InputDet.bits.Button2 == BTN_PRESS && !rightBtnPush)
-    {
-        if(!rightBtnPush)
-        {
-            rightBtnPush = true;
-            PRINTF_FUNC("right btn down............................... %d \n", ShmSysConfigAndInfo->SysInfo.CurGunSelected);
-            if (ShmSysConfigAndInfo->SysInfo.CurGunSelected + 1 < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount &&
-                ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
-            {
-                ShmSysConfigAndInfo->SysInfo.CurGunSelected++;
-                ChangeGunSelectByIndex(ShmSysConfigAndInfo->SysInfo.CurGunSelected);
-            }
-            else if (ShmSysConfigAndInfo->SysConfig.AcConnectorCount > 0 &&
-                     ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == NO_DEFINE)
-                ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = DEFAULT_AC_INDEX;
-            else if (ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == YES)
-            {
-                for (byte _index = 0; _index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; _index++)
-                {
-                    if (chargingInfo[_index]->SystemStatus != S_BOOTING &&
-                        chargingInfo[_index]->SystemStatus != S_IDLE &&
-                        chargingInfo[_index]->SystemStatus != S_RESERVATION)
-                    {
-                        ShmSysConfigAndInfo->SysInfo.CurGunSelected = _index;
-                        ChangeGunSelectByIndex(ShmSysConfigAndInfo->SysInfo.CurGunSelected);
-                        return;
-                    }
-                }
-
-                ShmSysConfigAndInfo->SysInfo.CurGunSelected = 0;
-                ChangeGunSelectByIndex(ShmSysConfigAndInfo->SysInfo.CurGunSelected);
-            }
-            else
-            {
-                ShmSysConfigAndInfo->SysInfo.CurGunSelected = 0;
-                ChangeGunSelectByIndex(ShmSysConfigAndInfo->SysInfo.CurGunSelected);
-            }
-        }
-    }
-    else if (ShmPrimaryMcuData->InputDet.bits.Button2 == BTN_RELEASE)
-    {
-        if(rightBtnPush)
-        {
-            rightBtnPush = false;
-            PRINTF_FUNC("right btn up............................... \n");
-        }
-    }
-}
-
-//===============================================
-// 確認各小板偵測的錯誤狀況
-//===============================================
-void CheckErrorOccurStatus(byte index)
-{
-    // 小板
-    if (chargingInfo[index]->Type == _Type_Chademo)
-    {
-        if (ShmStatusCodeData->FaultCode.FaultEvents.bits.ChademoOutputRelayDrivingFault == YES)
-            BoardErrOccurByString(index, "011012");
-        else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGfdTrip == YES)
-            BoardErrOccurByString(index, "012234");
-    }
-    else if (chargingInfo[index]->Type == _Type_GB)
-    {
-        if (ShmStatusCodeData->FaultCode.FaultEvents.bits.GbOutputRelayDrivingFault == YES)
-            BoardErrOccurByString(index, "011016");
-        else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip == YES)
-            BoardErrOccurByString(index, "012236");
-    }
-    else if (chargingInfo[index]->Type == _Type_CCS_2)
-    {
-        if (ShmStatusCodeData->FaultCode.FaultEvents.bits.CcsOutputRelayDrivingFault == YES)
-            BoardErrOccurByString(index, "011014");
-        else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGfdTrip == YES)
-            BoardErrOccurByString(index, "012235");
-    }
 
-    // RB
-    if (ShmSysConfigAndInfo->SysConfig.PhaseLossPolicy == YES)
-    {
-        if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP == YES ||
-            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP == YES ||
-            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP == YES)
-        {
-            if (ShmSysConfigAndInfo->SysWarningInfo.ExtraErrProcess == _EXTRA_ERR_PROCESS_NONE)
-            {
-                ShmSysConfigAndInfo->SysWarningInfo.ExtraErrProcess = _EXTRA_ERR_PROCESS_INUVP;
-                StopChargingProcessByString(2);
-            }
-        }
-        else
-        {
-            if (ShmSysConfigAndInfo->SysWarningInfo.ExtraErrProcess == _EXTRA_ERR_PROCESS_INUVP)
-            {
-                ShmSysConfigAndInfo->SysWarningInfo.ExtraErrProcess = _EXTRA_ERR_PROCESS_NONE;
-                ReleaseChargingProcessByString(2);
-            }
-        }
-    }
-    else
-    {
-        if (ShmSysConfigAndInfo->SysWarningInfo.ExtraErrProcess == _EXTRA_ERR_PROCESS_INUVP)
-        {
-            ShmSysConfigAndInfo->SysWarningInfo.ExtraErrProcess = _EXTRA_ERR_PROCESS_NONE;
-            ReleaseChargingProcessByString(2);
-        }
-    }
+#include    <sys/types.h>
+#include    <sys/stat.h>
+#include 	<sys/time.h>
+#include 	<sys/timeb.h>
+#include 	<sys/ioctl.h>
+#include 	<sys/socket.h>
+#include 	<sys/ipc.h>
+#include 	<sys/shm.h>
+#include 	<sys/mman.h>
+#include 	<linux/wireless.h>
+#include 	<arpa/inet.h>
+#include 	<netinet/in.h>
+#include 	<unistd.h>
+#include 	<stdarg.h>
+#include    <stdio.h>      /*標準輸入輸出定義*/
+#include    <stdlib.h>     /*標準函數庫定義*/
+#include    <unistd.h>     /*Unix 標準函數定義*/
+#include    <fcntl.h>      /*檔控制定義*/
+#include    <termios.h>    /*PPSIX 終端控制定義*/
+#include    <errno.h>      /*錯誤號定義*/
+#include 	<errno.h>
+#include 	<string.h>
+#include	<time.h>
+#include	<ctype.h>
+#include 	<ifaddrs.h>
+#include 	<math.h>
+#include 	"Config.h"
+#include 	<stdbool.h>
+#include 	"../../define.h"
+#include 	<dirent.h>
+#include 	"VCCU.h"
+#include	"timeout.h"
+#include 	"IOComm.h"
+#include 	<unistd.h>                 //write, close, usleep, read
+
+#include 	<sys/time.h>
+#include 	<sys/timeb.h>
+#include    <sys/types.h>
+#include    <sys/stat.h>
+#include 	<sys/types.h>
+#include 	<sys/ioctl.h>
+#include 	<sys/socket.h>
+#include 	<sys/ipc.h>
+#include 	<sys/shm.h>
+#include 	<sys/shm.h>
+#include 	<sys/mman.h>
+#include 	<linux/wireless.h>
+#include 	<arpa/inet.h>
+#include 	<netinet/in.h>
+
+#include 	<unistd.h>
+#include 	<stdarg.h>
+#include    <stdio.h>      /*標準輸入輸出定義*/
+#include    <stdlib.h>     /*標準函數庫定義*/
+#include    <unistd.h>     /*Unix 標準函數定義*/
+#include    <fcntl.h>      /*檔控制定義*/
+#include    <termios.h>    /*PPSIX 終端控制定義*/
+#include    <errno.h>      /*錯誤號定義*/
+#include 	<errno.h>
+#include 	<string.h>
+#include	<time.h>
+#include	<ctype.h>
+#include 	<ifaddrs.h>
+#include 	<math.h>
+#include 	"Module_EvComm.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>                 //write, close, usleep, read
+#include <fcntl.h>                  //uart
+#define 	Debug
+#define 	ARRAY_SIZE(A)		(sizeof(A) / sizeof(A[0]))
+//#define 	PASS				1
+#define 	FAIL				-1
+#define 	START				1
+#define 	STOP				0
+#define 	BUFFER_SIZE			128
+#define 	YES					1
+#define 	NO					0
+#define 	NORMAL				0
+#define		ABNORMAL			1
+#define 	EQUAL				0
+#define 	BTN_RELEASE			0
+#define 	BTN_PRESS			1
+#define 	MAX_BUF 			64
+//#define 	SYSFS_GPIO_DIR 		"/sys/class/gpio"
+#define 	SendDirection               0x08000000
+#define 	FAIL				-1
+
+struct SysConfigAndInfo				*ShmSysConfigAndInfo;
+struct StatusCodeData 				*ShmStatusCodeData;
+struct CHAdeMOData					*ShmCHAdeMOData;
+struct CcsData						*ShmCcsData;
+struct RelayModuleData				*ShmRelayModuleData;
+//struct ATE 							*ate;
+struct ChargingInfoData			*chargingInfo[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
+struct timeb 					startChargingTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
+struct timeb 					endChargingTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
+struct timeb 					startPlugPresentStatusTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
+struct timeb 					startDutyCyclTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
+struct timeb 					endPlugPresentStatusTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
+struct timeb 					endDutyCyclTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
+
+
+//VCCU_ChargeFromVehicle_DATA chargeFromVehicle;
+
+pid_t CANReceiverPid;
+int 						CanFd;
+int 						CanFd2;
+
+#define VIN_MAX_VOLTAGE		250	// 大於該值 : OVP
+#define VIN_MIN_VOLTAGE		170	// 小於該值 : UVP
+#define VIN_DROP_VOLTAGE	150	// 小於該值 : ac drop
+
+//#define SYSFS_GPIO_DIR      "/sys/class/gpio"
+
+byte gunCount = CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY;
+// for initial index to check EV board type is correct
 
-    if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP == YES ||
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP == YES ||
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP == YES)
-    {
-        if (ShmSysConfigAndInfo->SysWarningInfo.ExtraErrProcess == _EXTRA_ERR_PROCESS_NONE)
-        {
-            ShmSysConfigAndInfo->SysWarningInfo.ExtraErrProcess = _EXTRA_ERR_PROCESS_INOVP;
-            StopChargingProcessByString(2);
-        }
-    }
-    else
-    {
-        if (ShmSysConfigAndInfo->SysWarningInfo.ExtraErrProcess == _EXTRA_ERR_PROCESS_INOVP)
-        {
-            ShmSysConfigAndInfo->SysWarningInfo.ExtraErrProcess = _EXTRA_ERR_PROCESS_NONE;
-            ReleaseChargingProcessByString(2);
-        }
-    }
-}
+//char *relayRs485PortName = "/dev/ttyS5";
+//char* pPortName = "/dev/ttyS3";
+//char *priPortName = "/dev/ttyS1";
+
+#define btoa(x) ((x)?"true":"false")
+long hexToDec(char *source);
+int getIndexOfSigns(char ch);
+int whileLoopTime = 200000;//500ms//10000; // 10 ms
+int targetCurrent_Value = 120;//2;
+int targetVoltage_Value = 500;
+int maximumCurrent_value = 200;//10;
+int maximumVoltage_value = 500;
+int linkVoltage = 500;
+int contactorVoltage = 0;//要用電池載的電壓
+int maxValue = 950;
+int gbmaxValue = 750;
+int _port;
+#define YES                 1
+#define NO                  0
+byte flash = NO;
+//=================================
+// Create all share memory
+//=================================
 
-//===============================================
-// 確認 GPIO 狀態
-//===============================================
-void gpio_set_value(unsigned int gpio, unsigned int value)
+byte normalStop = 0x01;
+byte stopReason[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+byte evstaus[5] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
+
+struct Ev_Board_Cmd Ev_Cmd={
+		0,
+		0x00000200,
+		0x00000400,
+		0x00000500,
+		0x00000600,
+		0x00000700,
+		0x00000800,
+		0x00000900,
+		0x00000A00,
+		0x00000C00,
+		0x00000D00,
+
+		0x00000E00,
+		0x00000F00,
+		0x00001000,
+		0x00001100,
+
+		0x00001200,
+		0x00001500,
+};
+
+
+int CreatShareMemory()
+{
+	int MeterSMId;
+
+	//creat ShmSysConfigAndInfo
+	if ((MeterSMId = shmget(ShmSysConfigAndInfoKey,	sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
+	{
+		#ifdef SystemLogMessage
+		//StoreLogMsg("[main]CreatShareMemory:shmget ShmSysConfigAndInfo NG \n");
+		#endif
+		return 0;
+	}
+	else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0))	== (void *) -1)
+	{
+		#ifdef SystemLogMessage
+		//StoreLogMsg("[main]CreatShareMemory:shmat ShmSysConfigAndInfo NG \n");
+		#endif
+		return 0;
+	}
+	memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo));
+
+	//creat ShmCcsData
+	if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData),	IPC_CREAT | 0777)) < 0){
+		#ifdef SystemLogMessage
+			//StoreLogMsg("[main]CreatShareMemory:shmget ShmCcsData NG \n");
+		#endif
+		return 0;
+	}
+	else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1){
+		#ifdef SystemLogMessage
+			//StoreLogMsg("[main]CreatShareMemory:shmat ShmCcsData NG \n");
+		#endif
+		return 0;
+	}
+	memset(ShmCcsData, 0, sizeof(struct CcsData));
+
+
+	//creat ShmRelayModuleData
+	if ((MeterSMId = shmget(ShmRelayBdKey, sizeof(struct RelayModuleData), IPC_CREAT | 0777)) < 0)
+	{
+		#ifdef SystemLogMessage
+		//StoreLogMsg("shmget ShmRelayModuleData NG\n");
+		#endif
+		return 0;
+	}
+	else if ((ShmRelayModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+	{
+		#ifdef SystemLogMessage
+		//StoreLogMsg("shmat ShmRelayModuleData NG\n");
+		#endif
+		return 0;
+	}
+	memset(ShmRelayModuleData, 0, sizeof(struct RelayModuleData));
+	return 1;
+}
+unsigned long GetTimeoutValue(struct timeval _sour_time);
+unsigned long GetTimeoutValue(struct timeval _sour_time)
 {
-    int fd;
-    char buf[MAX_BUF];
-
-    snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/value", gpio);
-    fd = open(buf, O_WRONLY);
-    if (fd < 0)
-    {
-        perror("gpio/set-value");
-        return;
-    }
+	struct timeval _end_time;
+	gettimeofday(&_end_time, NULL);
 
-    if (value)
-        write(fd, "1", 2);
-    else
-        write(fd, "0", 2);
-
-    close(fd);
+	return 1000000 * (_end_time.tv_sec - _sour_time.tv_sec) + _end_time.tv_usec - _sour_time.tv_usec;
 }
-
-int gpio_get_value(unsigned int gpio, unsigned int *value)
+int InitCanBus()
 {
-    int fd;
-    char buf[MAX_BUF];
-    char ch;
-
-    snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/value", gpio);
+    int s0, nbytes;
+    struct timeval tv;
+    struct ifreq ifr0;
+    struct sockaddr_can addr0;
+    /*
+    //can0
+    system("/sbin/ip link set can0 down");//先將interface disable
+    system("/sbin/ip link set can0 type can bitrate 500000 restart-ms 100");
+    system("/sbin/ip link set can0 up");
+    */
 
-    fd = open(buf, O_RDONLY);
-    if (fd < 0){
-        perror("gpio/get-value");
-        return fd;
-    }
+    //can1
+    system("/sbin/ip link set can0 down");//先將interface disable
+    system("/sbin/ip link set can0 type can bitrate 250000 restart-ms 100");
+    system("/sbin/ip link set can0 up");
 
-    read(fd, &ch, 1);
+    s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW);
+    tv.tv_sec = 0;
+    tv.tv_usec = 10000;
 
-    if (ch != '0') {
-        *value = 1;
-    } else {
-        *value = 0;
+    if(setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0)
+    {
+        #ifdef SystemLogMessage
+            //StoreLogMsg("[CsuComm]InitCanBus:Set SO_RCVTIMEO NG");
+        #endif
     }
 
-    close(fd);
-    return 0;
-}
-
-void CheckGunTypeFromHw()
-{
-    int pinIn[4] = { 22, 23, 44, 45 };
-    unsigned int gpioValue = 0;
+    nbytes = 40960;
 
-    for (int i = 0; i < ARRAY_SIZE(pinIn); i++)
+    if(setsockopt(s0, SOL_SOCKET,  SO_RCVBUF, &nbytes, sizeof(int)) < 0)
     {
-        gpio_get_value(pinIn[i], &gpioValue);
-
-        switch (pinIn[i])
-        {
-            case 22:
-                bd1_1_status = gpioValue;
-                break;
-            case 23:
-                bd1_2_status = gpioValue;
-                break;
-            case 44:
-                bd0_1_status = gpioValue;
-                break;
-            case 45:
-                bd0_2_status = gpioValue;
-                break;
-        }
+        #ifdef SystemLogMessage
+            //StoreLogMsg("[CsuComm]InitCanBus:Set SO_RCVBUF NG");
+        #endif
     }
-}
 
-void CheckGpioInStatus()
-{
-    int pinIn[2] = { 27, 47 };
-    unsigned int gpioValue = 0;
+    nbytes = 40960;
 
-    for (int i = 0; i < ARRAY_SIZE(pinIn); i++)
+    if(setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0)
     {
-        gpio_get_value(pinIn[i], &gpioValue);
-        if (gpioValue == 0x01)
-        {
-            switch(pinIn[i])
-            {
-                // 小板緊急停止
-                case 47:
-                {
-                    for(int i = 0; i < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; i++)
-                    {
-                        if (chargingInfo[i]->slotsIndex == 1)
-                        {
-                            if (chargingInfo[i]->Type == _Type_Chademo)
-                                BoardErrOccurByString(i, "023730");
-                            else if (chargingInfo[i]->Type == _Type_CCS_2)
-                                BoardErrOccurByString(i, "013627");
-                            break;
-                        }
-                    }
-                }
-                    break;
-                case 27:
-                {
-                    for(int i = 0; i < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; i++)
-                    {
-                        if (chargingInfo[i]->slotsIndex == 3)
-                        {
-                            if (chargingInfo[i]->Type == _Type_Chademo)
-                                BoardErrOccurByString(i, "023730");
-                            else if (chargingInfo[i]->Type == _Type_CCS_2)
-                                BoardErrOccurByString(i, "013627");
-                            break;
-                        }
-                    }
-                }
-                    break;
-            }
-        }
-        else
-        {
-            switch (pinIn[i])
-            {
-                // 小板解除緊急停止
-                case 47:
-                {
-                    for(int i = 0; i < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; i++)
-                    {
-                        if (chargingInfo[i]->slotsIndex == 1)
-                        {
-                            if (chargingInfo[i]->Type == _Type_Chademo)
-                                ReleaseBoardErrOccurByString(i, "023730");
-                            else if (chargingInfo[i]->Type == _Type_CCS_2)
-                                ReleaseBoardErrOccurByString(i, "013627");
-                            break;
-                        }
-                    }
-                }
-                    break;
-                case 27:
-                {
-                    for (int i = 0; i < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; i++)
-                    {
-                        if (chargingInfo[i]->slotsIndex == 3)
-                        {
-                            if (chargingInfo[i]->Type == _Type_Chademo)
-                                ReleaseBoardErrOccurByString(i, "023730");
-                            else if (chargingInfo[i]->Type == _Type_CCS_2)
-                                ReleaseBoardErrOccurByString(i, "013627");
-                            break;
-                        }
-                    }
-                }
-                break;
-            }
-        }
+        #ifdef SystemLogMessage
+            //StoreLogMsg("[CsuComm]InitCanBus:Set SO_SNDBUF NG");
+        #endif
     }
-}
 
-//===============================================
-// Main process
-//===============================================
-// 檢查 Byte 中某個 Bit 的值
-// _byte : 欲改變的 byte
-// _bit : 該 byte 的第幾個 bit
-unsigned char DetectBitValue(unsigned char _byte, unsigned char _bit)
-{
-    return ( _byte & mask_table[_bit] ) != 0x00;
+    //strcpy(ifr0.ifr_name, "can0" );
+    strcpy(ifr0.ifr_name, "can0" );
+    ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
+    addr0.can_family = AF_CAN;
+    addr0.can_ifindex = ifr0.ifr_ifindex;
+    bind(s0, (struct sockaddr *)&addr0, sizeof(addr0));
+    return s0;
 }
 
-// 設定 Byte 中某個 Bit的值
-// _byte : 欲改變的 byte
-// _bit : 該 byte 的第幾個 bit
-// value : 修改的值為 0 or 1
-void SetBitValue(unsigned char *_byte, unsigned char _bit, unsigned char value)
+int CHROMAInitCanBus()
+{
+	int 					s0,nbytes;
+		struct timeval			tv;
+		struct ifreq 			ifr0;
+		struct sockaddr_can		addr0;
+
+		system("/sbin/ip link set can1 down");
+		system("/sbin/ip link set can1 type can bitrate 500000 restart-ms 100");
+		system("/sbin/ip link set can1 up");
+
+		s0 = socket(PF_CAN, SOCK_RAW, CAN_RAW);
+
+		tv.tv_sec = 0;
+		tv.tv_usec = 10000;
+	   	if (setsockopt(s0, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct	timeval)) < 0)
+		{
+			#ifdef SystemLogMessage
+			//DEBUG_ERROR("Set SO_RCVTIMEO NG");
+			#endif
+		}
+		nbytes=40960;
+		if (setsockopt(s0, SOL_SOCKET,  SO_RCVBUF, &nbytes, sizeof(int)) < 0)
+		{
+			#ifdef SystemLogMessage
+			//DEBUG_ERROR("Set SO_RCVBUF NG");
+			#endif
+		}
+		nbytes=40960;
+		if (setsockopt(s0, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0)
+		{
+			#ifdef SystemLogMessage
+			//DEBUG_ERROR("Set SO_SNDBUF NG");
+			#endif
+		}
+
+	   	strcpy(ifr0.ifr_name, "can1" );
+		ioctl(s0, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
+		addr0.can_family = AF_CAN;
+		addr0.can_ifindex = ifr0.ifr_ifindex;
+		bind(s0, (struct sockaddr *)&addr0, sizeof(addr0));
+		return s0;
+}
+int DiffTimeb(struct timeb ST, struct timeb ET)
 {
-    if(value == 1)
-        *_byte |= (1 << _bit);
-    else if (value == 0)
-        *_byte ^= (1 << _bit);
+	//return milli-second
+	unsigned int StartTime,StopTime;
+
+	StartTime=(unsigned int)ST.time;
+	StopTime=(unsigned int)ET.time;
+	//return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
+	return (StopTime-StartTime);
 }
 
-void UserScanFunction()
+void StopGunInfoTimeoutDet(unsigned char gunIndex)
 {
-    bool idleReq = false;
-    unsigned char stopReq = 255;
-
-    // 當前非驗證的狀態
-    if(!IsAuthorizingMode())
-    {
-        // 先判斷現在是否可以提供刷卡
-        // 1. 如果當前沒有槍是閒置狀態,則無提供刷卡功能
-        // 2. 停止充電
-        if (ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_FIX)
-        {
-            strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
-            return;
-        }
-
-        for (byte i = 0; i < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; i++)
-        {
-            if (chargingInfo[i]->SystemStatus == S_CHARGING)
-            {
-                stopReq = i;
-            }
-            if ((chargingInfo[i]->SystemStatus == S_IDLE && chargingInfo[i]->IsAvailable) == YES ||
-                (_acgunIndex > 0 && ac_chargingInfo[0]->SystemStatus == S_IDLE && ac_chargingInfo[0]->IsAvailable))
-            {
-                idleReq = true;
-            }
-        }
-
-        if (_acgunIndex > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == DEFAULT_AC_INDEX &&
-            ac_chargingInfo[0]->SystemStatus == S_CHARGING)
-        {
-            stopReq = DEFAULT_AC_INDEX;
-        }
-
-        if (strlen((char *)ShmSysConfigAndInfo->SysConfig.UserId) > 0)
-        {
-            if (_acgunIndex > 0 && stopReq == DEFAULT_AC_INDEX && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == DEFAULT_AC_INDEX)
-            {
-                char value[32];
-
-                PRINTF_FUNC("ac stop charging \n");
-                PRINTF_FUNC("index = %d, card number = %s, UserId = %s \n", ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc,
-                            ac_chargingInfo[0]->StartUserId, ShmSysConfigAndInfo->SysConfig.UserId);
-                memcpy(value, (unsigned char *)ac_chargingInfo[0]->StartUserId,
-                       ARRAY_SIZE(ac_chargingInfo[0]->StartUserId));
-                if (strcmp((char *)ShmSysConfigAndInfo->SysConfig.UserId, value) == EQUAL)
-                {
-                    AcChargingTerminalProcess();
-                }
-                strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
-            }
-            else if (stopReq < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount &&
-                     chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus == S_CHARGING &&
-                     (_acgunIndex <= 0 || (_acgunIndex > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == NO_DEFINE)))
-            {
-                char value[32];
-
-                PRINTF_FUNC("stop charging \n");
-                PRINTF_FUNC("index = %d, card number = %s, UserId = %s \n", ShmSysConfigAndInfo->SysInfo.CurGunSelected,
-                            chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->StartUserId, ShmSysConfigAndInfo->SysConfig.UserId);
-                memcpy(value, (unsigned char *)chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->StartUserId,
-                       ARRAY_SIZE(chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->StartUserId));
-
-                // 同一張卡直接停掉
-                if (strcmp((char *)ShmSysConfigAndInfo->SysConfig.UserId, value) == EQUAL)
-                {
-                    ChargingTerminalProcess(ShmSysConfigAndInfo->SysInfo.CurGunSelected);
-                    strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
-                }
-                else
-                {
-                    // 進驗證
-                    if (_acgunIndex > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == DEFAULT_AC_INDEX)
-                    {
-                        _authorizeIndex = ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc;
-                    }
-                    else
-                    {
-                        _authorizeIndex = ShmSysConfigAndInfo->SysInfo.CurGunSelected;
-                    }
-
-                    StartSystemTimeoutDet(Timeout_AuthorizingForStop);
-                    AuthorizingStart();
-                }
-            }
-            else if (idleReq)
-            {
-                if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount > 1 &&
-                    stopReq != 255 &&
-                    ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == YES)
-                {
-                    idleReq = false;
-                    strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
-                }
-                else if ((_acgunIndex > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == DEFAULT_AC_INDEX) ||
-                         chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus == S_IDLE)
-                {
-                    PRINTF_FUNC("// LCM => Authorizing \n");
-                    // LCM => Authorizing
-                    ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_AUTHORIZING;
-                    // 進入確認卡號狀態
-                    AuthorizingStart();
-                }
-                else
-                    strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
-            }
-            else
-            {
-                strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
-            }
-        }
-    }
-    else
-    {
-        // 透過後臺停止充電的判斷
-        if (isAuthorizedComplete() ||
-            (ShmSysConfigAndInfo->SysInfo.OcppConnStatus == NO &&
-             ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING))
-        {
-            // 判斷後台回覆狀態
-            if(canStartCharging() ||
-               (ShmSysConfigAndInfo->SysInfo.OcppConnStatus == NO &&
-                ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING))
-            {
-                if (_authorizeIndex != NO_DEFINE)
-                {
-                    // 先找 AC
-                    if (_authorizeIndex == DEFAULT_AC_INDEX)
-                    {
-                        if (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST &&
-                            strcmp((char *)chargingInfo[_authorizeIndex]->StartUserId, "") != EQUAL)
-                        {
-                            AcChargingTerminalProcess();
-                        }
-                    }
-                    else
-                    {
-                        if (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST &&
-                            strcmp((char *)chargingInfo[_authorizeIndex]->StartUserId, "") != EQUAL)
-                        {
-                            ChargingTerminalProcess(_authorizeIndex);
-                        }
-                    }
-
-                    strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
-                    _authorizeIndex = NO_DEFINE;
-                }
-            }
-            else
-                strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
-
-            ClearAuthorizedFlag();
-        }
-        else if (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST)
-        {
-            // 白名單驗證
-            for (int i = 0; i < 10; i++)
-            {
-                if (strcmp((char *)ShmSysConfigAndInfo->SysConfig.LocalWhiteCard[i], "") != EQUAL)
-                {
-                    if (strcmp((char *)ShmSysConfigAndInfo->SysConfig.LocalWhiteCard[i], (char *)ShmSysConfigAndInfo->SysConfig.UserId) == EQUAL)
-                    {
-                        ChargingTerminalProcess(_authorizeIndex);
-                        strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
-                        ClearAuthorizedFlag();
-                        break;
-                    }
-                }
-            }
-        }
-    }
+	if (gunIndex < gunCount)
+	{
+		chargingInfo[gunIndex]->TimeoutFlag = Timeout_None;
+	}
 }
 
-unsigned char isModeChange(unsigned char gun_index)
+void StartGunInfoTimeoutDet(unsigned char gunIndex, unsigned char flag)
 {
-    unsigned char result = NO;
+	if (gunIndex < gunCount)
+	{
+		if (chargingInfo[gunIndex]->TimeoutFlag != flag)
+		{
+			gettimeofday(&chargingInfo[gunIndex]->TimeoutTimer, NULL);
+		}
+		chargingInfo[gunIndex]->TimeoutFlag = flag;
+	}
+}
 
-    if(chargingInfo[gun_index]->SystemStatus != chargingInfo[gun_index]->PreviousSystemStatus)
-    {
-        result = YES;
-        chargingInfo[gun_index]->PreviousSystemStatus = chargingInfo[gun_index]->SystemStatus;
-    }
 
-    return result;
+unsigned short MaxValue(unsigned short value1, unsigned short value2)
+{
+	return value1 >= value2 ? value1 : value2;
 }
 
-void ScannerCardProcess()
+unsigned char isATEChange(unsigned char gun_index)
 {
-    if (!isDetectPlugin() && !isCardScan && ShmSysConfigAndInfo->SysWarningInfo.Level != 2 &&
-        ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_ENABLE)
-    {
-        isCardScan = true;
-        // 處理刷卡及驗證卡號的動作
-        UserScanFunction();
-    }
+	unsigned char result = NO;
+	if(chargingInfo[gun_index]->ATEState != chargingInfo[gun_index]->PreviousATEState)
+	{
+		result = YES;
+		chargingInfo[gun_index]->PreviousATEState = chargingInfo[gun_index]->ATEState;
 
-    if (ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_AUTHORIZING)
-    {
-        StartSystemTimeoutDet(Timeout_Authorizing);
-
-        // 確認驗證卡號完成沒
-        if (isAuthorizedComplete() || ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING)
-        {
-            StopSystemTimeoutDet();
-            // 判斷後台回覆狀態
-            if(canStartCharging() || ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING)
-            {
-                // LCM => Authorize complete
-                ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_AUTHORIZ_COMP;
-            }
-            else
-            {
-                // LCM => Authorize fail
-                ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_AUTHORIZ_FAIL;
-                strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
-            }
-            ClearAuthorizedFlag();
-        }
-        else if (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST)
-        {
-            // 白名單驗證
-            for (int i = 0; i < 10; i++)
-            {
-                if (strcmp((char *)ShmSysConfigAndInfo->SysConfig.LocalWhiteCard[i], "") != EQUAL)
-                {
-                    if (strcmp((char *)ShmSysConfigAndInfo->SysConfig.LocalWhiteCard[i], (char *)ShmSysConfigAndInfo->SysConfig.UserId) == EQUAL)
-                    {
-                        ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_AUTHORIZ_COMP;
-                        ClearAuthorizedFlag();
-                        break;
-                    }
-                }
-            }
-        }
-    }
-    else if (ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_AUTHORIZ_FAIL)
-    {
-        StartSystemTimeoutDet(Timeout_VerifyFail);
-        isCardScan = false;
-    }
-    else if(ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_AUTHORIZ_COMP)
-    {
-        StartSystemTimeoutDet(Timeout_VerifyComp);
-    }
-    else if(ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_WAIT_FOR_PLUG)
-    {
-        StartSystemTimeoutDet(Timeout_WaitPlug);
-    }
-    else
-        isCardScan = false;
+	}
+	return result;
 }
-
-bool AddGunInfoByConnector(byte typeValue, byte slots)
+unsigned char isModeChange(unsigned char gun_index)
 {
-    bool result = true;
+	unsigned char result = NO;
+	if(chargingInfo[gun_index]->SystemStatus != chargingInfo[gun_index]->PreviousSystemStatus)
+	{
+		result = YES;
+		chargingInfo[gun_index]->PreviousSystemStatus = chargingInfo[gun_index]->SystemStatus;
 
-    switch (typeValue)
-    {
-        case '0': // none
-            break;
-        case '1': // IEC 62196-2 Type 1/SAE J1772 Plug
-            break;
-        case '2': // IEC 62196-2 Type 1/SAE J1772 Socket
-            break;
-        case '3': // IEC 62196-2 Type 2 Plug
-        case '4': // IEC 62196-2 Type 2 Socket
-            if (AC_QUANTITY > _ac_Index)
-            {
-                ac_chargingInfo[_acgunIndex] = &ShmSysConfigAndInfo->SysInfo.AcChargingData[_ac_Index];
-
-                // AC 固定 index
-                ac_chargingInfo[_acgunIndex]->Index = 0;
-                ac_chargingInfo[_acgunIndex]->ReservationId = -1;
-                ac_chargingInfo[_acgunIndex]->SystemStatus = S_IDLE;
-                ac_chargingInfo[_acgunIndex]->Type = _Type_AC;
-                ac_chargingInfo[_acgunIndex]->IsAvailable = YES;
-                _ac_Index++;
-                _acgunIndex++;
-            }
-            else
-                result = false;
-            break;
-        case '5': // GB/T AC Plug
-            break;
-        case '6': // GB/T AC Socket
-            break;
-        case 'J': // CHAdeMO
-        {
-            if (CHAdeMO_QUANTITY > _chademoIndex)
-            {
-                chargingInfo[_gunIndex] = &ShmSysConfigAndInfo->SysInfo.ChademoChargingData[_chademoIndex];
-
-                chargingInfo[_gunIndex]->Index = _gunIndex;
-                chargingInfo[_gunIndex]->ReservationId = -1;
-                chargingInfo[_gunIndex]->slotsIndex = slots;
-                chargingInfo[_gunIndex]->SystemStatus = S_BOOTING;
-                chargingInfo[_gunIndex]->Type = _Type_Chademo;
-                chargingInfo[_gunIndex]->type_index = _chademoIndex;
-                chargingInfo[_gunIndex]->IsAvailable = YES;
-                _chademoIndex++;
-                _gunIndex++;
-            }
-            else
-                result = false;
-        }
-            break;
-        case 'U': // CCS1 combo
-        case 'E': // CCS2 combo
-        {
-            if (CCS_QUANTITY > _ccsIndex)
-            {
-                chargingInfo[_gunIndex] = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[_ccsIndex];
-
-                chargingInfo[_gunIndex]->Index =    _gunIndex;
-                chargingInfo[_gunIndex]->ReservationId = -1;
-                chargingInfo[_gunIndex]->slotsIndex = slots;
-                chargingInfo[_gunIndex]->SystemStatus = S_BOOTING;
-                chargingInfo[_gunIndex]->Type = _Type_CCS_2;
-                chargingInfo[_gunIndex]->type_index = _ccsIndex;
-                chargingInfo[_gunIndex]->IsAvailable = YES;
-                // 現階段預設為走 DIN70121
-                ShmCcsData->CommProtocol = 0x01;
-                _ccsIndex++;
-                _gunIndex++;
-            }
-            else
-                result = false;
-        }
-            break;
-        case 'G': // GBT DC
-        {
-            if (GB_QUANTITY > _gb_Index)
-            {
-                chargingInfo[_gunIndex] = &ShmSysConfigAndInfo->SysInfo.GbChargingData[_gb_Index];
-
-                chargingInfo[_gunIndex]->Index =    _gunIndex;
-                chargingInfo[_gunIndex]->ReservationId = -1;
-                chargingInfo[_gunIndex]->slotsIndex = slots;
-                chargingInfo[_gunIndex]->SystemStatus = S_BOOTING;
-                chargingInfo[_gunIndex]->Type = _Type_GB;
-                chargingInfo[_gunIndex]->type_index = _gb_Index;
-                chargingInfo[_gunIndex]->IsAvailable = YES;
-                _gb_Index++;
-                _gunIndex++;
-            }
-            else
-                result = false;
-        }
-            break;
-        case 'D': // GBT DC x 2
-            break;
-    }
-    return result;
+	}
+	return result;
 }
 
-bool CheckConnectorTypeStatus()
+unsigned char checkMode(byte gun_index, byte mode)
 {
-    bool result = true;
+	unsigned char result = NO;
 
-    PRINTF_FUNC("bd0_1_status = %d, bd0_2_status = %d, bd1_1_status = %d, bd1_2_status = %d \n",
-                bd0_1_status, bd0_2_status, bd1_1_status, bd1_2_status);
-    if (strlen((char *) ShmSysConfigAndInfo->SysConfig.ModelName) >= 9)
-    {
-        byte slots = 1;
-        for (byte typeIndex = 7; typeIndex <= 9; typeIndex++)
-        {
-            if(!AddGunInfoByConnector(ShmSysConfigAndInfo->SysConfig.ModelName[typeIndex], slots))
-            {
-                return false;
-            }
-            slots++;
-        }
-
-        // AC index 接在 DC 後面
-        if(_ac_Index > 0)
-        {
-            for (int acCurIndex = 0; acCurIndex < _acgunIndex; acCurIndex++)
-            {
-                // AC index 接在 DC 後面
-                ac_chargingInfo[acCurIndex]->Index += _gunIndex;
-            }
-        }
-
-        ShmSysConfigAndInfo->SysConfig.TotalConnectorCount = _gunIndex;
-        ShmSysConfigAndInfo->SysConfig.AcConnectorCount = _acgunIndex;
-        PRINTF_FUNC("DC _gunCount = %d, AC _gunCount = %d \n",
-                    ShmSysConfigAndInfo->SysConfig.TotalConnectorCount,
-                    ShmSysConfigAndInfo->SysConfig.AcConnectorCount);
-
-        if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount == 0)
-        {
-            if(ShmSysConfigAndInfo->SysConfig.AcConnectorCount == 0)
-            {
-                result = false;
-            }
-        }
-        else if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount == 1)
-        {
-            bool SingleBoardDetected = true;
-
-            if (bd0_1_status == 0 && bd0_2_status == 1)
-            {
-                // 與硬體相同 type : Chademo
-                if (chargingInfo[0]->Type == _Type_Chademo)
-                {
-                    chargingInfo[0]->Evboard_id = 0x01;
-                }
-            }
-            else if (bd0_1_status == 1 && bd0_2_status == 0)
-            {
-                PRINTF_FUNC("For single connector EVSE, CCS board should not at slot 0\n");
-                result = false;
-            }
-            else if (bd0_1_status == 1 && bd0_2_status == 1)
-            {
-                // 與硬體相同 type : GB
-                if (chargingInfo[0]->Type == _Type_GB)
-                {
-                    chargingInfo[0]->Evboard_id = 0x01;
-                }
-            }
-            else
-            {
-                SingleBoardDetected = false;
-            }
-
-            if(SingleBoardDetected == true)
-            {
-                if(!(bd1_1_status == 0 && bd1_2_status == 0))
-                {
-                    PRINTF_FUNC("For single connector EVSE, it should not have two EV board\n");
-                    result = false;
-                }
-            }
-            else if(SingleBoardDetected == false)
-            {
-                if (bd1_1_status == 0 && bd1_2_status == 1)
-                {
-                    // 與硬體相同 type : Chademo
-                    if (chargingInfo[0]->Type == _Type_Chademo)
-                    {
-                        chargingInfo[0]->Evboard_id = 0x01;
-                    }
-                }
-                else if (bd1_1_status == 1 && bd1_2_status == 0)
-                {
-                    // 與硬體相同 type : CCS
-                    if (chargingInfo[0]->Type == _Type_CCS_2)
-                    {
-                        chargingInfo[0]->Evboard_id = 0x01;
-                    }
-                }
-                else if (bd1_1_status == 1 && bd1_2_status == 1)
-                {
-                    // 與硬體相同 type : GB
-                    if (chargingInfo[0]->Type == _Type_GB)
-                    {
-                        chargingInfo[0]->Evboard_id = 0x01;
-                    }
-                }
-            }
-
-            PRINTF_FUNC("Single Connector EVSE, Type = %d, Evboard_id = %d \n", chargingInfo[0]->Type, chargingInfo[0]->Evboard_id);
-            if (chargingInfo[0]->Evboard_id == 0x00)
-            {
-                result = false;
-            }
-        }
-        else if(ShmSysConfigAndInfo->SysConfig.TotalConnectorCount == 2)
-        {
-            // 偵測槍屬於哪個 slot : 可知道插在板上的Slot 0 或 1 是 Chademo 還是 CCS
-            for (byte gunIndex = 0; gunIndex < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; gunIndex++)
-            {
-                if (gunIndex == 0 && bd0_1_status == 0 && bd0_2_status == 1)
-                {
-                    // 與硬體相同 type : Chademo
-                    if (chargingInfo[gunIndex]->Type == _Type_Chademo)
-                    {
-                        chargingInfo[gunIndex]->Evboard_id = 0x01;
-                    }
-                }
-                else if (gunIndex == 0 && bd0_1_status == 1 && bd0_2_status == 0)
-                {
-                    // 與硬體相同 type : CCS
-                    if (chargingInfo[gunIndex]->Type == _Type_CCS_2)
-                    {
-                        chargingInfo[gunIndex]->Evboard_id = 0x01;
-                    }
-                }
-                else if (gunIndex == 0 && bd0_1_status == 1 && bd0_2_status == 1)
-                {
-                    // 與硬體相同 type : GB
-                    if (chargingInfo[gunIndex]->Type == _Type_GB)
-                    {
-                        chargingInfo[gunIndex]->Evboard_id = 0x01;
-                    }
-                }
-
-                if (gunIndex == 1 && bd1_1_status == 0 && bd1_2_status == 1)
-                {
-                    // 與硬體相同 type : Chademo
-                    if (chargingInfo[gunIndex]->Type == _Type_Chademo)
-                    {
-                        chargingInfo[gunIndex]->Evboard_id = 0x02;
-                    }
-                }
-                else if (gunIndex == 1 && bd1_1_status == 1 && bd1_2_status == 0)
-                {
-                    // 與硬體相同 type : CCS
-                    if (chargingInfo[gunIndex]->Type == _Type_CCS_2)
-                    {
-                        chargingInfo[gunIndex]->Evboard_id = 0x02;
-                    }
-                }
-                else if (gunIndex == 1 && bd1_1_status == 1 && bd1_2_status == 1)
-                {
-                    // 與硬體相同 type : GB
-                    if (chargingInfo[gunIndex]->Type == _Type_GB)
-                    {
-                        chargingInfo[gunIndex]->Evboard_id = 0x02;
-                    }
-                }
-
-                PRINTF_FUNC("index = %d, Type = %d, Evboard_id = %d \n", gunIndex, chargingInfo[gunIndex]->Type, chargingInfo[gunIndex]->Evboard_id);
-                if (chargingInfo[gunIndex]->Evboard_id == 0x00)
-                    result = false;
-            }
-        }
-        else
-        {
-            // Module Name 不正確 - 告警
-            result = false;
-        }
-    }
-    else
-    {
-        // Module Name 不正確 - 告警
-        result = false;
-    }
+	if(chargingInfo[gun_index]->SystemStatus != mode)
+	{
+		result = YES;
 
-    return result;
+	}
+	return result;
 }
 
-void KillTask()
+void setChargerMode(byte gun_index, byte mode)
 {
-    ChangeLcmByIndex(_LCM_FIX);
-    system("killall Module_EventLogging");
-    system("killall Module_PrimaryComm");
-    system("killall Module_EvComm");
-    system("killall Module_LcmControl");
-    system("killall Module_InternalComm");
-    system("killall Module_PsuComm");
-    //system("killall OcppBackend &");
-    system("killall Module_4g &");
-    system("killall Module_Wifi &");
+	chargingInfo[gun_index]->SystemStatus = mode;
 }
 
-char CheckUpdateProcess()
+void setATEMode(byte gun_index, byte mode)
 {
-    DIR *d;
-    struct dirent *dir;
-    d = opendir("/mnt/");
-
-    if (d)
-    {
-        long int MaxLen=48*1024*1024, ImageLen = 0;
-        while ((dir = readdir(d)) != NULL)
-        {
-            char *new_str;
-            new_str = malloc(strlen("/mnt/")+strlen(dir->d_name)+1);
-            new_str[0] = '\0';
-            strcat(new_str, "/mnt/");
-            strcat(new_str, dir->d_name);
-            int fd = open(new_str, O_RDONLY);
-            if (fd < 0)
-            {
-                return FAIL;
-            }
-
-            unsigned char *ptr = malloc(MaxLen); //-48 is take out the header
-            memset(ptr, 0xFF, MaxLen);  //-48 is take out the header
-            //get the image length
-            ImageLen = read(fd, ptr, MaxLen);
-
-            if (ImageLen > 20)
-            {
-                unsigned int Type = (((unsigned int)ptr[16])<<24 | ((unsigned int)ptr[17])<<16 | ((unsigned int)ptr[18])<<8 | ((unsigned int)ptr[19]));
-                PRINTF_FUNC("Typed...%x \r\n", Type);
-
-                switch (Type)
-                {
-                    case CSU_BOOTLOADER:
-                    case CSU_KERNEL_CONFIGURATION:
-                    case CSU_KERNEL_IMAGE:
-                    case CSU_ROOT_FILE_SYSTEM:
-                    case CSU_USER_CONFIGURATION:
-                    {
-                        if (Upgrade_Flash(Type, new_str, (char *)ShmSysConfigAndInfo->SysConfig.ModelName) == PASS)
-                            return PASS;
-                        else
-                            return FAIL;
-                    }
-                        break;
-                    case CCS_BOARD_BOOTLOADER:
-                    case CCS_BOARD_KERNEL_CONFIGURATION:
-                    case CCS_BOARD_KERNEL_IMAGE:
-                    case CCS_BOARD_FILE_SYSTEM:
-                    {
-                        bool isPass = true;
-                        int CanFd = InitCanBus();
-
-                        if (CanFd > 0)
-                        {
-                            for(byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++)
-                            {
-                                if (!isPass)
-                                    break;
-
-                                if (chargingInfo[index]->Type == _Type_CCS_2)
-                                {
-                                    if (Upgrade_CCS(CanFd, Type, chargingInfo[index]->Evboard_id, new_str, (char *)ShmSysConfigAndInfo->SysConfig.ModelName) == FAIL)
-                                    {
-                                        isPass = false;
-                                    }
-                                }
-                            }
-                        }
-                        else
-                        {
-                            printf("Upgrade CCS open CAN FD fail.\n");
-                            isPass = false;
-                        }
-
-                        return isPass;
-                    }
-                        break;
-                    case CSU_PRIMARY_CONTROLLER:
-                    case RELAY_CONTROL_BOARD:
-                    case FAN_CONTROL_BOARD:
-                    case AC_WALLMOUNT_CONTROLLER:
-                    case LED_BOARD:
-                    {
-                        byte target = 0x00;
-
-                        if (Type == CSU_PRIMARY_CONTROLLER)
-                            target = UPGRADE_PRI;
-                        else if (Type == RELAY_CONTROL_BOARD)
-                            target = UPGRADE_RB;
-                        else if (Type == FAN_CONTROL_BOARD)
-                            target = UPGRADE_FAN;
-                        else if (Type == AC_WALLMOUNT_CONTROLLER)
-                            target = UPGRADE_AC;
-                        else if (Type == LED_BOARD)
-                            target = UPGRADE_LED;
-
-                        int fd = InitComPort(target);
-
-                        if (Upgrade_UART(fd, Type, target, new_str, (char *)ShmSysConfigAndInfo->SysConfig.ModelName) == PASS)
-                            return PASS;
-                        else
-                            return FAIL;
-
-                        close(fd);
-                    }
-                        break;
-                    case CHAdeMO_BOARD:
-                    case GB_BOARD:
-                    {
-                        bool isPass = true;
-                        int CanFd = InitCanBus();
-
-                        if (CanFd > 0)
-                        {
-                            for(byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++)
-                            {
-                                if (!isPass)
-                                    break;
-
-                                if ((Type == CHAdeMO_BOARD  && chargingInfo[index]->Type == _Type_Chademo) ||
-                                    (Type == GB_BOARD       && chargingInfo[index]->Type == _Type_GB))
-                                {
-                                    if (Upgrade_CAN(CanFd, Type, chargingInfo[index]->Evboard_id, new_str, (char *)ShmSysConfigAndInfo->SysConfig.ModelName) == PASS)
-                                        return PASS;
-                                    else
-                                        return FAIL;
-                                }
-                            }
-                        }
-                        else
-                        {
-                            PRINTF_FUNC("Upgrad FD fail. \n");
-                            isPass = false;
-                        }
-
-                        return isPass;
-                        break;
-                    }
-                }
-            }
-            free(new_str);
-            free(ptr);
-        }
-    }
-    free(dir);
-    closedir(d);
-    return FAIL;
+	chargingInfo[gun_index]->ATEStatus = mode;
 }
 
-void CreateRfidFork()
+void setStatusMode(byte gun_index, byte mode)
 {
-    pid_t rfidRecPid;
-
-    rfidRecPid = fork();
-    if (rfidRecPid == 0)
-    {
-        while(true)
-        {
-            // 刷卡判斷
-            RFID rfid;
-            if (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_NO_CHARGING ||
-                !ShmSysConfigAndInfo->SysConfig.isRFID)
-            {}
-            else if(getRequestCardSN(rfidFd, 0, &rfid))
-            {
-                PRINTF_FUNC("Get Card..-%s- \n", ShmSysConfigAndInfo->SysConfig.UserId);
-                if (strlen((char *)ShmSysConfigAndInfo->SysConfig.UserId) == 0)
-                {
-                    if (ShmSysConfigAndInfo->SysConfig.RfidCardNumEndian == RFID_ENDIAN_LITTLE)
-                    {
-                        switch (rfid.snType)
-                        {
-                            case RFID_SN_TYPE_6BYTE:
-                                sprintf((char *) ShmSysConfigAndInfo->SysConfig.UserId,
-                                        "%02X%02X%02X%02X%02X%02X",
-                                        rfid.currentCard[0], rfid.currentCard[1],
-                                        rfid.currentCard[2], rfid.currentCard[3],
-                                        rfid.currentCard[4], rfid.currentCard[5]);
-                                break;
-                            case RFID_SN_TYPE_7BYTE:
-                                sprintf((char *) ShmSysConfigAndInfo->SysConfig.UserId,
-                                        "%02X%02X%02X%02X%02X%02X%02X",
-                                        rfid.currentCard[0], rfid.currentCard[1],
-                                        rfid.currentCard[2], rfid.currentCard[3],
-                                        rfid.currentCard[4], rfid.currentCard[5],
-                                        rfid.currentCard[6]);
-                                break;
-                            case RFID_SN_TYPE_10BYTE:
-                                sprintf((char *) ShmSysConfigAndInfo->SysConfig.UserId,
-                                        "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
-                                        rfid.currentCard[0], rfid.currentCard[1],
-                                        rfid.currentCard[2], rfid.currentCard[3],
-                                        rfid.currentCard[4], rfid.currentCard[5],
-                                        rfid.currentCard[6], rfid.currentCard[7],
-                                        rfid.currentCard[8], rfid.currentCard[9]);
-                                break;
-                            case RFID_SN_TYPE_4BYTE:
-                                sprintf((char *) ShmSysConfigAndInfo->SysConfig.UserId,
-                                        "%02X%02X%02X%02X",
-                                        rfid.currentCard[0], rfid.currentCard[1],
-                                        rfid.currentCard[2], rfid.currentCard[3]);
-                                break;
-                        }
-                    }
-                    else if (ShmSysConfigAndInfo->SysConfig.RfidCardNumEndian == RFID_ENDIAN_BIG)
-                    {
-                        switch (rfid.snType)
-                        {
-                            case RFID_SN_TYPE_6BYTE:
-                                sprintf((char *) ShmSysConfigAndInfo->SysConfig.UserId,
-                                        "%02X%02X%02X%02X%02X%02X",
-                                        rfid.currentCard[5], rfid.currentCard[4],
-                                        rfid.currentCard[3], rfid.currentCard[2],
-                                        rfid.currentCard[1], rfid.currentCard[0]);
-                                break;
-                            case RFID_SN_TYPE_7BYTE:
-                                sprintf((char *) ShmSysConfigAndInfo->SysConfig.UserId,
-                                        "%02X%02X%02X%02X%02X%02X%02X",
-                                        rfid.currentCard[6], rfid.currentCard[5],
-                                        rfid.currentCard[4], rfid.currentCard[3],
-                                        rfid.currentCard[2], rfid.currentCard[1],
-                                        rfid.currentCard[0]);
-                                break;
-                            case RFID_SN_TYPE_10BYTE:
-                                sprintf((char *) ShmSysConfigAndInfo->SysConfig.UserId,
-                                        "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
-                                        rfid.currentCard[9], rfid.currentCard[8],
-                                        rfid.currentCard[7], rfid.currentCard[6],
-                                        rfid.currentCard[5], rfid.currentCard[4],
-                                        rfid.currentCard[3], rfid.currentCard[2],
-                                        rfid.currentCard[1], rfid.currentCard[0]);
-                                break;
-                            case RFID_SN_TYPE_4BYTE:
-                                sprintf((char *) ShmSysConfigAndInfo->SysConfig.UserId,
-                                        "%02X%02X%02X%02X",
-                                        rfid.currentCard[3], rfid.currentCard[2],
-                                        rfid.currentCard[1], rfid.currentCard[0]);
-                                break;
-                        }
-                    }
-
-                    PRINTF_FUNC("card number = %s\n", ShmSysConfigAndInfo->SysConfig.UserId);
-                }
-            }
-            sleep(1);
-        }
-    }
+	chargingInfo[gun_index]->ATEStatus = mode;
 }
 
-void StartSystemTimeoutDet(unsigned char flag)
+unsigned char isStatusChange(unsigned char gun_index)
 {
-    if (ShmSysConfigAndInfo->SysInfo.SystemTimeoutFlag != flag)
-    {
-        gettimeofday(&ShmSysConfigAndInfo->SysInfo.SystemTimeoutTimer, NULL);
-    }
-    ShmSysConfigAndInfo->SysInfo.SystemTimeoutFlag = flag;
-}
+	unsigned char result = NO;
+	if(chargingInfo[gun_index]->ATEStatus != chargingInfo[gun_index]->PreviousATEStatus)
+	{
+		result = YES;
+		chargingInfo[gun_index]->PreviousATEStatus = chargingInfo[gun_index]->ATEStatus;
 
-void StopSystemTimeoutDet()
-{
-    gettimeofday(&ShmSysConfigAndInfo->SysInfo.SystemTimeoutTimer, NULL);
-    ShmSysConfigAndInfo->SysInfo.SystemTimeoutFlag = Timeout_None;
+	}
+	return result;
 }
 
-void StartGunInfoTimeoutDet(unsigned char gunIndex, unsigned char flag)
-{
-    if (gunIndex < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount)
-    {
-        if (chargingInfo[gunIndex]->TimeoutFlag != flag)
-        {
-            gettimeofday(&chargingInfo[gunIndex]->TimeoutTimer, NULL);
-        }
-        chargingInfo[gunIndex]->TimeoutFlag = flag;
-    }
-}
+//==========================================
+// Common Function
+//==========================================
 
-void StopGunInfoTimeoutDet(unsigned char gunIndex)
+
+int PackageIdCmd(int cmd)
 {
-    if (gunIndex < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount)
-    {
-        chargingInfo[gunIndex]->TimeoutFlag = Timeout_None;
-    }
+	return cmd | 0x80000000;
 }
 
-void CheckConnectionTimeout()
+void SendCmdToEvboard(int canfd, int cmd, byte *data, byte dataLen)
 {
-    if(system("pidof -s OcppBackend > /dev/null") != 0)
-    {
-        _connectionTimeout = CONN_PLUG_TIME_OUT;
-    }
-    else
-    {
-        if(strcmp((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData,"") != 0)
-        {
-            _connectionTimeout = atoi((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData);
-            if(_connectionTimeout <= 0)
-            {
-                _connectionTimeout = CONN_PLUG_TIME_OUT;
-            }
-        }
-        else
-        {
-            _connectionTimeout = CONN_PLUG_TIME_OUT;
-        }
-    }
+    struct can_frame frame;
+    frame.can_id = PackageIdCmd(cmd);//(0x00001000 + cmd) | 0x80000000;//(cmd | 0x80000000);
+    frame.can_dlc = dataLen;
+    memcpy(frame.data, data, sizeof(frame.data));
+    write(canfd, &frame, sizeof(struct can_frame));
+    //usleep(2000);
 }
 
-void CreateTimeoutFork()
-{
-    pid_t timeoutPid;
 
-    timeoutPid = fork();
-    if (timeoutPid > 0)
-    {
-        gettimeofday(&_cmdSubPriority_time, NULL);
-        CheckConnectionTimeout();
-
-        while(true)
-        {
-            if ((GetTimeoutValue(_cmdSubPriority_time) / 1000) > 5000)
-            {
-                CheckConnectionTimeout();
-                gettimeofday(&_cmdSubPriority_time, NULL);
-            }
-
-            //printf("Timeout ***********SystemTimeoutFlag = %d, ********\n", ShmSysConfigAndInfo->SysInfo.SystemTimeoutFlag);
-            // 系統
-            switch(ShmSysConfigAndInfo->SysInfo.SystemTimeoutFlag)
-            {
-                case Timeout_SelftestChk:
-                    if (GetTimeoutValue(ShmSysConfigAndInfo->SysInfo.SystemTimeoutTimer) >= 40000000)
-                    {
-                        _SelfTestTimeout();
-                        StopSystemTimeoutDet();
-                    }
-                    break;
-                case Timeout_Authorizing:
-                    if (GetTimeoutValue(ShmSysConfigAndInfo->SysInfo.SystemTimeoutTimer) >= 30000000)
-                    {
-                        _AuthorizedTimeout();
-                        StopSystemTimeoutDet();
-                    }
-                    break;
-                case Timeout_VerifyFail:
-                    if (GetTimeoutValue(ShmSysConfigAndInfo->SysInfo.SystemTimeoutTimer) >= 3000000)
-                    {
-                        _AutoReturnTimeout();
-                        StopSystemTimeoutDet();
-                    }
-                    break;
-                case Timeout_VerifyComp:
-                    if (GetTimeoutValue(ShmSysConfigAndInfo->SysInfo.SystemTimeoutTimer) >= 3000000)
-                    {
-                        _AutoReturnTimeout();
-                        StopSystemTimeoutDet();
-                    }
-                    break;
-                case Timeout_WaitPlug:
-                    if (GetTimeoutValue(ShmSysConfigAndInfo->SysInfo.SystemTimeoutTimer) >= _connectionTimeout * 1000000)
-                    {
-                        _DetectPlugInTimeout();
-                        StopSystemTimeoutDet();
-                    }
-                    break;
-                case Timeout_ReturnToChargingGunDet:
-                {
-                    if (GetTimeoutValue(ShmSysConfigAndInfo->SysInfo.SystemTimeoutTimer) >= 30000000)
-                    {
-                        DisplayChargingInfo();
-                        StopSystemTimeoutDet();
-                    }
-                }
-                    break;
-                case Timeout_AuthorizingForStop:
-                {
-                    if (GetTimeoutValue(ShmSysConfigAndInfo->SysInfo.SystemTimeoutTimer) >= 30000000)
-                    {
-                        strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
-                        ClearAuthorizedFlag();
-                        StopSystemTimeoutDet();
-                    }
-                }
-                    break;
-            }
-            // 各槍
-            for (byte gun_index = 0; gun_index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; gun_index++)
-            {
-                //printf("Timeout ***********TimeoutFlag = %d, ********\n", chargingInfo[gun_index]->TimeoutFlag);
-                switch(chargingInfo[gun_index]->TimeoutFlag)
-                {
-                    case Timeout_Preparing:
-                    {
-                        if (GetTimeoutValue(chargingInfo[gun_index]->TimeoutTimer) >= 30000000)
-                        {
-                            _PrepareTimeout(gun_index);
-                            StopGunInfoTimeoutDet(gun_index);
-                        }
-                    }
-                        break;
-                    case Timeout_EvChargingDet:
-                    {
-                        if (GetTimeoutValue(chargingInfo[gun_index]->TimeoutTimer) >= 120000000)
-                        {
-                            _DetectEvChargingEnableTimeout(gun_index);
-                            StopGunInfoTimeoutDet(gun_index);
-                        }
-                    }
-                        break;
-                    case Timeout_EvseChargingDet:
-                    {
-                        if (GetTimeoutValue(chargingInfo[gun_index]->TimeoutTimer) >= 60000000)
-                        {
-                            _DetectEvseChargingEnableTimeout(gun_index);
-                            StopGunInfoTimeoutDet(gun_index);
-                        }
-                    }
-                        break;
-                    case Timeout_EvseCompleteDet:
-                    {
-                        if (GetTimeoutValue(chargingInfo[gun_index]->TimeoutTimer) >= 10000000)
-                        {
-                            StopGunInfoTimeoutDet(gun_index);
-                        }
-                    }
-                        break;
-                    case Timeout_ForCcsPrechargeDet:
-                    {
-                        if (GetTimeoutValue(chargingInfo[gun_index]->TimeoutTimer) >= 60000000)
-                        {
-                            _CcsPrechargeTimeout(gun_index);
-                            StopGunInfoTimeoutDet(gun_index);
-                        }
-                    }
-                        break;
-                }
-            }
-            sleep(1);
-        }
-    }
+void setBootNotification1(){
+	byte data[8];
+	data[0] = 0x02;
+	data[1] = 0x02;
+	data[2] = 0x02;
+	data[3] = 0x02;
+	data[4] = 0x03;
+	data[5] = 0x03;
+	data[6] = 0x03;
+	data[7] = 0x03;
+	SendCmdToEvboard(CanFd2, bn1, data, sizeof(data));
 }
 
-void GetSystemTime()
-{
-    struct timeb csuTime;
-    struct tm *tmCSU;
-
-    ftime(&csuTime);
-    tmCSU = localtime(&csuTime.time);
-    PRINTF_FUNC("Time : %04d-%02d-%02d %02d:%02d:%02d \n", tmCSU->tm_year + 1900,
-                tmCSU->tm_mon + 1, tmCSU->tm_mday, tmCSU->tm_hour, tmCSU->tm_min,
-                tmCSU->tm_sec);
-
-//  byte date[14];
-//
-//
-//       //sprintf(&date, "%d", );
-//
-//       date[0] = '0' + ((tmCSU->tm_year + 1900) / 1000 % 10);
-
-//  date[0] = (tmCSU->tm_year + 1900) / 1000 % 10;
-//  date[1] = (tmCSU->tm_year + 1900) / 100 % 10;
-//  date[2] = (tmCSU->tm_year + 1900) / 10 % 10;
-//  date[3] = (tmCSU->tm_year + 1900) / 1 % 10;
-//
-//  date[4] = (tmCSU->tm_mon + 1) / 10 % 10;
-//  date[5] = (tmCSU->tm_mon + 1) / 1 % 10;
-//
-//  date[6] = (tmCSU->tm_mday) / 10 % 10;
-//  date[7] = (tmCSU->tm_mday) / 1 % 10;
-//
-//  date[8] = (tmCSU->tm_hour) / 10 % 10;
-//  date[9] = (tmCSU->tm_hour) / 1 % 10;
-//
-//  date[10] = (tmCSU->tm_min) / 10 % 10;
-//  date[11] = (tmCSU->tm_min) / 1 % 10;
-//
-//  date[12] = (tmCSU->tm_sec) / 10 % 10;
-//  date[13] = (tmCSU->tm_sec) / 1 % 10;
-
-//  PRINTF_FUNC("%x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x \n", date[0], date[1], date[2], date[3],
-//          date[4], date[5], date[6], date[7],
-//          date[8], date[9], date[10], date[11],
-//          date[12], date[13]);
+void setBootNotification2(){
+	byte data[8];
+	data[0] = 0x04;
+	data[1] = 0x04;
+	data[2] = 0x04;
+	data[3] = 0x04;
+	data[4] = 0x05;
+	data[5] = 0x05;
+	data[6] = 0x05;
+	data[7] = 0x05;
+	SendCmdToEvboard(CanFd2, bn2, data, sizeof(data));
 }
 
-void CheckFactoryConfigFunction()
-{
-    if(ShmSysConfigAndInfo->SysInfo.FactoryConfiguration)
-    {
-        system("cd /root;./FactoryConfig -m");
-        system("sync");
-        sleep(5);
-        system("reboot -f");
-        sleep(5);
-        system("reboot -f");
-    }
+void setEVStatus1(byte evstatus){
+	byte data[1];
+	data[0] =  evstatus;
+	SendCmdToEvboard(CanFd2, EVStatus1, data, sizeof(data));
 }
 
-void CheckFwUpdateFunction()
-{
-    //PRINTF_FUNC("ShmSysConfigAndInfo->SysInfo.FirmwareUpdate = %d \n", ShmSysConfigAndInfo->SysInfo.FirmwareUpdate);
-    if (ShmSysConfigAndInfo->SysInfo.FirmwareUpdate == YES)
-    {
-        DEBUG_INFO_MSG("ftp : update start. \n");
-        KillTask();
-        if (CheckUpdateProcess() == PASS)
-            DEBUG_INFO_MSG("ftp : update complete. \n");
-        else
-            DEBUG_INFO_MSG("ftp : update fail. \n");
-
-        ShmSysConfigAndInfo->SysInfo.FirmwareUpdate = NO;
-        sleep(5);
-        system("reboot -f");
-    }
-    else if(ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq == YES)
-    {
-        ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = NO;
-    }
-    else if (strcmp((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "Downloaded") == EQUAL)
-    {
-        DEBUG_INFO_MSG("Backend : update start. \n");
-        strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "");
-        strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "Installing");
-        ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = YES;
-        KillTask();
-
-        if (CheckUpdateProcess() == PASS)
-        {
-            DEBUG_INFO_MSG("Backend : update complete. \n");
-            strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "Installed");
-        }
-        else
-        {
-            DEBUG_INFO_MSG("Backend : update fail. \n");
-            strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "InstallationFailed");
-        }
-
-        strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "Installed");
-        ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = YES;
-        sleep(5);
-        system("reboot -f");
-    }
-    else if (strcmp((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "DownloadFailed") == EQUAL)
-    {
-        DEBUG_ERROR_MSG("Backend to download file fail. \n");
-        strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "");
-        strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "InstallationFailed");
-        ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = YES;
-    }
+void setEVStatus2(byte evstatus){
+	byte data[1];
+	data[0] = evstatus;
+	SendCmdToEvboard(CanFd2, EVStatus2, data, sizeof(data));
 }
 
-//===============================================
-// Check reservation date is expired
-//===============================================
-int isReservationExpired(unsigned char gun_index)
+void GetFirmwareVersion(byte gun_index, byte toId)
 {
-    int result = NO;
-    struct tm expiredDate;
-    struct timeb expiredTime;
-
-    if (sscanf((char*) ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate,
-        "%4d-%2d-%2dT%2d:%2d:%2d", &expiredDate.tm_year,
-        &expiredDate.tm_mon, &expiredDate.tm_mday, &expiredDate.tm_hour,
-        &expiredDate.tm_min, &expiredDate.tm_sec) == 6)
-    {
-        expiredDate.tm_year -= 1900;
-        expiredDate.tm_mon -= 1;
-
-        expiredTime.time = mktime(&expiredDate);
-        if (!CheckTimeOut(expiredTime))
-        {
-            result = YES;
-        }
-    }
+	int id = PackageIdCmd(Ev_Cmd.get_firmware_ver + toId);
+	byte data[8];
 
-    return result;
+	SendCmdToEvboard(CanFd, id, data, 0);
 }
 
-//===============================================
-// OCPP
-//===============================================
-void CheckOcppStatus()
+void GetHardwareVersion(byte gun_index, byte toId)
 {
-    if (ShmOCPP16Data->SpMsg.bits.BootNotificationConf == YES)
-    {
-        ShmOCPP16Data->SpMsg.bits.BootNotificationConf = NO;
-    }
+	int id = PackageIdCmd(Ev_Cmd.get_hardware_ver + toId);
+	byte data[8];
 
-    if (ShmOCPP16Data->MsMsg.bits.ResetReq == YES)
-    {
-        bool canReset = true;
-        if (ShmSysConfigAndInfo->SysWarningInfo.Level != 2)
-        {
-            for (byte _index = 0; _index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; _index++)
-            {
-                if (chargingInfo[_index]->SystemStatus != S_IDLE &&
-                    chargingInfo[_index]->SystemStatus != S_RESERVATION &&
-                    chargingInfo[_index]->SystemStatus != S_MAINTAIN)
-                {
-                    canReset = false;
-                    if (chargingInfo[_index]->SystemStatus >= S_REASSIGN && chargingInfo[_index]->SystemStatus < S_TERMINATING)
-                    {
-                        ChargingTerminalProcess(_index);
-                    }
-                }
-            }
-        }
-
-        if (canReset)
-        {
-            ShmOCPP16Data->MsMsg.bits.ResetReq = NO;
-            sprintf((char*)ShmOCPP16Data->Reset.ResponseStatus, "Accepted");
-            if(strcmp((char *)ShmOCPP16Data->Reset.Type, "Hard") == EQUAL)
-            {
-                DEBUG_ERROR_MSG("****** Hard Reboot ****** \n");
-                ShmOCPP16Data->MsMsg.bits.ResetConf = YES;
-                sleep(3);
-                system("reboot -f");
-            }
-            else if (strcmp((char *)ShmOCPP16Data->Reset.Type, "Soft") == EQUAL)
-            {
-                DEBUG_ERROR_MSG("****** Soft Reboot ****** \n");
-                ShmOCPP16Data->MsMsg.bits.ResetConf = YES;
-                sleep(3);
-                system("killall OcppBackend &");
-                KillTask();
-                system("/usr/bin/run_evse_restart.sh");
-            }
-        }
-    }
+	SendCmdToEvboard(CanFd, id, data, 0);
 }
 
-void OcppStartTransation(byte gunIndex)
+void SetChargingPermission(byte gun_index, byte permissionStatus, short aOutputPw, short aOutputCur, short aOutputVol, byte toId)
 {
-    if(strcmp((char *)chargingInfo[gunIndex]->StartUserId, "") == EQUAL)
-        strcpy((char *)ShmOCPP16Data->StartTransaction[gunIndex].IdTag, (char *)ShmOCPP16Data->StartTransaction[gunIndex].IdTag);
-    else
-        strcpy((char *)ShmOCPP16Data->StartTransaction[gunIndex].IdTag, (char *)chargingInfo[gunIndex]->StartUserId);
+	int id = PackageIdCmd(Ev_Cmd.charging_permission + toId);
+	byte data[8];
 
-    PRINTF_FUNC("IdTag = %s \n", ShmOCPP16Data->StartTransaction[gunIndex].IdTag);
-    ShmOCPP16Data->CpMsg.bits[gunIndex].StartTransactionReq = YES;
-}
-
-void OcppStopTransation(byte gunIndex)
-{
-    if(strcmp((char *)chargingInfo[gunIndex]->StartUserId, "") == EQUAL)
-        strcpy((char *)ShmOCPP16Data->StopTransaction[gunIndex].IdTag, (char *)ShmOCPP16Data->StopTransaction[gunIndex].IdTag);
-    else
-        strcpy((char *)ShmOCPP16Data->StopTransaction[gunIndex].IdTag, (char *)chargingInfo[gunIndex]->StartUserId);
+	data[0] = permissionStatus;
+	data[1] = aOutputPw & 0xff;
+	data[2] = (aOutputPw >> 8) & 0xff;
+	data[3] = aOutputCur & 0xff;
+	data[4] = (aOutputCur >> 8) & 0xff;
+	data[5] = aOutputVol & 0xff;
+	data[6] = (aOutputVol >> 8) & 0xff;
+	data[7] = 0xff;
+	//printf(" ChargingPermission Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ",(Ev_Cmd.charging_permission + toId), data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7] );
 
-    PRINTF_FUNC("IdTag = %s \n", ShmOCPP16Data->StopTransaction[gunIndex].IdTag);
-    ShmOCPP16Data->CpMsg.bits[gunIndex].StopTransactionReq = YES;
+	SendCmdToEvboard(CanFd, id, data, sizeof(data));
 }
 
-bool OcppRemoteStop(byte gunIndex)
+void GetMiscellaneousInfo(byte gun_index, byte toId, short K1K2Status, short soc)
 {
-    bool result = ShmOCPP16Data->CsMsg.bits[gunIndex].RemoteStopTransactionReq;
-    if (ShmOCPP16Data->CsMsg.bits[gunIndex].RemoteStopTransactionReq == YES)
-    {
-        strcpy((char *)ShmOCPP16Data->StopTransaction[gunIndex].StopReason, "Remote");
-        ShmOCPP16Data->CsMsg.bits[gunIndex].RemoteStopTransactionReq = NO;
-    }
+	int id = PackageIdCmd(Ev_Cmd.get_miscellaneous_info + toId);
+	byte data[8];
+	data[0] = 0x01;
+	data[1] = 0x02;
+	data[2] = 0x03;
+	data[3] = 0x04;
+	data[4] = 0x05;
+	data[5] = K1K2Status & 0xff;
+	data[6] = soc & 0xff;
+	data[7] = 0x08;
+	//printf(" Miscellaneous Info Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ",Ev_Cmd.get_miscellaneous_info, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7] );
 
-    return result;
+	/*
+	data[1] = 0x0001;
+	data[2] = 0x0001;
+	data[3] = 0x10;
+	data[4] = 0x10;
+	*/
+	SendCmdToEvboard(CanFd, id, data, sizeof(data));
 }
+/*
+void setMisc(byte toId){
 
-void OcppRemoteStartChk()
+	float K1K2Status = 0;
+	float soc = 0;
+	K1K2Status = ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status;
+	soc = ShmSysConfigAndInfo->ate.chademo.id0D_req.Soc;
+	GetMiscellaneousInfo(0, toId, K1K2Status, soc);
+}
+*/
+void SetPresentInputPower(short outputVol_b1, short outputCur_b1, byte toId)
 {
-    if (ShmSysConfigAndInfo->SysInfo.OrderCharging != 255)
-        PRINTF_FUNC("OrderCharging = %d \n", ShmSysConfigAndInfo->SysInfo.OrderCharging);
+	int id = PackageIdCmd(Ev_Cmd.present_input_power + toId);
+	byte data[8];
 
-    if (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_NO_CHARGING)
-    {}
-    else if(!isDetectPlugin())
-    {
-        // 如果有 AC 槍,則固定是第 2 把槍,所以索引固定為 1
-        byte acDirIndex = ShmSysConfigAndInfo->SysConfig.AcConnectorCount;
-
-        for (byte ac_index = 0; ac_index < ShmSysConfigAndInfo->SysConfig.AcConnectorCount; ac_index++)
-        {
-            if ((ac_chargingInfo[ac_index]->SystemStatus == S_IDLE || ac_chargingInfo[ac_index]->SystemStatus == S_RESERVATION)&&
-                ShmOCPP16Data->CsMsg.bits[acDirIndex].RemoteStartTransactionReq == YES)
-            {
-                ShmOCPP16Data->CsMsg.bits[acDirIndex].RemoteStartTransactionReq = NO;
-                ShmSysConfigAndInfo->SysInfo.OrderCharging = DEFAULT_AC_INDEX;
-                ShmOCPP16Data->CsMsg.bits[ShmSysConfigAndInfo->SysConfig.TotalConnectorCount + ac_index].RemoteStartTransactionReq = NO;
-                DetectPluginStart();
-                return;
-            }
-        }
-
-        byte threeGunIndex = 0;
-
-        for (byte gun_index = 0; gun_index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; gun_index++)
-        {
-            // 如果有 AC 槍,且 DC 槍也有兩把
-            if (acDirIndex == 1 && gun_index == 1)
-                threeGunIndex = 1;
-
-            if ((chargingInfo[gun_index]->SystemStatus == S_IDLE || chargingInfo[gun_index]->SystemStatus == S_RESERVATION)&&
-                ShmOCPP16Data->CsMsg.bits[gun_index + threeGunIndex].RemoteStartTransactionReq == YES)
-            {
-                ShmSysConfigAndInfo->SysInfo.OrderCharging = gun_index;
-                ShmOCPP16Data->CsMsg.bits[gun_index].RemoteStartTransactionReq = NO;
-                DetectPluginStart();
-                break;
-            }
-        }
-    }
+	data[0] = outputVol_b1 & 0xff;
+	data[1] = (outputVol_b1 >> 8) & 0xff;
+	data[2] = outputCur_b1 & 0xff;
+	data[3] = (outputCur_b1 >> 8) & 0xff;
+	/*
+	data[4] = outputVol_b2 & 0xff;
+	data[5] = (outputVol_b2 >> 8) & 0xff;
+	data[6] = outputCur_b2 & 0xff;
+	data[7] = (outputCur_b2 >> 8) & 0xff;
+	*/
+	//printf(" PresentInputPower Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ",Ev_Cmd.present_input_power, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7] );
+	SendCmdToEvboard(CanFd, id, data, sizeof(data));
 }
 
-void ChkOcppStatus(byte gunIndex)
+
+void SetPresentInputRequirement(short aOutputPw_b1, short aOutputCur_b1, short aOutputPw_b2, short aOutputCur_b2, byte toId)
 {
-    if (chargingInfo[gunIndex]->SystemStatus == S_IDLE &&
-        ShmOCPP16Data->CsMsg.bits[gunIndex].ReserveNowReq == YES)
-    {
-        ShmOCPP16Data->CsMsg.bits[gunIndex].ReserveNowReq = NO;
-        if (isReservationExpired(gunIndex))
-        {
-            PRINTF_FUNC("***************ChkOcppStatus : OcppReservedStatus******************** \n");
-            DEBUG_ERROR_MSG("***************ChkOcppStatus : OcppReservedStatus******************** \n");
-            chargingInfo[gunIndex]->ReservationId = ShmOCPP16Data->ReserveNow[gunIndex].ReservationId;
-            chargingInfo[gunIndex]->SystemStatus = S_RESERVATION;
-        }
-        ShmOCPP16Data->CsMsg.bits[gunIndex].ReserveNowConf = YES;
-    }
+	int id = PackageIdCmd(Ev_Cmd.present_input_requirement + toId );
+	byte data[8];
 
-    if (chargingInfo[gunIndex]->SystemStatus == S_RESERVATION &&
-        ShmOCPP16Data->CsMsg.bits[gunIndex].CancelReservationReq == YES)
-    {
-        ShmOCPP16Data->CsMsg.bits[gunIndex].CancelReservationReq = NO;
-        if (isReservationExpired(gunIndex))
-        {
-            PRINTF_FUNC("***************ChkOcppStatus : Cancel OcppReservedStatus******************** \n");
-            DEBUG_ERROR_MSG("***************ChkOcppStatus : Cancel OcppReservedStatus******************** \n");
-            chargingInfo[gunIndex]->ReservationId = 0;
-            chargingInfo[gunIndex]->SystemStatus = S_IDLE;
-        }
-        ShmOCPP16Data->CsMsg.bits[gunIndex].CancelReservationConf = YES;
-    }
+	data[0] = aOutputPw_b1 & 0xff;
+	data[1] = (aOutputPw_b1 >> 8) & 0xff;
+	data[2] = aOutputCur_b1 & 0xff;
+	data[3] = (aOutputCur_b1 >> 8) & 0xff;
+	data[4] = aOutputPw_b2 & 0xff;
+	data[5] = (aOutputPw_b2 >> 8) & 0xff;
+	data[6] = aOutputCur_b2 & 0xff;
+	data[7] = 0x01;
+	/*
+	data[6] = aOutputCur_b2 & 0xff;
+	data[7] = (aOutputCur_b2 >> 8) & 0xff;
+	*/
 
-    if (ShmOCPP16Data->CsMsg.bits[gunIndex].ChangeAvailabilityReq == YES)
-    {
-        PRINTF_FUNC("***************ChkOcppStatus : OcppChangeAvailability to %s********************\n",ShmOCPP16Data->ChangeAvailability[gunIndex].Type);
-
-        ShmOCPP16Data->CsMsg.bits[gunIndex].ChangeAvailabilityReq = NO;
-        if(strcmp((char *)ShmOCPP16Data->ChangeAvailability[gunIndex].Type, "Operative") == EQUAL)
-        {
-            if (isDb_ready)
-            {
-                DB_Update_Operactive(localDb, gunIndex, YES);
-            }
-
-            chargingInfo[gunIndex]->IsAvailable = YES;
-
-            if (chargingInfo[gunIndex]->SystemStatus == S_IDLE ||
-                chargingInfo[gunIndex]->SystemStatus == S_RESERVATION ||
-                chargingInfo[gunIndex]->SystemStatus == S_MAINTAIN)
-            {
-                setChargerMode(gunIndex, MODE_IDLE);
-            }
-        }
-        else if (strcmp((char *)ShmOCPP16Data->ChangeAvailability[gunIndex].Type, "Inoperative") == EQUAL)
-        {
-            if (isDb_ready)
-            {
-                DB_Update_Operactive(localDb, gunIndex, NO);
-            }
-
-            chargingInfo[gunIndex]->IsAvailable = NO;
-
-            if (chargingInfo[gunIndex]->SystemStatus == S_IDLE ||
-                chargingInfo[gunIndex]->SystemStatus == S_RESERVATION ||
-                chargingInfo[gunIndex]->SystemStatus == S_MAINTAIN)
-            {
-                setChargerMode(gunIndex, MODE_MAINTAIN);
-            }
-        }
-    }
+	//printf(" Present Input Requirement Get-Msg : %08X - %02x %02x %02x %02x %02x %02x %02x %02x\n ",Ev_Cmd.present_input_requirement, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7] );
 
-    if (ShmOCPP16Data->CsMsg.bits[gunIndex].UnlockConnectorReq == YES)
-    {
-        ShmOCPP16Data->CsMsg.bits[gunIndex].UnlockConnectorReq = NO;
-        strcpy((char *)ShmOCPP16Data->UnlockConnector[gunIndex].ResponseStatus, "NotSupported");
-        ShmOCPP16Data->CsMsg.bits[gunIndex].UnlockConnectorConf = YES;
-    }
+	SendCmdToEvboard(CanFd, id, data, sizeof(data));
 }
 
-bool CheckBackendChargingTimeout(byte gunIndex)
+void GetEvseOutputStatus(byte gun_index, byte toId)
 {
-    bool result = false;
-
-    if (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_ENABLE)
-    {
-        if (ShmSysConfigAndInfo->SysConfig.MaxChargingDuration > 0)
-        {
-            if (chargingInfo[gunIndex]->PresentChargedDuration > (ShmSysConfigAndInfo->SysConfig.MaxChargingDuration * 60))
-                result = true;
-        }
-    }
-    else if (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_DISABLE)
-    {
-        // 隨插即充電的要看 offline
-        if (ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeDuration > 0)
-        {
-            if (chargingInfo[gunIndex]->PresentChargedDuration > (ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeDuration * 60))
-                result = true;
-        }
-    }
+	int id = PackageIdCmd(Ev_Cmd.get_evse_output_status + toId);
+	byte data[8];
 
-    return result;
+	SendCmdToEvboard(CanFd, id, data, 0);
 }
 
-bool CheckBackendChargingEnergy(byte gunIndex)
+void GetEvseCapacityInfo(byte gun_index, byte toId)
 {
-    bool result = false;
-
-    if (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_ENABLE)
-    {
-        if (ShmSysConfigAndInfo->SysConfig.MaxChargingEnergy > 0)
-        {
-            if (chargingInfo[gunIndex]->PresentChargedEnergy > ShmSysConfigAndInfo->SysConfig.MaxChargingEnergy)
-                result = true;
-        }
-    }
-    else if (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_DISABLE)
-    {
-        // 隨插即充電的要看 offline
-        if (ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy > 0)
-        {
-            if (chargingInfo[gunIndex]->PresentChargedEnergy > (ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy))
-                result = true;
-        }
-    }
+	int id = PackageIdCmd(Ev_Cmd.get_evse_capacity_info + toId);
+	byte data[8];
 
-    return result;
+	SendCmdToEvboard(CanFd, id, data, 0);
 }
 
-//===============================================
-// SQLite3 related routine
-//===============================================
-int DB_Open(sqlite3 *db)
+void EvseStopChargingEvent(byte stopResult, byte *stopReason, byte toId)
 {
-    int result = PASS;
-    char* errMsg = NULL;
-    char* createRecordSql="CREATE TABLE IF NOT EXISTS charging_record("
-                          "idx integer primary key AUTOINCREMENT, "
-                          "reservationId text, "
-                          "transactionId text, "
-                          "startMethod text, "
-                          "userId text, "
-                          "dateTimeStart text, "
-                          "dateTimeStop text,"
-                          "socStart text, "
-                          "socStop text, "
-                          "chargeEnergy text, "
-                          "stopReason text"
-                          ");";
-
-    char* createCfgSql="CREATE TABLE IF NOT EXISTS `config` ( "
-                       "`idx` INTEGER PRIMARY KEY AUTOINCREMENT, "
-                       "`IsAvailable` TEXT NOT NULL, "
-                       "`connector` INTEGER NOT NULL, "
-                       "`val` TEXT NOT NULL, unique(IsAvailable,connector) on conflict replace);";
-
-    if(sqlite3_open(DB_FILE, &db))
-    {
-        result = FAIL;
-        PRINTF_FUNC( "Can't open database: %s\r\n", sqlite3_errmsg(db));
-        sqlite3_close(db);
-    }
-    else
-    {
-        PRINTF_FUNC( "Local charging record database open successfully.\r\n");
-
-        if (sqlite3_exec(db, createRecordSql, 0, 0, &errMsg) != SQLITE_OK)
-        {
-            result = FAIL;
-            PRINTF_FUNC( "Create local charging record table error message: %s\n", errMsg);
-        }
-        else
-        {
-            PRINTF_FUNC( "Opened local charging record table successfully\n");
-        }
-
-        if (sqlite3_exec(db, createCfgSql, 0, 0, &errMsg) != SQLITE_OK)
-        {
-            result = FAIL;
-            PRINTF_FUNC( "Create local config table error message: %s\n", errMsg);
-        }
-        else
-        {
-            PRINTF_FUNC( "Opened local config table successfully\n");
-        }
-
-        sqlite3_close(db);
-    }
+	int id = PackageIdCmd(Ev_Cmd.evse_stop_charging + toId);
+	byte data[8];
+
+	data[0] = stopResult;
+	data[1] = *stopReason;
+	data[2] = *(stopReason + 1);
+	data[3] = *(stopReason + 2);
+	data[4] = *(stopReason + 3);
+	data[5] = *(stopReason + 4);
+	data[6] = *(stopReason + 5);
 
-    return result;
+	SendCmdToEvboard(CanFd, id, data, sizeof(data));
 }
 
-int DB_Insert_Record(sqlite3 *db, int gun_index)
-{
-    int result = PASS;
-    char* errMsg = NULL;
-    char insertSql[1024];
-
-    sprintf(insertSql, "insert into charging_record(reservationId, transactionId, startMethod, userId, dateTimeStart, dateTimeStop, socStart, socStop, chargeEnergy, stopReason) "
-                       "values('%d', '%d', '%d', '%s', '%s', '%s', '%d', '%d', '%f', '%s');",
-                       ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].ReservationId,
-                       ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId,
-                       ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartMethod,
-                       ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartUserId,
-                       ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StartDateTime,
-                       ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].StopDateTime,
-                       ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc,
-                       ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].EvBatterySoc,
-                       ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].PresentChargedEnergy,
-                       ShmOCPP16Data->StopTransaction[gun_index].StopReason);
-
-    if(sqlite3_open("/Storage/ChargeLog/localCgargingRecord.db", &db))
-    {
-        result = FAIL;
-        PRINTF_FUNC( "Can't open database: %s\r\n", sqlite3_errmsg(db));
-        sqlite3_close(db);
-    }
-    else
-    {
-        PRINTF_FUNC( "Local charging record database open successfully.\r\n");
-        if (sqlite3_exec(db, insertSql, 0, 0, &errMsg) != SQLITE_OK)
-        {
-            result = FAIL;
-            PRINTF_FUNC( "Insert local charging record error message: %s\n", errMsg);
-        }
-        else
-        {
-            PRINTF_FUNC( "Insert local charging record successfully\n");
-        }
-        sqlite3_close(db);
-    }
 
-    return result;
+void SetIsolationStatus(byte gun_index, byte result, byte toId)
+{
+	int id = PackageIdCmd(Ev_Cmd.isolation_status + toId);
+	byte data[8];
+	data[0] = result;
+	SendCmdToEvboard(CanFd, id, data, 1);
 }
 
-int DB_Update_Operactive(sqlite3 *db, uint8_t gun_index, uint8_t IsAvailable)
+void SetEvsePrechargeInfo(byte gun_index, byte result, byte toId)
 {
-    uint8_t result = false;
-    char* errMsg = NULL;
-    char sqlStr[1024];
-    srand(time(NULL));
-
-    if(sqlite3_open(DB_FILE, &db))
-    {
-        result = FAIL;
-        PRINTF_FUNC( "Can't open database: %s\r\n", sqlite3_errmsg(db));
-        sqlite3_close(db);
-    }
-    else
-    {
-        PRINTF_FUNC( "Local charging record database open successfully (%d).\r\n", IsAvailable);
-
-        sprintf(sqlStr, "insert or replace into config (IsAvailable, connector, val) values('IsAvailable', %d, %d);", gun_index, IsAvailable);
-        PRINTF_FUNC("sqlStr= %s\r\n", sqlStr);
-        if (sqlite3_exec(db, sqlStr, 0, 0, &errMsg) != SQLITE_OK)
-        {
-            result = FAIL;
-            PRINTF_FUNC( "update config error message: %s\n", errMsg);
-        }
-        else
-        {
-            PRINTF_FUNC("update connector-%d config item isOperactive to %d\r\n", gun_index, IsAvailable);
-        }
-
-        sqlite3_close(db);
-    }
+	int id = PackageIdCmd(Ev_Cmd.evse_precharge_info + toId);
+	byte data[8];
 
-    return result;
+	data[0] = result;
+	SendCmdToEvboard(CanFd, id, data, 1);
 }
 
-int DB_Get_Operactive(sqlite3 *db, uint8_t gun_index)
-{
-    uint8_t result = true;
-    char* errMsg = NULL;
-    char sqlStr[1024];
-    char **rs;
-    int  rows, cols;
+void handleEmulatorFaultStatus(){
+	setEVStatus2(evstaus[4]);
+	ShmSysConfigAndInfo->ate.Permission = STOP;
+	setStatusMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission);
+	ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
+	SetChargingPermission(CCS_QUANTITY, ShmSysConfigAndInfo->ate.Permission, ShmSysConfigAndInfo->ate.TotalBatteryCap,
+				ShmSysConfigAndInfo->ate.MaxBatteryCurrent, ShmSysConfigAndInfo->ate.MaxBatteryVoltage, 1);
+	EvseStopChargingEvent(normalStop, stopReason, 1);
 
-    sprintf(sqlStr, "select * from config where IsAvailable='IsAvailable' and connector=%d;", gun_index);
-    //DEBUG_INFO("sqlStr= %s\r\n", sqlStr);
+}
 
-    if(sqlite3_open(DB_FILE, &db))
-    {
-        result = FAIL;
-        PRINTF_FUNC( "Can't open database: %s\r\n", sqlite3_errmsg(db));
-        sqlite3_close(db);
-    }
-    else
-    {
-        PRINTF_FUNC( "Local config query database open successfully.\r\n");
-        sqlite3_get_table(db, sqlStr, &rs, &rows, &cols, &errMsg);
-        if(rows>0)
-        {
-            for(int idxRow=1;idxRow<=rows;idxRow++)
-            {
-                if(strcmp(rs[(idxRow*cols)+3], "0") == 0)
-                {
-                    result = false;
-                }
-                PRINTF_FUNC("Query connector-%d isOperactive: %s\r\n", gun_index, rs[(idxRow*cols)+3]);
-            }
-        }
-        else
-        {
-            PRINTF_FUNC("Query connector-%d fail, set default value to operactive.\r\n", gun_index);
-        }
-
-        sqlite3_free_table(rs);
-        sqlite3_close(db);
-    }
 
-    return result;
-}
 
-//===============================================
-// Config process
-//===============================================
-void AddPlugInTimes(byte gunIndex)
+int bitExtracted(byte number, int k, int p)
 {
-    if (chargingInfo[gunIndex]->Type == _Type_Chademo)
-        ShmSysConfigAndInfo->SysConfig.ChademoPlugInTimes += 1;
-    else if(chargingInfo[gunIndex]->Type == _Type_CCS_2)
-        ShmSysConfigAndInfo->SysConfig.Ccs2PlugInTimes += 1;
-    else if(chargingInfo[gunIndex]->Type == _Type_GB)
-        ShmSysConfigAndInfo->SysConfig.GbPlugInTimes += 1;
+    return (((1 << k) - 1) & (number >> (p - 1)));
 }
 
-void ChangeStartOrStopDateTime(byte isStart, byte gunIndex)
+unsigned short bitextract(unsigned short value, int begin, int end)
 {
-    char cmdBuf[32];
-    struct timeb csuTime;
-    struct tm *tmCSU;
-
-    ftime(&csuTime);
-    tmCSU = localtime(&csuTime.time);
-
-    sprintf(cmdBuf, "%04d-%02d-%02d %02d:%02d:%02d", tmCSU->tm_year + 1900,
-            tmCSU->tm_mon + 1, tmCSU->tm_mday, tmCSU->tm_hour, tmCSU->tm_min,
-            tmCSU->tm_sec);
-    if (isStart)
-        strcpy((char *)chargingInfo[gunIndex]->StartDateTime, cmdBuf);
-    else
-        strcpy((char *)chargingInfo[gunIndex]->StopDateTime, cmdBuf);
+	unsigned short mask = (1 << (end - begin)) - 1;
+    return (value >> begin) & mask;
 }
 
-void zipLogFiles()
+bool CheckUniqNumber(byte value)
 {
-    const char* logPath = "/Storage/SystemLog";
-    // 獲取目錄
-    DIR* pDir = opendir(logPath);
-    if (pDir != NULL)
-    {
-        struct timeb csuTime;
-        struct tm *tmCSU;
-
-        ftime(&csuTime);
-        tmCSU = localtime(&csuTime.time);
-//      PRINTF_FUNC("Time : %04d-%02d-%02d %02d:%02d:%02d \n", tmCSU->tm_year + 1900,
-//          tmCSU->tm_mon + 1, tmCSU->tm_mday, tmCSU->tm_hour, tmCSU->tm_min,
-//          tmCSU->tm_sec);
-
-        // Read items inside the folder
-        struct dirent* pEntry = NULL;
-        while ((pEntry = readdir(pDir)) != NULL)
-        {
-            if (strcmp(pEntry->d_name, ".") != 0 &&
-                strcmp(pEntry->d_name, "..") != 0 &&
-                strncmp(pEntry->d_name, "[", 1) == 0 &&
-                strstr(pEntry->d_name, "tar") < 0)
-            {
-                char yearC[5];
-                unsigned short year = 0;
-                char monthC[3];
-                unsigned short month = 0;
-
-                yearC[4] = '\0';
-                strncpy(yearC, pEntry->d_name + 1, 4);
-                monthC[2] = '\0';
-                strncpy(monthC, pEntry->d_name + 6, 2);
-
-                year = atoi(yearC);
-                month = atoi(monthC);
-
-                if (year != 0)
-                {
-                    if (year < tmCSU->tm_year + 1900 ||
-                        (year >= tmCSU->tm_year + 1900 && month < tmCSU->tm_mon + 1))
-                    {
-                        DEBUG_INFO_MSG("tar file name : %s \n", pEntry->d_name);
-                        char file[256];
-
-                        memset(file, 0x00, sizeof(file));
-                        strcat(file, "tar zcvf ");
-                        strcat(file, logPath);
-                        strncat(file, "/", 1);
-                        strcat(file, pEntry->d_name);
-                        strcat(file, ".tar");
-                        strncat(file, " ", 1);
-                        strcat(file, logPath);
-                        strncat(file, "/", 1);
-                        strcat(file, pEntry->d_name);
-                        PRINTF_FUNC("zip = %s \n", file);
-                        system(file);
-                    }
-                }
-            }
-        }
-    }
-    // Close folder
-    closedir(pDir);
-}
+	for (byte index = 0; index < gunCount; index++)
+	{
+		if (chargingInfo[index]->Evboard_id == value)
+		{
+			struct timeval _end_time;
+			gettimeofday(&_end_time, NULL);
+			unsigned long diff = 1000000 *	(_end_time.tv_sec - _id_assign_time.tv_sec) + _end_time.tv_usec - _id_assign_time.tv_usec;
+			if (diff >= 3000000)
+			{
+				gettimeofday(&_id_assign_time, NULL);
+				return true;
+			}
+			else
+			{
+				return false;
+			}
+		}
+	}
 
-void ChangeGunSelectByIndex(byte sel)
-{
-    ShmSysConfigAndInfo->SysInfo.CurGunSelected = sel;
-    ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = NO_DEFINE;
+	gettimeofday(&_id_assign_time, NULL);
+	return true;
 }
 
-void CheckIsAlternatvieByModelName()
+void SetTargetAddr(byte *target_number, byte index)
 {
-    // 黑白機 ?
-    if(strcmp((char *)ShmSysConfigAndInfo->SysConfig.ModelName, "DWWU301J0UE1PH") == EQUAL ||
-       strcmp((char *)ShmSysConfigAndInfo->SysConfig.ModelName, "DWWU301J0UW1PH") == EQUAL ||
-       strcmp((char *)ShmSysConfigAndInfo->SysConfig.ModelName, "DWWU301J0UT1PH") == EQUAL ||
-       strcmp((char *)ShmSysConfigAndInfo->SysConfig.ModelName, "DWYE301J0EE1PH") == EQUAL ||
-       strcmp((char *)ShmSysConfigAndInfo->SysConfig.ModelName, "DWYE301J0EW1PH") == EQUAL ||
-       strcmp((char *)ShmSysConfigAndInfo->SysConfig.ModelName, "DWYE301J0ET1PH") == EQUAL ||
-       strcmp((char *)ShmSysConfigAndInfo->SysConfig.ModelName, "DWYC301J0UE1PH") == EQUAL ||
-       strcmp((char *)ShmSysConfigAndInfo->SysConfig.ModelName, "DWYC301J0UW1PH") == EQUAL ||
-       strcmp((char *)ShmSysConfigAndInfo->SysConfig.ModelName, "DWYC301J0UT1PH") == EQUAL)
-        ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf = YES;
-    else
-        ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf = NO;
+	int id = PackageIdCmd(Ev_Cmd.address_assignment + index);
+	//printf("intCmd = %x \n", cmd & CAN_EFF_MASK);
+	//cmd = cmd & CAN_EFF_MASK;
+
+	byte data[8];
+
+	data[0] = *target_number;
+	data[1] = *(target_number + 1);
+	data[2] = *(target_number + 2);
+	data[3] = *(target_number + 3);
+	data[4] = index;
+
+	SendCmdToEvboard(CanFd2, id, data, sizeof(data));
 }
 
-void StopProcessingLoop()
-{
-    for (;;)
-    {
-        CheckFactoryConfigFunction();
-        CheckFwUpdateFunction();
-        sleep(1);
-    }
+void AddrAssignment(byte *data)
+{
+	byte target_number[8];
+	byte index = 0x00;
+
+	memcpy(target_number, data, sizeof(target_number));
+	index = *(data + 4);
+
+	if (CheckUniqNumber(index))
+	{
+		printf("EV board id = %x \n", index);
+//		printf("target_number[0] = %x \n", target_number[0]);
+//		printf("target_number[1] = %x \n", target_number[1]);
+//		printf("target_number[2] = %x \n", target_number[2]);
+//		printf("target_number[3] = %x \n", target_number[3]);
+//		printf("target_number[4] = %x \n", target_number[4]);
+
+		if (index < 1)
+			return;
+
+		printf("SetTargetAddr \n");
+		SetTargetAddr(target_number, index);
+	}
+}
+
+
+
+
+void VCCU_TD(){
+	byte data[8];
+	data[0] = 0x00;
+	data[1] = 0x00;
+	data[2] = 0x01;
+	data[3] = 0x01;
+	data[4] = 0x00;
+	data[5] = 0x00;
+	data[6] = 0x42;
+	data[7] = 0x66;
+	SendCmdToEvboard(CanFd, TDId, data, sizeof(data));
+}
+
+void VCCU_ChargeFromVehicle(int canfd, int linkVoltage, int contactorVoltage,
+		int chargePermission, int isolationMeasurem,
+		int plugLockPermissio, int plugUnlockPermiss, int contactorStatus){
+
+	struct VCCU_ChargeFromVehicle obj;
+	obj.VCCU_Vehicle_LinkVoltage= linkVoltage;//500
+	obj.VCCU_Vehicle_ContactorVoltage = contactorVoltage;//0
+	obj.DATA.bits.VCCU_Vehicle_ChargePermission = chargePermission;//Not_allowed
+	obj.DATA.bits.VCCU_Vehicle_IsolationMeasurem = isolationMeasurem;//Active
+	obj.DATA.bits.VCCU_Vehicle_PlugLockPermissio = plugLockPermissio;//Allowed//Not_allowed;
+	obj.DATA.bits.VCCU_Vehicle_PlugUnlockPermiss = plugUnlockPermiss;//Not_allowed
+	obj.bits.VCCU_Vehicle_ContactorStatus = contactorStatus;//Open
+	obj.bits.VCCU_Vehicle_StopCharge = 3;//Open
+	obj.bits.VCCU_Vehicle_ChargeSelection = 3;//Open
+	byte* data1;
+	data1 = (byte*) &(*((UWORD *) &obj.VCCU_Vehicle_ContactorVoltage));
+	byte* data2;
+	data2 = (byte*) &(*((UWORD *) &obj.VCCU_Vehicle_LinkVoltage));
+	byte data[6];
+	data[0] = data1[0];
+	data[1] = data1[1];
+	data[2] = data2[0];
+	data[3] = data2[1];
+	data[4] = *((UBYTE *) &obj.DATA);
+	data[5] = *((UBYTE *) &obj.bits);
+	//printf("%02x %02x %02x %02x %02x %02x  \n", data[0], data[1], data[2], data[3], data[4], data[5] );
+	SendCmdToEvboard(canfd, VCCU_ChargeFromVehicleIds, data, sizeof(data));
+}
+
+//0x18FF3082
+void VCCU_V2G_VehicleStatus(int canfd, int EnergyTra, int EVErrorCode,
+		int EVPowerDeliveryParame, int EVRESSSOC,
+		int EVRESSConditioningFla, int EVRESSConditionin, int EVReady,
+		int BulkChargingCompleteF, int EVCabinConditioningFl, int EVCabinConditioning,
+		int ChargingComplete, int FullSOCFlag, int FullSOC,
+		int BulkSOCFlag, int BulkSOC, int BulkChargingComplete,
+		int BulkChargingCompleteFValue){
+	struct VCCU_V2G_VehicleStatus obj;
+	obj.DATA4.VCCU_V2G_StateM_EnergyTra_0000 = EnergyTra;//VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended;
+	obj.DATA1.VCCU_V2G_EVErrorCode = EVErrorCode;//0;
+	obj.DATA4.VCCU_V2G_EVPowerDeliveryParame = EVPowerDeliveryParame;//3;
+	obj.VCCU_V2G_EVRESSSOC.value = EVRESSSOC;//0;
+	obj.DATA3.VCCU_V2G_EVRESSConditioningFla = EVRESSConditioningFla;//3;
+	obj.DATA3.VCCU_V2G_EVRESSConditioning = EVRESSConditionin;//3;
+	obj.DATA3.VCCU_V2G_EVReady = EVReady;//3;
+	obj.DATA1.VCCU_V2G_BulkChargingCompleteF = BulkChargingCompleteF;//3;
+	obj.DATA3.VCCU_V2G_EVCabinConditioningFl = EVCabinConditioningFl;//3;
+	obj.DATA2.VCCU_V2G_EVCabinConditioning = EVCabinConditioning;//3;
+	obj.DATA2.VCCU_V2G_ChargingComplete = ChargingComplete;//3;
+	obj.DATA2.VCCU_V2G_FullSOCFlag = FullSOCFlag;//0;
+	obj.VCCU_V2G_FullSOC.value = FullSOC;//3;
+	obj.DATA2.VCCU_V2G_BulkSOCFlag = BulkSOCFlag;//3;
+	obj.VCCU_V2G_BulkSOC.value = BulkSOC;//0;
+	obj.DATA1.VCCU_V2G_BulkChargingComplete = BulkChargingComplete;//3;
+	obj.DATA1.VCCU_V2G_BulkChargingCompleteF = BulkChargingCompleteFValue;//3;
+	byte data[7];
+	data[0] = *((UBYTE *) &obj.DATA1);
+	data[1] = *((UBYTE *) &obj.DATA2);
+	data[2] = *((UBYTE *) &obj.DATA3);
+	data[3] = *((UBYTE *) &obj.DATA4);
+	data[4] = *((UBYTE *) &obj.VCCU_V2G_BulkSOC);
+	data[5] = *((UBYTE *) &obj.VCCU_V2G_FullSOC);
+	data[6] = *((UBYTE *) &obj.VCCU_V2G_EVRESSSOC);
+	//printf("%02x %02x %02x %02x %02x %02x %02x  \n", data[0], data[1], data[2], data[3], data[4], data[5] , data[6]);
+	SendCmdToEvboard(canfd, VCCU_V2G_VehicleStatusIds, data, sizeof(data));
+}
+
+void VCCU_V2G_EVMaximumVoltageLimit(int VMaximumVoltageLimit,
+		int EVMaximumVoltage_0002,
+		int EVMaximumVoltage_0000,
+		int EVMaximumVoltage_0001,
+		int EVMaximumVoltage_0003){
+
+	struct VCCU_V2G_EVMaximumVoltageLimit obj;
+	obj.DATA1.VCCU_V2G_EVMaximumVoltageLimit = VMaximumVoltageLimit;//1
+	obj.DATA1.VCCU_V2G_EVMaximumVoltage_0002 = EVMaximumVoltage_0002;//5
+	obj.VCCU_V2G_EVMaximumVoltage_0000.value = EVMaximumVoltage_0000;//520
+	obj.VCCU_V2G_EVMaximumVoltage_0001.value = EVMaximumVoltage_0001;//1
+	obj.VCCU_V2G_EVMaximumVoltage_0003.value = EVMaximumVoltage_0003;//0
+	byte* data1;
+	data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVMaximumVoltage_0000));
+	byte data[5];
+	data[0] = *((UBYTE *) &obj.DATA1);
+	data[1] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumVoltage_0003);
+	data[2] = data1[0];
+	data[3] = data1[1];
+	data[4] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumVoltage_0001);
+	//printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
+	SendCmdToEvboard(CanFd, VCCU_V2G_EVMaximumVoltageLimitIds, data, sizeof(data));
+}
+
+void VCCU_V2G_EVMaximumCurrentLimit(int EVMaximumCurrentLimit,
+		int EVMaximumCurrent_0000,
+		int EVMaximumCurrent_0001,
+		int EVMaximumCurrent_0002,
+		int EVMaximumCurrent_0003){
+
+	struct VCCU_V2G_EVMaximumCurrentLimit obj;
+	obj.DATA1.VCCU_V2G_EVMaximumCurrentLimit = EVMaximumCurrentLimit;//1
+	obj.DATA1.VCCU_V2G_EVMaximumCurrent_0000 = EVMaximumCurrent_0000;//3
+	obj.VCCU_V2G_EVMaximumCurrent_0001.value = EVMaximumCurrent_0001;//1
+	obj.VCCU_V2G_EVMaximumCurrent_0002.value = EVMaximumCurrent_0002;//0
+	obj.VCCU_V2G_EVMaximumCurrent_0003.value = EVMaximumCurrent_0003;//10
+	byte* data1;
+	data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVMaximumCurrent_0003));
+	byte data[5];
+	data[0] = *((UBYTE *) &obj.DATA1);
+	data[1] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumCurrent_0002);
+	data[2] = data1[0];
+	data[3] = data1[1];
+	data[4] = *((UBYTE *) &obj.VCCU_V2G_EVMaximumCurrent_0001);
+	//printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
+	SendCmdToEvboard(CanFd, VCCU_V2G_EVMaximumCurrentLimitIds, data, sizeof(data));
+}
+
+void VCCU_V2G_EVTargetCurrent(int EVTargetCurrent_Unit,
+		int EVTargetCurrent_Value,
+		int EVTargetCurrent_UnitF,
+		int EVTargetCurrent_Multi){//05 00 00 01 03
+
+	struct VCCU_V2G_EVTargetCurrent obj;
+	obj.VCCU_V2G_EVTargetCurrent_Unit.value = EVTargetCurrent_Unit;//3
+	obj.VCCU_V2G_EVTargetCurrent_Value.value = EVTargetCurrent_Value;//5
+	obj.VCCU_V2G_EVTargetCurrent_UnitF.value = EVTargetCurrent_UnitF;//1
+	obj.VCCU_V2G_EVTargetCurrent_Multi.value = EVTargetCurrent_Multi;//0
+	byte* data1;
+	data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVTargetCurrent_Value));
+	byte data[5];
+	data[0] = data1[0];
+	data[1] = data1[1];
+	data[2] = *((UBYTE *) &obj.VCCU_V2G_EVTargetCurrent_Multi);
+	data[3] = *((UBYTE *) &obj.VCCU_V2G_EVTargetCurrent_UnitF);
+	data[4] = *((UBYTE *) &obj.VCCU_V2G_EVTargetCurrent_Unit);
+	//printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
+	SendCmdToEvboard(CanFd, VCCU_V2G_EVTargetCurrentIds, data, sizeof(data));
+}
+
+void VCCU_V2G_EVTargetVoltage(int EVTargetVoltage_Value,
+		int EVTargetVoltage_Unit,
+		int EVTargetVoltage_UnitF,
+		int EVTargetVoltage_Multi){//C2 01 00 01 05
+
+	struct VCCU_V2G_EVTargetVoltage obj;
+	obj.VCCU_V2G_EVTargetVoltage_Value.value = EVTargetVoltage_Value;//450
+	obj.VCCU_V2G_EVTargetVoltage_Unit.value = EVTargetVoltage_Unit;//5
+	obj.VCCU_V2G_EVTargetVoltage_UnitF.value = EVTargetVoltage_UnitF;//1
+	obj.VCCU_V2G_EVTargetVoltage_Multi.value = EVTargetVoltage_Multi;//0
+
+	byte* data1;
+	data1 = (byte*) &(*((UWORD *) &obj.VCCU_V2G_EVTargetVoltage_Value));
+	byte data[5];
+	data[0] = data1[0];
+	data[1] = data1[1];
+	data[2] = *((UBYTE *) &obj.VCCU_V2G_EVTargetVoltage_Multi);
+	data[3] = *((UBYTE *) &obj.VCCU_V2G_EVTargetVoltage_UnitF);
+	data[4] = *((UBYTE *) &obj.VCCU_V2G_EVTargetVoltage_Unit);
+	//printf("%d %02x %02x \n",obj.VCCU_V2G_EVTargetVoltage_Value.value, data[0], data[1]);
+	//printf("%02x %02x %02x %02x %02x \n", data[0], data[1], data[2], data[3], data[4]);
+	SendCmdToEvboard(CanFd, VCCU_V2G_EVTargetVoltageIds, data, sizeof(data));
+}
+
+void VCCU_Requests(int LED0, int LED1, int LED2,
+		int HighSideOut0, int HighSideOut1, int HighSideOut2, int HighSideOut3,
+		int HighSideOut4, int RTC_TimerRequest, int PlugLock,
+		int RTC_TimerValue,
+		int ControlPilot, int ChargeUnit, int Inlet){
+	struct VCCU_Requests obj;
+	obj.VCCU_LED0_Request = LED0;//0.0
+	obj.VCCU_LED1_Request = LED1;//0.0
+	obj.VCCU_LED2_Request = LED2;//0.0
+	obj.byte3.VCCU_HighSideOut0_Request = HighSideOut0;//3
+	obj.byte3.VCCU_HighSideOut1_Request = HighSideOut1;//3
+	obj.byte3.VCCU_HighSideOut2_Request = HighSideOut2;//3
+	obj.byte3.VCCU_HighSideOut3_Request = HighSideOut3;//3
+	obj.byte4.VCCU_HighSideOut4_Request = HighSideOut4;//3
+	obj.byte4.VCCU_RTC_TimerRequest = RTC_TimerRequest;//3
+	obj.byte4.VCCU_PlugLock_MotorRequest = PlugLock;//7
+	obj.VCCU_RTC_TimerValue= RTC_TimerValue;//0
+	obj.byte6.VCCU_ControlPilot_ChargeModeRe = ControlPilot;//7
+	obj.byte6.VCCU_ChargeUnit_Request = ChargeUnit;//3
+	obj.byte6.VCCU_Inlet_MotorRequest = Inlet;//3
+
+
+	byte data[7];
+	data[0] = *((UBYTE *) &obj.VCCU_LED0_Request);
+	data[1] = *((UBYTE *) &obj.VCCU_LED1_Request);
+	data[2] = *((UBYTE *) &obj.VCCU_LED2_Request);
+	data[3] = *((UBYTE *) &obj.byte3);
+	data[4] = *((UBYTE *) &obj.byte4);
+	data[5] = *((UBYTE *) &obj.VCCU_RTC_TimerValue);
+	data[6] = *((UBYTE *) &obj.byte6);
+	//printf("%02x %02x %02x %02x %02x %02x %02x  \n", data[0], data[1], data[2], data[3], data[4], data[5] , data[6]);
+	SendCmdToEvboard(CanFd, VCCU_RequestsIds, data, sizeof(data));
+}
+
+bool MatedPlugInletUnlocked_Status(){
+	return (ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Status == VCCU_InletStatus_Connected &&
+			ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_Inlet_ConnectionStatus == VCCU_InletStatus_Connected &&
+			//ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == Unlocked &&
+			ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State == EVSEStateB2 &&
+			ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_Mode == ChargeV2G
+			//&& ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.VCCU_ControlPilot_Voltage - 32000 == 9
+			);
+}
+
+bool PreCharge_Statue(){
+	return ((ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == PreCharge ) &&
+			ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State == EVSEStateC &&
+			//(ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_Voltage.bits.value / 2) == 6 &&
+			ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_IsolationMea_0000 == Not_requested);
+}
+
+bool status1(){
+
+	bool result = false;
+	result = (ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_PlugLockPermissio == Allowed
+			&& ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == VCCU_Unlocked );
+	return result;
+}
+
+bool status2(){
+	bool result = false;
+	result = ((ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_DutyCycle.bits.value >= 5
+			&& ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.ControlPilot_DutyCycle.bits.value <= 7)
+			&& ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == Locked
+			&& ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_Mode == EVSEStateB2
+			&& ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_DigitalInput_Status == Not_pressed
+			&& ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_S3Switch_Status == Not_pressed);
+	return result;
+}
+
+bool  UnmatedPlug(){
+	bool result = false;
+	/*
+	printf("VCCU_V2G_StateM_StateMachineSt = %d VCCU_ChargeUnit_State = %d VCCU_ChargeUnit_Mode = %d VCCU_Vehicle_ContactorRequest = %d VCCU_Vehicle_IsolationMea_0000 = %d \n", ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt,
+			ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State,
+			ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_Mode,
+			ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.Data.bits.VCCU_Vehicle_ContactorRequest,
+			ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.Data.bits.VCCU_Vehicle_IsolationMea_0000);
+			*/
+	if(ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == StateM_Initialized &&
+					//ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Status == VCCU_InletStatus_Not_connected &&
+					//ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_Inlet_ConnectionStatus == VCCU_InletStatus_Not_connected &&
+					//ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == Unlocked &&
+					(ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State == EVSEStateA ||
+							ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State == EVSEStateE ||
+							ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State == EVSEStateB1) &&
+					ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_Mode == VCCU_ChargeUnit_Mode_SNA &&
+					//ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.VCCU_ControlPilot_Voltage == 0 &&
+					ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest == ForceOpen &&
+					ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_IsolationMea_0000 == Requested ){
+		//TODO
+		result = true;
+		//printf("CCS DC01....................\n");
+		//VCCU_ChargeFromVehicle(CanFd, 500, 0, Not_allowed, Active, Not_allowed, Not_allowed, Opened);
+		setChargerMode(CCS_QUANTITY, V_UNMATEDPLUG);
+	}
+
+	return result;
+}
+
+bool MatedPlugInletUnlocked(){
+	bool result = false;
+	if(MatedPlugInletUnlocked_Status() && chargingInfo[CCS_QUANTITY]->SystemStatus == V_IDLE){//(DC02) Mated Plug - Inlet Unlocked
+		//TODO
+		result = true;
+		//VCCU_ChargeFromVehicle(CanFd, 500, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+		setChargerMode(CCS_QUANTITY, V_MATED_PLUG_INLET_UNLOCKED);
+	}
+	return result;
+}
+
+bool InletLocking(){
+	bool result = false;
+
+	if(//ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State == EVSEStateB2
+			status1() &&
+			ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == VCCU_Inlet_MotorStatus_Moving
+			){//(DC03) Inlet Locking
+		result = true;
+		//printf("CCS DC03....................\n");
+		/*
+		if(ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_PlugLockPermissio == Allowed &&
+				ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Status == VCCU_InletStatus_Connected &&//PlugPresent_Status == Connected for >=2s
+				//ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.VCCU_ControlPilot_DutyCycle && //ControlPilot_DutyCycle == valid for >= 2s
+				ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == Unlocked){
+
+		}*/
+		setChargerMode(CCS_QUANTITY, V_INLETLOCKING);
+	}
+	return result;
+}
+
+bool InletLocked(){
+	bool result = false;
+	if(MatedPlugInletUnlocked_Status() && ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == Locked){//DC04) Inlet Locked
+		result = true;
+		/*
+		if(ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == VCCU_Inlet_MotorStatus_Moving){
+				}*/
+		setChargerMode(CCS_QUANTITY, V_INLETLOCKED);
+	}
+	return result;
+}
+bool DC05_Status(){
+	return (status1() && status2() && (ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == SLAC || ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == WaitForIP ||
+			ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == SECCDiscoveryProtocol || ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == TLConnection ||
+			ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == SupportedAppProtocol || ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == SessionSetup ||
+			ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == ServiceDiscovery || ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == ServiceDetails ||
+			ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == PaymentServiceSelection || ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == CertificateInstallation ||
+			ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == CertificateUpdate || ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == PaymentDetails ||
+			ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == PaymentDetails || ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == Authorization )
+					&& ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest == Open);
+}
+
+bool S_SLAC(){
+	bool result = false;
+	if(MatedPlugInletUnlocked_Status() && DC05_Status()){
+		result = true;
+
+
+		/*
+		if(ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == Locked &&
+			(ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.VCCU_ControlPilot_DutyCycle >= 5 || ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.VCCU_ControlPilot_DutyCycle <= 7) &&
+			ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State == EVSEStateB2 &&
+			ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_DigitalInput_Status == Not_pressed &&
+			ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_S3Switch_Status == Not_pressed&&
+			ShmSysConfigAndInfo->ate.vccu.ptc1.VCCU_PTC1_Temperature < 90){
+
+		}*/
+		setChargerMode(CCS_QUANTITY, V_SLAC);
+	}
+	return result;
+}
+
+bool Definition(){
+	bool result = false;
+	if(MatedPlugInletUnlocked_Status() && (ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == ChargeParameterDiscovery ) &&
+			ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest == Open){
+		result = true;
+/*
+		VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+								3, 0,
+								3, 3, TRUE,
+								3, 3, 3,
+								3, 3, 0,
+								3, 0, 3,
+								3);
+		VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, 520, TRUE, 0);
+		VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, 10);
+*/
+		setChargerMode(CCS_QUANTITY, V_DEFINITION);
+	}
+	return result;
+}
+
+bool S_CableCheck(){
+	bool result = false;
+	if(MatedPlugInletUnlocked_Status() && (ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == CableCheck )){
+		result = true;
+		//VCCU_ChargeFromVehicle(CanFd, 500, 0, Allowed, Active, Allowed, Not_allowed, Opened);
+		setChargerMode(CCS_QUANTITY, V_CABLECHECK);
+	}
+	return result;
+}
+
+bool Isolation(){
+	bool result = false;
+	if(MatedPlugInletUnlocked_Status() && PreCharge_Statue()){
+		result = true;
+		//VCCU_ChargeFromVehicle(CanFd, 500, 0, Allowed, Not_Active, Allowed, Not_allowed, Opened);
+		setChargerMode(CCS_QUANTITY, V_ISOLATION);
+	}
+	return result;
+}
+
+bool S_PreCharge(){
+	bool result = false;
+	if(PreCharge_Statue()){
+		//VCCU_ChargeFromVehicle(CanFd, 500, 500, Allowed, Not_Active, Allowed, Not_allowed, Opened);
+		//VCCU_V2G_EVTargetCurrent(U_A, 5, TRUE, 0);
+		setChargerMode(CCS_QUANTITY, V_VOLTAGEDIFFERENCE);
+	}
+	return result;
+}
+
+bool Contactors(){
+	bool result = false;
+	if( PreCharge_Statue()
+			//&& ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest == Close
+			){
+		result = true;
+		//VCCU_ChargeFromVehicle(CanFd, 500, 500, Allowed, Not_Active, Allowed, Not_allowed, Closed);
+		setChargerMode(CCS_QUANTITY, V_CONTACTORSCLOSED);
+
+/*
+		if (GetTimeoutValue(chargingInfo[CCS_QUANTITY]->TimeoutTimer) >= 7000000)
+		{
+			ftime(&startChargingTime[CCS_QUANTITY]);
+			chargingInfo[CCS_QUANTITY]->RemainChargingDuration = 0;
+			StopGunInfoTimeoutDet(CCS_QUANTITY);
+			StartGunInfoTimeoutDet(CCS_QUANTITY, Timeout_Preparing);
+		}
+		*/
+
+	}
+	return result;
+}
+
+bool S_PowerDelivery(){
+	bool result = false;
+	if(PreCharge_Statue() && ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == PowerDelivery
+			&& ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest == Close
+			){
+		result = true;
+		//VCCU_V2G_EVTargetVoltage(450, U_V, TRUE, 0);
+		setChargerMode(CCS_QUANTITY, V_POWERDELIVERY);
+	}
+	return result;
+}
+
+bool S_CurrentDemand(){
+	bool result = false;
+	if(ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == CurrentDemand){//(DC12) Current Demand
+		result = true;
+		//TODO stop
+		setChargerMode(CCS_QUANTITY, V_CURRENTDEMAND);
+	}
+	return result;
+}
+
+bool PowerDeliveryFalse(){
+	bool result = false;
+	if(ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == PowerDelivery
+			&& ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest == Open
+			){//(DC13) PowerDelivery
+		result = true;
+		setChargerMode(CCS_QUANTITY, V_POWERDELIVERYFALSE);
+	}
+	return result;
+}
+
+bool S_WeldingDetection(){
+	bool result = false;
+	if(ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == WeldingDetection){//(DC14) Welding Detection
+		result = true;
+		setChargerMode(CCS_QUANTITY, V_DETECTION);
+	}
+	return result;
+}
+
+bool SessionStop(){
+	bool result = false;
+	if(ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == StateM_SessionStop &&
+			ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_IsolationMea_0000 == Requested){//Session Stop
+		result = true;
+		setChargerMode(CCS_QUANTITY, V_SESSION_STOP);
+	}
+	return result;
+}
+
+bool StopCommunicationSession(){
+	bool result = false;
+	if(ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == StateM_StopCommunicationSession ){//Stop Communication Session
+		result = true;
+		setChargerMode(CCS_QUANTITY, V_STOP_COMMUNICATION_SESSION);
+	}
+	return result;
+}
+
+bool DCFinished(){
+	bool result = false;
+	if(ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt == StateM_Finished ){//Finished
+		result = true;
+		setChargerMode(CCS_QUANTITY, V_FINISHED);
+	}
+	return result;
+}
+
+bool statusCheck(){
+	bool result = false;
+	//VCCU_TD();
+	UnmatedPlug();
+	MatedPlugInletUnlocked();
+	InletLocking();
+	InletLocked();
+	S_SLAC();
+	Definition();
+	S_CableCheck();
+	Isolation();
+	S_PreCharge();
+	Contactors();
+	S_PowerDelivery();
+	S_CurrentDemand();
+	PowerDeliveryFalse();
+	S_WeldingDetection();
+	SessionStop();
+	StopCommunicationSession();
+	DCFinished();
+	return result;
 }
 
-void CreateWatchdog()
-{
-    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == NO)
-    {
-        wtdFd = InitWatchDog();
+bool AcUnmatedPlug(){
+	bool result = false;
 
-        if (wtdFd < 0)
-            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed = 1;
-    }
+	if((ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State == EVSEStateA ||
+		ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State == EVSEStateE ||
+		ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State == EVSEStateB1) &&
+		ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_Mode == VCCU_ChargeUnit_Mode_SNA ){
+		//TODO
+		result = true;
+		setChargerMode(CCS_QUANTITY, V_UNMATEDPLUG);
+	}
+
+	return result;
+}
+
+bool AcMatedPlugInletUnlocked(){
+	bool result = false;
+	if( (ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Status == VCCU_InletStatus_Connected &&
+		ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA7.bits.VCCU_Inlet_ConnectionStatus == VCCU_InletStatus_Connected &&
+		//ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == Unlocked &&
+		ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State == EVSEStateB2 &&
+		ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_Mode == ChargePwm
+		//&& ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.VCCU_ControlPilot_Voltage - 32000 == 9
+		) && chargingInfo[CCS_QUANTITY]->SystemStatus == V_IDLE){//(DC02) Mated Plug - Inlet Unlocked
+		//TODO
+		result = true;
+		//VCCU_ChargeFromVehicle(CanFd, 500, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+		setChargerMode(CCS_QUANTITY, V_MATED_PLUG_INLET_UNLOCKED);
+	}
+	return result;
 }
 
-bool IsConnectorWholeIdle()
-{
-    bool result = true;
 
-    for (byte count = 0; count < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; count++)
-    {
-        if (chargingInfo[count]->SystemStatus != S_IDLE &&
-            chargingInfo[count]->SystemStatus != S_RESERVATION)
-        {
-            result = false;
-            break;
-        }
-    }
+bool acInletLocking(){
+	bool result = false;
 
-    for (byte count = 0; count < ShmSysConfigAndInfo->SysConfig.AcConnectorCount; count++)
-    {
-        if (ac_chargingInfo[count]->SystemStatus != S_IDLE &&
-            ac_chargingInfo[count]->IsErrorOccur == NO)
-        {
-            result = false;
-            break;
-        }
-    }
+	if(//ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State == EVSEStateB2
+		(ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_PlugLockPermissio == Allowed
+		&& ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == VCCU_Unlocked &&
+		((chargingInfo[CCS_QUANTITY]->PlugPresentStatusDuration >= 2) &&
+		chargingInfo[CCS_QUANTITY]->DutyCycleDuration >= 2)) &&
+		ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == VCCU_Inlet_MotorStatus_Moving
+		){//(DC03) Inlet Locking
+		result = true;
+		//printf("CCS DC03....................\n");
+		/*
+		if(ShmSysConfigAndInfo->ate.vccu.chargeFromVehicle.DATA.bits.VCCU_Vehicle_PlugLockPermissio == Allowed &&
+				ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Status == VCCU_InletStatus_Connected &&//PlugPresent_Status == Connected for >=2s
+				//ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.VCCU_ControlPilot_DutyCycle && //ControlPilot_DutyCycle == valid for >= 2s
+				ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA5.bits.VCCU_Inlet_MotorStatus == Unlocked){
 
-    return result;
+		}*/
+		setChargerMode(CCS_QUANTITY, V_INLETLOCKING);
+	}
+	return result;
 }
 
-void ClearAlarmCodeWhenAcOff()
-{
-    if (!ShmSysConfigAndInfo->SysInfo.AcContactorStatus)
-    {
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuNoResource = NO;
-    }
+bool acStatusCheck(){
+	bool result = false;
+	AcUnmatedPlug();
+	AcMatedPlugInletUnlocked();
+	return result;
 }
 
-//==========================================
-// Check task processing
-//==========================================
-void CheckTask()
+
+long hexToDec(char *source)
 {
-    if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T')
-    {
-        if(system("pidof -s Module_4g > /dev/null") != 0)
-        {
-            DEBUG_ERROR_MSG("Module_4g not running, restart it.\r\n");
-            system("/root/Module_4g &");
-        }
-    }
-    else if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W')
-    {
-        if(system("pidof -s Module_Wifi > /dev/null") != 0)
-        {
-            DEBUG_ERROR_MSG("Module_Wifi not running, restart it.\r\n");
-            system("/root/Module_Wifi &");
-        }
-    }
+    long sum = 0;
+    long t = 1;
+    int i, len;
 
-    if(strcmp((char *)ShmSysConfigAndInfo->SysConfig.OcppServerURL, "") != EQUAL &&
-       strcmp((char *)ShmSysConfigAndInfo->SysConfig.ChargeBoxId, "") != EQUAL)
+    len = strlen(source);
+    for(i=len-1; i>=0; i--)
     {
-        if(system("pidof -s OcppBackend > /dev/null") != 0)
-        {
-            DEBUG_ERROR_MSG("OcppBackend not running, restart it.\r\n");
-            system("/root/OcppBackend &");
-        }
+        sum += t * getIndexOfSigns(*(source + i));
+        t *= 16;
     }
 
-    if(system("pidof -s Module_ProduceUtils > /dev/null") != 0)
-    {
-        DEBUG_ERROR_MSG("Module_ProduceUtils not running, restart it.\r\n");
-        system ("/root/Module_ProduceUtils &");
-    }
+    return sum;
 }
 
-//==========================================
-// Check Smart Charging Profile
-//==========================================
-int GetStartScheduleTime(unsigned char *time)
+int getIndexOfSigns(char ch)
 {
-    int result = -1;
-    struct tm tmScheduleStart;
-    struct timeb tbScheduleStart;
-
-    if((sscanf((char *)time, "%4d-%2d-%2dT%2d:%2d:%2d", &tmScheduleStart.tm_year, &tmScheduleStart.tm_mon, &tmScheduleStart.tm_mday, &tmScheduleStart.tm_hour, &tmScheduleStart.tm_min, &tmScheduleStart.tm_sec) == 6))
+    if(ch >= '0' && ch <= '9')
     {
-        tmScheduleStart.tm_year -= 1900;
-        tmScheduleStart.tm_mon -= 1;
-        tbScheduleStart.time = mktime(&tmScheduleStart);
-        tbScheduleStart.millitm = 0;
-
-        result = DiffTimebWithNow(tbScheduleStart) / 1000;
+        return ch - '0';
     }
-
-    return result;
-}
-
-void CheckSmartChargeProfile(byte _index)
-{
-    if (ShmOCPP16Data->CSUMsg.bits[_index].ChargingProfileConf == NO)
+    if(ch >= 'A' && ch <='F')
     {
-        if (ShmOCPP16Data->CSUMsg.bits[_index].ChargingProfileReq == NO)
-            ShmOCPP16Data->CSUMsg.bits[_index].ChargingProfileReq = YES;
+        return ch - 'A' + 10;
     }
-    else
+    if(ch >= 'a' && ch <= 'f')
     {
-        // Get Charging Profile
-        ShmOCPP16Data->CSUMsg.bits[_index].ChargingProfileConf = NO;
-        if (strcmp((char *)ShmOCPP16Data->SmartChargingProfile[_index].ChargingProfileKind, "Absolute") == EQUAL)
-        {
-            int _time = GetStartScheduleTime(ShmOCPP16Data->SmartChargingProfile[_index].ChargingSchedule.StartSchedule);
-            byte _startCount = NO_DEFINE;
-            byte _maxCount = ARRAY_SIZE(ShmOCPP16Data->SmartChargingProfile[_index].ChargingSchedule.ChargingSchedulePeriod);
-
-            for (byte _count = 0; _count < _maxCount; _count++)
-            {
-                // 預設最小輸出電流 (MIN_OUTPUT_CUR) A
-                if (_time >= ShmOCPP16Data->SmartChargingProfile[_index].ChargingSchedule.ChargingSchedulePeriod[_count].StartPeriod &&
-                    ShmOCPP16Data->SmartChargingProfile[_index].ChargingSchedule.ChargingSchedulePeriod[_count].Limit > MIN_OUTPUT_CUR)
-                {
-                    _startCount = _count;
-                }
-            }
-
-            PRINTF_FUNC("_startCount = %d \n", _startCount);
-            if (_startCount < _maxCount)
-            {
-                PRINTF_FUNC("*********Limit = %f \n", ShmOCPP16Data->SmartChargingProfile[_index].ChargingSchedule.ChargingSchedulePeriod[_startCount].Limit);
-                chargingInfo[_index]->ChargingProfileCurrent = ShmOCPP16Data->SmartChargingProfile[_index].ChargingSchedule.ChargingSchedulePeriod[_startCount].Limit * 10;
-                chargingInfo[_index]->ChargingProfilePower = ShmOCPP16Data->SmartChargingProfile[_index].ChargingSchedule.ChargingSchedulePeriod[_startCount].Limit * chargingInfo[_index]->EvBatterytargetVoltage / 100;
-            }
-            else
-            {
-                chargingInfo[_index]->ChargingProfilePower = -1;
-                chargingInfo[_index]->ChargingProfileCurrent = -1;
-            }
-
-            PRINTF_FUNC("ChargingProfilePower = %f \n", chargingInfo[_index]->ChargingProfilePower);
-            PRINTF_FUNC("ChargingProfileCurrent = %f \n", chargingInfo[_index]->ChargingProfileCurrent);
-        }
-//
-//      printf("-------------Schedule------------\n");
-//      printf("index = %d \n", _index);
-//      printf("StartSchedule = %s \n", ShmOCPP16Data->SmartChargingProfile[_index].ChargingSchedule.StartSchedule);
-//      printf("ChargingRateUnit = %s \n", ShmOCPP16Data->SmartChargingProfile[_index].ChargingSchedule.ChargingRateUnit);
-//      printf("----------SchedulePeriod---------\n");
-//      for (int v = 0; v < 10; v++)
-//      {
-//          printf("StartPeriod = %d \n", ShmOCPP16Data->SmartChargingProfile[_index].ChargingSchedule.ChargingSchedulePeriod[v].StartPeriod);
-//          printf("Limit = %f \n", ShmOCPP16Data->SmartChargingProfile[_index].ChargingSchedule.ChargingSchedulePeriod[v].Limit);
-//      }
-//      printf("---------------------------------\n");
+        return ch - 'a' + 10;
     }
+    return -1;
 }
 
-void CheckReturnToChargingConn()
-{
-    if ((ShmSysConfigAndInfo->SysConfig.TotalConnectorCount + ShmSysConfigAndInfo->SysConfig.AcConnectorCount) > 1 &&
-        ShmSysConfigAndInfo->SysInfo.PageIndex != _LCM_AUTHORIZING &&
-        ShmSysConfigAndInfo->SysInfo.PageIndex != _LCM_AUTHORIZ_FAIL &&
-        ShmSysConfigAndInfo->SysInfo.PageIndex != _LCM_AUTHORIZ_COMP &&
-        ShmSysConfigAndInfo->SysInfo.PageIndex != _LCM_WAIT_FOR_PLUG)
-    {
-        bool isReturnTimeout = false;
-        for (byte count = 0; count < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; count++)
-        {
-            if (count != ShmSysConfigAndInfo->SysInfo.CurGunSelected)
-            {
-                if ((chargingInfo[count]->SystemStatus >= S_REASSIGN_CHECK && chargingInfo[count]->SystemStatus <= S_COMPLETE) ||
-                    (chargingInfo[count]->SystemStatus >= S_CCS_PRECHARGE_ST0 && chargingInfo[count]->SystemStatus <= S_CCS_PRECHARGE_ST1))
-                {
-                    isReturnTimeout = true;
-                    StartSystemTimeoutDet(Timeout_ReturnToChargingGunDet);
-                }
-            }
-        }
-
-        // AC 槍
-        if (!isReturnTimeout && ShmSysConfigAndInfo->SysConfig.AcConnectorCount > 0)
-        {
-            // 沒有選中 AC,且 AC 在充電中
-            if (ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == NO_DEFINE &&
-                (ac_chargingInfo[0]->SystemStatus >= S_PREPARNING && ac_chargingInfo[0]->SystemStatus <= S_COMPLETE))
-            {
-                // 當前 DC 充電槍在 idle 狀態
-                if (chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus == S_IDLE ||
-                    chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus == S_RESERVATION)
-                {
-                    isReturnTimeout = true;
-                    StartSystemTimeoutDet(Timeout_ReturnToChargingGunDet);
-                }
-            }
-            else if (ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == DEFAULT_AC_INDEX &&
-                     ((chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus >= S_REASSIGN_CHECK && chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus <= S_COMPLETE) ||
-                      (chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus >= S_CCS_PRECHARGE_ST0 && chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus <= S_CCS_PRECHARGE_ST1)))
-            {
-                // 當前 DC 充電槍在 idle 狀態
-                if (ac_chargingInfo[0]->SystemStatus == S_IDLE ||
-                    ac_chargingInfo[0]->SystemStatus == S_RESERVATION)
-                {
-                    isReturnTimeout = true;
-                    StartSystemTimeoutDet(Timeout_ReturnToChargingGunDet);
-                }
-            }
-        }
-
-        if (!isReturnTimeout)
-            StopSystemTimeoutDet();
-    }
+
+void Initialization(){
+	char *moduleName = "DMYZ30100J01P0";
+	memcpy(&ShmSysConfigAndInfo->SysConfig.ModelName, moduleName, strlen(moduleName));
+	//printf("%s \n", ShmSysConfigAndInfo->SysConfig.ModelName);
+	ShmSysConfigAndInfo->SysInfo.CcsChargingData[CCS_QUANTITY].Index = CCS_QUANTITY;
+	ShmSysConfigAndInfo->SysInfo.CcsChargingData[CCS_QUANTITY].slotsIndex = 1;
+	chargingInfo[CCS_QUANTITY] = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[CCS_QUANTITY];
+	chargingInfo[CCS_QUANTITY]->SystemStatus = V_IDLE;
+	chargingInfo[CCS_QUANTITY]->Type = _Type_CCS;
+	chargingInfo[CCS_QUANTITY]->type_index = CCS_QUANTITY;
+	chargingInfo[CCS_QUANTITY]->Evboard_id = 0x01;
+	ShmSysConfigAndInfo->ate.ATEStatus = 0;
+	// 現階段預設為走 DIN70121
+	ShmCcsData->CommProtocol = 0x01;
+	//return PASS;
 }
 
-bool GetStartChargingByAlterMode(byte _gun)
-{
-    bool result = true;
 
-    if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount == 2 &&
-        ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == YES)
-    {
-        for (byte _select = 0; _select < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; _select++)
-        {
-            if (_select != _gun)
-            {
-                if (chargingInfo[_select]->SystemStatus != S_IDLE &&
-                    chargingInfo[_select]->SystemStatus != S_RESERVATION)
-                {
-                    result = false;
-                    break;
-                }
-            }
-        }
-    }
+bool CheckConnectorTypeStatus()
+{
+	bool result = true;
 
-    return result;
+	return result;
 }
 
-int main(void)
+void SpawnTask()
 {
-    if(CreateShareMemory() == 0)
-    {
-        #ifdef SystemLogMessage
-        DEBUG_ERROR_MSG("CreatShareMemory NG \n");
-        #endif
-        if(ShmStatusCodeData!=NULL)
-        {
-            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory = 1;
-        }
-        return 0;
-        sleep(5);
-        system("reboot -f");
-        sleep(5);
-        system("reboot -f");
-    }
 
-    PRINTF_FUNC("Chademo = %d, CCS = %d, GB = %d, AC = %d \n",
-                CHAdeMO_QUANTITY, CCS_QUANTITY, GB_QUANTITY, AC_QUANTITY);
-    PRINTF_FUNC("\n"); PRINTF_FUNC("Initial SystemConfig and Info.......\n");
-    if (!InitialSystemDefaultConfig())
-    {
-        DEBUG_ERROR_MSG("InitialSystemDefaultConfig NG \n");
-        StopProcessingLoop();
-    }
+	sleep(2);
+	system("/root/Module_InternalComm &");
+	system("/root/Module_EvComm &");
 
-    PRINTF_FUNC("CheckConnectorTypeStatus. \n");
-    CheckGunTypeFromHw();
-    PRINTF_FUNC("CheckIsAlternatvieByModelName. \n");
-    CheckIsAlternatvieByModelName();
-    PRINTF_FUNC("ModelName = %s\n", ShmSysConfigAndInfo->SysConfig.ModelName);
-    PRINTF_FUNC("InitialShareMemoryInfo \n");
-    InitialShareMemoryInfo();
-    PRINTF_FUNC("ChargerType (IEC or UL) = %d \n", ShmSysConfigAndInfo->SysInfo.ChargerType);
-    ChangeLcmByIndex(_LCM_INIT);
-    if (!CheckConnectorTypeStatus())
-        isModelNameMatch = false;
-
-    Initialization();
-    PRINTF_FUNC("Spawn all Task. \n");
-    SpawnTask();
-    if (!isModelNameMatch)
-    {
-        PRINTF_FUNC("Module Name & HW info none match. \n");
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ModelNameNoneMatchStestFail = YES;
-        ChangeLcmByIndex(_LCM_FIX);
-        // Module Name 與硬體對應不正確
-        DEBUG_ERROR_MSG("Module Name & HW info none match. \n");
-        sleep(3);
-        KillTask();
-        StopProcessingLoop();
-    }
-    PRINTF_FUNC("Module Name & HW info correct. Initialize.......\n");
-    CreateTimeoutFork();
-    PRINTF_FUNC("Self test. \n");
-    SelfTestRun();
-    StopSystemTimeoutDet();
-    PRINTF_FUNC("SelfTestSeq = %d, Work_Step = %d \n", ShmSysConfigAndInfo->SysInfo.SelfTestSeq, ShmPsuData->Work_Step);
-    if (ShmSysConfigAndInfo->SysInfo.SelfTestSeq == _STEST_FAIL ||
-        ShmPsuData->Work_Step == _NO_WORKING)
-    {
-        if (ShmSysConfigAndInfo->SysWarningInfo.Level != 2)
-            DisplaySelfTestFailReason();
-
-        for (byte gun_index = 0; gun_index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; gun_index++)
-        {
-            setChargerMode(gun_index, MODE_ALARM);
-        }
-        ChangeLcmByIndex(_LCM_FIX);
-        sleep(3);
-        KillTask();
-        StopProcessingLoop();
-    }
-    else
-    {
-        for (byte gun_index = 0; gun_index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; gun_index++)
-        {
-            setChargerMode(gun_index, MODE_IDLE);
-        }
-    }
+	//return PASS;
+}
 
-// Local DB
-    if(DB_Open(localDb) != PASS)
-    {
-        PRINTF_FUNC("DB_Open fail. \n");
-        isDb_ready = false;
-    }
-    else
-    {
-        isDb_ready = true;
-        for(int _index=0; _index< ShmSysConfigAndInfo->SysConfig.TotalConnectorCount;_index++)
-        {
-            chargingInfo[_index]->IsAvailable = DB_Get_Operactive(localDb, _index);
-        }
-    }
+void KillTask()
+{
+	system("killall Module_InternalComm");
+	system("killall Module_EvComm");
+}
+
+int main(void){
+	//Create all share memory
+	//printf("=====Initializing. \n");
+	//ate = malloc( sizeof(ate) );
+
+
+	if(CreatShareMemory()==0){
+		#ifdef SystemLogMessage
+		//DEBUG_ERROR("CreatShareMemory NG \n");
+		#endif
+		if(ShmStatusCodeData!=NULL)
+		{
+			//ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
+		}
+		return 0;
+		sleep(5);
+		system("reboot -f");
+	}
+	/*
+	int a=2;
+	int *b;
+	b = &a;
+	printf("%p\n", &a);
+	printf("%d\n", *b);
+	printf("%p\n", b);
+	printf("%p\n", &b);
+	*//*
+	int a = 2;
+	int b = 3;
+	a = a^b;
+	b = a^b;
+	a = a^b;
+	printf("%d %d", a, b);
+
+	const char *SystemId="0101";
+
+	printf("%c %p =====\n", *SystemId, &SystemId);
+
+	strcpy((char *)&ShmSysConfigAndInfo->SysConfig.SystemId,SystemId);
+
+	char *SystemIdStr = (char *)&ShmSysConfigAndInfo->SysConfig.SystemId;
+
+	printf("%s =====\n", SystemIdStr);*/
+
+	//SpawnTask();
+	//KillTask();
+	KillTask();
+	///CanFd = InitCanBus();
+	//CanFd2 = CHROMAInitCanBus();
+	Initialization();
+
+	SpawnTask();
+	//CANReceiver();
+	//CHROMACANReceiver();
+	//printf ("vccu 1===== CanFd2:%d. \n", CanFd2);
+	//setChargerMode(CCS_QUANTITY, V_IDLE);
+
+	/*
+	struct   timeb   tp;
+
+	unsigned int StartTime,StopTime;
+	//ftime(&tp);
+	ftime(&startChargingTime[CCS_QUANTITY]);
+	//
+	StartTime = (int)startChargingTime[CCS_QUANTITY].time;
+	printf("%u\n", StartTime);
+	sleep(2);
+	ftime(&tp);
+
+	ftime(&endChargingTime[CCS_QUANTITY]);
+	StopTime = (int)endChargingTime[CCS_QUANTITY].time;
+	printf("%u\n", StopTime);
+
+*/
+/*
+	gpio_set_direction(1, GPIO_DIR_INPUT);
+	gpio_set_direction(2, GPIO_DIR_INPUT);
+    gpio_set_direction(3, GPIO_DIR_INPUT);
+    gpio_write(1, 0);
+    gpio_write(3, 0);
+    gpio_write(3, 1);
+    gpio_write(3, 1);
+    */
+	/*
+	int pinIn[2] = { 1, 3 };
+
+	system("echo 1 > /sys/class/gpio/export");
+	system("echo \"out\" > /sys/class/gpio/gpio1/direction");
+	system("echo 1 > /sys/class/gpio/gpio1/value");
+	system("echo 3 > /sys/class/gpio/export");
+	system("echo \"out\" > /sys/class/gpio/gpio3/direction");
+	system("echo 1 > /sys/class/gpio/gpio3/value");
+
+	gpio_set_direction(1, GPIO_DIR_OUTPUT);
+    gpio_set_direction(4, GPIO_DIR_OUTPUT);
+	gpio_write(1, 0);
+	gpio_write(4, 0);
+
+	for (int i = 0; i < ARRAY_SIZE(pinIn); i++)
+	{
+
+	}*/
+	//Uart1Fd = Init407ComPort();
+
+    //printf("407 Port id = %d \n", Uart1Fd);
+    //int led = gpio_read(3);
+    //printf("led === %d \n", led);
+
+	//printf("%d %d %d %d %d %d \n", ShmSysConfigAndInfo->ate.targetCurrent_Value, ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.maximumCurrent_value, ShmSysConfigAndInfo->ate.maximumVoltage_value, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.contactorVoltage);
+/*
+	InitRS485DirectionIO();
+	// Open Uart5 for RB
+	Uart5Fd = InitComPort();
+	for (byte index = 0; index < ARRAY_SIZE(outputRelay.relay_event.relay_status); index++)
+	{
+		outputRelay.relay_event.relay_status[index] = 0x00;
+	}
+
+	memset(&regRelay, 0xFF,sizeof(Relay));
+	outputRelay.relay_event.bits.AC_Contactor = 0x00;
+	outputRelay.relay_event.bits.CCS_Precharge = 0x00;
+	outputRelay.relay_event.bits.Gun1_P = 0x00;
+	outputRelay.relay_event.bits.Gun1_N = 0x00;
+	outputRelay.relay_event.bits.Gun2_P = 0x00;
+	outputRelay.relay_event.bits.Gun2_N = 0x00;
+	//outputRelay.relay_event.bits.Gun1_Parallel_N = 0x00;
+	//outputRelay.relay_event.bits.Gun1_Parallel_P = 0x01;
+
+	sleep(1);
+	if(Uart5Fd < 0){
+		printf ("open port error. \n");
+		return 0;
+	}*/
+	//usleep(300000);
+
+
+	ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status=0x00;
+	ShmSysConfigAndInfo->ate.chademo.id0D_req.Soc = 50;
+	ShmSysConfigAndInfo->ate.ateMode = 0;
+	ShmSysConfigAndInfo->ate.ATEState = 1;//1:ccs 2:gb
+	/*
+	outputRelay.relay_event.bits.Gun1_Parallel_N = 0x00;
+	outputRelay.relay_event.bits.Gun1_Parallel_P = 0x00;
+
+
+	flash = YES;
+	SetOutputGpio(!flash);
+	return 0;
+	*/
+	/**/
+	//byte priorityLow = 1;
+/**/
+	//byte normalStop = 0x01;
+	//byte stopReason[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+
+	//byte evstaus[5] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
+	//PresentInputRequirement
+
+	/*
+	typedef enum
+	{
+		ESIdle = 0x01;
+		ESPreparing = 0x02;
+		ESCharging = 0x03;
+		ESChargingTerminating = 0x04;
+		ESFault = 0x05;
+	}EmulatorStatus;
+*/
+
+	//setStatusMode(CCS_QUANTITY, STOP);
+	//CCS
+	ShmSysConfigAndInfo->ate.targetCurrent_Value = targetCurrent_Value;
+	ShmSysConfigAndInfo->ate.targetVoltage_Value = targetVoltage_Value;
+	ShmSysConfigAndInfo->ate.maximumCurrent_value = maximumCurrent_value;
+	ShmSysConfigAndInfo->ate.maximumVoltage_value = maximumVoltage_value;
+	ShmSysConfigAndInfo->ate.linkVoltage = linkVoltage;
+	ShmSysConfigAndInfo->ate.contactorVoltage = contactorVoltage;//contactorVoltage;
+
+	//GB
+	//ShmSysConfigAndInfo->ate.PresentBattVoltage = 4700;
+	ShmSysConfigAndInfo->ate.PresentBattVoltage = 7400;
+	ShmSysConfigAndInfo->ate.MinimumChargeCurrent = 20;
+	//ShmSysConfigAndInfo->ate.RequireVoltage = 4800;
+	ShmSysConfigAndInfo->ate.RequireVoltage = 7450;
+	//ShmSysConfigAndInfo->ate.RequireVoltage = 4700;
+	ShmSysConfigAndInfo->ate.RequireCurrent = 600;
+	ShmSysConfigAndInfo->ate.chademoTargetVoltage_Value = 4800;
+	ShmSysConfigAndInfo->ate.chademoTargetCurrent_Value = 30;
+	//ShmSysConfigAndInfo->ate.targetCurrent_Value = 1200;
+	ShmSysConfigAndInfo->ate.Permission = STOP;
+	ShmSysConfigAndInfo->ate.TotalBatteryCap = 1000;          //0.1
+	ShmSysConfigAndInfo->ate.MaxBatteryCurrent = 1200;        //0.1
+	ShmSysConfigAndInfo->ate.MaxBatteryVoltage = 7500;        //0.1
+	ShmSysConfigAndInfo->ate.status = 0;
+	ShmSysConfigAndInfo->ate.chademo.id03.state = 0;
+	ShmSysConfigAndInfo->ate.ATEStatus = 0x00;
+	ShmSysConfigAndInfo->ate.cstatus = 0;
+	ShmSysConfigAndInfo->ate.chademo.PresentChargedDuration = 0;
+	ShmSysConfigAndInfo->ate.chademo.RemainChargingDuration = 0;
+	setStatusMode(CCS_QUANTITY, STOP);
+	if(ShmSysConfigAndInfo->ate.ATEState  == 1){
+
+	}else if(ShmSysConfigAndInfo->ate.ATEState  == 2){
+
+	}
+	setATEMode(CCS_QUANTITY, ShmSysConfigAndInfo->ate.ATEState);
+
+	ftime(&startChargingTime[CCS_QUANTITY]);
+	chargingInfo[CCS_QUANTITY]->RemainChargingDuration = 0;
+	StopGunInfoTimeoutDet(CCS_QUANTITY);
+	StartGunInfoTimeoutDet(CCS_QUANTITY, Timeout_Preparing);
+	//
+	printf("version = ....................\n"  );
+	while(true){
+		//ShmSysConfigAndInfo->ate.ATEState
+		if(ShmSysConfigAndInfo->ate.ATEState  == 1){//VCCU
+			//TODO
+			//ShmSysConfigAndInfo->ate.ateMode = 0;
+		}else if(ShmSysConfigAndInfo->ate.ATEState  == 2){//GB
+			//TODO
+			//ShmSysConfigAndInfo->ate.ateMode = 0;
+		}else{//none
+			// init
+		}
+		int state = isATEChange(CCS_QUANTITY);
+		if(state){
+//TODO
+		}
+
+		if(ShmSysConfigAndInfo->ate.ATEState  == 1){//VCCU
+			/*
+			ftime(&endChargingTime[CCS_QUANTITY]);
+
+			chargingInfo[CCS_QUANTITY]->RemainChargingDuration = DiffTimeb(startChargingTime[CCS_QUANTITY], endChargingTime[CCS_QUANTITY]);
+			//GetTimeoutValue(chargingInfo[CCS_QUANTITY]->TimeoutTimer);
+
+			printf("%d %d ....................\n",chargingInfo[CCS_QUANTITY]->RemainChargingDuration, chargingInfo[CCS_QUANTITY]->TimeoutFlag);
+			if (GetTimeoutValue(chargingInfo[CCS_QUANTITY]->TimeoutTimer) >= 7000000)
+			{
+				ftime(&startChargingTime[CCS_QUANTITY]);
+				chargingInfo[CCS_QUANTITY]->RemainChargingDuration = 0;
+				StopGunInfoTimeoutDet(CCS_QUANTITY);
+				StartGunInfoTimeoutDet(CCS_QUANTITY, Timeout_Preparing);
+			}
+			*/
+
+			//setBootNotification1();
+
+			// 輸出電壓
+			//測試value
+			//GetPersentOutputVol();
+			// 三相輸入電壓
+			//GetPresentInputVol();
+			statusCheck();
+			int status = isModeChange(CCS_QUANTITY);
+
+			/*
+			 * VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+														3, 0,
+														3, 3, TRUE,
+														3, 3, 3,
+														3, 3, 0,
+														3, 0, 3,
+														3);
+			VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+			VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+			VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+			VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+			*/
+/*
+			VCCU_Requests(0, 0, 0,
+						3, 3, 3, 3,
+						3, 3, 7,
+						0,
+						7, 3, 3);*/
+			switch(chargingInfo[CCS_QUANTITY]->SystemStatus){
+				case V_IDLE:{
+					if (status){
+						printf("CCS IDLE Processing 1....................\n");
+					}
+					//setEVStatus1(evstaus[0]);
+					break;
+				}
+				case V_UNMATEDPLUG:{
+					if (status){
+						printf("CCS UNMATEDPLUG Processing 2....................\n");
+					}
+					//setEVStatus1(evstaus[0]);
+					//VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Not_allowed, Not_allowed, Opened);
+
+					break;
+				}
+				case V_MATED_PLUG_INLET_UNLOCKED:{
+					if (status){
+						if(ShmSysConfigAndInfo->ate.vccu.inletStatus.DATA2.VCCU_PlugPresent_Status == VCCU_InletStatus_Connected){
+
+						}
+						printf("CCS MATED_PLUG_INLET_UNLOCKED Processing 3....................\n");
+					}
+					//setEVStatus1(evstaus[0]);
+					//VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+					//VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+					break;
+				}
+				case V_INLETLOCKING:{
+					if (status){
+						printf("CCS INLETLOCKING Processing 4....................\n");
+					}
+					//setEVStatus1(evstaus[0]);
+					break;
+				}
+				case V_INLETLOCKED:{
+					if (status){
+						printf("CCS INLETLOCKED Processing 5....................\n");
+					}
+					/*
+					setEVStatus1(evstaus[1]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+							3, 0,
+							3, 3, TRUE,
+							3, 3, 3,
+							3, 3, 0,
+							3, 0, 3,
+							3);
+							*/
+					/*
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					*/
+					break;
+				}
+				case V_SLAC:{
+					if (status){
+						printf("CCS SLAC Processing 6....................\n");
+					}
+					//setEVStatus1(evstaus[1]);
+					//VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+					/*
+					 VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					 VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					 */
+					/*
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+										3, 0,
+										3, 3, TRUE,
+										3, 3, 3,
+										3, 3, 0,
+										3, 0, 3,
+										3);
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+					*/
+					break;
+				}
+				case V_DEFINITION:{
+					if (status){
+						printf("CCS DEFINITION Processing 7....................\n");
+					}
+					//setEVStatus1(evstaus[1]);
+					/*
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0, 3, 0,
+											3, 3, TRUE, 3, 3, 3, 3, 3, 0, 3, 0, 3, 3);
+					*/
+					/*
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, 500, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, 10);
+
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					*/
+					/*
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+										3, 0,
+										3, 3, TRUE,
+										3, 3, 3,
+										3, 3, 0,
+										3, 0, 3,
+										3);
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+					*/
+					break;
+				}
+				case V_CABLECHECK:{
+					if (status){
+						printf("CCS CABLECHECK Processing 8 ....................\n");
+					}
+					/*
+					setEVStatus1(evstaus[1]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Allowed, Active, Allowed, Not_allowed, Opened);
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+															3, 0,
+															3, 3, TRUE,
+															3, 3, 3,
+															3, 3, 0,
+															3, 0, 3,
+															3);
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+*/
+					break;
+				}
+				case V_ISOLATION:{
+					if (status){
+						printf("CCS ISOLATION Processing 9 %d ....................\n", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va );
+						ftime(&startChargingTime[CCS_QUANTITY]);
+					}
+					/*
+					setEVStatus1(evstaus[1]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Allowed, Not_Active, Allowed, Not_allowed, Opened);
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+							3, 0,
+							3, 3, TRUE,
+							3, 3, 3,
+							3, 3, 0,
+							3, 0, 3,
+							3);
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+					*/
+					break;
+				}
+				case V_VOLTAGEDIFFERENCE:{
+					if (status){
+						printf("CCS VOLTAGEDIFFERENCE Processing 10 ....................\n");
+
+						ftime(&startChargingTime[CCS_QUANTITY]);
+						chargingInfo[CCS_QUANTITY]->RemainChargingDuration = 0;
+						StopGunInfoTimeoutDet(CCS_QUANTITY);
+						StartGunInfoTimeoutDet(CCS_QUANTITY, Timeout_Preparing);
+
+					}
+
+					ftime(&endChargingTime[CCS_QUANTITY]);
+
+					chargingInfo[CCS_QUANTITY]->RemainChargingDuration = DiffTimeb(startChargingTime[CCS_QUANTITY], endChargingTime[CCS_QUANTITY]);
+					//GetTimeoutValue(chargingInfo[CCS_QUANTITY]->TimeoutTimer);
+
+					//printf("%d %ld ....................\n",chargingInfo[CCS_QUANTITY]->RemainChargingDuration, val);
+					if (GetTimeoutValue(chargingInfo[CCS_QUANTITY]->TimeoutTimer) >= 7000000)
+					{
+						ftime(&startChargingTime[CCS_QUANTITY]);
+						chargingInfo[CCS_QUANTITY]->RemainChargingDuration = 0;
+						StopGunInfoTimeoutDet(CCS_QUANTITY);
+						StartGunInfoTimeoutDet(CCS_QUANTITY, Timeout_Preparing);
+					}
+
+					/*printf("VCCU_V2G_StateM_StateMachineSt = %d VCCU_ChargeUnit_State = %d VCCU_Vehicle_IsolationMea_0000 = %d  VCCU_Vehicle_ContactorRequest = %d....................\n", ShmSysConfigAndInfo->ate.vccu.v2g_StateM.VCCU_V2G_StateM_StateMachineSt,
+					ShmSysConfigAndInfo->ate.vccu.controlPilotStatus.DATA.bits.VCCU_ChargeUnit_State,
+					ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_IsolationMea_0000,
+					ShmSysConfigAndInfo->ate.vccu.chargeToVehicle.bits.VCCU_Vehicle_ContactorRequest);
+					*/
+					/*
+					setEVStatus1(evstaus[1]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Allowed, Not_Active, Allowed, Not_allowed, Closed);
+					//VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+							3, 0,
+							3, 3, TRUE,
+							3, 3, 3,
+							3, 3, 0,
+							3, 0, 3,
+							3);
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+					*/
+					break;
+				}
+				case V_CONTACTORSCLOSED:{
+					if (status){
+						printf("CCS CONTACTORSCLOSED Processing 11  %d %d....................\n",ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, ShmSysConfigAndInfo->ate.linkVoltage  );
+					}
+					/*
+					setEVStatus1(evstaus[1]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Allowed, Not_Active, Allowed, Not_allowed, Closed);
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+							3, 0,
+							3, 3, TRUE,
+							3, 3, 3,
+							3, 3, 0,
+							3, 0, 3,
+							3);
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+					*/
+					break;
+				}
+				case V_POWERDELIVERY:{
+					if (status){
+						printf("CCS POWERDELIVERY Processing 12 %d  %d....................\n", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va, ShmSysConfigAndInfo->ate.linkVoltage );
+					}
+					//VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Allowed, Not_Active, Allowed, Not_allowed, Closed);
+					/*
+					if(ShmSysConfigAndInfo->ate.ATEStatus == 0){
+						VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Allowed, Not_Active, Allowed, Not_allowed, Closed);
+					}else{
+						VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Not_allowed, Not_Active, Allowed, Not_allowed, Opened);
+					}
+					//VCCU_V2G_EVTargetVoltage(400, U_V, TRUE, 0);
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+							3, 0,
+							3, 3, TRUE,
+							3, 3, 3,
+							3, 3, 0,
+							3, 0, 3,
+							3);
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+
+					setEVStatus1(evstaus[1]);
+					*/
+					break;
+				}
+				case V_CURRENTDEMAND:{
+					if (status){
+						printf("CCS CURRENTDEMAND Processing 13 %d....................\n", ShmSysConfigAndInfo->ate.vccu.v2g_EVSEPresentVoltage.VCCU_V2G_EVSEPresentVoltage_Va );
+						printf("maximumVoltage_value = %d  Voltage = %d  maximumCurrent_value = %d  Current = %d....................\n", ShmSysConfigAndInfo->ate.maximumVoltage_value, ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.maximumCurrent_value, ShmSysConfigAndInfo->ate.targetCurrent_Value);
+					}
+					//setEVStatus1(evstaus[2]);
+
+					//printf("targetVoltage_Value= %d targetCurrent_Value =%d maximumVoltage_value = %d maximumCurrent_value = %d linkVoltage = %d \n",ShmSysConfigAndInfo->ate.targetVoltage_Value, ShmSysConfigAndInfo->ate.targetCurrent_Value, ShmSysConfigAndInfo->ate.maximumVoltage_value, ShmSysConfigAndInfo->ate.maximumCurrent_value, ShmSysConfigAndInfo->ate.linkVoltage);
+
+					/*
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, 500, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, 10);
+					VCCU_V2G_EVTargetVoltage(400, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, 2, TRUE, 0);
+					VCCU_ChargeFromVehicle(CanFd, 500, 500, Allowed, Not_Active, Allowed, Not_allowed, Closed);
+					*/
+					/*
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+					*/
+					//VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Allowed, Not_Active, Allowed, Not_allowed, Closed);
+					/*
+					if(ShmSysConfigAndInfo->ate.ATEStatus == 0){
+						//VCCU_ChargeFromVehicle(CanFd, 500, 500, Allowed, Not_Active, Allowed, Not_allowed, Closed);
+						VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Allowed, Not_Active, Allowed, Not_allowed, Closed);
+					}else{
+						//VCCU_ChargeFromVehicle(CanFd, 500, 500, Not_allowed, Not_Active, Allowed, Not_allowed, Closed);
+						VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Not_allowed, Not_Active, Allowed, Not_allowed, Closed);
+					}
+					VCCU_V2G_VehicleStatus(CanFd, VCCU_V2G_StateM_EnergyTra_0000_DC_DC_extended, 0,
+							3, 0,
+							3, 3, TRUE,
+							3, 3, 3,
+							3, 3, 0,
+							3, 0, 3,
+							3);
+					VCCU_V2G_EVMaximumVoltageLimit(TRUE, U_V, ShmSysConfigAndInfo->ate.maximumVoltage_value, TRUE, 0);
+					VCCU_V2G_EVMaximumCurrentLimit(TRUE, U_A, TRUE, 0, ShmSysConfigAndInfo->ate.maximumCurrent_value);
+					VCCU_V2G_EVTargetVoltage(ShmSysConfigAndInfo->ate.targetVoltage_Value, U_V, TRUE, 0);
+					VCCU_V2G_EVTargetCurrent(U_A, ShmSysConfigAndInfo->ate.targetCurrent_Value, TRUE, 0);
+					*/
+					break;
+				}
+				case V_POWERDELIVERYFALSE:{
+					if (status){
+						printf("CCS POWERDELIVERYFALSE Processing 14....................\n");
+					}
+					/*
+					setEVStatus1(evstaus[3]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, ShmSysConfigAndInfo->ate.linkVoltage, Not_allowed, Not_Active, Allowed, Not_allowed, Opened);
+					*/
+					break;
+				}
+				case V_DETECTION:{
+					if (status){
+						printf("CCS DETECTION Processing 15....................\n");
+					}
+					/*
+					setEVStatus1(evstaus[3]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+					*/
+					break;
+				}
+				case V_SESSION_STOP:{
+					if (status){
+						printf("CCS SESSION_STOP Processing 16....................\n");
+					}
+					/*
+					setEVStatus1(evstaus[3]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+					*/
+					break;
+				}
+				case V_STOP_COMMUNICATION_SESSION:{
+					if (status){
+						printf("CCS STOP_COMMUNICATION_SESSION Processing 17....................\n");
+					}
+					/*
+					setEVStatus1(evstaus[3]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+					*/
+					break;
+				}
+				case V_FINISHED:{
+					if (status){
+						printf("CCS FINISHED Processing 18....................\n");
+					}
+					/*
+					setEVStatus1(evstaus[3]);
+					VCCU_ChargeFromVehicle(CanFd, ShmSysConfigAndInfo->ate.linkVoltage, 0, Not_allowed, Active, Allowed, Not_allowed, Opened);
+					*/
+					break;
+				}
+				default:{
+					break;
+				}
+			}
+			//usleep(100000);
+			usleep(whileLoopTime);
+		}else if(ShmSysConfigAndInfo->ate.ATEState  == 2){//GB
+			if(ShmSysConfigAndInfo->ate.status == 0){
+
+
+			}else{
+
+			}
+			/*
+			printf("ProximitySignal = %d, state =  %d Permission = %d TotalBatteryCap = %d MaxBatteryCurrent = %d MaxBatteryVoltage = %d ATEStatus = %d....................\n", ShmSysConfigAndInfo->ate.chademo.id03.state ,ShmSysConfigAndInfo->ate.Permission,
+					ShmSysConfigAndInfo->ate.chademo.id03.ProximitySignal, ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent,
+					ShmSysConfigAndInfo->ate.MaxBatteryVoltage, ShmSysConfigAndInfo->ate.ATEStatus);
+			*/
+
+			printf("state =  %d Permission = %d TotalBatteryCap = %d MaxBatteryCurrent = %d MaxBatteryVoltage = %d ATEStatus = %d K1K2Status = %d PresentBattVoltage = %d RequireVoltage = %d....................\n", ShmSysConfigAndInfo->ate.chademo.id03.state ,ShmSysConfigAndInfo->ate.Permission,
+					ShmSysConfigAndInfo->ate.TotalBatteryCap, ShmSysConfigAndInfo->ate.MaxBatteryCurrent,
+					ShmSysConfigAndInfo->ate.MaxBatteryVoltage, ShmSysConfigAndInfo->ate.ATEStatus,
+					ShmSysConfigAndInfo->ate.chademo.id0D_req.K1K2Status, ShmSysConfigAndInfo->ate.PresentBattVoltage, ShmSysConfigAndInfo->ate.RequireVoltage);
+
+			usleep(whileLoopTime);
+			//usleep(whileLoopTime);
+
+		}
+
+	}
+	printf("End. \n");
+	return FAIL;
+}
 
-    ChangeLcmByIndex(_LCM_IDLE);
-    sleep(1);
-    //***** 須新增的偵測 *****//
-    // 1. Thernal - 控制風扇轉速
-    // 2. ouput fuse - 控制風扇轉速
-    CreateRfidFork();
-    // Create Watchdog
-    //CreateWatchdog();
-    // Main loop
-    PRINTF_FUNC("****************************Main Loop********************************** \n");
-    gettimeofday(&_cmdMainPriority_time, NULL);
-    for (;;)
-    {
-        CheckOcppStatus();
-        ChkPrimaryStatus();
-        if ((IsConnectorWholeIdle() || ShmSysConfigAndInfo->SysInfo.PageIndex == _LCM_FIX) &&
-            ShmSysConfigAndInfo->SysInfo.SystemTimeoutFlag != Timeout_ReturnToChargingGunDet)
-        {
-            CheckFactoryConfigFunction();
-
-            CheckFwUpdateFunction();
-        }
-
-        // OCPP 邏輯
-        OcppRemoteStartChk();
-        // 讀卡邏輯
-        ScannerCardProcess();
-        // 當 AC 沒有搭上時,清除一些錯誤碼
-        ClearAlarmCodeWhenAcOff();
-        // 確認是否要回到充電中的槍畫面邏輯判斷
-        CheckReturnToChargingConn();
-
-        if (_acgunIndex > 0 && isDetectPlugin() && !isCardScan)
-        {
-            ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_WAIT_FOR_PLUG;
-        }
-
-        if ((GetTimeoutValue(_cmdMainPriority_time) / 1000) > 5000)
-        {
-            CheckTask();
-            for (byte _index = 0; _index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; _index++)
-            {
-                if (chargingInfo[_index]->SystemStatus == S_CHARGING)
-                    CheckSmartChargeProfile(_index);
-            }
-
-            gettimeofday(&_cmdMainPriority_time, NULL);
-        }
-
-        for (byte gun_index = 0; gun_index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; gun_index++)
-        {
-            CheckGpioInStatus();
-            CheckErrorOccurStatus(gun_index);
-            ChkOcppStatus(gun_index);
-
-            //PRINTF_FUNC("index = %d, ErrorCode = %s \n", gun_index, ShmOCPP16Data->StatusNotification[gun_index].ErrorCode);
-            switch(chargingInfo[gun_index]->SystemStatus)
-            {
-                case S_IDLE:
-                case S_RESERVATION:
-                case S_MAINTAIN:
-                {
-                    if (chargingInfo[gun_index]->SystemStatus == S_IDLE &&
-                        isModeChange(gun_index))
-                    {
-                        PRINTF_FUNC("S_IDLE================================== %x \n", gun_index);
-                        chargingInfo[gun_index]->PresentChargedDuration = 0;
-                        chargingInfo[gun_index]->RemainChargingDuration = 0;
-                        strcpy((char *)chargingInfo[gun_index]->StartDateTime, "");
-                        strcpy((char *)chargingInfo[gun_index]->StopDateTime, "");
-                        strcpy((char *)chargingInfo[gun_index]->StartUserId, "");
-                        strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "");
-                    }
-                    else if (chargingInfo[gun_index]->SystemStatus == S_RESERVATION &&
-                             isModeChange(gun_index))
-                    {
-                        PRINTF_FUNC("S_RESERVATION....................%x \n", gun_index);
-                        ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowConf = YES;
-                    }
-
-                    if (chargingInfo[gun_index]->IsAvailable == NO)
-                    {
-                        setChargerMode(gun_index, MODE_MAINTAIN);
-                    }
-
-                    if (ShmSysConfigAndInfo->SysWarningInfo.Level == 2)
-                    {
-                        if (gun_index == ShmSysConfigAndInfo->SysInfo.CurGunSelected)
-                        {
-                            ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_FIX;
-                        }
-                        ClearDetectPluginFlag();
-                    }
-                    else if (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == _OFFLINE_POLICY_NO_CHARGING)
-                    {/*                             不給充電                            */}
-                    else
-                    {
-                        if (ShmSysConfigAndInfo->SysInfo.SystemPage == _LCM_FIX)
-                        {
-                            ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_NONE;
-                        }
-
-                        if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_AVER)
-                        {
-                            if (ShmSysConfigAndInfo->SysInfo.AcContactorStatus == YES)
-                            {
-                                // 均充 -> 最大充
-                                if (ShmSysConfigAndInfo->SysInfo.BridgeRelayStatus == NO)
-                                {
-                                    if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_NONE)
-                                    {
-                                        PRINTF_FUNC("=============Smart Charging============= Step 11 \n");
-                                        ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_PREPARE_A_TO_M;
-                                    }
-                                }
-                                else if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag != _REASSIGNED_COMP &&
-                                         ShmSysConfigAndInfo->SysInfo.ReAssignedFlag != _REASSIGNED_WAITING)
-                                {
-                                    PRINTF_FUNC("=============Smart Charging============= Step 14 \n");
-                                    ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_WAITING;
-                                }
-                                else if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_COMP)
-                                {
-                                    ShmSysConfigAndInfo->SysInfo.MainChargingMode = _MAIN_CHARGING_MODE_MAX;
-                                    ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_NONE;
-                                }
-                            }
-                            else
-                            {
-                                ShmSysConfigAndInfo->SysInfo.MainChargingMode = _MAIN_CHARGING_MODE_MAX;
-                                ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_NONE;
-                            }
-                        }
-                        else
-                            ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_NONE;
-
-                        { // Idle 正常程序起點
-                            // 判斷是否有啟用檢查插槍
-                            if(isDetectPlugin())
-                            {
-                                // 卡號驗證成功後,等待充電槍插入充電車
-                                if ((ShmSysConfigAndInfo->SysInfo.OrderCharging != FAIL &&
-                                    ShmSysConfigAndInfo->SysInfo.OrderCharging < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount))
-                                {
-                                    if (chargingInfo[(unsigned char)ShmSysConfigAndInfo->SysInfo.OrderCharging]->ConnectorPlugIn == YES &&
-                                        chargingInfo[gun_index]->IsAvailable)
-                                    {
-                                        PRINTF_FUNC("-----------------1----------------- %d \n", ShmSysConfigAndInfo->SysInfo.OrderCharging);
-                                        ChangeGunSelectByIndex(ShmSysConfigAndInfo->SysInfo.OrderCharging);
-                                        AddPlugInTimes(ShmSysConfigAndInfo->SysInfo.OrderCharging);
-                                        setChargerMode(ShmSysConfigAndInfo->SysInfo.OrderCharging, MODE_REASSIGN_CHECK);
-                                        strcpy((char *)chargingInfo[(unsigned char)ShmSysConfigAndInfo->SysInfo.OrderCharging]->StartUserId, "");
-                                        ClearDetectPluginFlag();
-                                        continue;
-                                    }
-                                }
-                                else
-                                {
-                                    if (chargingInfo[gun_index]->ConnectorPlugIn == YES && chargingInfo[gun_index]->IsAvailable &&
-                                        chargingInfo[gun_index]->SystemStatus == S_IDLE)
-                                    {
-                                        PRINTF_FUNC("-----------------2----------------- \n");
-                                        ChangeGunSelectByIndex(gun_index);
-                                        AddPlugInTimes(gun_index);
-                                        strcpy((char *)chargingInfo[gun_index]->StartUserId, (char *)ShmSysConfigAndInfo->SysConfig.UserId);
-                                        PRINTF_FUNC("index = %d, CardNumber = %s \n", gun_index, chargingInfo[gun_index]->StartUserId);
-                                        strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
-                                        // 當前操作的槍號,進入 Preparing
-                                        setChargerMode(gun_index, MODE_REASSIGN_CHECK);
-                                        ClearDetectPluginFlag();
-                                        continue;
-                                    }
-                                }
-
-                                if (!isCardScan)
-                                {
-                                    // LCM => Waiting for plugging
-                                    ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_WAIT_FOR_PLUG;
-                                }
-                            }
-                            else if (chargingInfo[gun_index]->SystemStatus == S_RESERVATION)
-                            {
-                                if (!isReservationExpired(gun_index))
-                                {
-                                    chargingInfo[gun_index]->SystemStatus = S_IDLE;
-                                }
-                            }
-                            else if (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_DISABLE &&
-                                     (chargingInfo[gun_index]->ConnectorPlugIn == YES && chargingInfo[gun_index]->IsAvailable))
-                            {
-                                PRINTF_FUNC("-----------------3----------------- \n");
-                                bool isCanStartChargingFlag = GetStartChargingByAlterMode(gun_index);
-
-                                if (isCanStartChargingFlag)
-                                {
-                                    ChangeGunSelectByIndex(gun_index);
-                                    AddPlugInTimes(gun_index);
-                                    setChargerMode(gun_index, MODE_REASSIGN_CHECK);
-                                    ClearDetectPluginFlag();
-                                    continue;
-                                }
-                            }
-                            else
-                            {
-                                if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == gun_index)
-                                    ShmSysConfigAndInfo->SysInfo.ConnectorPage = _LCM_IDLE;
-                            }
-                        } // Idle 正常程序終點
-                    }
-
-                    ReleaseAlarmCode(gun_index);
-                }
-                    break;
-                case S_REASSIGN_CHECK:
-                {
-                    if (isModeChange(gun_index))
-                    {
-                        PRINTF_FUNC("S_REASSIGN_CHECK================================== %x \n", gun_index);
-                        ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_NONE;
-                        if (ShmSysConfigAndInfo->SysInfo.OrderCharging != FAIL)
-                            ShmSysConfigAndInfo->SysInfo.OrderCharging = FAIL;
-                        StopSystemTimeoutDet();
-                    }
-
-                    bool isRessign = false;
-                    if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount > 1 && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
-                    {
-                        if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_MAX)
-                        {
-                            for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++)
-                            {
-                                // 有其他槍已經分配好 psu 模塊
-                                if (ShmSysConfigAndInfo->SysInfo.CurGunSelected != index &&
-                                    chargingInfo[index]->SystemStatus >= S_PREPARNING)
-                                {
-                                    PRINTF_FUNC("=============Smart Charging============= Step 1 \n");
-                                    ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_PREPARE_M_TO_A;
-                                    isRessign = true;
-                                    break;
-                                }
-                            }
-                        }
-                        else if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_AVER &&
-                                 ShmSysConfigAndInfo->SysInfo.ReAssignedFlag != _REASSIGNED_NONE)
-                        {
-                            // 如果在切換最大充的過程中,需等待最大充切換完成後,在走均充流程
-                            if (ShmSysConfigAndInfo->SysInfo.BridgeRelayStatus == YES)
-                            {
-                                if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag != _REASSIGNED_COMP &&
-                                    ShmSysConfigAndInfo->SysInfo.ReAssignedFlag != _REASSIGNED_WAITING)
-                                {
-                                    PRINTF_FUNC("=============Smart Charging============= Step 14 \n");
-                                    ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_WAITING;
-                                }
-                                else if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_COMP)
-                                {
-                                    ShmSysConfigAndInfo->SysInfo.MainChargingMode = _MAIN_CHARGING_MODE_MAX;
-                                    ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_NONE;
-                                }
-                            }
-
-                            if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == gun_index)
-                                ShmSysConfigAndInfo->SysInfo.ConnectorPage = _LCM_PRE_CHARGE;
-                            continue;
-                        }
-                    }
-
-                    if (isRessign)
-                        setChargerMode(gun_index, MODE_REASSIGN);
-                    else
-                        setChargerMode(gun_index, MODE_PRECHARGE);
-
-                    if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == gun_index)
-                        ShmSysConfigAndInfo->SysInfo.ConnectorPage = _LCM_PRE_CHARGE;
-                }
-                    break;
-                case S_REASSIGN:
-                {
-                    if (isModeChange(gun_index))
-                    {
-                        PRINTF_FUNC("S_REASSIGN================================== %x \n", gun_index);
-                    }
-
-                    // 重新分配,此階段主要是讓已經在充電或者準備進入充電前的緩衝
-                    // 此狀態下~ 控制權在於 PSU 及 EV小板 Process
-                    if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_NONE ||
-                        ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_AVER)
-                    {
-                        if (ShmSysConfigAndInfo->SysInfo.CanAverageCharging)
-                            setChargerMode(gun_index, MODE_PRECHARGE);
-                        else
-                            setChargerMode(gun_index, MODE_IDLE);
-                    }
-                    else if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag == _REASSIGNED_RELAY_M_TO_A &&
-                             ShmSysConfigAndInfo->SysInfo.BridgeRelayStatus == NO)
-                    {
-                        PRINTF_FUNC("=============Smart Charging : _REASSIGNED_COMP============= Step 6 \n");
-                        ShmSysConfigAndInfo->SysInfo.MainChargingMode = _MAIN_CHARGING_MODE_AVER;
-                        ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_NONE;
-                    }
-
-                    //PRINTF_FUNC("CurGunSelected = %d, gun_index = %d \n", ShmSysConfigAndInfo->SysInfo.CurGunSelected, gun_index);
-                    if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == gun_index)
-                        ShmSysConfigAndInfo->SysInfo.ConnectorPage = _LCM_PRE_CHARGE;
-                }
-                    break;
-                case S_PREPARNING:
-                {
-                    if (isModeChange(gun_index))
-                    {
-                        PRINTF_FUNC("S_PREPARNING================================== %x \n", gun_index);
-                        StopGunInfoTimeoutDet(gun_index);
-                        StartGunInfoTimeoutDet(gun_index, Timeout_Preparing);
-                    }
-
-                    if (ShmPsuData->SystemPresentPsuQuantity > 0 && ShmPsuData->SystemAvailablePower > 10 &&
-                        GetTimeoutValue(chargingInfo[gun_index]->TimeoutTimer) >= 5000000)
-                    {
-                        setChargerMode(gun_index, MODE_PREPARE_FOR_EV);
-                    }
-
-                    if (isEvBoardStopChargeFlag(gun_index) == YES || OcppRemoteStop(gun_index) == YES)
-                    {
-                        // 板端或後臺要求停止
-                        ChargingTerminalProcess(gun_index);
-                    }
-
-                    if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == gun_index)
-                        ShmSysConfigAndInfo->SysInfo.ConnectorPage = _LCM_PRE_CHARGE;
-                }
-                    break;
-                case S_PREPARING_FOR_EV: // 等待車端的通訊 (EV 小板),待車端回報後,開始樁端的測試
-                {
-                    if (isModeChange(gun_index))
-                    {
-                        PRINTF_FUNC("S_PREPARING_FOR_EV================================== %x \n", gun_index);
-                        strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
-                        StopGunInfoTimeoutDet(gun_index);
-                        StartGunInfoTimeoutDet(gun_index, Timeout_EvChargingDet);
-                    }
-
-                    if (chargingInfo[gun_index]->Type == _Type_Chademo)
-                    {
-                        // 檢查車端的槍鎖是否為鎖上
-                        if (isEvGunLocked_chademo(gun_index) == YES)
-                        {
-                            setChargerMode(gun_index, MODE_PREPARE_FOR_EVSE);
-                        }
-                    }
-                    else if (chargingInfo[gun_index]->Type == _Type_GB)
-                    {
-                        // 檢查車端的 charging enable 是否為 1
-                        if (isEvGunLocked_gb(gun_index) == YES)
-                        {
-                            setChargerMode(gun_index, MODE_PREPARE_FOR_EVSE);
-                        }
-                    }
-                    else if (chargingInfo[gun_index]->Type == _Type_CCS_2)
-                    {
-                        // 檢查車端的 charging enable 是否為 1
-                        if (isEvGunLocked_ccs(gun_index) == YES)
-                        {
-                            setChargerMode(gun_index, MODE_PREPARE_FOR_EVSE);
-                        }
-                    }
-
-                    if (isEvBoardStopChargeFlag(gun_index) == YES  ||
-                        OcppRemoteStop(gun_index) == YES)
-                    {
-                        // 板端或後臺要求停止
-                        ChargingTerminalProcess(gun_index);
-                    }
-
-                    // LCM => Pre-charging
-                    if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == gun_index)
-                        ShmSysConfigAndInfo->SysInfo.ConnectorPage = _LCM_PRE_CHARGE;
-                }
-                    break;
-                case S_PREPARING_FOR_EVSE: // 等待 RB 通訊及測試,並將狀態回報, CSU 確認 Pass 後,開始進入充電
-                {
-                    if (isModeChange(gun_index))
-                    {
-                        PRINTF_FUNC("S_PREPARING_FOR_EVSE================================== %x \n", gun_index);
-                        StopGunInfoTimeoutDet(gun_index);
-                        StartGunInfoTimeoutDet(gun_index, Timeout_EvseChargingDet);
-                    }
-
-                    if (chargingInfo[gun_index]->Type == _Type_Chademo)
-                    {
-                        // 檢查樁端的 GFD 結果
-                        if (isPrechargeStatus_chademo(gun_index) > 5 && isPrechargeStatus_chademo(gun_index) < 8)
-                        {
-                            // 當前操作的槍號,進入 Charging
-                            setChargerMode(gun_index, MODE_CHARGING);
-                        }
-
-                        if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
-                        {
-                            // GFD 錯誤停止
-                            RecordAlarmCode(gun_index, "012234");
-                        }
-                        else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
-                        {
-                            // GFD 警告
-                            RecordWarningCode(gun_index, "012296");
-                        }
-                    }
-                    else if (chargingInfo[gun_index]->Type == _Type_GB)
-                    {
-                        // 檢查樁端的 GFD 結果
-                        if (isPrechargeStatus_gb(gun_index) > 5 && isPrechargeStatus_gb(gun_index) < 9)
-                        {
-                            setChargerMode(gun_index, MODE_CHARGING);
-                        }
-
-                        if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
-                        {
-                            // GFD 錯誤停止
-                            RecordAlarmCode(gun_index, "012236");
-                        }
-                        else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
-                        {
-                            // GFD 警告
-                            RecordWarningCode(gun_index, "012298");
-                        }
-                    }
-                    else if (chargingInfo[gun_index]->Type == _Type_CCS_2)
-                    {
-                        // 檢查樁端的 GFD 結果
-                        if (chargingInfo[gun_index]->GroundFaultStatus == GFD_PASS ||
-                            chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
-                        {
-                            setChargerMode(gun_index, MODE_CCS_PRECHARGE_STEP0);
-                        }
-
-                        if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
-                        {
-                            // GFD 錯誤停止
-                            RecordAlarmCode(gun_index, "012235");
-                        }
-                        else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
-                        {
-                            // GFD 警告
-                            RecordWarningCode(gun_index, "012297");
-                        }
-                    }
-
-                    if (isEvBoardStopChargeFlag(gun_index) == YES ||
-                        chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL ||
-                        OcppRemoteStop(gun_index) == YES)
-                    {
-                        // 板端或後臺要求停止
-                        ChargingTerminalProcess(gun_index);
-                    }
-
-                    // LCM => Pre-charging
-                    if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == gun_index)
-                        ShmSysConfigAndInfo->SysInfo.ConnectorPage = _LCM_PRE_CHARGE;
-                }
-                    break;
-                case S_CHARGING: // 剛進入充電狀態,等待 EV 小板要求的輸出電流後開始輸出
-                {
-                    if (isModeChange(gun_index))
-                    {
-                        PRINTF_FUNC("S_CHARGING================================== %x \n", gun_index);
-                        StopGunInfoTimeoutDet(gun_index);
-                        ftime(&startChargingTime[gun_index]);
-                        ChangeStartOrStopDateTime(YES, gun_index);
-                        OcppStartTransation(gun_index);
-                    }
-                    ftime(&endChargingTime[gun_index]);
-                    chargingInfo[gun_index]->PresentChargedDuration = DiffTimeb(startChargingTime[gun_index], endChargingTime[gun_index]);
-
-                    if (chargingInfo[gun_index]->Type == _Type_Chademo)
-                    {
-                        if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
-                        {
-                            // GFD 錯誤停止
-                            RecordAlarmCode(gun_index, "012234");
-                        }
-                        else if (((chargingInfo[gun_index]->EvBatterytargetVoltage * 10) > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
-                                 (chargingInfo[gun_index]->PresentChargedDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL))
-                        {
-                            // UVP
-                            RecordAlarmCode(gun_index, "012289");
-                            ChargingTerminalProcess(gun_index);
-                        }
-                        else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
-                        {
-                            // GFD 警告
-                            RecordWarningCode(gun_index, "012296");
-                        }
-                        else
-                            ReleaseWarningCodeByString(gun_index, "012296");
-                    }
-                    else if (chargingInfo[gun_index]->Type == _Type_GB)
-                        {
-                        if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
-                        {
-                            // GFD 錯誤停止
-                            RecordAlarmCode(gun_index, "012236");
-                        }
-                        else if (isPrechargeStatus_gb(gun_index) == 10 &&
-                                 (((chargingInfo[gun_index]->EvBatterytargetVoltage * 10) > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
-                                  (chargingInfo[gun_index]->PresentChargedDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL)))
-                        {
-                            // UVP
-                            RecordAlarmCode(gun_index, "012290");
-                            ChargingTerminalProcess(gun_index);
-                        }
-                        else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
-                        {
-                            // GFD 警告
-                            RecordWarningCode(gun_index, "012298");
-                        }
-                        else
-                            ReleaseWarningCodeByString(gun_index, "012298");
-                    }
-                    else if (chargingInfo[gun_index]->Type == _Type_CCS_2)
-                    {
-                        if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
-                        {
-                            // GFD 錯誤停止
-                            RecordAlarmCode(gun_index, "012235");
-                        }
-                        else if (((chargingInfo[gun_index]->EvBatterytargetVoltage * 10) > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
-                                 (chargingInfo[gun_index]->PresentChargedDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL))
-                        {
-                            // UVP
-                            RecordAlarmCode(gun_index, "012288");
-                            ChargingTerminalProcess(gun_index);
-                        }
-                        else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
-                        {
-                            // GFD 警告
-                            RecordWarningCode(gun_index, "012297");
-                        }
-                        else
-                            ReleaseWarningCodeByString(gun_index, "012297");
-                    }
-
-                    if (isEvBoardStopChargeFlag(gun_index) ||
-                        chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL ||
-                        OcppRemoteStop(gun_index) ||
-                        CheckBackendChargingTimeout(gun_index) ||
-                        CheckBackendChargingEnergy(gun_index))
-                    {
-                        PRINTF_FUNC("S_CHARGING=======Stop=========================== %f \n", (chargingInfo[gun_index]->EvBatterytargetVoltage * 10));
-                        // 板端或後臺要求停止
-                        ChargingTerminalProcess(gun_index);
-                    }
-
-                    // LCM => Charging
-                    if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == gun_index)
-                        ShmSysConfigAndInfo->SysInfo.ConnectorPage = _LCM_CHARGING;
-                }
-                    break;
-                case S_TERMINATING:
-                {
-                    if (isModeChange(gun_index))
-                    {
-                        PRINTF_FUNC ("terminating......................... %x \n", gun_index);
-                        if (strcmp((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "Remote") != EQUAL)
-                            strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "EVDisconnected");
-                        StopGunInfoTimeoutDet(gun_index);
-                    }
-
-                    bool toComplete = false;
-                    if (chargingInfo[gun_index]->Type == _Type_Chademo)
-                    {
-                        // 非車端的停止 : 需等待小板送出停止指令,讓車端解除槍
-                        if (isEvStopCharging_chademo(gun_index) == YES ||
-                            isPrechargeStatus_chademo(gun_index) <= 0)
-                        {
-                            toComplete = true;
-                            setChargerMode(gun_index, MODE_COMPLETE);
-                        }
-                    }
-                    else if (chargingInfo[gun_index]->Type == _Type_GB)
-                    {
-                        // 非車端的停止 : 需等待小板送出停止指令,讓車端解除槍
-                        if (isEvStopCharging_gb(gun_index) == YES ||
-                            isPrechargeStatus_gb(gun_index) <= 0)
-                        {
-                            toComplete = true;
-                            setChargerMode(gun_index, MODE_COMPLETE);
-                        }
-                    }
-                    else if (chargingInfo[gun_index]->Type == _Type_CCS_2)
-                    {
-                        // 非車端的停止 : 需等待小板送出停止指令,讓車端解除槍
-                        if (isEvStopCharging_ccs(gun_index) == YES &&
-                            (isPrechargeStatus_ccs(gun_index) >= 53 || isPrechargeStatus_ccs(gun_index) == 0 ||
-                             isPrechargeStatus_ccs(gun_index) == 13 || isPrechargeStatus_ccs(gun_index) == 14))
-                        {
-                            toComplete = true;
-                            setChargerMode(gun_index, MODE_COMPLETE);
-                        }
-                    }
-
-                    if (!toComplete)
-                    {
-                        if (strcmp((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "Remote") != EQUAL)
-                            strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "Local");
-                    }
-
-                    if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == gun_index)
-                        ShmSysConfigAndInfo->SysInfo.ConnectorPage = _LCM_COMPLETE;
-                }
-                    break;
-                case S_COMPLETE:
-                {
-                    if (isModeChange(gun_index))
-                    {
-                        PRINTF_FUNC ("complete......................... %x \n", gun_index);
-                        OcppStopTransation(gun_index);
-                        ftime(&endChargingTime[gun_index]);
-                        if (chargingInfo[gun_index]->PresentChargedDuration != 0)
-                            chargingInfo[gun_index]->PresentChargedDuration = DiffTimeb(startChargingTime[gun_index], endChargingTime[gun_index]);
-
-                        StopGunInfoTimeoutDet(gun_index);
-                        StartGunInfoTimeoutDet(gun_index, Timeout_EvseCompleteDet);
-                        ChangeStartOrStopDateTime(NO, gun_index);
-                    }
-
-                    if(chargingInfo[gun_index]->ConnectorPlugIn == NO &&
-                       GetTimeoutValue(chargingInfo[gun_index]->TimeoutTimer) >= 10000000)
-                    {
-                        setChargerMode(gun_index, MODE_IDLE);
-                    }
-
-                    if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == gun_index)
-                        ShmSysConfigAndInfo->SysInfo.ConnectorPage = _LCM_COMPLETE;
-                }
-                    break;
-                case S_CCS_PRECHARGE_ST0:
-                {
-                    if (isModeChange(gun_index))
-                    {
-                        PRINTF_FUNC("CCS Precharge Processing 1....................%x \n", gun_index);
-                        StopGunInfoTimeoutDet(gun_index);
-                        StartGunInfoTimeoutDet(gun_index, Timeout_ForCcsPrechargeDet);
-                    }
-
-                    if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
-                    {
-                        // GFD 錯誤停止
-                        RecordAlarmCode(gun_index, "012235");
-                    }
-
-                    if (isEvBoardStopChargeFlag(gun_index) == YES ||
-                        chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
-                    {
-                        // 板端要求停止
-                        ChargingTerminalProcess(gun_index);
-                    }
-
-                    // 等待 EV 小板 (CCS) 通知可以開始 Precharge
-                    // 切換 D+ Relay to Precharge Relay
-                    if (isPrechargeStatus_ccs(gun_index) == 39 || isPrechargeStatus_ccs(gun_index) == 40)
-                    {
-                        if (chargingInfo[gun_index]->RelayKPK2Status == YES && chargingInfo[gun_index]->PrechargeStatus != PRECHARGE_READY)
-                        //if (chargingInfo[gun_index]->PrechargeStatus != PRECHARGE_PRERELAY_PASS)
-                        {
-                            PRINTF_FUNC("Send precharge ready 1..........%x, status = %d \n", gun_index, isPrechargeStatus_ccs(gun_index));
-                            chargingInfo[gun_index]->PrechargeStatus = PRECHARGE_READY;
-                        }
-                    }
-                    else if (isPrechargeStatus_ccs(gun_index) == 45 || isPrechargeStatus_ccs(gun_index) == 46)
-                    {
-                        setChargerMode(gun_index, MODE_CCS_PRECHARGE_STEP1);
-                    }
-
-                    break;
-                }
-                case S_CCS_PRECHARGE_ST1:
-                {
-                    if (isModeChange(gun_index))
-                    {
-                        PRINTF_FUNC("CCS Precharge Processing 2....................%x \n", gun_index);
-                    }
-
-                    if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
-                    {
-                        // GFD 錯誤停止
-                        RecordAlarmCode(gun_index, "012235");
-                    }
-
-                    if (isEvBoardStopChargeFlag(gun_index) == YES ||
-                        chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
-                    {
-                        // 板端要求停止
-                        ChargingTerminalProcess(gun_index);
-                    }
-
-                    // 等待小板通知進入充電
-                    // 切換 D+ Relay to Precharge Relay
-                    if (chargingInfo[gun_index]->RelayK1K2Status == YES)
-                    {
-                        chargingInfo[gun_index]->PrechargeStatus = PRECHARGE_READY;
-                        setChargerMode(gun_index, MODE_CHARGING);
-                    }
-                    break;
-                }
-            }
-        }
-
-        if (ShmSysConfigAndInfo->SysInfo.SystemPage != _LCM_NONE)
-        {
-            ChangeLcmByIndex(ShmSysConfigAndInfo->SysInfo.SystemPage);
-        }
-        else
-        {
-            bool dcPageRun = false;
-            if (_acgunIndex > 0 && ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc != NO_DEFINE)
-            {
-                if  (ac_chargingInfo[0]->SystemStatus == S_IDLE)
-                    ChangeLcmByIndex(_LCM_IDLE);
-                else if (ac_chargingInfo[0]->SystemStatus == S_PREPARNING)
-                    ChangeLcmByIndex(_LCM_PRE_CHARGE);
-                else if (ac_chargingInfo[0]->SystemStatus == S_CHARGING)
-                    ChangeLcmByIndex(_LCM_CHARGING);
-                else if (ac_chargingInfo[0]->SystemStatus == S_TERMINATING ||
-                         ac_chargingInfo[0]->SystemStatus == S_COMPLETE)
-                    ChangeLcmByIndex(_LCM_COMPLETE);
-                else
-                    dcPageRun = true;
-            }
-            else
-                dcPageRun = true;
-
-            if (dcPageRun)
-                ChangeLcmByIndex(ShmSysConfigAndInfo->SysInfo.ConnectorPage);
-        }
-
-        write(wtdFd, "a", 1);
-        usleep(whileLoopTime);
-    }
 
-    return FAIL;
-}

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно