/*
 * Config.h
 *
 *  Created on: 2020/01/15
 *      Author: Eason Yang
 */

#ifndef CONFIG_MAIN_H_
#define CONFIG_MAIN_H_

#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	<dirent.h>

#include 	<unistd.h>
#include 	<stdarg.h>
#include    <stdio.h>
#include    <stdlib.h>
#include    <unistd.h>
#include    <fcntl.h>
#include    <termios.h>
#include    <errno.h>
#include 	<errno.h>
#include 	<string.h>
#include	<time.h>
#include	<ctype.h>
#include 	<ifaddrs.h>
#include	<stdbool.h>
#include	<stddef.h>
#include	<stdint.h>
#include	<sqlite3.h>

//===================================
// Define Alarm code constant
//===================================
#define ALARM_L1_OVER_VOLTAGE					0x00000001
#define ALARM_L1_UNDER_VOLTAGE					0x00000002
#define ALARM_L1_OVER_CURRENT					0x00000004
#define ALARM_OVER_TEMPERATURE	                0x00000008
#define ALARM_GROUND_FAIL						0x00000010
#define ALARM_CP_ERROR							0x00000020
#define ALARM_CURRENT_LEAK_AC                   0x00000040
#define ALARM_CURRENT_LEAK_DC                   0x00000080

#define ALARM_MCU_TESTFAIL						0x00000100
#define ALARM_HANDSHAKE_TIMEOUT                 0x00000200
#define ALARM_EMERGENCY_STOP                    0x00000400
#define ALARM_RELAY_WELDING                     0x00000800
#define ALARM_LEAK_MODULE_FAIL                  0x00001000
#define ALARM_SHUTTER_FAULT                     0x00002000
#define ALARM_LOCKER_FAULT                      0x00004000
#define ALARM_POWER_DROP                        0x00008000
  
#define ALARM_L1_CIRCUIT_SHORT                  0x00010000
#define ALARM_ROTATORY_SWITCH_FAULT             0x00020000
#define ALARM_RELAY_DRIVE_FAULT                 0x00040000
#define ALARM_BLE_MODULE_BROKEN                 0x00080000
#define ALARM_L2_OVER_VOLTAGE                   0x00100000
#define ALARM_L3_OVER_VOLTAGE                   0x00200000
#define ALARM_L2_UNDER_VOLTAGE                  0x00400000
#define ALARM_L3_UNDER_VOLTAGE                  0x00800000

#define ALARM_L2_OVER_CURRENT					0x01000000
#define ALARM_L3_OVER_CURRENT					0x02000000
#define ALARM_L2_CIRCUIT_SHORT                  0x04000000
#define ALARM_L3_CIRCUIT_SHORT                  0x08000000
#define ALARM_METER_TIMEOUT						0x10000000
#define ALARM_METER_IC_TIMEOUT					0x20000000
#define ALARM_CP_NEG_ERROR 						0x40000000
#define ALARM_QCA_FLASH_FAIL					0x80000000

//=================================
//CCS related define
//=================================
#define CCS_PWM_DUTY_CP_STATE_F					0
#define CCS_PWM_DUTY_CP_STATE_E					1
#define CCS_PWM_DUTY_5							5
#define CCS_PWM_DUTY_100						100

//===================================
//	Define CP State constant
//===================================
enum CP_STATE
{
	CP_STATE_UNKNOWN=0,
	CP_STATE_A,
	CP_STATE_B,
	CP_STATE_C,
	CP_STATE_D,
	CP_STATE_E,
	CP_STATE_F
};

//===================================
//	Define CCS CP State constant
//===================================
enum CCS_CP_STATE
{
	CCS_CP_STATE_UNKNOWN=0,
	CCS_CP_STATE_A,				//A (12V, no PWM)
	CCS_CP_STATE_B1,			//B1 (9V, no PWM)
	CCS_CP_STATE_B2,			//B2 (9V, with PWM)
	CCS_CP_STATE_C,				//C (6V, with PWM)
	CCS_CP_STATE_D,				//D (3V, with PWM)
	CCS_CP_STATE_E,				//E (0V, no PWM)
	CCS_CP_STATE_F,				//F (-12V, no PWM)
	CCS_CP_STATE_G,				//G (>12V)
	CCS_CP_STATE_H				//H  (<12V)
};

