#ifndef CAN_DRV_H
#define CAN_DRV_H

/******************************************************************************
Macro definitions
******************************************************************************/
#define R_CAN_GRAMINIT_ON  (0x8UL)
#define R_CAN_GSLPSTS_ON   (0x4UL)
#define R_CAN_GRSTSTS_ON   (0x1UL)
#define R_CAN_CSLPSTS_ON   (0x4UL)
#define R_CAN_CHLTSTS_ON   (0x2UL)
#define R_CAN_CRSTSTS_ON   (0x1UL)
#define R_CAN_TMTRM_ON     (0x8U)
#define R_CAN_TMTR_ON      (0x1U)
#define R_CAN_AFLDAE_ON    (0x100UL)
#define R_CAN_GSLPR_MASK   (0x4UL)
#define R_CAN_GMDC_MASK    (0x3UL)
#define R_CAN_CSLPR_MASK   (0x4UL)
#define R_CAN_CHMDC_MASK   (0x3UL)

/******************************************************************************
Exported global variables and functions (to be accessed by other files)
******************************************************************************/
//void    R_CAN_Init( void );
//bool    R_CAN_Send_TxBuf0(uint32_t can_id, uint8_t dlc, uint8_t msg[8]);
//bool    R_CAN_Receive_RxBuf0(uint32_t * p_can_id, uint8_t * p_dlc, uint8_t msg[8]);

/***************************************************/
/***	    Compressor CAN0 signals  			****/
/*****         RX                              *****/

typedef struct
{	
	unsigned int RcvId:11;
	unsigned int RcvDLC:4;
	
	unsigned int COMP_CompressorVoltage:16;
	
	unsigned int COMP_CompressorCurrent:8;
	
	unsigned int COMP_CompressorSpeed:16;
	
	unsigned int COMP_CompressorState:2;
	
	unsigned int COMP_InternalVoltageFault:1;
	unsigned int COMP_UnderVoltageFault:1;
	unsigned int COMP_OverVoltageFault:1;
	unsigned int COMP_OverCurrentFault:1;
	unsigned int COMP_TemperatureFault:1;
	unsigned int COMP_BusOff:1;
	unsigned int COMP_LossCommunicationWithAC:1;
}COMP_Information_t;

/*****         TX                              *****/

typedef struct
{
	unsigned int RcvId:11;
	unsigned int RcvDLC:4;
	unsigned int AC_CompressorControlCommand:1;
	unsigned int AC_CompressorTargetSpeed:16;
}AC_COMP_Control_t;

/***************************************************/
/***	    MAIN CAN signals  			****/
/*****         TX                              *****/
typedef struct
{	
	unsigned int RcvId:11;
	unsigned int RcvDLC:4;
	
	unsigned int AC_AcState:1;
	unsigned int AC_PtcRelayDriveState:1;
	unsigned int AC_DefrostState:2;
	unsigned int AC_DemistState:2;
	unsigned int AC_IntakeAirState:2;
	unsigned int AC_BlowerLevelState:3;
	unsigned int AC_PTCHighTemperatureSelfProtectionState:1;
}AC_CurrentStatus_t;

typedef struct
{	
	unsigned int RcvId:11;
	unsigned int RcvDLC:4;
	
	unsigned int AC_COMP_CompressorVoltage:16;
	
	unsigned int AC_COMP_CompressorCurrent:8;
	
	unsigned int AC_COMP_CompressorSpeed:16;
	
	unsigned int AC_COMP_CompressorState:2;
}AC_COMP_Information_t;

typedef struct
{	
	unsigned int RcvId:11;
	unsigned int RcvDLC:4;
	
	unsigned int AC_SleepConditionsReady_Reserved:1;
	unsigned int AC_Stayawake_reasons1_Reserved:1;
	unsigned int AC_Stayawake_reasons2_Reserved:1;
	unsigned int AC_Stayawake_reasons3_Reserved:1;
	unsigned int AC_Stayawake_reasons4_Reserved:1;
	unsigned int AC_Stayawake_reasons5_Reserved:1;
}AC_NM_t;

