8#ifndef USEREXTENSIONS_SRC_ODRIVECAN_H_
9#define USEREXTENSIONS_SRC_ODRIVECAN_H_
20#define ODRIVE_THREAD_MEM 256
21#define ODRIVE_THREAD_PRIO 25
23enum class ODriveState : uint32_t {
AXIS_STATE_UNDEFINED=0,
AXIS_STATE_IDLE=1,
AXIS_STATE_STARTUP_SEQUENCE=2,
AXIS_STATE_FULL_CALIBRATION_SEQUENCE=3,
AXIS_STATE_MOTOR_CALIBRATION=4,
AXIS_STATE_ENCODER_INDEX_SEARCH=6,
AXIS_STATE_ENCODER_OFFSET_CALIBRATION=7,
AXIS_STATE_CLOSED_LOOP_CONTROL=8,
AXIS_STATE_LOCKIN_SPIN=9,
AXIS_STATE_ENCODER_DIR_FIND=10,
AXIS_STATE_HOMING=11,
AXIS_STATE_ENCODER_HALL_POLARITY_CALIBRATION=12,
AXIS_STATE_ENCODER_HALL_PHASE_CALIBRATION=13};
28enum class ODriveEncoderFlags : uint32_t {
ERROR_NONE = 0,
ERROR_UNSTABLE_GAIN = 0x01,
ERROR_CPR_POLEPAIRS_MISMATCH = 0x02,
ERROR_NO_RESPONSE = 0x04,
ERROR_UNSUPPORTED_ENCODER_MODE = 0x08,
ERROR_ILLEGAL_HALL_STATE = 0x10,
ERROR_INDEX_NOT_FOUND_YET = 0x20,
ERROR_ABS_SPI_TIMEOUT = 0x40,
ERROR_ABS_SPI_COM_FAIL = 0x80,
ERROR_ABS_SPI_NOT_READY = 0x100,
ERROR_HALL_NOT_CALIBRATED_YET = 0x200};
77 uint32_t
getCpr()
override;
@ AXIS_ERROR_MIN_ENDSTOP_PRESSED
@ AXIS_ERROR_ESTOP_REQUESTED
@ AXIS_ERROR_HOMING_WITHOUT_ENDSTOP
@ AXIS_ERROR_WATCHDOG_TIMER_EXPIRED
@ AXIS_ERROR_UNKNOWN_POSITION
@ AXIS_ERROR_INVALID_STATE
@ AXIS_ERROR_MAX_ENDSTOP_PRESSED
@ ERROR_UNSUPPORTED_ENCODER_MODE
@ ERROR_INDEX_NOT_FOUND_YET
@ ERROR_CPR_POLEPAIRS_MISMATCH
@ ERROR_ILLEGAL_HALL_STATE
@ ERROR_HALL_NOT_CALIBRATED_YET
@ ERROR_ABS_SPI_NOT_READY
@ AXIS_STATE_ENCODER_OFFSET_CALIBRATION
@ AXIS_STATE_ENCODER_INDEX_SEARCH
@ AXIS_STATE_STARTUP_SEQUENCE
@ AXIS_STATE_ENCODER_HALL_PHASE_CALIBRATION
@ AXIS_STATE_CLOSED_LOOP_CONTROL
@ AXIS_STATE_ENCODER_DIR_FIND
@ AXIS_STATE_MOTOR_CALIBRATION
@ AXIS_STATE_FULL_CALIBRATION_SEQUENCE
@ AXIS_STATE_ENCODER_HALL_POLARITY_CALIBRATION
@ INPUT_MODE_MIX_CHANNELS
@ CONTROL_MODE_VOLTAGE_CONTROL
@ CONTROL_MODE_POSITION_CONTROL
@ CONTROL_MODE_TORQUE_CONTROL
@ CONTROL_MODE_VELOCITY_CONTROL
virtual bool sendMessage(CAN_tx_msg &msg)=0
const ClassIdentifier getInfo()
Command handlers always have class infos. Works well with ChoosableClass.
static bool isCreatable()
static ClassIdentifier info
static ClassIdentifier info
static bool isCreatable()
const ClassIdentifier getInfo()
Command handlers always have class infos. Works well with ChoosableClass.
void canRxPendCallback(CANPort *port, CAN_rx_msg &msg) override
void requestMsg(uint8_t cmd)
void setState(ODriveState state)
uint32_t lastVoltageUpdate
volatile ODriveLocalState state
void stopMotor() override
void setTorque(float torque)
void setPos(int32_t pos) override
std::string getHelpstring()
const ClassIdentifier getInfo()=0
Command handlers always have class infos. Works well with ChoosableClass.
void saveFlash() override
void restoreFlash() override
void turn(int16_t power) override
void canErrorCallback(CANPort *port, uint32_t errcode)
volatile uint32_t odriveMotorFlags
int32_t getPos() override
bool hasIntegratedEncoder()
float getPos_f() override
Encoder * getEncoder() override
void startMotor() override
bool reloadPosAfterStartup
void sendMsg(uint8_t cmd, T value)
volatile uint32_t odriveEncoderFlags
bool motorReady() override
CommandStatus command(const ParsedCommand &cmd, std::vector< CommandReply > &replies) override
void setMode(ODriveControlMode controlMode, ODriveInputMode inputMode)
volatile ODriveState odriveCurrentState
EncoderType getEncoderType() override
uint32_t getCpr() override
void sendMsg(uint8_t cmd, float value)
volatile uint32_t odriveControllerFlags
static void * memcpy(void *dst, const void *src, size_t n)
uint8_t data[CAN_MSGBUFSIZE]