#ifndef RSCAN_H__
#define RSCAN_H__

/*-----------------use for RH850_F1KM_S1 --------------------*/
#include "RSCAN_Table.h"

typedef enum
{
	RSCAN_CHANNEL_BUF_0 = 0U,
	RSCAN_CHANNEL_BUF_1,
	RSCAN_CHANNEL_BUF_2,
	RSCAN_CHANNEL_BUF_3,
	RSCAN_CHANNEL_BUF_4,
	RSCAN_CHANNEL_BUF_5,
	RSCAN_CHANNEL_BUF_6,
	RSCAN_CHANNEL_BUF_7,
	RSCAN_CHANNEL_BUF_8,
	RSCAN_CHANNEL_BUF_9,
	RSCAN_CHANNEL_BUF_10,
	RSCAN_CHANNEL_BUF_11,
	RSCAN_CHANNEL_BUF_12,
	RSCAN_CHANNEL_BUF_13,
	RSCAN_CHANNEL_BUF_14,
	RSCAN_CHANNEL_BUF_15,
	RSCAN_CHANNEL_BUF_16,
	RSCAN_CHANNEL_BUF_17,
	RSCAN_CHANNEL_BUF_18,
	RSCAN_CHANNEL_BUF_19,
	RSCAN_CHANNEL_BUF_20,
	RSCAN_CHANNEL_BUF_21,
	RSCAN_CHANNEL_BUF_22,
	RSCAN_CHANNEL_BUF_23,
	RSCAN_CHANNEL_BUF_24,
	RSCAN_CHANNEL_BUF_25,
	RSCAN_CHANNEL_BUF_26,
	RSCAN_CHANNEL_BUF_27,
	RSCAN_CHANNEL_BUF_28,
	RSCAN_CHANNEL_BUF_29,
	RSCAN_CHANNEL_BUF_MAX,

} RSCAN_Channel_Buf_en_t;

typedef enum
{
	RSCAN_BUS_IDLE = 0U,
	RSCAN_BUS_OFF,
	RSCAN_BUS_TX,
	RSCAN_BUS_RX,

} RSCAN_Com_Status_en_t;

typedef enum
{
	RSCAN_Baud_Rate_500K = 0U,
	RSCAN_Baud_Rate_250K,
	RSCAN_Baud_Rate_125K,

} RSCAN_Baud_Rate_en_t;

typedef enum
{
	RSCANFD_Baud_Rate_2M = 0U,
	RSCANFD_Baud_Rate_5M,

} RSCANFD_Baud_Rate_en_t;
typedef enum
{
	RSCAN_FRAME_STANDARD = 0U,
	RSCAN_FRAME_EXTEND,

} RSCAN_Frame_en_t;

typedef enum
{
	RSCAN_MODE_DISABLE = 0U,
	RSCAN_MODE_CAN,
	RSCAN_MODE_CANFD,
	RSCAN_MODE_LISTEN,

} RSCAN_Mode_en_t;

typedef void (*RSCAN_Confirm)(uint32_t Identifier, uint8_t TransferStatus);
typedef void (*RSCAN_AbortConfirm)(uint32_t Identifier);
typedef void (*RSCAN_Read_Msg)(uint32_t m_id, uint8_t m_dlc, uint8_t m_Msg[]);

typedef struct
{
	RSCAN_Mode_en_t enRSCANChMode;		   /*通道模式 */
	RSCAN_Baud_Rate_en_t enRSCANChBps;	   /*通道波特率*/
	RSCANFD_Baud_Rate_en_t enRSCANFDChBps; /*CANFD 数据波特率*/
	uint32_t u32RSCANChRuleSize;		   /*通道接收规则条数*/
	RSCAN_Confirm pfnRSCANConfirmCallBack;
	RSCAN_AbortConfirm pfnRSCANAbortConfirmCallBack;
	RSCAN_Read_Msg pfnRSCANReadMsgCallBack;

} RSCAN_Channel_Config_st_t;