typedef struct
{	
	unsigned int RcvId:11;
	unsigned int RcvDLC:4;
	
	unsigned int AC_DiagEvaporatorTemperatureSensorShortCircuit:1;
	unsigned int AC_DiagEvaporatorTemperatureSensorOpenCircuit	:1;
	unsigned int AC_DiagServoMotorShortCircuit					:1;
	unsigned int AC_DiagServoMotorPositionFault				:1;
	unsigned int AC_DiagLoopMotorShortCircuit					:1;
	unsigned int AC_DiagLoopMotorPositionFault					:1;
	unsigned int AC_DiagBlowermotorShortCircuit				:1;
	unsigned int AC_DiagBlowermotorOpenCircuit					:1;
	unsigned int AC_DiagPTC_PressureSensorShortCircuit			:1;
	unsigned int AC_DiagPTC_PressureSensorOpenCircuit			:1;
	unsigned int AC_DiagPressureSensorShortCircuit				:1;
	unsigned int AC_DiagPressureSensorOpenCircuit				:1;
	unsigned int AC_DiagCoolingPressureTooHight				:1;
	unsigned int AC_DiagCoolingPressureTooLow					:1;
	unsigned int AC_DiagCompressorFault						:1;
	unsigned int AC_DiagCommunicationLostWithVCU				:1;
	unsigned int AC_DiagCommunicationLostWithHMI				:1;
	unsigned int AC_DiagCommunicationLostWithComp				:1;
	unsigned int AC_DiagBusOff									:1;
	unsigned int AC_DiagCOMP_InternalVoltageFault				:1;
	unsigned int AC_DiagCOMP_UnderVoltageFault					:1;
	unsigned int AC_DiagCOMP_OverVoltageFault					:1;
	unsigned int AC_DiagCOMP_OverCurrentFault					:1;
	unsigned int AC_DiagCOMP_TemperatureFault					:1;
	unsigned int AC_DiagCOMP_BusOff							:1;
	unsigned int AC_DiagCOMP_LossCommunicationWithAC			:1;
	
	unsigned char AC_SoftwareVersion;
	unsigned char AC_HardwareVersion;
}AC_Diagnosis_t;

typedef struct
{
	unsigned int RcvId:11;
	unsigned int RcvDLC:4;
	
	unsigned char Data[8];
}AC_DiagResp_t;

/*****         RX                              *****/
typedef struct
{		
	unsigned int RcvId:11;
	unsigned int RcvDLC:4;
	
	unsigned int VCU_AC_EnableCommand:1;
}VCU_DisplayInfo_t;

typedef struct
{	
	unsigned int RcvId:11;
	unsigned int RcvDLC:4;
	
	unsigned int HMI_AcKeyState:3;
	unsigned int HMI_BlowerLevelKey:2;
	unsigned int HMI_IntakeAirKey:1;
}HMI_ControlCommand_t;

typedef struct
{	
	unsigned int RcvId:11;
	unsigned int RcvDLC:4;
	
	unsigned char Data[8];
}TEST_AC_DiagReq_t;

typedef struct
{
	unsigned int RcvId:11;
	unsigned int RcvDLC:4;
	
	unsigned char Data[8];
}TEST_Func_DiagReq_t;


typedef struct {
	unsigned int lword[4];
}can_cre_type;

//#define CAN_RX_RULE_NUM 5
#define CAN_PAGE_RX_RULE_IDX_MASK           0xfU
#define CAN_RX_RULE_PAGE_IDX_BIT_POS        4U
/***************************************************/
/**********************CAN FRAME********************/
typedef struct
{
	unsigned int ID;
	unsigned int * addr;
}Can_Frame_Format;



#define COMP_Information_ID		0x300
#define AC_COMP_Control_ID		0x200
#define AC_CurrentStatus_ID		0x32B
#define AC_COMP_Information_ID	0x35B
#define AC_NM_ID				0x409
#define AC_Diagnosis_ID			0x609
#define AC_DiagResp_ID			0x75B//0x7CE
#define AC_DiagResp_PeriodicDid_ID	0x7AA
#define VCU_DisplayInfo_ID		0x310
#define HMI_ControlCommand_ID	0x348
#define TEST_AC_DiagReq_ID		0x74B//0x7C6
#define TEST_Func_DiagReq_ID	0x7DF

extern volatile COMP_Information_t		COMP_Information	;
extern volatile AC_COMP_Control_t		AC_COMP_Control		;
extern volatile AC_CurrentStatus_t		AC_CurrentStatus	;
extern volatile AC_COMP_Information_t	AC_COMP_Information	;
extern volatile AC_NM_t					AC_NM				;
extern volatile AC_Diagnosis_t			AC_Diagnosis		;
extern volatile AC_DiagResp_t			AC_DiagResp			;
extern volatile AC_DiagResp_t			AC_DiagResp_PeriodicDid;
extern volatile VCU_DisplayInfo_t		VCU_DisplayInfo		;
extern volatile HMI_ControlCommand_t	HMI_ControlCommand	;
extern volatile TEST_AC_DiagReq_t		TEST_AC_DiagReq		;
extern volatile TEST_Func_DiagReq_t	TEST_Func_DiagReq	;
extern const Can_Frame_Format CanBufDsc[];

#endif
