RMUL2025/User/device/can.h

278 lines
6.6 KiB
C
Raw Normal View History

2025-03-09 17:01:52 +08:00
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ----------------------------------------------------------------- */
#include <cmsis_os2.h>
#include <stdbool.h>
#include "bsp\can.h"
#include "component\ahrs.h"
#include "component\user_math.h"
#include "device\device.h"
/* Exported constants ------------------------------------------------------- */
#define CAN_MOTOR_CHASSIS_1_RECV (1 << 0)
#define CAN_MOTOR_CHASSIS_2_RECV (1 << 1)
#define CAN_MOTOR_CHASSIS_3_RECV (1 << 2)
#define CAN_MOTOR_CHASSIS_4_RECV (1 << 3)
#define CAN_MOTOR_GIMBAL_YAW_RECV (1 << 4)
#define CAN_MOTOR_GIMBAL_PIT_RECV (1 << 5)
#define CAN_MOTOR_SHOOT_FRIC1_RECV (1 << 6)
#define CAN_MOTOR_SHOOT_FRIC2_RECV (1 << 7)
#define CAN_MOTOR_SHOOT_TRIG_RECV (1 << 8)
#define CAN_MOTOR_CAP_RECV (1 << 9)
#define CAN_TOF_RECV (1 << 10)
#define CAN_REC_CHASSIS_FINISHED \
(CAN_MOTOR_CHASSIS_1_RECV | CAN_MOTOR_CHASSIS_2_RECV | \
CAN_MOTOR_CHASSIS_3_RECV | CAN_MOTOR_CHASSIS_4_RECV)
#define CAN_REC_GIMBAL_FINISHED \
(CAN_MOTOR_GIMBAL_YAW_RECV | CAN_MOTOR_GIMBAL_PIT_RECV)
#define CAN_REC_SHOOT_FINISHED \
(CAN_MOTOR_SHOOT_FRIC1_RECV | CAN_MOTOR_SHOOT_FRIC2_RECV | \
CAN_MOTOR_SHOOT_TRIG_RECV)
#define CAN_REC_CAP_FINISHED CAN_MOTOR_CAP_RECV
#define CAN_REC_TOF_FINISHED CAN_TOF_RECV
#define CAN_MOTOR_TX_BUF_SIZE (8)
#define CAN_MOTOR_RX_BUF_SIZE (8)
#define CAN_CAP_TX_BUF_SIZE (8)
#define CAN_CAP_RX_BUF_SIZE (8)
#define CAN_TX_BUF_SIZE_MAX \
((CAN_MOTOR_TX_BUF_SIZE > CAN_CAP_TX_BUF_SIZE) ? CAN_MOTOR_TX_BUF_SIZE \
: CAN_CAP_TX_BUF_SIZE)
#define CAN_RX_BUF_SIZE_MAX \
((CAN_MOTOR_RX_BUF_SIZE > CAN_CAP_RX_BUF_SIZE) ? CAN_MOTOR_RX_BUF_SIZE \
: CAN_CAP_RX_BUF_SIZE)
/* 电机最大电流绝对值 */
#define CAN_GM6020_MAX_ABS_CUR (1)
#define CAN_M3508_MAX_ABS_CUR (20)
#define CAN_M2006_MAX_ABS_CUR (10)
/* Exported macro ----------------------------------------------------------- */
/* Exported types ----------------------------------------------------------- */
/* 电机型号 */
typedef enum {
CAN_MOTOR_M2006 = 0,
CAN_MOTOR_M3508,
CAN_MOTOR_GM6020,
} CAN_MotorModel_t;
typedef enum {
CAN_M3508_M1_ID = 0x201, /* 1 */
CAN_M3508_M2_ID = 0x202, /* 2 */
CAN_M3508_M3_ID = 0x203, /* 3 */
CAN_M3508_M4_ID = 0x204, /* 4 */
CAN_M3508_FRIC1_ID = 0x205, /* 5 */
CAN_M3508_FRIC2_ID = 0x206, /* 6 */
CAN_M2006_TRIG_ID = 0x207, /* 8 */
CAN_GM6020_YAW_ID = 0x209, /* 5 */
CAN_GM6020_PIT_ID = 0x20A, /* 6 */
} CAN_MotorId_t;
typedef struct {
BSP_CAN_t chassis;
BSP_CAN_t gimbal;
BSP_CAN_t shoot;
BSP_CAN_t cap;
} CAN_Params_t;
/* 电机反馈信息 */
typedef struct {
float rotor_angle;
float rotor_speed;
float torque_current;
float temp;
} CAN_MotorFeedback_t;
enum CAN_MotorChassis_e {
CAN_MOTOR_CHASSIS_M1 = 0,
CAN_MOTOR_CHASSIS_M2,
CAN_MOTOR_CHASSIS_M3,
CAN_MOTOR_CHASSIS_M4,
CAN_MOTOR_CHASSIS_NUM,
};
enum CAN_MotorGimbal_e {
CAN_MOTOR_GIMBAL_YAW = 0,
CAN_MOTOR_GIMBAL_PIT,
CAN_MOTOR_GIMBAL_NUM,
};
enum CAN_MotorShoot_e {
CAN_MOTOR_SHOOT_FRIC1 = 0,
CAN_MOTOR_SHOOT_FRIC2,
CAN_MOTOR_SHOOT_TRIG,
CAN_MOTORSHOOT_NUM,
};
typedef struct {
uint8_t num;
uint32_t id_start;
} CAN_MotorGroupInit_t;
typedef struct {
CAN_MotorGroupInit_t chassis;
CAN_MotorGroupInit_t gimbal1;
CAN_MotorGroupInit_t gimbal2;
CAN_MotorGroupInit_t shoot1;
CAN_MotorGroupInit_t shoot2;
} CAN_MotorInit_t;
typedef union {
float as_array[4];
struct {
float m1;
float m2;
float m3;
float m4;
} named;
} CAN_ChassisOutput_t;
typedef union {
float as_array[3];
AHRS_Eulr_t named;
} CAN_GimbalOutput_t;
typedef union {
float as_array[3];
struct {
float fric1;
float fric2;
float trig;
} named;
} CAN_ShootOutput_t;
typedef struct {
float power_limit;
} CAN_CapOutput_t;
typedef struct {
CAN_ChassisOutput_t chassis;
CAN_GimbalOutput_t gimbal;
CAN_ShootOutput_t shoot;
CAN_CapOutput_t cap;
} CAN_Output_t;
typedef enum {
CAN_MOTOR_GROUT_CHASSIS = 0,
CAN_MOTOR_GROUT_GIMBAL1,
CAN_MOTOR_GROUT_GIMBAL2,
CAN_MOTOR_GROUT_SHOOT1,
CAN_MOTOR_GROUT_SHOOT2,
CAN_MOTOR_GROUT_CAP,
CAN_MOTOR_GROUT_NUM,
} CAN_MotorGroup_t;
typedef enum {
CAN_CAP_STATUS_OFFLINE,
CAN_CAP_STATUS_RUNNING,
} CAN_CapStatus_t;
typedef union {
CAN_MotorFeedback_t as_array[4];
struct {
CAN_MotorFeedback_t m1;
CAN_MotorFeedback_t m2;
CAN_MotorFeedback_t m3;
CAN_MotorFeedback_t m4;
} named;
} CAN_ChassisMotor_t;
typedef union {
CAN_MotorFeedback_t as_array[2];
struct {
CAN_MotorFeedback_t yaw;
CAN_MotorFeedback_t pit;
} named;
} CAN_GimbalMotor_t;
typedef union {
CAN_MotorFeedback_t as_array[3];
struct {
CAN_MotorFeedback_t fric1;
CAN_MotorFeedback_t fric2;
CAN_MotorFeedback_t trig;
} named;
} CAN_ShootMotor_t;
typedef struct {
float input_volt;
float cap_volt;
float input_curr;
float target_power;
} CAN_CapFeedback_t;
typedef struct {
CAN_RxHeaderTypeDef rx_header;
uint8_t rx_data[CAN_RX_BUF_SIZE_MAX];
} CAN_RawRx_t;
typedef struct {
CAN_TxHeaderTypeDef tx_header;
uint8_t tx_data[CAN_TX_BUF_SIZE_MAX];
} CAN_RawTx_t;
typedef struct {
float percentage;
CAN_CapStatus_t cap_status;
CAN_CapFeedback_t cap_feedback;
} CAN_Capacitor_t;
typedef struct {
CAN_ChassisMotor_t chassis;
CAN_GimbalMotor_t gimbal;
CAN_ShootMotor_t shoot;
} CAN_Motor_t;
typedef struct {
float dist;
uint8_t status;
uint16_t signal_strength;
} CAN_Tof_t;
typedef struct {
uint32_t recive_flag;
CAN_Motor_t motor;
CAN_Capacitor_t cap;
CAN_Tof_t tof;
const CAN_Params_t *param;
struct {
uint32_t chassis;
uint32_t gimbal;
uint32_t shoot;
uint32_t cap;
} mailbox;
osMessageQueueId_t msgq_raw;
} CAN_t;
/* Exported functions prototypes -------------------------------------------- */
int8_t CAN_Init(CAN_t *can, const CAN_Params_t *param);
int8_t CAN_Motor_Control(CAN_MotorGroup_t group, CAN_Output_t *output,
CAN_t *can);
int8_t CAN_StoreMsg(CAN_t *can, CAN_RawRx_t *can_rx);
bool CAN_CheckFlag(CAN_t *can, uint32_t flag);
int8_t CAN_ClearFlag(CAN_t *can, uint32_t flag);
int8_t CAN_Cap_Control(CAN_CapOutput_t *output, CAN_t *can);
void CAN_ResetCapOut(CAN_CapOutput_t *cap_out);
void CAN_Cap_Decode(CAN_CapFeedback_t *feedback, const uint8_t *raw);
void CAN_CAP_HandleOffline(CAN_Capacitor_t *cap, CAN_CapOutput_t *cap_out,
float power_chassis);
void CAN_Tof_Decode(CAN_Tof_t *tof, const uint8_t *raw);
#ifdef __cplusplus
}
#endif