/**
  ******************************************************************************
  * @file           : CAN_receive.c
  * @brief          : CAN program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023   FDI company
  * All rights reserved.
  *
  * CAN communication routine file, changes can be added.
  *
  ******************************************************************************
  */
	
#include "CAN_receive.h"
#include "main.h"
uint8_t rximu[64];
uint8_t rxahrs[56];
uint8_t rxinsgps[80];
uint8_t rxstate[112];
uint8_t rxtime[22];
uint8_t rxcan_nine[20][8];
uint8_t can_send=0;
uint8_t can_init=0;
uint8_t can_rece=0;
uint8_t last_flag=0;

extern CAN_HandleTypeDef hcan1;
extern CAN_HandleTypeDef hcan2;

uint8_t RX_BUFFER[8];	

/*!
 *  CAN中断接收函数
 *	CAN interrupts the receive function.
 *	\param[out]	None
 *	\param[in]	hcan
 */
	
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
	CAN_RxHeaderTypeDef RX_Header;																					//定义数据帧的帧头
																																		
	HAL_CAN_GetRxMessage(hcan,CAN_RX_FIFO0,&RX_Header,RX_BUFFER);						//把can接收到的数据帧传入局部变量
  uint8_t i,k;
	static uint8_t imu_flag=0;
	static uint8_t acc_flag=0;
	static uint8_t ins_flag=0;
	static uint8_t sys_flag=0;
  static uint8_t Count_can=0;
	static uint8_t last_num=0;
	static uint8_t tim_flag=0;

				//判断接收各个ID的数据
		if(RX_BUFFER[0]==0xFC && last_num==0xFD) 														//判断有帧头帧尾，上一帧数据的帧尾在这一帧帧头之前
		{
			Count_can=1;	
			if((RX_BUFFER[1]==TYPE_IMU)&&(RX_BUFFER[2]==IMU_LEN))  						//判断IMU_PACKET_ID 0x40
			{
				imu_flag=1;
			}
			if((RX_BUFFER[1]==TYPE_AHRS)&&(RX_BUFFER[2]==AHRS_LEN))						//判断AHRS_PACKET_ID 0x41
			{	
				acc_flag=1;
			}
			if((RX_BUFFER[1]==TYPE_INSGPS)&&(RX_BUFFER[2]==INSGPS_LEN))				//判断INSGPS_PACKET_ID 0x42
			{	
				ins_flag=1;
			}
			if((RX_BUFFER[1]==TYPE_SYSSTATE)&&(RX_BUFFER[2]==SYS_STATE_LEN))  //判断SYS_STATE_PACKET_ID 0x50
			{
				sys_flag=1;
			}
			if((RX_BUFFER[1]==TYPE_FORTIME)&&(RX_BUFFER[2]==FORTIME_LEN)) 		//判断FORTIME_PACKET_ID 0x52
			{
				tim_flag=1;
			}
		}
			last_num=RX_BUFFER[7];										 												//尾帧赋值
		
		//将CAN发送回来的数据存进二进制数组中
		if(Count_can) 																										  //确认数据有效，开始接收数据
	{
		 for(i=0;i<8;i++)
		{ 
			rxcan_nine[Count_can-1][i]=RX_BUFFER[i];	 												//将原始数据存放至二维数组中
		}
	  Count_can=Count_can+1;
	}
	//将二进制数组中的数据存进相应的数据包数组中
	if(imu_flag==1 && Count_can==IMU_CAN)
	{
		Count_can=0;
	  imu_flag=0;
		for(k=0;k<(IMU_CAN-1);k++)																					//IMU数组数据包
		{
			for(i=0;i<8;i++)
			{
				rximu[i+(k*8)]=rxcan_nine[k][i];  
			}
		}
	}
		if(ins_flag==1 && Count_can==INSGPS_CAN)
	{
		Count_can=0;
	  ins_flag=0;
		for(k=0;k<(INSGPS_CAN-1);k++)																				//INSGPS数组数据包
		{
			for(i=0;i<8;i++)
			{
				rxinsgps[i+(k*8)]=rxcan_nine[k][i];  
			}
		}
	}
	if(acc_flag==1 && Count_can==AHRS_CAN)
	{
		Count_can=0;
		acc_flag=0;

		for(k=0;k<(AHRS_CAN-1);k++)																					//AHRS数组数据包
		{
			for(i=0;i<8;i++)
			{
				rxahrs[i+(k*8)]=rxcan_nine[k][i];  
			}
		}
	}
		if(tim_flag==1 && Count_can==FORTIME_CAN)
	{
		Count_can=0;
		tim_flag=0;

		for(k=0;k<(FORTIME_CAN-1);k++)																			//FORTIME数组数据包
		{
			for(i=0;i<8;i++)
			{
				rxtime[i+(k*8)]=rxcan_nine[k][i]; 
			}
		}
	}
	if(sys_flag==1 && Count_can==SYS_STATE_CAN)
	{
		Count_can=0;
		sys_flag=0;

		for(k=0;k<(SYS_STATE_CAN-1);k++)																		//SYS_STATE数组数据包
		{
			for(i=0;i<8;i++)
			{
				rxstate[i+(k*8)]=rxcan_nine[k][i];  
			}
		}
	}
}
																//#include "fdilink_decode.h"