//===================================
// Define Speaker type constant
//===================================
enum SPEAKER_ACTION
{
	SPEAKER_STOP=0,
	SPEAKER_ALWAYS_ON,
	SPEAKER_SHORT,
	SPEAKER_LONG,
	SPEAKER_INTERVAL_SHORT,
	SPEAKER_INTERVAL_LONG,
	SPEAKER_INTERVAL_3COUNT
};

//===================================
// Define Led constant
//===================================
enum LED_ACTION
{
	LED_ACTION_INIT=0,
	LED_ACTION_IDLE,
	LED_ACTION_AUTHED,
	LED_ACTION_CONNECTED,
	LED_ACTION_CHARGING,
	LED_ACTION_STOP,
	LED_ACTION_ALARM,
	LED_ACTION_MAINTAIN,
	LED_ACTION_RFID_PASS,
	LED_ACTION_RFID_FAIL,
	LED_ACTION_BLE_CONNECT,
	LED_ACTION_BLE_DISABLE,
	LED_ACTION_DEBUG,
	LED_ACTION_ALL_OFF,
	LED_RELAY_ON,
	LED_RELAY_OFF,
	LED_ACTION_HANDSHAKE_FAIL,
	LED_ACTION_INTERNET_DISCONNECT,
	LED_ACTION_RESTORE_SETTING,
	LED_ACTION_IDLE_BACKEND_CONNECTED,
	LED_ACTION_IDLE_BACKEND_CONNECTED_SLEEP,
	LED_ACTION_IDLE_BACKEND_DISCONNECTED,
	LED_ACTION_IDLE_BACKEND_DISCONNECTED_SLEEP,
	LED_ACTION_RESERVATION_MODE
};

//===================================
// Define start mode constant
//===================================
enum START_METHOD
{
	START_METHOD_FREE=0,
	START_METHOD_RFID,
	START_METHOD_BACKEND,
	START_METHOD_BLE
};

enum HANDSHAKE_STATE
{
	HANDSHAKE_IDLE=0,
	HANDSHAKE_DUTY_5,
	HANDSHAKE_DUTY_5_CHECK,
	HANDSHAKE_CCS,
	HANDSHAKE_CP_STATE_E,
	HANDSHAKE_SET_MAX_CURRENT,
	HANDSHAKE_BS_MODE,
	HANDSHAKE_HLC_MODE
};

enum EV_READY_STATE
{
	EV_READY_STAT_E=1,
	EV_READY_STAT_C,
	EV_READY_SET_MAX_CURRENT
};

enum CHARGING_MODE
{
	CHARGING_MODE_BS=0,
	CHARGING_MODE_HLC,
	CHARGING_MODE_SOCKETE
};

enum HLC_MODE
{
	HLC_STOP_MODE=0,
	HLC_START_MODE,
	HLC_RENEGOTIATE_MODE,
	HLC_STANDBY_MODE
};

enum EVSE_NOTIFICATION
{
	NOTIFICATION_NONE=0,
	NOTIFICATION_STOP,
	NOTIFICATION_RENEGOTIATION
};

enum TIMER_IDX
{
	TMR_IDX_HANDSHAKING=0,
	TMR_IDX_AUTH,
	TMR_IDX_REFRESH_CHARGING_INFO,
	TMR_IDX_PROFILE_PREPARE,
	TMR_IDX_BS_HLC_HANDSHAKE,
	TMR_IDX_CCS_HEARTBEAT_COUNT_RESET,
	TMR_IDX_PWN_CHANGE,
	TMR_IDX_POWERSAVING_LCD,
	TMR_IDX_POWERSAVING_RFID,
	TMR_IDX_POWERSAVING_METER,
	TMR_IDX_POWERSAVING_STATE_B,
	TMR_IDX_CHECK_TASK,
	TMR_IDX_POWERSAVING_LED_STATUS,
	TMR_IDX_CHECK_POWER_CONSUMPTION,
	TMR_IDX_LCM_POWER_CONSUMPTION,
	TMR_IDX_UPGRADE,
	TMR_IDX_RESET_WIFI,
	TMR_IDX_DISP_STOPSUM,
	TMR_IDX_18,
	TMR_IDX_19,
	TMR_IDX_GUN_DETECT,
	TMR_IDX_CNT
};

//===================================
//	Define Authorization State constant
//===================================
enum RFID_AUTHORIZATION_STATUS
{
	DEFAULT_RFID = 0,
	VALIDATED_RFID,
	UNVALIDATED_RFID,
	UNKNOW_RFID
};