typedef struct
{

	RSCAN_Channel_Config_st_t stRSCANCh0;
	RSCAN_Channel_Config_st_t stRSCANCh1;
	RSCAN_Channel_Config_st_t stRSCANCh2;
	RSCAN_Channel_Config_st_t stRSCANCh3;
	RSCAN_Channel_Config_st_t stRSCANCh4;
	RSCAN_Channel_Config_st_t stRSCANCh5;
	// RSCAN_Channel_Config_st_t stRSCANChannel6; /*nonsupport*/
	// RSCAN_Channel_Config_st_t stRSCANChannel7; /*nonsupport*/

} RSCAN0_Config_st_t;

typedef enum
{
	RSCAN_SET_COMPLETE = 0U,
	RSCAN_SET_ERROR_PARAMETER,
	RSCAN_SET_ERROR_MSGFULL,

} RSCAN_SetState_en_t;

typedef enum
{
	RSCAN_INIT_COMPLETE = 0U,
	RSCAN_INIT_ERROR_PARAMETER,
	RSCAN_INIT_ERROR_CHANNEL_0,
	RSCAN_INIT_ERROR_CHANNEL_1,
	RSCAN_INIT_ERROR_CHANNEL_2,
	RSCAN_INIT_ERROR_CHANNEL_3,
	RSCAN_INIT_ERROR_CHANNEL_4,
	RSCAN_INIT_ERROR_CHANNEL_5,
	RSCAN_INIT_ERROR,

} RSCAN_InitState_en_t;

typedef union {
	uint32_t u32CANData[16U];
	uint8_t u8CANData[64U];
} CAN_Data_un_t;

typedef struct
{
	CAN_Data_un_t unCANData;
	uint32_t u32CANID;
	uint8_t u8CANLEN;
	uint8_t u8CANFrameIDE;	/*0: Standard ID . 1: Extended ID */
	uint8_t u8CANFrameType; /*0: CAN   1: CANFD */

} CAN_Frame_st_t;

extern RSCAN_InitState_en_t RSCAN0_CH_Init(const RSCANFD_Filter_st_t pstRSCANFilter[], RSCAN0_Config_st_t *pstRSCANConfig);

extern void RSCAN0_CH0_Receive(CAN_Frame_st_t *pstCANFrame);
extern void RSCAN0_CH1_Receive(CAN_Frame_st_t *pstCANFrame);
extern void RSCAN0_CH2_Receive(CAN_Frame_st_t *pstCANFrame);
extern void RSCAN0_CH3_Receive(CAN_Frame_st_t *pstCANFrame);
extern void RSCAN0_CH4_Receive(CAN_Frame_st_t *pstCANFrame);
extern void RSCAN0_CH5_Receive(CAN_Frame_st_t *pstCANFrame);

extern RSCAN_SetState_en_t RSCAN0_CH0_Set_FIFO0_Data(CAN_Frame_st_t *pstCANFrame);
extern RSCAN_SetState_en_t RSCAN0_CH1_Set_FIFO0_Data(CAN_Frame_st_t *pstCANFrame);
extern RSCAN_SetState_en_t RSCAN0_CH2_Set_FIFO0_Data(CAN_Frame_st_t *pstCANFrame);
extern RSCAN_SetState_en_t RSCAN0_CH3_Set_FIFO0_Data(CAN_Frame_st_t *pstCANFrame);
extern RSCAN_SetState_en_t RSCAN0_CH4_Set_FIFO0_Data(CAN_Frame_st_t *pstCANFrame);
extern RSCAN_SetState_en_t RSCAN0_CH5_Set_FIFO0_Data(CAN_Frame_st_t *pstCANFrame);

extern RSCAN_SetState_en_t RSCAN0_CH0_Set_TXBUF_Data(RSCAN_Channel_Buf_en_t enBufIndex, CAN_Frame_st_t *pstCANFrame);
extern RSCAN_SetState_en_t RSCAN0_CH1_Set_TXBUF_Data(RSCAN_Channel_Buf_en_t enBufIndex, CAN_Frame_st_t *pstCANFrame);
extern RSCAN_SetState_en_t RSCAN0_CH2_Set_TXBUF_Data(RSCAN_Channel_Buf_en_t enBufIndex, CAN_Frame_st_t *pstCANFrame);
extern RSCAN_SetState_en_t RSCAN0_CH3_Set_TXBUF_Data(RSCAN_Channel_Buf_en_t enBufIndex, CAN_Frame_st_t *pstCANFrame);
extern RSCAN_SetState_en_t RSCAN0_CH4_Set_TXBUF_Data(RSCAN_Channel_Buf_en_t enBufIndex, CAN_Frame_st_t *pstCANFrame);
extern RSCAN_SetState_en_t RSCAN0_CH5_Set_TXBUF_Data(RSCAN_Channel_Buf_en_t enBufIndex, CAN_Frame_st_t *pstCANFrame);

