公司代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

185 lines
5.8 KiB

/*
* msp_DC_CAN.c
*
* Created on: 2024621
* Author: SQ-X
*/
#include <msp_DC_CAN_SWING_Controller.h>
#include "bsp_FDCAN.h"
#include "BHBF_ROBOT.h"
static DHCANopenData0x2E4 dHCANopenData0x2E4;
DH_CAN_Remote* DH_CAN;
int32_t * Send_Left_Compensation;
int32_t * Send_Right_Compensation;
int32_t * Send_BackwardDistance;
int32_t * Send_LaneChangeDistance;
int32_t * Send_Swing_Speed;
int32_t * Send_Swing_Angle;
int32_t * Send_Move_Speed;
int32_t * Send_Robot_Angle;
int32_t* SetSpeed[10];
int32_t* Robot_Move_Speed;
FDCANHandler *DH_CAN_Remote_Controller_Handler;
HardWareController *hardController;
DispacherController *dispacherController;
void DH_CAN_Remote_Controller_intialize(FDCANHandler *Handler)
{
DH_CAN_Remote_Controller_Handler = Handler;
DH_CAN_Remote_Controller_Handler->CAN_Decode = DecodeCAN;
HardWareErrorController->Add_PCOMHardWare(HardWareErrorController,
"DH_CAN_Remote_Controller_1E4", 0,DH_CAN_Remote_Controller_1E4);
HardWareErrorController->Add_PCOMHardWare(HardWareErrorController,
"DH_CAN_Remote_Controller_2E4", 0,DH_CAN_Remote_Controller_2E4);
//周期性运行
dispacherController = Handler->dispacherController;
dispacherController->Add_Dispatcher_List(dispacherController,
SendRobtDataToController_0x364);
dispacherController->Add_Dispatcher_List(dispacherController,
SendRobtDataToController_0x264);
}
void DecodeCAN(uint32_t canID, uint8_t *buffer, uint32_t length)
{
//buffer[0] is CAN ID;
int DH_40022_Flag = (int) canID;
switch (DH_40022_Flag)
{
case 0x701: //心跳700 + NodeID1
//DC_Decoding_Func();
break;
case 0x702: //心跳700 + NodeID2
//DC_Decoding_Func();
break;
case 0x1E4: //1E4 = 484
{
DH_CAN->Front_Back_Move_Value = CAN_Buf[0];
DH_CAN->Left_Right_Turn_Value = CAN_Buf[1];
DH_CAN->Swing_Speed_Value = CAN_Buf[2];
DH_CAN->Swing_Angle_Value = CAN_Buf[3];
DH_CAN->Left_Compensation_Value = CAN_Buf[4];
DH_CAN->Right_Compensation_Value = CAN_Buf[5];
HardWareErrorController->Set_PCOMHardWare(HardWareErrorController,
"DH_CAN_Remote_Controller_1E4", 1);
}
break;
case 0x2E4: //2E4
{
memcpy(&dHCANopenData0x2E4,buffer,8);
DH_CAN->Emergency_Stop = dHCANopenData0x2E4.EmergencyStop;
DH_CAN->Move_Forward = dHCANopenData0x2E4.Forwards;
DH_CAN->Move_Backward = dHCANopenData0x2E4.BackWards;
DH_CAN->Move_Turn_Left = dHCANopenData0x2E4.TurnLeft;
DH_CAN->Move_Turn_Right = dHCANopenData0x2E4.TurnRight;
*Robot_Move_Speed = GetSpeed(dHCANopenData0x2E4);
DH_CAN->Mode_Selection = GetMode(dHCANopenData0x2E4);
DH_CAN->Work_Start = dHCANopenData0x2E4.TaskStart;
DH_CAN->Increase = dHCANopenData0x2E4.Incresss;
DH_CAN->Decrease = dHCANopenData0x2E4.Decresss;
DH_CAN->Lane_Change = dHCANopenData0x2E4.LaneChnge;//换道
DH_CAN->UpWards = dHCANopenData0x2E4.UpWards;
DH_CAN->DownWards = dHCANopenData0x2E4.DownWards;
DH_CAN->Swing_Left = dHCANopenData0x2E4.SwingLeft;
DH_CAN->Swing_Right = dHCANopenData0x2E4.SwingRight;
HardWareErrorController->Set_PCOMHardWare(HardWareErrorController,
"DH_CAN_Remote_Controller_2E4", 1);
}
break;
default:
break;
}
}
uint8_t data_to_Send[8] =
{ 1, 2, 3, 4, 5, 6, 7, 8 };
uint16_t data_temp;
void SendRobtDataToController_0x364() //Send 换道距离, 0x364
{
memset(data_to_Send, 0, sizeof(data_to_Send));
data_temp = (uint16_t)(*Send_Left_Compensation);
memcpy(&data_to_Send[0], &data_temp, 2); //左补偿
data_temp = (uint16_t) (*Send_Right_Compensation);
memcpy(&data_to_Send[2], &data_temp, 2); //右补偿
data_temp = (uint16_t) (*Send_BackwardDistance);
memcpy(&data_to_Send[4], &data_temp, 2); //后退距离
data_temp = (uint16_t) (*Send_LaneChangeDistance);
memcpy(&data_to_Send[6], &data_temp, 2); //换道距离
DH_CAN_Remote_Controller_Handler->CAN_Send(DH_CAN_Remote_Controller_Handler,
0X364, 8, data_to_Send);
//DH_CAN_Remote_Controller_Handler->CAN_Send(DH_CAN_Remote_Controller_Handler,10,8,data);
}
void SendRobtDataToController_0x264()
{
memset(data_to_Send, 0, sizeof(data_to_Send));
//data_temp=(uint16_t)GV.DH_CAN.Send_Angle;
data_temp = (uint16_t) (*Send_Swing_Speed);
memcpy(&data_to_Send[0], &data_temp, 2); //摆速
data_temp = (uint16_t) (*Send_Swing_Angle);
memcpy(&data_to_Send[2], &data_temp, 2); //摆角
data_temp = (uint16_t) (*Send_Move_Speed);
memcpy(&data_to_Send[4], &data_temp, 2); //速度
data_temp = (uint16_t) (*Send_Robot_Angle);//需要知道是不是这个东西
memcpy(&data_to_Send[6], &data_temp, 2); //角度
//DH_40022_FDCANfunction(0X264, 8,data);
DH_CAN_Remote_Controller_Handler->CAN_Send(DH_CAN_Remote_Controller_Handler,
0X264, 8, data_to_Send);
}
int32_t GetSpeed(DHCANopenData0x2E4 dHCANopenData0x2E4)
{
if(dHCANopenData0x2E4.Speed1==1) {return *SetSpeed[0];}
if(dHCANopenData0x2E4.Speed2==1) {return *SetSpeed[1];}
if(dHCANopenData0x2E4.Speed3==1) {return *SetSpeed[2];}
if(dHCANopenData0x2E4.Speed4==1) {return *SetSpeed[3];}
if(dHCANopenData0x2E4.Speed5==1) {return *SetSpeed[4];}
if(dHCANopenData0x2E4.Speed6==1) {return *SetSpeed[5];}
if(dHCANopenData0x2E4.Speed7==1) {return *SetSpeed[6];}
if(dHCANopenData0x2E4.Speed8==1) {return *SetSpeed[7];}
if(dHCANopenData0x2E4.Speed9==1) {return *SetSpeed[8];}
if(dHCANopenData0x2E4.Speed10==1) {return *SetSpeed[9];}
return 0;
}
int32_t GetMode(DHCANopenData0x2E4 dHCANopenData0x2E4)
{
if(dHCANopenData0x2E4.Mode0==1) {return 0;}
if(dHCANopenData0x2E4.Mode1==1) {return 1;}
if(dHCANopenData0x2E4.Mode2==1) {return 2;}
if(dHCANopenData0x2E4.Mode3==1) {return 3;}
if(dHCANopenData0x2E4.Mode4==1) {return 4;}
if(dHCANopenData0x2E4.Mode5==1) {return 5;}
if(dHCANopenData0x2E4.Mode6==1) {return 6;}
if(dHCANopenData0x2E4.Mode7==1) {return 7;}
if(dHCANopenData0x2E4.Mode8==1) {return 8;}
if(dHCANopenData0x2E4.Mode9==1) {return 9;}
if(dHCANopenData0x2E4.Mode10==1) {return 10;}
return -1;
}