/*
 * 	TODO:
 * 		1. Rotary switch define change with system specification
 */
enum ROTARY_SWITCH
{
	ROTARY_SWITCH_0_DEBUG=0,
	ROTARY_SWITCH_1_6A,
	ROTARY_SWITCH_2_8A,
	ROTARY_SWITCH_3_10A,
	ROTARY_SWITCH_4_13A,
	ROTARY_SWITCH_5_16A,
	ROTARY_SWITCH_6_20A,
	ROTARY_SWITCH_7_25A,
	ROTARY_SWITCH_8_30A,
	ROTARY_SWITCH_9_32A,
	ROTARY_SWITCH_A_40A,
	ROTARY_SWITCH_B_48A,
	ROTARY_SWITCH_C_RESERVE,
	ROTARY_SWITCH_D_80A,
	ROTARY_SWITCH_E_DISPENSER,
	ROTARY_SWITCH_F_POWERSHARING_SLAVE
};

#define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)), __LINE__, __FUNCTION__, ##args)
#define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)), __LINE__, __FUNCTION__, ##args)
#define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)), __LINE__, __FUNCTION__, ##args)

extern int StoreLogMsg(const char *fmt, ...);


//============================================================
// Private shared memory key define
//============================================================
#define ShmChargerKey		2001
#define ShmDispenserKey		2002

typedef struct Verion
{
	char Version_FW[32];
	char Version_HW[32];
}Ver;

typedef struct PRESENTINPUTVOLTAGE
{
	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;
}PresentOutputVoltage;

typedef struct FANSPEED
{
	unsigned short int speed[4];
}FanSpeed;

typedef struct TEMPERATURE
{
	unsigned char point[8];
}Temperature;

typedef struct AUXPOWER
{
	unsigned char voltage[8];
}AuxPower;

typedef struct RELAY
{
	unsigned char relay_status[2][8];
}Relay;

typedef struct GFD
{
	unsigned short int adc_value_positive[2];
	unsigned short int adc_value_negative[2];
}Gfd;

typedef struct GPIO_IN
{
	unsigned char AC_Connector;
	unsigned char AC_MainBreaker;
	unsigned char SPD;
	unsigned char Door_Open;
	unsigned char GFD[2];
	unsigned char Button[2];
	unsigned char Button_Emergency;
	unsigned char Button_Mode_Switch;
}Gpio_in;

typedef struct GPIO_OUT
{
	unsigned char AC_Connector;
	unsigned char Button_LED[2];
	unsigned char System_LED[4];
}Gpio_out;

typedef struct ALARM_LOG
{
	unsigned char logArea;
	unsigned int alarmIndex;
	unsigned char log[8];
}Alarm_Log;

typedef struct BLE_CONFIG_DATA
{
	unsigned char isLogin:1;
	unsigned char isRequestStart:1;
	unsigned char isRequestStop:1;
}Ble_Config_Data;

typedef struct BLE_LONGIN_CENTRAL_ID
{
	unsigned char id[32];
}Ble_Login_Central_Id;

typedef struct RTC
{
	unsigned short int year;
	unsigned char month;
	unsigned char day;
	unsigned char hour;
	unsigned char min;
	unsigned char sec;
}Rtc;

typedef struct PRESENTOUTPUTCURRENT
{
	double L1N_L12[2];
	double L2N_L23[2];
	double L3N_L31[2];
}Presentoutputcurrent;

typedef struct SOCKET_E
{
	unsigned char isSocketEMode:1;
	unsigned char isSocketEPinOn:1;
}Socket_E;

typedef struct AC_PRIMARY_MCU
{
	unsigned char cp_state;
	unsigned int  current_limit;
	float cp_voltage_positive;
	float cp_voltage_negtive;
	unsigned char locker_state;
	unsigned char relay_state;
	unsigned char shutter_state;
	unsigned char meter_state;
	unsigned char pp_state;
	unsigned char rating_current;
	unsigned char rotatory_switch;
	Relay	relayState;
	Socket_E socket_e;
}Ac_Primary_Mcu;

