mirror of
https://github.com/westonrobot/ugv_sdk
synced 2023-04-08 06:32:14 +08:00
393 lines
9.5 KiB
C
393 lines
9.5 KiB
C
/*
|
|
* agx_protocol_v2.h
|
|
*
|
|
* Created on: Nov 04, 2020 13:54
|
|
* Description:
|
|
*
|
|
* Copyright (c) 2020 Weston Robot Pte. Ltd.
|
|
*/
|
|
|
|
#ifndef AGX_PROTOCOL_V2_H
|
|
#define AGX_PROTOCOL_V2_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <stdint.h>
|
|
|
|
// define endianess of the platform
|
|
#if (!defined(USE_LITTLE_ENDIAN) && !defined(USE_BIG_ENDIAN))
|
|
#define USE_LITTLE_ENDIAN
|
|
#endif
|
|
|
|
#ifdef USE_BIG_ENDIAN
|
|
#error "BIG ENDIAN IS CURRENTLY NOT SUPPORTED"
|
|
#endif
|
|
|
|
/*---------------------------- Motor IDs -------------------------------*/
|
|
|
|
#define ACTUATOR1_ID ((uint8_t)0x00)
|
|
#define ACTUATOR2_ID ((uint8_t)0x01)
|
|
#define ACTUATOR3_ID ((uint8_t)0x02)
|
|
#define ACTUATOR4_ID ((uint8_t)0x03)
|
|
#define ACTUATOR5_ID ((uint8_t)0x04)
|
|
#define ACTUATOR6_ID ((uint8_t)0x05)
|
|
#define ACTUATOR7_ID ((uint8_t)0x06)
|
|
#define ACTUATOR8_ID ((uint8_t)0x07)
|
|
|
|
/*--------------------------- Message IDs ------------------------------*/
|
|
|
|
// control group: 0x1
|
|
#define CAN_MSG_MOTION_COMMAND_ID ((uint32_t)0x111)
|
|
#define CAN_MSG_LIGHT_COMMAND_ID ((uint32_t)0x121)
|
|
#define CAN_MSG_BRAKING_COMMAND_ID ((uint32_t)0x131)
|
|
|
|
// state feedback group: 0x2
|
|
#define CAN_MSG_SYSTEM_STATE_ID ((uint32_t)0x211)
|
|
#define CAN_MSG_MOTION_STATE_ID ((uint32_t)0x221)
|
|
#define CAN_MSG_LIGHT_STATE_ID ((uint32_t)0x231)
|
|
#define CAN_MSG_RC_STATE_ID ((uint32_t)0x241)
|
|
|
|
#define CAN_MSG_ACTUATOR1_HS_STATE_ID ((uint32_t)0x251)
|
|
#define CAN_MSG_ACTUATOR2_HS_STATE_ID ((uint32_t)0x252)
|
|
#define CAN_MSG_ACTUATOR3_HS_STATE_ID ((uint32_t)0x253)
|
|
#define CAN_MSG_ACTUATOR4_HS_STATE_ID ((uint32_t)0x254)
|
|
#define CAN_MSG_ACTUATOR5_HS_STATE_ID ((uint32_t)0x255)
|
|
#define CAN_MSG_ACTUATOR6_HS_STATE_ID ((uint32_t)0x256)
|
|
#define CAN_MSG_ACTUATOR7_HS_STATE_ID ((uint32_t)0x257)
|
|
#define CAN_MSG_ACTUATOR8_HS_STATE_ID ((uint32_t)0x258)
|
|
|
|
#define CAN_MSG_ACTUATOR1_LS_STATE_ID ((uint32_t)0x261)
|
|
#define CAN_MSG_ACTUATOR2_LS_STATE_ID ((uint32_t)0x262)
|
|
#define CAN_MSG_ACTUATOR3_LS_STATE_ID ((uint32_t)0x263)
|
|
#define CAN_MSG_ACTUATOR4_LS_STATE_ID ((uint32_t)0x264)
|
|
#define CAN_MSG_ACTUATOR5_LS_STATE_ID ((uint32_t)0x265)
|
|
#define CAN_MSG_ACTUATOR6_LS_STATE_ID ((uint32_t)0x266)
|
|
#define CAN_MSG_ACTUATOR7_LS_STATE_ID ((uint32_t)0x267)
|
|
#define CAN_MSG_ACTUATOR8_LS_STATE_ID ((uint32_t)0x268)
|
|
|
|
#define CAN_MSG_MOTOR_ANGLE_INFO ((uint32_t)0x271)
|
|
#define CAN_MSG_MOTOR_SPEED_INFO ((uint32_t)0x281)
|
|
#define CAN_MSG_CURRENT_CTRL_MODE ((uint32_t)0x291)
|
|
|
|
// sensor data group: 0x3
|
|
#define CAN_MSG_ODOMETRY_ID ((uint32_t)0x311)
|
|
|
|
#define CAN_MSG_IMU_ACCEL_ID ((uint32_t)0x321)
|
|
#define CAN_MSG_IMU_GYRO_ID ((uint32_t)0x322)
|
|
#define CAN_MSG_IMU_EULER_ID ((uint32_t)0x323)
|
|
|
|
#define CAN_MSG_SAFETY_BUMPER_ID ((uint32_t)0x331)
|
|
|
|
#define CAN_MSG_ULTRASONIC_1_ID ((uint32_t)0x341)
|
|
#define CAN_MSG_ULTRASONIC_2_ID ((uint32_t)0x342)
|
|
#define CAN_MSG_ULTRASONIC_3_ID ((uint32_t)0x343)
|
|
#define CAN_MSG_ULTRASONIC_4_ID ((uint32_t)0x344)
|
|
#define CAN_MSG_ULTRASONIC_5_ID ((uint32_t)0x345)
|
|
#define CAN_MSG_ULTRASONIC_6_ID ((uint32_t)0x346)
|
|
#define CAN_MSG_ULTRASONIC_7_ID ((uint32_t)0x347)
|
|
#define CAN_MSG_ULTRASONIC_8_ID ((uint32_t)0x348)
|
|
|
|
#define CAN_MSG_UWB_1_ID ((uint32_t)0x351)
|
|
#define CAN_MSG_UWB_2_ID ((uint32_t)0x352)
|
|
#define CAN_MSG_UWB_3_ID ((uint32_t)0x353)
|
|
#define CAN_MSG_UWB_4_ID ((uint32_t)0x354)
|
|
|
|
#define CAN_MSG_BMS_BASIC_ID ((uint32_t)0x361)
|
|
#define CAN_MSG_BMS_EXTENDED_ID ((uint32_t)0x362)
|
|
|
|
// query/config group: 0x4
|
|
#define CAN_MSG_VERSION_REQUEST_ID ((uint32_t)0x411)
|
|
#define CAN_MSG_VERSION_RESPONSE_ID ((uint32_t)0x41a)
|
|
|
|
#define CAN_MSG_CTRL_MODE_CONFIG_ID ((uint32_t)0x421)
|
|
|
|
#define CAN_MSG_STEER_NEUTRAL_REQUEST_ID ((uint32_t)0x431)
|
|
#define CAN_MSG_STEER_NEUTRAL_RESPONSE_ID ((uint32_t)0x43a)
|
|
|
|
#define CAN_MSG_STATE_RESET_CONFIG_ID ((uint32_t)0x441)
|
|
|
|
/*--------------------- Control/State Constants ------------------------*/
|
|
|
|
#define LIGHT_CMD_CTRL_ALLOWED ((uint8_t)0x01)
|
|
#define LIGHT_CMD_CTRL_DISALLOWED ((uint8_t)0x00)
|
|
|
|
#define VERSION_REQUEST_VALUE ((uint8_t)0x01)
|
|
#define STEER_NEUTRAL_REQUEST_VALUE ((uint8_t)0xee)
|
|
#define STEER_NEUTRAL_RESPONSE_SUCCESS_VALUE ((uint8_t)0xee)
|
|
#define STEER_NEUTRAL_RESPONSE_FAILURE_VALUE ((uint8_t)0xff)
|
|
|
|
/*------------------------ Frame Memory Layout -------------------------*/
|
|
|
|
/* No padding in the struct */
|
|
// reference: https://stackoverflow.com/questions/3318410/pragma-pack-effect
|
|
#pragma pack(push, 1)
|
|
|
|
#ifdef USE_LITTLE_ENDIAN
|
|
typedef struct {
|
|
uint8_t high_byte;
|
|
uint8_t low_byte;
|
|
} struct16_t;
|
|
typedef struct {
|
|
uint8_t msb;
|
|
uint8_t high_byte;
|
|
uint8_t low_byte;
|
|
uint8_t lsb;
|
|
} struct32_t;
|
|
#elif defined(USE_BIG_ENDIAN)
|
|
typedef struct {
|
|
uint8_t low_byte;
|
|
uint8_t high_byte;
|
|
} struct16_t;
|
|
typedef struct {
|
|
uint8_t lsb;
|
|
uint8_t low_byte;
|
|
uint8_t high_byte;
|
|
uint8_t msb;
|
|
} struct32_t;
|
|
#endif
|
|
|
|
// Control messages
|
|
typedef struct {
|
|
struct16_t linear_velocity;
|
|
struct16_t angular_velocity;
|
|
struct16_t lateral_velocity;
|
|
struct16_t steering_angle;
|
|
} MotionCommandFrame;
|
|
|
|
typedef struct {
|
|
uint8_t cmd_ctrl_allowed;
|
|
uint8_t front_light_mode;
|
|
uint8_t front_light_custom;
|
|
uint8_t rear_light_mode;
|
|
uint8_t rear_light_custom;
|
|
uint8_t reserved0;
|
|
uint8_t reserved1;
|
|
uint8_t count;
|
|
} LightCommandFrame;
|
|
|
|
typedef struct {
|
|
uint8_t cmd_ctrl_allowed;
|
|
uint8_t front_light_mode;
|
|
uint8_t front_light_custom;
|
|
uint8_t rear_light_mode;
|
|
uint8_t rear_light_custom;
|
|
uint8_t reserved0;
|
|
uint8_t reserved1;
|
|
uint8_t count;
|
|
} BrakingCommandFrame;
|
|
|
|
// State feedback messages
|
|
typedef struct {
|
|
uint8_t vehicle_state;
|
|
uint8_t control_mode;
|
|
struct16_t battery_voltage;
|
|
struct16_t error_code;
|
|
uint8_t reserved0;
|
|
uint8_t count;
|
|
} SystemStateFrame;
|
|
|
|
typedef struct {
|
|
struct16_t linear_velocity;
|
|
struct16_t angular_velocity;
|
|
struct16_t lateral_velocity;
|
|
struct16_t steering_angle;
|
|
} MotionStateFrame;
|
|
|
|
typedef struct {
|
|
uint8_t cmd_ctrl_allowed;
|
|
uint8_t front_light_mode;
|
|
uint8_t front_light_custom;
|
|
uint8_t rear_light_mode;
|
|
uint8_t rear_light_custom;
|
|
uint8_t reserved0;
|
|
uint8_t reserved1;
|
|
uint8_t count;
|
|
} LightStateFrame;
|
|
|
|
#define RC_SWA_MASK ((uint8_t)0b00000011)
|
|
#define RC_SWA_UP_MASK ((uint8_t)0b00000010)
|
|
#define RC_SWA_DOWN_MASK ((uint8_t)0b00000011)
|
|
|
|
#define RC_SWB_MASK ((uint8_t)0b00001100)
|
|
#define RC_SWB_UP_MASK ((uint8_t)0b00001000)
|
|
#define RC_SWB_MIDDLE_MASK ((uint8_t)0b00000100)
|
|
#define RC_SWB_DOWN_MASK ((uint8_t)0b00001100)
|
|
|
|
#define RC_SWC_MASK ((uint8_t)0b00110000)
|
|
#define RC_SWC_UP_MASK ((uint8_t)0b00100000)
|
|
#define RC_SWC_MIDDLE_MASK ((uint8_t)0b00010000)
|
|
#define RC_SWC_DOWN_MASK ((uint8_t)0b00110000)
|
|
|
|
#define RC_SWD_MASK ((uint8_t)0b11000000)
|
|
#define RC_SWD_UP_MASK ((uint8_t)0b10000000)
|
|
#define RC_SWD_DOWN_MASK ((uint8_t)0b11000000)
|
|
|
|
typedef struct {
|
|
uint8_t sws;
|
|
int8_t stick_right_h;
|
|
int8_t stick_right_v;
|
|
int8_t stick_left_v;
|
|
int8_t stick_left_h;
|
|
int8_t var_a;
|
|
uint8_t reserved0;
|
|
uint8_t count;
|
|
} RcStateFrame;
|
|
|
|
typedef struct {
|
|
struct16_t rpm;
|
|
struct16_t current;
|
|
struct32_t pulse_count;
|
|
} ActuatorHSStateFrame;
|
|
|
|
typedef struct {
|
|
struct16_t driver_voltage;
|
|
struct16_t driver_temperature;
|
|
int8_t motor_temperature;
|
|
uint8_t driver_state;
|
|
uint8_t reserved0;
|
|
uint8_t reserved1;
|
|
} ActuatorLSStateFrame;
|
|
|
|
// sensors
|
|
typedef struct {
|
|
struct32_t left_wheel;
|
|
struct32_t right_wheel;
|
|
} OdometryFrame;
|
|
|
|
typedef struct {
|
|
struct16_t accel_x;
|
|
struct16_t accel_y;
|
|
struct16_t accel_z;
|
|
uint8_t reserverd0;
|
|
uint8_t count;
|
|
} ImuAccelFrame;
|
|
|
|
typedef struct {
|
|
struct16_t gyro_x;
|
|
struct16_t gyro_y;
|
|
struct16_t gyro_z;
|
|
uint8_t reserverd0;
|
|
uint8_t count;
|
|
} ImuGyroFrame;
|
|
|
|
typedef struct {
|
|
struct16_t yaw;
|
|
struct16_t pitch;
|
|
struct16_t roll;
|
|
uint8_t reserverd0;
|
|
uint8_t count;
|
|
} ImuEulerFrame;
|
|
|
|
typedef struct {
|
|
uint8_t trigger_state;
|
|
uint8_t reserved0;
|
|
uint8_t reserved1;
|
|
uint8_t reserved2;
|
|
uint8_t reserved3;
|
|
uint8_t reserved4;
|
|
uint8_t reserved5;
|
|
uint8_t reserved6;
|
|
} SafetyBumperFrame;
|
|
|
|
typedef struct {
|
|
uint8_t distance[8];
|
|
} UltrasonicFrame;
|
|
|
|
typedef struct {
|
|
struct16_t relative_distance;
|
|
struct16_t relative_angle;
|
|
uint8_t is_normal;
|
|
int8_t channels[3];
|
|
} UwbFrame;
|
|
|
|
typedef struct {
|
|
uint8_t battery_soc;
|
|
uint8_t battery_soh;
|
|
struct16_t voltage;
|
|
struct16_t current;
|
|
struct16_t temperature;
|
|
} BmsBasicFrame;
|
|
|
|
typedef struct {
|
|
uint8_t protection_code1;
|
|
uint8_t protection_code2;
|
|
uint8_t protection_code3;
|
|
uint8_t protection_code4;
|
|
uint8_t battery_max_teperature;
|
|
uint8_t battery_min_teperature;
|
|
struct16_t count;
|
|
} BmsExtendedFrame;
|
|
|
|
// query/config
|
|
typedef struct {
|
|
uint8_t request;
|
|
uint8_t reserved0;
|
|
uint8_t reserved1;
|
|
uint8_t reserved2;
|
|
uint8_t reserved3;
|
|
uint8_t reserved4;
|
|
uint8_t reserved5;
|
|
uint8_t reserved6;
|
|
} VersionRequestFrame;
|
|
|
|
typedef struct {
|
|
struct16_t controller_hw_version;
|
|
struct16_t motor_driver_hw_version;
|
|
struct16_t controller_sw_version;
|
|
struct16_t motor_driver_sw_version;
|
|
} VersionResponseFrame;
|
|
|
|
typedef struct {
|
|
uint8_t mode;
|
|
uint8_t reserved0;
|
|
uint8_t reserved1;
|
|
uint8_t reserved2;
|
|
uint8_t reserved3;
|
|
uint8_t reserved4;
|
|
uint8_t reserved5;
|
|
uint8_t reserved6;
|
|
} ControlModeConfigFrame;
|
|
|
|
typedef struct {
|
|
uint8_t set_as_neutral;
|
|
uint8_t reserved0;
|
|
uint8_t reserved1;
|
|
uint8_t reserved2;
|
|
uint8_t reserved3;
|
|
uint8_t reserved4;
|
|
uint8_t reserved5;
|
|
uint8_t reserved6;
|
|
} SteerNeutralRequestFrame;
|
|
|
|
typedef struct {
|
|
uint8_t neutral_set_successful;
|
|
uint8_t reserved0;
|
|
uint8_t reserved1;
|
|
uint8_t reserved2;
|
|
uint8_t reserved3;
|
|
uint8_t reserved4;
|
|
uint8_t reserved5;
|
|
uint8_t reserved6;
|
|
} SteerNeutralResponseFrame;
|
|
|
|
typedef struct {
|
|
uint8_t error_clear_byte;
|
|
uint8_t reserved0;
|
|
uint8_t reserved1;
|
|
uint8_t reserved2;
|
|
uint8_t reserved3;
|
|
uint8_t reserved4;
|
|
uint8_t reserved5;
|
|
uint8_t reserved6;
|
|
} StateResetConfigFrame;
|
|
|
|
#pragma pack(pop)
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* AGX_PROTOCOL_V2_H */
|