/*===========================================================================
                    Combined Charging System (CCS): SECC
                                EVComm.h

                        initiated by Vern, Joseph
                           (since 2019/07/19)
   =============================================================================*/

#ifndef EVCOMM_H_
#define EVCOMM_H_

#if FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == ENABLE
//Saving System Log
#define SAVE_SYS_LOG_MSG_EVCOMM_SWITCH          ENABLE      //ENABLE, DISABLE

//Configuration for Debug Print Messages
#define DEBUG_PRINTF_EVCOMM_SHOW                DISABLE     //DISABLE, ENABLE
#define DEBUG_PRINTF_EVCOMM_BRIEF_SHOW          DISABLE      //DISABLE, ENABLE
#define DEBUG_PRINTF_EVCOMM_DETAIL_SHOW         DISABLE      //DISABLE, ENABLE
#define DEBUG_PRINTF_EVCOMM_SYSTEM_LOG_SHOW     DISABLE      //ENABLE, DISABLE
#else //debug mode
//Saving System Log
#define SAVE_SYS_LOG_MSG_EVCOMM_SWITCH          ENABLE      //ENABLE, DISABLE

//Configuration for Debug Print Messages
#define DEBUG_PRINTF_EVCOMM_SHOW                ENABLE     //DISABLE, ENABLE
#define DEBUG_PRINTF_EVCOMM_BRIEF_SHOW          DISABLE      //DISABLE, ENABLE
#define DEBUG_PRINTF_EVCOMM_DETAIL_SHOW         DISABLE      //DISABLE, ENABLE
#define DEBUG_PRINTF_EVCOMM_SYSTEM_LOG_SHOW     ENABLE      //ENABLE, DISABLE
#endif

//ADC Channels (0, 1, 2, 3)
#define ADC_CHANNEL_AIN0_NTC1   0
#define ADC_CHANNEL_AIN1_NTC2   1
#define ADC_CHANNEL_AIN2_PP     2
#define ADC_CHANNEL_AIN3_CP     3

#define QcaInterface                        "eth1"
#define SUPPORT_BCB_TOGGLE_FUNCTION         ENABLE      //BCB
#define SdpUdpServerPort                    15118
//#define SdpTcpServerPort                    59438       //49152-65535 (default:59438)
#define SdpTcpServerPort                    50000       //49152-65535 (base: 50000)
#define IPV6_LINK_LOCAL_PREFIX              0xFE80

//[Joseph] These Tx/Rx buffer size should owns 8 + 4294967295 = 4,294,967,303 Bytes = 4.GB as maximum.
//(according to Figure 24 in DIN 70121)
#define V2GTP_MSG_RX_BUFFER_SIZE           (64*1024)   //65,536 = 65.5KB
#define V2GTP_MSG_TX_BUFFER_SIZE           (64*1024)   //65,536 = 65.5KB
#define V2GTP_MSG_HEADER_LENGTH             8           //8 Bytes

/***********************************************/
/*********** Ethernet Type ********************/
/**********************************************/
#define EtherType_HomePlug                  0x88E1

/***********************************************/
/*** MMTYPE (Management Message Type) **/
/**********************************************/
#define MMTYPE_CM_SET_KEY_REQ               0x6008
#define MMTYPE_CM_SET_KEY_CNF               0x6009
#define MMTYPE_CM_AMP_MAP_REQ             0x601C
#define MMTYPE_CM_AMP_MAP_CNF             0x601D
#define MMTYPE_CM_SLAC_PARM_REQ             0x6064
#define MMTYPE_CM_SLAC_PARM_CNF             0x6065
#define MMTYPE_CM_START_ATTEN_CHAR_IND      0x606A
#define MMTYPE_CM_MNBC_SOUND_IND            0x6076
#define MMTYPE_CM_ATTEN_CHAR_IND             0x606E
#define MMTYPE_CM_ATTEN_CHAR_RSP            0x606F
#define MMTYPE_CM_VALIDATE_REQ              0x6078
#define MMTYPE_CM_VALIDATE_CNF              0x6079
#define MMTYPE_CM_SLAC_MATCH_REQ            0x607C
#define MMTYPE_CM_SLAC_MATCH_CNF            0x607D
#define MMTYPE_CM_ATTEN_PROFILE_IND         0x6086
//following are the vendor specific type
#define MMTYPE_VENDOR_VS_HOST_ACTION        0xA062      //Embedded Host Action Requested Indication MME
#define MMTYPE_VENDOR_ATTEN_CHAR            0xA14E      //Attenuation Characteristics MME (VS_ATTEN_CHAR)
#define MMTYPE_VENDOR_VS_NW_INFO            0xA038      //Network Info MME
#define MMTYPE_VENDOR_VS_NW_INFO_CNF        0xA039      //Network Info MME
#define MMTYPE_VENDOR_VS_PL_LNK_STATUS        0xA0B8      //Powerline Link Status /*+++ 20200808, vern, for PLC connection monitoring ---*/
#define MMTYPE_VENDOR_VS_PL_LNK_STATUS_CNF        0xA0B9      //Powerline Link Status /*+++ 20200808, vern, for PLC connection monitoring ---*/

