#ifndef DRV_CAN_H
#define DRV_CAN_H

#define FRAME_PRO_0 (0)
#define FRAME_PRO_1 (1)
#define FRAME_PRO_2 (2)
#define FRAME_PRO_3 (3)
#define FRAME_PRO_4 (4)
#define FRAME_PRO_5 (5)
#define FRAME_PRO_6 (6)
#define FRAME_PRO_7 (7)
#define FRAME_PRO_D (FRAME_PRO_0)

#define FRAME_PT_NEED_RSP  (1)
#define FRAME_PT_RSP       (2)
#define FRAME_PT_NO_RSP    (3)


#define PRINTF_TER_ID  (0x45UL)
#define SELF_ID  (0x42UL)
#define CTR_ID   (0x43UL)
#define BROCAST_ID   (0x7FUL)

#define CAN_TX_BUF_MAX    (256)
#define CAN_RX_BUF_MAX    (256)
#define CAN_RX_CTR_BRO_BUF_MAX  (256)
#define CAN_RX_TEST_BRO_BUF_MAX (256)


#define get_index_total_value(x) ((x)?(x):(32))
#define Silent_Enable(x) gpio_bit_write(GPIOA,GPIO_PIN_7,(bit_status)(x))


#pragma  pack (push,1)  
typedef struct
{
	uint32_t other:3;
	uint32_t dest:7;
	uint32_t sour:7;
	uint32_t index:5;
	uint32_t total:5;
	uint32_t rsp:2;
	uint32_t pro:3;
}HEAD;
typedef struct
{
	HEAD head;
	uint8_t* data;
	uint16_t len;
}CAN_FRAME;
#pragma pack(pop)

extern CAN_FRAME can_ctr_self;
extern CAN_FRAME can_ctr_bro;
extern CAN_FRAME can_test_bro;

enum
{
	BMS_1_SELF,
	BMS_1_CUR_VOL_SELF,
	BMS_1_RSP,
	BMS_1_RESEND,
	TIMEOUT_BMS_1_RESEND,
	
	BMS_2_SELF,
	BMS_2_CUR_VOL_SELF,
	BMS_2_RSP,
	BMS_2_RESEND,
	TIMEOUT_BMS_2_RESEND,

	CTR_SELF,
	CTR_RSP,
	CTR_RESEND,
	TIMEOUT_CTR_RESEND,

	ADAS_SELF,
	ADAS_RSP,
	ADAS_RESEND,
	TIMEOUT_ADAS_RESEND,

	
	OTHER_SEND,


	CAN_TEST
};

void CAN_Config_HW(void);

void CAN_Config(void);

uint16_t Get_Data_Can(CAN_FRAME*app_can_frame);

int8_t Send_Data_Can(CAN_FRAME*app_can_frame,uint8_t from);

void Check_Can_Poll(void);

void Can_Stop_Send(void);

#endif