typedef struct AC_PRIMARY_MCU_ALARM
{
	union
	{
		unsigned long InputAlarmCode;
		struct
		{
			unsigned long OVP_L1:1;
			unsigned long UVP_L1:1;
			unsigned long OCP_L1:1;
			unsigned long OTP:1;
			unsigned long gmi_fault:1;
			unsigned long cp_fault:1;
			unsigned long ac_leak:1;
			unsigned long dc_leak:1;
			unsigned long mcu_selftest_fail:1;
			unsigned long handshaking_timeout:1;
			unsigned long emergency_stop:1;
			unsigned long relay_welding:1;
			unsigned long leak_module_fail:1;
			unsigned long shutter_fault:1;
			unsigned long locker_fault:1;
			unsigned long power_drop:1;
			unsigned long rotate_switch_fault:1;
			unsigned long short_circuit_L1:1;
			unsigned long relay_drive_fault:1;
			unsigned long comm_timeout:1;
			unsigned long OVP_L2:1;
			unsigned long UVP_L2:1;
			unsigned long OCP_L2:1;
			unsigned long OVP_L3:1;
			unsigned long UVP_L3:1;
			unsigned long OCP_L3:1;
			unsigned long short_circuit_L2:1;
			unsigned long short_circuit_L3:1;
			unsigned long meter_comm_timeout:1;
			unsigned long meter_ic_comm_timeout:1;
			unsigned long pilot_negative_error:1;
		}bits;
	};
}Ac_Primary_Mcu_Alarm;

typedef struct AC_PRIMARY_MCU_LED
{
	unsigned char mode;
	unsigned long alarm_code;
}Ac_Primary_Mcu_Led;

typedef struct EVSE_ID
{
	unsigned char model_name[14];
	unsigned char serial_number[12];
}Evse_Id;

typedef struct AC_PRIMARY_MCU_CP_PWM_DUTY
{
	unsigned int max_current;
}Ac_Primary_Mcu_Cp_Pwm_Duty;

typedef struct LEGACY_REQUEST
{
	unsigned char isLegacyRequest:1;
	uint8_t isRelayOn:1;
}Legacy_Request;

typedef struct POWER_CONSUMPTION
{
	uint64_t power_consumption;
	uint64_t power_consumption_at_start;

}Power_Consumption;

typedef struct MCU_OP_FLAG
{
	unsigned char isSetModePass:1;
	unsigned char isSetSerialNumberPass:1;
	unsigned char isSetModelNamePass:1;
	unsigned char isReadFwVerPass:1;
	unsigned char isMcuUpgradeReq:1;
	unsigned char isSetCpPwmDuty:1;
	unsigned char isReadMeterIcCorrectionStatus:1;
}Mcu_Op_Flag;

typedef struct SYSTEM_ALARM_CODE
{
	unsigned long SystemAlarmCode;

}System_Alarm_Code;

typedef struct OTHER_ALARM_CODE
{
	unsigned long isHandshakingTimeOut:1;
	unsigned long isDcLeakage:1;
	unsigned long isACLeakage:1;
}Other_Alarm_Code;

typedef struct PILOT_VOLTAGE
{
	float PilotVoltagePositive;
	float PilotVoltageNegative;

}Pilot_Voltage;

typedef struct FW_UPGRADE_INFO
{
	int fwType;
	char modelName[17];
	char location[384];
}Fw_Upgrade_Info;

typedef struct GUN_PLUGIN_TIMES
{
	uint32_t GunPluginTimes;

}Gun_Plugin_Times;

typedef struct MCU_RESET_REQUEST
{
	unsigned char isMcuResetRequest:1;
}Mcu_Reset_Request;

typedef struct TIMEOUT_SPEC
{
	int Present_Timeout_Spec;
	int Handshake_Timeout;
}Timeout_Spec;

typedef struct SET_BREATHE_LED_TIMING
{
	uint16_t set_Led_Action_Connected_Fade_In;
	uint16_t set_Led_Action_Connected_Fade_Out;
	uint16_t set_Led_Action_Authed_Fade_In;
	uint16_t set_Led_Action_Authed_Fade_Out;
	uint16_t Set_Led_Action_Chaging_Fade_In;
	uint16_t set_Led_Action_Chaging_Fade_Out;
}Set_Breathe_Led_Timing;