/***********************************************/
/************** V2GTP Payload Type ************/
/**********************************************/
//Reference:
//Table 16 — "Overview on V2GTP payload types," page 79, DIN SPEC 70121:2014-12
#define V2GTP_PAYLOAD_TYPE_SDP_REQUEST      0x9000      //SDP request message
#define V2GTP_PAYLOAD_TYPE_SDP_RESPONSE     0x9001      //SDP response message
#define V2GTP_PAYLOAD_TYPE_EXI_MSG          0x8001      //EXI encoded V2G Message
//Payload
#define SDP_PAYLOAD_SECURITY_TLS            0x00        //0x00 = secured with TLS
#define SDP_PAYLOAD_SECURITY_NONE           0x10        //0x10 = No transport layer security
#define SDP_PAYLOAD_TRANS_PROTOCOL_TCP      0x00        //0x00= TCP
#define SDP_PAYLOAD_TRANS_PROTOCOL_UDP      0x10        //0x10 = reserved for UDP
/***********************************************/
/****** Timing and constant values **********/
/*********** [2015] ISO 15118_3 ***************/
/**********************************************/
//#define TT_EVSE_match_MNBC                  600         //unit: 1ms (default: 600ms)
#define TT_EVSE_match_MNBC                  (600+400)   //unit: 1ms (default: 600ms)
#define C_EV_match_MNBC                     0x0A
#define TT_EVSE_SLAC_init                   50          //unit: sec.
#define TT_match_sequence                   400         //unit: ms
#define TP_match_response                   100         //unit: ms, General performance time for a response to a request
#define TT_match_response                   (200*3)     //unit: ms, Time that the EV/EVSE shall wait for a response from the EVSE/EV
#define TP_EV_batch_msg_interval            (50*3)      //unit: ms
#define TT_EVSE_match_session               10000       //unit: ms
#define TT_match_join                       (12000*2)   //unit: ms

#define V2G_SECC_ReadyToCharge_Performance_Time             148000  //unit: ms (148 sec)
#define V2G_SECC_CommunicationSetup_Performance_Time        18000   //unit: ms (18 sec)
#define V2G_SECC_ChargingParameter_Performance_Time         60000   //unit: ms (60 sec)
//#define V2G_SECC_ChargingParameter_Performance_Time       120000   //unit: ms (120 sec)
#define V2G_SECC_CableCheck_Performance_Time                38000   //unit: ms (38 sec)
//#define V2G_SECC_CableCheck_Performance_Time              60000   //unit: ms (extend to 60 sec)
//#define V2G_SECC_PreCharge_Performance_Time                 5000    //unit: ms (5 sec)
#define V2G_SECC_PreCharge_Performance_Time                 10000   //unit: ms (extend to 10 sec)
#define V2G_SECC_WeldingDetection_Performance_Time          20000   //unit: ms (20 sec)
#define V2G_SECC_CPState_Detection_Timeout                  1500    //unit: ms (1.5 sec)
#define V2G_SECC_CPOscillator_Retain_Timeout                1500    //unit: ms (1.5 sec)

#define V2G_EVCC_Msg_Timeout_SupportedAppProtocolReq        2000    //unit: ms (1.5 sec)
#define V2G_EVCC_Msg_Timeout_SessionSetupReq                2000    //unit: ms (1.5 sec)
#define V2G_EVCC_Msg_Timeout_ServiceDiscoveryReq            2000
#define V2G_EVCC_Msg_Timeout_ServicePaymentSelectionReq     2000
#define V2G_EVCC_Msg_Timeout_ContractAuthenticationReq      2000
#define V2G_EVCC_Msg_Timeout_ChargeParameterDiscoveryReq    2000
#define V2G_EVCC_Msg_Timeout_PowerDeliveryReq               2000
#define V2G_EVCC_Msg_Timeout_CableCheckReq                  2000
#define V2G_EVCC_Msg_Timeout_PreChargeReq                   2000
#define V2G_EVCC_Msg_Timeout_CurrentDemandReq               25
#define V2G_EVCC_Msg_Timeout_WeldingDetectionReq            2000
#define V2G_EVCC_Msg_Timeout_SessionStopReq                 2000
#define V2G_SECC_Sequence_Timeout                           60000   //unit: ms (default: 60000, i.e. 60 sec)
#define V2G_SECC_QCA7000_GET_MAC_ADDR_REQ_RETRY_PERIOD      3000    //unit: ms (default: 3000, i.e. 3 sec)
#define V2G_SECC_QCA7000_SEND_SET_KEY_PERIOD                2000    //unit: ms (default: 2000, i.e. 2 sec)
#define V2G_SECC_QCA7000_COMM_TIMEOUT                       10000   //unit: ms (default: 10000, i.e. 20 sec)
//[To-Do] to be continued. (DIN 70121, Table 75)

#define V2G_SECC_CP_Timeout_CableCheck                      2000    //unit: ms (default: 2 sec)

