/*
 * Module_EvComm.h
 *
 *  Created on: 2020�~9��14��
 *      Author: Wendell
 */

#ifndef MODULE_EVCOMM_H_
#define MODULE_EVCOMM_H_

// server protocol setting
#define SOCKET_SERVER_IP				"192.168.0.10"
#define PACKET_HEADER_LENGTH			4
#define MAXIMUM_PAYLOAD_LENGTH			249			// 249 bytes
#define TCP_LISTEN_PORT					36000
#define SOCKET_RECEIVE_INTERVAL			10			// 10ms
#define DISPENSER_SOCKET_TIMEOUT		10000		// 10s

// client protocol setting
#define DISPENSER_MODEL_NAME_RESEND		3000		// 3s
#define DISPENSER_CONNECTOR_RESEND		3000		// 3s
#define CABINET_STATUS_REQUEST_RESEND	1000		// 1s
#define CHARGING_CAPABILITY_RESEND		1000		// 1s
#define IP_CONFLICTED_TIME              1000        // 1s

// socket setting
#define	CONNECTION_LIMIT				5
#define MAXIMUM_CONNECT_QUANTITY		2

#define CCS_MAX_PHYSICAL_VOLTAGE        9500
#define CCS_NATURAL_MAX_CURRENT         2000
#define CCS_LIQUID_MAX_CURRENT          5000
#define CCS_NATURAL_REMA_MAX_CURRENT    3000

#define CHA_MAX_PHYSICAL_VOLTAGE        5000
#define CHA_NATURAL_MAX_CURRENT         2000

#define GBT_MAX_PHYSICAL_VOLTAGE        7500
#define GBT_NATURAL_MAX_CURRENT         2500

#define AUTO_GUN_SELECTION              0xFF

struct Message
{
	int				size;
	unsigned char 	buffer[2048];
};

enum HEADER_OP
{
	_Header_Read		= 0x01,
	_Header_Write		= 0x02,
	_Header_Response	= 0x03,
};

enum PAYLOAD_REGISTER
{
	_Reg_Dispenser_Model_Name		= 0x01,
	_Reg_Connector_ID				= 0x02,
	_Reg_Power_Cabinet_Status		= 0x03,
	_Reg_Dispenser_Status			= 0x04,
	_Reg_Charging_Capability		= 0x05,
	_Reg_Charging_Target			= 0x06,
	_Reg_Software_Update			= 0x07,
	_Reg_Plug_In_Status				= 0x08,
	_Reg_Connector_State			= 0x09,
	_Reg_User_ID					= 0x0A,
	_Reg_Charging_Permission		= 0x0B,
	_Reg_Misc_Control               = 0x0C,
	_Reg_Report_Csu_Version         = 0x0D,
	_Reg_Report_Other_Version       = 0x0E,
	_Reg_Charging_Info              = 0x0F,
	_Reg_Charger_System_Id          = 0x10,
	_Reg_WaitPlugIn                 = 0x11,
	_Reg_GroundFaultDetection       = 0x12,
};

enum Response_Result
{
	_R_OK	= 0x01,
	_R_NG	= 0x02,
};

enum Response_Upgrade
{
    _R_NeedUpgrade  = 0x01,
    _R_NoUpgrade    = 0x02,
};

enum PlugIn_Status
{
	_PIS_UnPlugged	= 0x00,
	_PIS_PluggedIn	= 0x01,
};

enum Connector_Remote_Status
{
	_CRS_Idle			= 0x00,
	_CRS_Preparing		= 0x01,
	_CRS_Charging		= 0x02,
	_CRS_Terminating	= 0x03,
	_CRS_Alarm          = 0x04,
};

typedef enum
{
    _DAS_NotAllowed     = 0x00,
    _DAS_Allowed        = 0x01,
    _DAS_Wait           = 0x02,
}DispenserAck_Status;

enum Permission_Status
{
	_PS_NotPermitted	= 0x00,
	_PS_Permitted		= 0x01,
};

enum Accept_Status
{
	_AS_Reject			= 0x00,
	_AS_Accept			= 0x01,
};

struct HEADER_STRUCTURE
{
	unsigned char se;
	unsigned char id;
	unsigned char op;
	unsigned char len;
};

struct PAYLOAD_STRUCTURE
{
	unsigned char reg;
	unsigned char data[MAXIMUM_PAYLOAD_LENGTH];
};

struct PACKET_STRUCTURE
{
	struct HEADER_STRUCTURE  Header;
	struct PAYLOAD_STRUCTURE Payload;
}Packet_Structure;

enum DispenserStatus
{
	_DS_None					= 0x00,
	_DS_Identification			= 0x01,
	_DS_Idle					= 0x02,
	_DS_Alarm					= 0x03,
	_DS_Charging				= 0x04,
	_DS_Timeout					= 0x05,
};

enum ConnectionStatus
{
	_CNS_FREE					= 0x00,
	_CNS_WaitModelName			= 0x01,
	_CNS_DispenserMatched		= 0x02,
};

struct MISC_COMMAND
{
    unsigned short  Command;
    unsigned int    Value;
};

enum MiscCommand
{
    _MiscCmd_None               = 0x0000,
    _MiscCmd_ConnectorTimeout   = 0x0001,
    _MiscCmd_ChangeOperative    = 0x0002,
    _MiscCmd_DefaultPrice       = 0x0003,
    _MiscCmd_Currency           = 0x0004,
    _MiscCmd_AccountBalance     = 0x0005,
    _MiscCmd_BackendStatus      = 0x0006,
    _MiscCmd_EthernetStatus     = 0x0007,
    _MiscCmd_WiFiStatus         = 0x0008,
    _MiscCmd_4GStatus           = 0x0009,
    _MiscCmd_Billing            = 0x000A,
    _MiscCmd_StopButton         = 0x000B,
    _MiscCmd_HardwareReboot     = 0x0101,
    _MiscCmd_SoftwareRestart    = 0x0102,
    _MiscCmd_RemoteStart        = 0x0103,
    _MiscCmd_RemoteStop         = 0x0104,
    _MiscCmd_UnlockStop         = 0x0105,
};

struct ChargingCapabilityResponse
{
    unsigned char  ResponseResult;          // 1: OK, 2 NG
    unsigned short MaxOuputVoltage;         // unit = 0.1 volt
    unsigned short MaxOuputCurrent;         // unit = 0.1 Amp
    unsigned short MaxOuputPower;           // unit = 0.1 kW
    unsigned char  Currency;                // currency index
    unsigned int   UserPrice;               // unit = 0.01 dollar
    unsigned int   TotalCost;               // unit = 0.01 dollar
    int            AccountBalance;          // unit = 0.01 dollar
};

enum WaitPlug
{
    _WaitPlug_None  = 0x0,
    _WaitPlug_Start = 0x1,
};

enum GroundFaultDetection
{
    _GFD_Disable    = 0x0,
    _GFD_Enable     = 0x1,
};

#endif /* MODULE_EVCOMM_H_ */