typedef struct SET_LED_BRIGHTNESS
{
	uint8_t sector_1;	// 0~1 AM and 1~2 AM
	uint8_t sector_2;	// 2~3 AM and 3~4 AM
	uint8_t sector_3;	// 4~5 AM and 5~6 AM
	uint8_t sector_4;	// 6~7 AM and 7~8 AM
	uint8_t sector_5;	// 8~9 AM and 9~10 AM
	uint8_t sector_6;	// 10~11 AM and 11~12 AM
	uint8_t sector_7;	// 12~13 PM and 13~14 PM
	uint8_t sector_8;	// 14~15 PM and 15~16 PM
	uint8_t sector_9;	// 16~17 PM and 17~18 PM
	uint8_t sector_10;	// 18~19 PM and 19~20 PM
	uint8_t sector_11;	// 20~21 PM and 21~22 PM
	uint8_t sector_12;	// 22~23 PM and 23~24 PM
}Set_Led_Brightness;

typedef struct SET_AUX_POWER_SWITCH
{
	uint8_t power_type;		// 0xff: All	0x01: Meter
	uint8_t power_switch;	// 0: OFF	1: ON
}Set_Aux_Power_Switch;

typedef union
{
	unsigned int value;
	struct
	{
		unsigned int isCalibratedVaGain:1;					// Voltage phase a gain is calibrated, 0: default	1: Calibrated
		unsigned int isCalibratedVbGain:1;					// Voltage phase b gain is calibrated, 0: default	1: Calibrated
		unsigned int isCalibratedVcGain:1;					// Voltage phase c gain is calibrated, 0: default	1: Calibrated
		unsigned int isCalibratedVaOffset:1;				// Voltage phase a offset is calibrated, 0: default	1: Calibrated
		unsigned int isCalibratedVbOffset:1;				// Voltage phase b offset is calibrated, 0: default	1: Calibrated
		unsigned int isCalibratedVcOffset:1;				// Voltage phase c offset is calibrated, 0: default	1: Calibrated
		unsigned int isCalibratedCaGain:1;					// Current phase a gain is calibrated, 0: default	1: Calibrated
		unsigned int isCalibratedCbGain:1;					// Current phase b gain is calibrated, 0: default	1: Calibrated
		unsigned int isCalibratedCcGain:1;					// Current phase c gain is calibrated, 0: default	1: Calibrated
		unsigned int isCalibratedCaOffset:1;				// Current phase a offset is calibrated, 0: default	1: Calibrated
		unsigned int isCalibratedCbOffset:1;				// Current phase b offset is calibrated, 0: default	1: Calibrated
		unsigned int isCalibratedCcOffset:1;				// Current phase c offset is calibrated, 0: default	1: Calibrated
		unsigned int isCalibratedPa:1;						// Phase angle a is calibrated, 0: default	1: Calibrated
		unsigned int isCalibratedPb:1;						// Phase angle b gain is calibrated, 0: default	1: Calibrated
		unsigned int isCalibratedPc:1;						// Phase angle c gain is calibrated, 0: default	1: Calibrated
		unsigned int :17;
	}bits;
}MeterIcCorrection;