#define DIN_SPEC_70121_2012_VersionNumberMajor              2
#define DIN_SPEC_70121_2012_VersionNumberMinor              0
#define ISO1_15118_2013_VersionNumberMajor                  2
#define ISO1_15118_2013_VersionNumberMinor                  0
#define ISO2_15118_2018_VersionNumberMajor                  3
#define ISO2_15118_2018_VersionNumberMinor                  0

/***********************************************/
/*************** Structure *********************/
/**********************************************/
struct MmeHeader
{
    unsigned char ODA[6];           //Original Destination Address
    unsigned char OSA[6];           //Original source Address
    //unsigned int VLAN Tag;        //IEEE802.1Q VLAN Tag (optional)
    unsigned short MTYPE;           //Ethernet Type for HomePlug, should be 0x88E1
    unsigned char MMV;              //Management Message Version
    unsigned short MMTYPE;          //Management Message Type
    unsigned char FMI[2];           //Fragmentation Management Information, Fragmentation Message Sequence Number
    unsigned char MMENTRY[256];     //Management Message Entry Data
} __attribute__((packed));

//Qualcomm Atheros Vendor Specific MME Format
struct QcaVendorMmeHeader
{
    unsigned char ODA[6];           //Original Destination Address
    unsigned char OSA[6];           //Original source Address
    //unsigned int VLAN Tag;        //IEEE802.1Q VLAN Tag (optional)
    unsigned short MTYPE;           //Ethernet Type for HomePlug, should be 0x88E1
    unsigned char MMV;              //Management Message Version
    unsigned short MMTYPE;          //Management Message Type
    unsigned char OUI[3];           //Fragmentation Management Information, Fragmentation Message Sequence Number
    unsigned char MBODY[1024];      //Management Message Entry Data
} __attribute__((packed));

struct V2gtpHeader                          //8 Bytes (see Figure 25 in DIN 70121)
{
    unsigned char ProtocolVersion;          //0x01: V2GTP version 1, 0x00, 0x02-0xFF reserved
    unsigned char InverseProtocolVersion;   //Equals the <Protocol_Version> XOR 0xFF, 0xFE: V2GTP Version 1
    unsigned short PayloadType;             //0x8001:	EXI encoded V2G Message,
                                            //0x9000:	SDP request message,
                                            //0x9001:	SDP response message,
                                            //0xA000 - 0xFFFF:	Manufacturer specific use
    unsigned int PayloadLength;             //excluding the generic V2GTP header byte
} __attribute__((packed));

int Proc_din_supportedAppProtocolRes(int AcceptFd);
void SHM_Init_din_ChargeParameterDiscoveryRes(struct CcsData *shm_ccs);
void SHM_Init_din_CableCheckRes(struct CcsData *shm_ccs);
void SHM_Init_din_PreChargeRes(struct CcsData *shm_ccs);
void SHM_Init_din_PowerDeliveryRes(struct CcsData *shm_ccs);
void SHM_Init_din_CurrentDemandRes(struct CcsData *shm_ccs);
void SHM_Init_din_WeldingDetectionRes(struct CcsData *shm_ccs);
void SHM_Init_din_SessionStopRes(struct CcsData *shm_ccs);
int OutputCpPwmDuty(unsigned char Duty);
void Check_EVErrorCode(int code);
unsigned char Check_V2G_Flow_Status_pre();
int End_Process();
int SdpUdpConnected();
int V2gTcpConnected();

//System Log
#if SAVE_SYS_LOG_MSG_EVCOMM_SWITCH == ENABLE
    #define SAVE_SYS_LOG_MSG_EVCOMM     StoreLogMsg2
#else
    #define SAVE_SYS_LOG_MSG_EVCOMM(...)
#endif

//Debug Message
#if DEBUG_PRINTF_EVCOMM_SHOW == ENABLE
    //Brief Messages
    #if DEBUG_PRINTF_EVCOMM_BRIEF_SHOW == ENABLE
        #define DEBUG_PRINTF_EVCOMM_BRIEF      printf
    #else
        #define DEBUG_PRINTF_EVCOMM_BRIEF(...)
    #endif

    //Detail Messages
    #if DEBUG_PRINTF_EVCOMM_DETAIL_SHOW == ENABLE
        #define DEBUG_PRINTF_EVCOMM_DETAIL     printf
    #else
        #define DEBUG_PRINTF_EVCOMM_DETAIL(...)
    #endif

    //System Log Messages
    #if DEBUG_PRINTF_EVCOMM_SYSTEM_LOG_SHOW == ENABLE
        #define DEBUG_PRINTF_EVCOMM_SYSTEM_LOG    printf
    #else
        #define DEBUG_PRINTF_EVCOMM_SYSTEM_LOG(...)
    #endif
#else
    #define DEBUG_PRINTF_EVCOMM_BRIEF(...)
    #define DEBUG_PRINTF_EVCOMM_DETAIL(...)
    #define DEBUG_PRINTF_EVCOMM_SYSTEM_LOG(...)
#endif

#endif