extern uint8_t RSCAN0_CH0_Get_Busoff_Status(void);
extern uint8_t RSCAN0_CH1_Get_Busoff_Status(void);
extern uint8_t RSCAN0_CH2_Get_Busoff_Status(void);
extern uint8_t RSCAN0_CH3_Get_Busoff_Status(void);
extern uint8_t RSCAN0_CH4_Get_Busoff_Status(void);
extern uint8_t RSCAN0_CH5_Get_Busoff_Status(void);

extern void RSCAN0_CH0_Busoff_Recover(void);
extern void RSCAN0_CH1_Busoff_Recover(void);
extern void RSCAN0_CH2_Busoff_Recover(void);
extern void RSCAN0_CH3_Busoff_Recover(void);
extern void RSCAN0_CH4_Busoff_Recover(void);
extern void RSCAN0_CH5_Busoff_Recover(void);

extern void RSCAN0_CH0_Abort(RSCAN_Channel_Buf_en_t enBufIndex);
extern void RSCAN0_CH1_Abort(RSCAN_Channel_Buf_en_t enBufIndex);
extern void RSCAN0_CH2_Abort(RSCAN_Channel_Buf_en_t enBufIndex);
extern void RSCAN0_CH3_Abort(RSCAN_Channel_Buf_en_t enBufIndex);
extern void RSCAN0_CH4_Abort(RSCAN_Channel_Buf_en_t enBufIndex);
extern void RSCAN0_CH5_Abort(RSCAN_Channel_Buf_en_t enBufIndex);

extern void RSCAN0_CH0_Sleep_Init(void);
extern void RSCAN0_CH1_Sleep_Init(void);
extern void RSCAN0_CH2_Sleep_Init(void);
extern void RSCAN0_CH3_Sleep_Init(void);
extern void RSCAN0_CH4_Sleep_Init(void);
extern void RSCAN0_CH5_Sleep_Init(void);
extern void RSCAN0_Sleep_Init(void);

extern uint8_t RSCAN0_CH0_TX_Error_Count(void);
extern uint8_t RSCAN0_CH1_TX_Error_Count(void);
extern uint8_t RSCAN0_CH2_TX_Error_Count(void);
extern uint8_t RSCAN0_CH3_TX_Error_Count(void);
extern uint8_t RSCAN0_CH4_TX_Error_Count(void);
extern uint8_t RSCAN0_CH5_TX_Error_Count(void);

extern uint8_t RSCAN0_CH0_RX_Error_Count(void);
extern uint8_t RSCAN0_CH1_RX_Error_Count(void);
extern uint8_t RSCAN0_CH2_RX_Error_Count(void);
extern uint8_t RSCAN0_CH3_RX_Error_Count(void);
extern uint8_t RSCAN0_CH4_RX_Error_Count(void);
extern uint8_t RSCAN0_CH5_RX_Error_Count(void);

extern void RSCAN0_CH0_RX_ISR(void);
extern void RSCAN0_CH1_RX_ISR(void);
extern void RSCAN0_CH2_RX_ISR(void);
extern void RSCAN0_CH3_RX_ISR(void);
extern void RSCAN0_CH4_RX_ISR(void);
extern void RSCAN0_CH5_RX_ISR(void);

extern void RSCAN0_CH0_TX_ISR(void);
extern void RSCAN0_CH1_TX_ISR(void);
extern void RSCAN0_CH2_TX_ISR(void);
extern void RSCAN0_CH3_TX_ISR(void);
extern void RSCAN0_CH4_TX_ISR(void);
extern void RSCAN0_CH5_TX_ISR(void);

#endif