#include "include.h"

u8 CAN_DATA[8];
u8 CAN_DATA1[8];
u8 CAN_DATA2[8];
u8 CAN_DATA3[8];
u8 CAN_DATA4[8];
u8 CAN_DATA5[8];
u8 CAN_DATA6[8];

u8 CAN_DATA_CNT;

u32 Init_Flash_Data = 0x12345678;

u8 CAN_RecData[CAN_RecDataMax];
u8 CAN_RecData_i;
u8 CAN_RecData_Toggle;
u8 CAN_RecData_TID;

void CAN_GPIO_Config(u32 RCC_APBnPeriphn, GPIO_TypeDef* GPIOx, u16 GPIO_Pin, u16 GPIO_PinSource, u8 GPIO_AF)
{
	RCC_AHB1PeriphClockCmd(RCC_APBnPeriphn, ENABLE);
	//��ʼ��GPIO
	//���Ÿ���ӳ������
	GPIO_PinAFConfig(GPIOx,GPIO_PinSource,GPIO_AF);//PA11����ΪCAN1
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;			//���ù���
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;		//�������
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;			//����
	GPIO_Init(GPIOx,&GPIO_InitStructure);			//��ʼ��PD0,PD1
}

void CAN_NVIC_Config(u8 NVIC_IRQChannel, u8 pre, u8 sub)
{
	NVIC_InitTypeDef  NVIC_InitStructure;
  NVIC_InitStructure.NVIC_IRQChannel                   = NVIC_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = pre;     // �����ȼ�Ϊ1
  NVIC_InitStructure.NVIC_IRQChannelSubPriority        = sub;            // �����ȼ�Ϊ0
  NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

void CAN_Mod_Config(u32 RCC_APB1Periph, CAN_TypeDef* CANx, u32 EXTID, u32 MaskID)
{
	//u32 EXTID1    = 0X014E550A;
	//u32 MaskId_ID = 0XFFFF0000;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph, ENABLE);
	
	CAN_InitTypeDef CAN_InitStructure;
	CAN_InitStructure.CAN_TTCM = DISABLE;     		//��ʱ�䴥��ͨ��ģʽ
	CAN_InitStructure.CAN_ABOM = DISABLE;     		//�����Զ����߹���  
	CAN_InitStructure.CAN_AWUM = DISABLE;   			//˯��ģʽͨ����������
	CAN_InitStructure.CAN_NART = ENABLE;      		//��ֹ�����Զ�����
	CAN_InitStructure.CAN_RFLM = DISABLE;     		//���IJ�����,�µĸ��Ǿɵ�
	CAN_InitStructure.CAN_TXFP = DISABLE;     		//���ȼ��ɱ��ı�ʶ������
	CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //ģʽ���� CAN_Mode_Normal
	CAN_InitStructure.CAN_SJW  = CAN_SJW_1tq;			//����ͬ����Ծ����Ϊ��ʱ�䵥λ
	CAN_InitStructure.CAN_BS1  = CAN_BS1_8tq;			//ʱ���1ռ��8��ʱ�䵥λ
	CAN_InitStructure.CAN_BS2  = CAN_BS2_5tq;			//ʱ���2ռ��5��ʱ�䵥λ
	CAN_InitStructure.CAN_Prescaler = 6;					//��Ƶϵ��(Fdiv)6  500K
	CAN_Init(CANx, &CAN_InitStructure);     		  //��ʼ��CAN1
	/*
	CAN_FilterInitTypeDef CAN_FilterInitStructure;
	CAN_FilterInitStructure.CAN_FilterNumber         = 0;//������0
	CAN_FilterInitStructure.CAN_FilterMode           = CAN_FilterMode_IdList;// CAN_FilterMode_IdMask
	CAN_FilterInitStructure.CAN_FilterScale          = CAN_FilterScale_32bit;//32λ
	CAN_FilterInitStructure.CAN_FilterIdHigh         = ((EXTID<<3)>>16) & 0xffff;//32λID
	CAN_FilterInitStructure.CAN_FilterIdLow          = ((EXTID<<3)& 0xffff) | CAN_ID_EXT;
	CAN_FilterInitStructure.CAN_FilterMaskIdHigh 		 = ((MaskID<<3)>>16) & 0xffff;//32λID
	CAN_FilterInitStructure.CAN_FilterMaskIdLow      = ((MaskID<<3)& 0xffff) | CAN_ID_EXT;
	CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;//FIFO0
	CAN_FilterInitStructure.CAN_FilterActivation     = ENABLE;//���������0
	CAN_FilterInit(&CAN_FilterInitStructure);//�˲�����ʼ��
	*/
	CAN_FilterInitTypeDef CAN_FilterInitStructure;
	CAN_FilterInitStructure.CAN_FilterNumber         = 0;//������0
	CAN_FilterInitStructure.CAN_FilterMode           = CAN_FilterMode_IdList;// CAN_FilterMode_IdMask
	CAN_FilterInitStructure.CAN_FilterScale          = CAN_FilterScale_32bit;//32λ
	CAN_FilterInitStructure.CAN_FilterIdHigh         = ((EXTID<<3)>>16) & 0xffff;//32λID
	CAN_FilterInitStructure.CAN_FilterIdLow          = ((EXTID<<3)& 0xffff) | CAN_ID_EXT;
	CAN_FilterInitStructure.CAN_FilterMaskIdHigh 		 = ((MaskID<<3)>>16) & 0xffff;//32λID
	CAN_FilterInitStructure.CAN_FilterMaskIdLow      = ((MaskID<<3)& 0xffff) | CAN_ID_EXT;
	CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;//FIFO0
	CAN_FilterInitStructure.CAN_FilterActivation     = ENABLE;//���������0
	CAN_FilterInit(&CAN_FilterInitStructure);//�˲�����ʼ��
	
	CAN_ITConfig(CANx,CAN_IT_FMP0,ENABLE);//FIFO0 ���� ��Ϣ�Һ��ж�.  
}

u8 CAN1_Send_Msg(u8* msg,u32 Can_ID,u8 len)
{
  u8 mbox;
  u16 i = 0;
  CanTxMsg TxMessage;
	
  TxMessage.StdId = 0;      				// ��׼��ʶ��Ϊ0
	TxMessage.ExtId = Can_ID;//0x1f4e5301  0x1f4e5701 // ������չ��ʾ����29λ��
	
  TxMessage.IDE = CAN_ID_EXT;       // ʹ����չ��ʶ��
  TxMessage.RTR = CAN_RTR_DATA;     // ��Ϣ����Ϊ����֡��һ֡8λ
  TxMessage.DLC = len;         			// ������֡��Ϣ
  
	for(i=0;i<len;i++)
	{
		TxMessage.Data[i] = msg[i];  			// ��һ֡��Ϣ      
	}
  mbox = CAN_Transmit(CAN1,&TxMessage); 
  
	i=0;
  while((CAN_TransmitStatus(CAN1,mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))
	{
		i++;//�ȴ����ͽ���
	}
	
  if(i>=0XFFF)return 1;
	return 0;
}

u8 CAN1_Receive_Msg(u8 *buf, u32 *id)
{
  u32 i;
  CanRxMsg RxMessage;
  
	if(CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0; //û�н��յ�����,ֱ���˳� 
  
	CAN_Receive(CAN1, CAN_FIFO0,&RxMessage);					//��ȡ����   
	
	*id = RxMessage.ExtId;
	
  for(i=0;i<RxMessage.DLC;i++)
  {
		buf[i]=RxMessage.Data[i];
  }
  return RxMessage.DLC;
}

//Flash��������
void Send_Flash_Set(u8 num, u8 flag, float value)
{
	int temp;
	CAN_DATA[0] = num; //�������
	CAN_DATA[1] = flag;//������
	
	temp = (int)value;//00000123.00 
	
	/*
	CAN_DATA[2] = (temp/10000000)<<4 | (temp%10000000)/1000000;
	
	temp = temp%1000000;//000123.00 
	CAN_DATA[3] = (temp/100000)<<4   | (temp%100000)  /10000;
	
	temp = temp%10000;//0123.00
	CAN_DATA[4] = (temp/1000)<<4     | (temp%1000)    /100;
	
	temp = temp%100;//23.00
	CAN_DATA[5] = (temp/10)<<4       | (temp%10);
	
	temp        = (value-(int)value)*100;
	CAN_DATA[6] = ((int)temp/10)<<4        | ((int)temp%10);
	*/
	//12345678
	CAN_DATA[2] = (temp/1000000);
	temp = temp%1000000;
	
	CAN_DATA[3] = (temp/10000);
	temp = temp%10000;
	
	CAN_DATA[4] = (temp/100);
	temp = temp%100;
	
	CAN_DATA[5] = temp;
	
	temp = (value-(int)value)*100;
	
	CAN_DATA[6] = temp;
	
	CAN_DATA[7] = 0xC0 + CAN_DATA_CNT++;
	if(CAN_DATA_CNT>=32) CAN_DATA_CNT = 0;
	
	CAN1_Send_Msg(CAN_DATA, CAN_Send_Flash_ID, 8);
}

float Rec_Flash_Set(u8 data[])
{
	float value = 0;
	
	value = (data[2]/16)*10000000 +
					(data[2]%16)*1000000  +
					(data[3]/16)*100000   +
					(data[3]%16)*10000    +
					(data[4]/16)*1000     +
					(data[4]%16)*100      +
					(data[5]/16)*10       +
					(data[5]%16)          +
					(data[6]/16)*0.1      +
					(data[6]%16)*0.01     ;
	
	return value;
}

void Send_CAN_DATA1(void)
{
	CAN_DATA1[0] = (u8)right_thruster.usart_data.rpm;
	CAN_DATA1[1] = (u8)((u16)(right_thruster.usart_data.rpm)>>8)|((u8)(10-right_thruster.twin_data.speed_lim))<<4;
	CAN_DATA1[2] = (u8)left_thruster.usart_data.rpm;
	CAN_DATA1[3] = (u8)((u16)(left_thruster.usart_data.rpm)>>8)|((u8)(10-left_thruster.twin_data.speed_lim))<<4;
//	CAN_DATA1[0] = 100;
//	CAN_DATA1[1] = 0;
//	CAN_DATA1[2] = 100;
//	CAN_DATA1[3] = 0;
	
	CAN_DATA1[4] = 0;
	CAN_DATA1[5] = 0;
	
	CAN_DATA1[6] = 0;
	CAN_DATA1[7] = 0xC0 + CAN_DATA_CNT++;
	if(CAN_DATA_CNT>=32) CAN_DATA_CNT = 0;
	
	CAN1_Send_Msg(CAN_DATA1, CAN_Send_Speed_ID, 8);
}

void Send_CAN_DATA2(void)
{
	CAN_DATA2[0] = 0;
	CAN_DATA2[1] = 0;
	CAN_DATA2[2] = 0;
	CAN_DATA2[3] = 0;
	CAN_DATA2[4] = 0;
	CAN_DATA2[5] = 0;
	
	CAN_DATA2[6] = 3;
	CAN_DATA2[7] = 0xC0 + CAN_DATA_CNT++;
	if(CAN_DATA_CNT>=32) CAN_DATA_CNT = 0;
	
	CAN1_Send_Msg(CAN_DATA2, CAN_Send_Speed_ID, 8);
}

void Send_CAN_DATA3(void)
{
	CAN_DATA3[0] = 0;
	CAN_DATA3[1] = 0;
	CAN_DATA3[2] = 0;
	CAN_DATA3[3] = 0;
	CAN_DATA3[4] = (u8)(left_track_motor.usart_data.rpm);
	CAN_DATA3[5] = (u8)((u16)(left_track_motor.usart_data.rpm)>>8) | ((u8)(10-left_track_motor.twin_data.speed_lim))<<4;
	
	CAN_DATA3[6] = 6;
	CAN_DATA3[7] = 0xC0 + CAN_DATA_CNT++;
	if(CAN_DATA_CNT>=32) CAN_DATA_CNT = 0;
	
	CAN1_Send_Msg(CAN_DATA3, CAN_Send_Speed_ID, 8);
}

void Send_CAN_DATA4(void)
{
	CAN_DATA4[0] = (u8)(right_track_motor.usart_data.rpm);
	CAN_DATA4[1] = (u8)((u16)(right_track_motor.usart_data.rpm)>>8) | ((u8)(10-right_track_motor.twin_data.speed_lim))<<4;
	CAN_DATA4[2] = 0;
	CAN_DATA4[3] = 0;
	CAN_DATA4[4] = 0;
	CAN_DATA4[5] = 0;
	
	CAN_DATA4[6] = 9;
	CAN_DATA4[7] = 0xC0 + CAN_DATA_CNT++; 
	if(CAN_DATA_CNT>=32) CAN_DATA_CNT = 0;
	
	CAN1_Send_Msg(CAN_DATA4, CAN_Send_Speed_ID, 8);
}

void Send_CAN_DATA5(void)
{	
	CAN_DATA5[0] = (u8)(Voltage*10);
	CAN_DATA5[1] = (u8)((u16)(Voltage*10)>>8);
	CAN_DATA5[2] = (u8)(temperature*10);
	CAN_DATA5[3] = (u8)((u16)(temperature*10)>>8);
	
	CAN_DATA5[4] = Motor_err_flag;
	CAN_DATA5[5] = Motor_err_flag>>8;
	
	CAN_DATA5[6] = 12;
	CAN_DATA5[7] = 0xC0 + CAN_DATA_CNT++;
	if(CAN_DATA_CNT>=32) CAN_DATA_CNT = 0;
	
	CAN1_Send_Msg(CAN_DATA5, CAN_Send_Speed_ID, 8);
}

void Send_CAN_DATA6(void)
{
	CAN_DATA6[0] = (u8)light_pwm;
	CAN_DATA6[1] = (u8)(light_pwm>>8);
	CAN_DATA6[2] = usbl_opendown;
	CAN_DATA6[3] = 0;
	CAN_DATA6[4] = 0;
	CAN_DATA6[5] = 0;
	CAN_DATA6[6] = 15;
	CAN_DATA6[7] = 0xC0 + CAN_DATA_CNT++;
	if(CAN_DATA_CNT>=32) CAN_DATA_CNT = 0;
	
	CAN1_Send_Msg(CAN_DATA6, CAN_Send_Speed_ID, 8);
}

void Send_CAN_MOTOR1DATA(void)
{
	static u8 tail1 = 0;
	
	hv_motor1_data[7] = tail1 + 0xC0;
	
	tail1++;
	if(tail1>31) tail1 = 0;
	
	CAN1_Send_Msg(hv_motor1_data, 0x014E650B, 8);
}

void Send_CAN_MOTOR2DATA(void)
{
	static u8 tail2 = 0;
	
	hv_motor2_data[7] = tail2 + 0xC0;
	
	tail2++;
	if(tail2>31) tail2 = 0;
	
	CAN1_Send_Msg(hv_motor2_data, 0x014E660C, 8);
}

void Send_CAN_MOTOR3DATA(void)
{
	static u8 tail3 = 0;
	
	hv_motor3_data[7] = tail3 + 0xC0;
	
	tail3++;
	if(tail3>31) tail3 = 0;
	
	CAN1_Send_Msg(hv_motor3_data, 0x014E670D, 8);
}