typedef struct CCS_INFO
{
	uint8_t		BatteryChargeType;				/*0x00: AC charging, 0x01: DC charging*/
	uint8_t 	PresentMsgFlowStatus;
												/*  ISO15118_2018
												0: Idle(wait B2 state),
												1: CM_SLAC_PARM.REQ,
												2: CM_SLAC_PARM.CNF,
												3: CM_START_ATTEN_CHAR.IND
												4: CM_MNBC_SOUND.IND,
												5: CM_ATTEN_CHAR.IND,
												6: CM_ATTEN_CHAR.RSP,
												7: CM_VALIDATE.REQ
												8: CM_VALIDATE.CNF,
												9: CM_SLAC_MATCH.REQ,
												10: CM_SLAC_MATCH.CNF,
												11: CM_AMP_MAP.REQ
												12: CM_AMP_MAP.CNF,
												13: SLACC/SDP/TCP connection,
												16: SupportedAppProtocolRequest,
												17: SupportedAppProtocolResponse,
												18: SessionSetupRequest
												19: SessionSetupResponse,
												20: ServiceDiscoveryRequest,
												21: ServiceDiscoveryResponse
												22: ServiceDetailRequest,
												23: ServiceDetailResponse
												24:ServiceAndPaymentSelectionRequest/ServiceSelectionRequest,
												25: ServiceAndPaymentSelectionResponse/ServiceSelectionResponse
												26: PaymentDetailsRequest/IdentificationDetailsRequest;,
												27: PaymentDetailsResponse/IdentificationDetailsResponse,
												28: AuthorizationRequest,
												29: AuthorizationResponse,
												30: CertificateUpdateRequest,
												31: CertificateUpdateResponse,
												32:CertificateInstallationRequest,
												33: CertificateInstallationResponse
												34: ChargeParameterDiscoveryRequest,
												35: ChargeParameterDiscoveryResponse
												36: CableCheckRequest,
												37: CableCheckResponse,
												38: PreChargeRequest,
												39: PreChargeResponse
												40: PowerDeliveryRequest start,
												41: PowerDeliveryResponse start,
												42: ChargingStatusRequest,
												43: ChargingStatusResponse
												44:CurrentDemandRequest,
												45:CurrentDemandResponse,
												46:MeteringReceiptRequest,
												47: MeteringReceiptResponse
												48: PowerDeliveryRequest end,
												49: PowerDeliveryRequest end,
												50: WeldingDetectionRequest,
												51: WeldingDetectionResponse,
												52: SessionStopRequest,
												53: SessionStopResponse
												253: Performance Timeout,
												254: Sequence Timeout,
												255: Fault
												*/

	float 		ConnectorTemperature1;			/*unit: 1°C*/
	float 		ConnectorTemperature2;			/*unit: 1°C*/
	uint16_t	ChargingRemainTime;				/*0x0000: 0 sec ~ 0xFFFF: 65535 sec, unit: 1 second*/
	float		TotalBatteryCapacity;			/*unit: Wh*/
	float		BatteryMaximumVoltage;			/*unit: 1 volt*/
	float		BatteryMaximumCurrent;			/*unit: 1 amp*/
	uint8_t		EVCCID[8];
	uint8_t		EVSEID[40];
	uint8_t		CCSLibRev[32];
	uint8_t		EVSEModelName[32];
	uint32_t	CSUAlarmStatusCode;
	uint16_t	CCSAlarmStatusCode;
	uint8_t		PaymentOption;					/* 0x00 EIM, 0x01 Pnc */
	float		EVSEMaxCurrent;					/*unit: 1 amp*/
	float		EVSEMinCurrent;					/*unit: 1 amp*/
	float		GridVoltage[3];				    /*unit: 1 volt*/
	uint8_t		MeterID[32];					/*unit: 1 amp*/
	float		MeterReadingValue;				/*unit: 1Wh*/
	uint8_t		EVOperation;					/*0:Charge, 1:Discharge*/
	uint8_t		EVChargeProgress;				/*0: Stop
													1: Start
													2: Renegotiate
													3: Standby */
	uint8_t		CpSetPWMDuty;					/*unit: 1%
													0: 0%
													5: 5%
													100: 100%*/
	uint8_t		CpSetStateE;					/*0:disable, 1:enable*/
	uint8_t		CpPresentPWMDuty;				/*unit:1%*/
	uint8_t		CpPresentState;					/*1: A (12V, no PWM)
													2: B1 (9V, no PWM)
													3: B2 (9V, with PWM)
													4: C (6V, with PWM)
													5: D (3V, with PWM)
													6: E (0V, no PWM)
													7: F (-12V, no PWM)
													8: G (>12V)
													9: H  (<12V)*/
	float		CpPositiveVoltage;				/*uint: 1V*/
	float		CpNegativeVoltage;				/*uint: 1V*/
	uint32_t	CcsHeartBeat;					/*unit: 1*/
	float 		EVSEPresentCurrent[3];			//unit: 1A
	float 		AvailableChargingPower;			//1KW
	uint8_t		EVSENotification;				/*0: None
												  1: StopCharging
												  2: ReNegotiation*/
	uint16_t 	ChargingPermission:1;			/*0x00: Not ready yet, stay in idle mode or go into terminating process.
												  0x01: start charging process*/
	uint16_t 	ConnectorLockerStatus:1;		/*0x00: released
												  0x01: locked*/

	uint16_t	RcdStatus:1;					/* 0x00 no error
												   0x01 an error */
	uint16_t	OutputRelayStatus:1;			/*0: OFF
												1: ON*/
	uint16_t	TempFlag4:1;
	uint16_t	TempFlag5:1;
	uint16_t	TempFlag6:1;
	uint16_t	TempFlag7:1;
	uint16_t	TempFlag8:1;
	uint16_t	TempFlag9:1;
	uint16_t	TempFlag10:1;
	uint16_t	TempFlag11:1;
	uint16_t	TempFlag12:1;
	uint16_t	TempFlag13:1;
	uint16_t	TempFlag14:1;
	uint16_t	TempFlag15:1;
}Ac_Ccs_Info;