/*****************************************************************************************************************************
*CAN的接收解码例程
*因为发送需要先占用CAN第一包数据中前7个数据所以解码要从RX_BUFFER[7]开始
*#include "fdilink_decode.h"中有每一个ID的每一个数据变量形式，如float对应四个RX_BUFFER
*例程方式选用：串口发送解码自己选择解码方式。
*以下为解码例程：
u8 Can_Hex2Dec(void)
{
	u8 i;
	 if(ahrstype==1)
	{
		if(rxahrs[1]==TYPE_AHRS&&rxahrs[2]==AHRS_LEN)
		{		
		AHRSData_Packet.RollSpeed=DATA_Trans(rxahrs[7],rxahrs[8],rxahrs[9],rxahrs[10]);       //横滚角速度
		AHRSData_Packet.PitchSpeed=DATA_Trans(rxahrs[11],rxahrs[12],rxahrs[13],rxahrs[14]);   //俯仰角速度
		AHRSData_Packet.HeadingSpeed=DATA_Trans(rxahrs[15],rxahrs[16],rxahrs[17],rxahrs[18]); //偏航角速度
			
    AHRSData_Packet.Roll=DATA_Trans(rxahrs[19],rxahrs[20],rxahrs[21],rxahrs[22]);      		//横滚角
		AHRSData_Packet.Pitch=DATA_Trans(rxahrs[23],rxahrs[24],rxahrs[25],rxahrs[26]);     		//俯仰角
		AHRSData_Packet.Heading=DATA_Trans(rxahrs[27],rxahrs[28],rxahrs[29],rxahrs[30]);	 		//偏航角
			
		AHRSData_Packet.Qw=DATA_Trans(rxahrs[31],rxahrs[32],rxahrs[33],rxahrs[34]);  					//四元数
		AHRSData_Packet.Qx=DATA_Trans(rxahrs[35],rxahrs[36],rxahrs[37],rxahrs[38]);
		AHRSData_Packet.Qy=DATA_Trans(rxahrs[39],rxahrs[40],rxahrs[41],rxahrs[42]);
		AHRSData_Packet.Qz=DATA_Trans(rxahrs[43],rxahrs[44],rxahrs[45],rxahrs[46]);
		AHRSData_Packet.Timestamp=timestamp(rxahrs[47],rxahrs[48],rxahrs[49],rxahrs[50]);   	//时间戳
		}
	ahrstype=0;
	}
		if(imutype==1)
	{
		if(rximu[1]==TYPE_IMU&&rximu[2]==IMU_LEN)
		{
			
		IMUData_Packet.gyroscope_x=DATA_Trans(rximu[7],rximu[8],rximu[9],rximu[10]);  				 //角速度
		IMUData_Packet.gyroscope_y=DATA_Trans(rximu[11],rximu[12],rximu[13],rximu[14]);
		IMUData_Packet.gyroscope_z=DATA_Trans(rximu[15],rximu[16],rximu[17],rximu[18]);
			
		IMUData_Packet.accelerometer_x=DATA_Trans(rximu[19],rximu[20],rximu[21],rximu[22]); 	 //线加速度
		IMUData_Packet.accelerometer_y=DATA_Trans(rximu[23],rximu[24],rximu[25],rximu[26]);
		IMUData_Packet.accelerometer_z=DATA_Trans(rximu[27],rximu[28],rximu[29],rximu[30]);

		IMUData_Packet.magnetometer_x=DATA_Trans(rximu[31],rximu[32],rximu[33],rximu[34]);  	 //磁力计数据
		IMUData_Packet.magnetometer_y=DATA_Trans(rximu[35],rximu[36],rximu[37],rximu[38]);
		IMUData_Packet.magnetometer_z=DATA_Trans(rximu[39],rximu[40],rximu[41],rximu[42]);
			
		IMUData_Packet.Timestamp=timestamp(rximu[55],rximu[56],rximu[57],rximu[58]);  				 //时间戳
		}
		imutype=0;
 }
 return 0;
}
*****************************************************************************************************************************/