typedef struct GUN_INFO
{
	unsigned char									SystemStatus;
	unsigned char									PreviousSystemStatus;
	Ver 											ver;
	PresentInputVoltage 							inputVoltage;
	Presentoutputcurrent							outputCurrent;
	Temperature 									temperature;
	Ble_Config_Data									bleConfigData;
	Ble_Login_Central_Id							bleLoginCentralId;
	Rtc												rtc;
	Ac_Primary_Mcu									primaryMcuState;
	Ac_Primary_Mcu_Alarm							primaryMcuAlarm;
	Ac_Primary_Mcu_Led								primaryMcuLed;
	Mcu_Op_Flag										mcuFlag;
	Power_Consumption								powerConsumptionTotal;
	Power_Consumption								powerConsumption[3];
	Legacy_Request									legacyRequest;
	System_Alarm_Code								systemAlarmCode;
	Ac_Primary_Mcu_Cp_Pwm_Duty						primaryMcuCp_Pwn_Duty;
	Other_Alarm_Code								otherAlarmCode;
	Pilot_Voltage									PilotVoltage;
	Gun_Plugin_Times								gunPluginTimes;
	Mcu_Reset_Request								mcuResetRequest;
	Set_Breathe_Led_Timing							setBreatheLedTiming;
	Set_Led_Brightness								setLedBrightness;
	Set_Aux_Power_Switch							setAuxPowerSwitch;
	Gpio_in											GPIO_Input;
	Ac_Ccs_Info										acCcsInfo;
	uint8_t											StartDateTime[32];			// Charging cycle start date time
	uint8_t											StopDateTime[32];			// Charging cycle stop date time
	float 											PresentChargedEnergy;
	float											presentChargedEnergyPeriod[24];		// Session present charged energy at each period, resolution: 0.01 KWH
	uint32_t 										PresentChargedDuration;
	uint8_t											ccsHandshakeState;
	uint8_t											PreviousEVChargeProgress;
	uint8_t											chargingMode;
	uint16_t										targetCurrent;
	uint8_t											evReadyState;
	uint8_t											resultAuthorization;
	MeterIcCorrection								meterIcCorrectionStatus;

	uint32_t										isAuthPassEnd:1;
	uint32_t										rfidReq:1;
	uint32_t										isGunPlugged:1;
	uint32_t										isSetBreatheLedTiming:1;
	uint32_t										isSetLedBrightness:1;
	uint32_t										isUnlockerConnetor:1;
	uint32_t										isOperactive:1;
	uint32_t										isCCSWaitChangeDuty:1;
	uint32_t										isCCSStartTransation:1;
	uint32_t										isEvReady2StateE:1;
	uint32_t										isDoEvReadyOnce:1;
	uint32_t										isChargerStopByCondition:1;
	uint32_t										isMeterOn:1;
	uint32_t										isSleepOn:1;
	uint32_t										isCheckPowerConsumption:1;
	uint32_t										isHandshakeTimerRefresh:1;
	uint32_t										isResetSoftReq:1;
	uint32_t										isResetHardReq:1;
	uint32_t										isUpgradeReq:1;
	uint32_t										isUpgradeEnd:1;
	uint32_t										isUpgradePASS:1;
}Gun_Info;

struct Charger
{
	Ver 					ver;
	Evse_Id					evseId;
	Gun_Info 				gun_info[3];
	Fw_Upgrade_Info			fwUpgradeInfo;
	Timeout_Spec			timeoutSpec;

	uint8_t					gun_selectd;
	uint8_t	 				speaker_type;
	uint16_t				isSpeakerOn:1;
	uint16_t		 		isUpdateSuccess:1;
	uint16_t		 		isCcsEnable:1;
	uint16_t				isLcdOn:1;
	uint16_t				isAuthrizing:1;
	uint16_t				isGetAuthResult:1;
	uint16_t				isUpgradeLcmReq:1;
	uint16_t				isUpgradeLcmSuccess:1;
};

struct DISPENSER
{
	Evse_Id								evseId;
	Gun_Info							gun_info;
	Timeout_Spec						timeoutSpec;
	Fw_Upgrade_Info						fwUpgradeInfo;
	uint16_t							AcPlugInTimes;
	uint16_t							isInitialFail:1;
	uint16_t							isCcsEnable:1;
	uint16_t							isConnectedBackend:1;
	struct SysConfigData				ConfigData;
};

#endif /* CONFIG_MAIN_H_ */