From 16aad18448fefe095e4b4a762fa06c78a39d2b7e Mon Sep 17 00:00:00 2001 From: Aaron de los Santos Date: Tue, 8 Jun 2021 22:54:01 -0700 Subject: [PATCH] Created jinja template to autogenerate arduino enums header Created arduino_enums_template.j2 to generate header file containing enums for arduino. Added the header file to Arduino/ODriveArduino/enums.h. This replaces the hardcoded enum defined inside the ODriveArduino class. --- Arduino/ODriveArduino/enums.h | 198 ++++++++++++++++++++++++++++++++ tools/arduino_enums_template.j2 | 22 ++++ 2 files changed, 220 insertions(+) create mode 100644 Arduino/ODriveArduino/enums.h create mode 100644 tools/arduino_enums_template.j2 diff --git a/Arduino/ODriveArduino/enums.h b/Arduino/ODriveArduino/enums.h new file mode 100644 index 00000000..3794d602 --- /dev/null +++ b/Arduino/ODriveArduino/enums.h @@ -0,0 +1,198 @@ +#ifndef arduino_enums_template_h +#define arduino_enums_template_h + +/* TODO: This file is dangerous because the enums could potentially change between API versions. Should transmit as part of the JSON. +** To regenerate this file, nagivate to the top level of the ODrive repository and run: +** python Firmware/interface_generator_stub.py --definitions Firmware/odrive-interface.yaml --template tools/arduino_enums_template.j2 --output Arduino/ODriveArduino/enums.h +*/ + +// ODrive.GpioMode +enum GpioMode { + GPIO_MODE_DIGITAL = 0, + GPIO_MODE_DIGITAL_PULL_UP = 1, + GPIO_MODE_DIGITAL_PULL_DOWN = 2, + GPIO_MODE_ANALOG_IN = 3, + GPIO_MODE_UART_A = 4, + GPIO_MODE_UART_B = 5, + GPIO_MODE_UART_C = 6, + GPIO_MODE_CAN_A = 7, + GPIO_MODE_I2C_A = 8, + GPIO_MODE_SPI_A = 9, + GPIO_MODE_PWM = 10, + GPIO_MODE_ENC0 = 11, + GPIO_MODE_ENC1 = 12, + GPIO_MODE_ENC2 = 13, + GPIO_MODE_MECH_BRAKE = 14, + GPIO_MODE_STATUS = 15, +}; + +// ODrive.StreamProtocolType +enum StreamProtocolType { + STREAM_PROTOCOL_TYPE_FIBRE = 0, + STREAM_PROTOCOL_TYPE_ASCII = 1, + STREAM_PROTOCOL_TYPE_STDOUT = 2, + STREAM_PROTOCOL_TYPE_ASCII_AND_STDOUT = 3, +}; + +// ODrive.Can.Protocol +enum Protocol { + PROTOCOL_SIMPLE = 0x00000001, +}; + +// ODrive.Axis.AxisState +enum AxisState { + 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, +}; + +// ODrive.Encoder.Mode +enum EncoderMode { + ENCODER_MODE_INCREMENTAL = 0, + ENCODER_MODE_HALL = 1, + ENCODER_MODE_SINCOS = 2, + ENCODER_MODE_SPI_ABS_CUI = 256, + ENCODER_MODE_SPI_ABS_AMS = 257, + ENCODER_MODE_SPI_ABS_AEAT = 258, + ENCODER_MODE_SPI_ABS_RLS = 259, + ENCODER_MODE_SPI_ABS_MA732 = 260, +}; + +// ODrive.Controller.ControlMode +enum ControlMode { + CONTROL_MODE_VOLTAGE_CONTROL = 0, + CONTROL_MODE_TORQUE_CONTROL = 1, + CONTROL_MODE_VELOCITY_CONTROL = 2, + CONTROL_MODE_POSITION_CONTROL = 3, +}; + +// ODrive.Controller.InputMode +enum InputMode { + INPUT_MODE_INACTIVE = 0, + INPUT_MODE_PASSTHROUGH = 1, + INPUT_MODE_VEL_RAMP = 2, + INPUT_MODE_POS_FILTER = 3, + INPUT_MODE_MIX_CHANNELS = 4, + INPUT_MODE_TRAP_TRAJ = 5, + INPUT_MODE_TORQUE_RAMP = 6, + INPUT_MODE_MIRROR = 7, + INPUT_MODE_TUNING = 8, +}; + +// ODrive.Motor.MotorType +enum MotorType { + MOTOR_TYPE_HIGH_CURRENT = 0, + MOTOR_TYPE_GIMBAL = 2, + MOTOR_TYPE_ACIM = 3, +}; + +// ODrive.Error +enum ODriveError { + ODRIVE_ERROR_NONE = 0x00000000, + ODRIVE_ERROR_CONTROL_ITERATION_MISSED = 0x00000001, + ODRIVE_ERROR_DC_BUS_UNDER_VOLTAGE = 0x00000002, + ODRIVE_ERROR_DC_BUS_OVER_VOLTAGE = 0x00000004, + ODRIVE_ERROR_DC_BUS_OVER_REGEN_CURRENT = 0x00000008, + ODRIVE_ERROR_DC_BUS_OVER_CURRENT = 0x00000010, + ODRIVE_ERROR_BRAKE_DEADTIME_VIOLATION = 0x00000020, + ODRIVE_ERROR_BRAKE_DUTY_CYCLE_NAN = 0x00000040, + ODRIVE_ERROR_INVALID_BRAKE_RESISTANCE = 0x00000080, +}; + +// ODrive.Can.Error +enum CanError { + CAN_ERROR_NONE = 0x00000000, + CAN_ERROR_DUPLICATE_CAN_IDS = 0x00000001, +}; + +// ODrive.Axis.Error +enum AxisError { + AXIS_ERROR_NONE = 0x00000000, + AXIS_ERROR_INVALID_STATE = 0x00000001, + AXIS_ERROR_WATCHDOG_TIMER_EXPIRED = 0x00000800, + AXIS_ERROR_MIN_ENDSTOP_PRESSED = 0x00001000, + AXIS_ERROR_MAX_ENDSTOP_PRESSED = 0x00002000, + AXIS_ERROR_ESTOP_REQUESTED = 0x00004000, + AXIS_ERROR_HOMING_WITHOUT_ENDSTOP = 0x00020000, + AXIS_ERROR_OVER_TEMP = 0x00040000, + AXIS_ERROR_UNKNOWN_POSITION = 0x00080000, +}; + +// ODrive.Motor.Error +enum MotorError { + MOTOR_ERROR_NONE = 0x00000000, + MOTOR_ERROR_PHASE_RESISTANCE_OUT_OF_RANGE = 0x00000001, + MOTOR_ERROR_PHASE_INDUCTANCE_OUT_OF_RANGE = 0x00000002, + MOTOR_ERROR_DRV_FAULT = 0x00000008, + MOTOR_ERROR_CONTROL_DEADLINE_MISSED = 0x00000010, + MOTOR_ERROR_MODULATION_MAGNITUDE = 0x00000080, + MOTOR_ERROR_CURRENT_SENSE_SATURATION = 0x00000400, + MOTOR_ERROR_CURRENT_LIMIT_VIOLATION = 0x00001000, + MOTOR_ERROR_MODULATION_IS_NAN = 0x00010000, + MOTOR_ERROR_MOTOR_THERMISTOR_OVER_TEMP = 0x00020000, + MOTOR_ERROR_FET_THERMISTOR_OVER_TEMP = 0x00040000, + MOTOR_ERROR_TIMER_UPDATE_MISSED = 0x00080000, + MOTOR_ERROR_CURRENT_MEASUREMENT_UNAVAILABLE = 0x00100000, + MOTOR_ERROR_CONTROLLER_FAILED = 0x00200000, + MOTOR_ERROR_I_BUS_OUT_OF_RANGE = 0x00400000, + MOTOR_ERROR_BRAKE_RESISTOR_DISARMED = 0x00800000, + MOTOR_ERROR_SYSTEM_LEVEL = 0x01000000, + MOTOR_ERROR_BAD_TIMING = 0x02000000, + MOTOR_ERROR_UNKNOWN_PHASE_ESTIMATE = 0x04000000, + MOTOR_ERROR_UNKNOWN_PHASE_VEL = 0x08000000, + MOTOR_ERROR_UNKNOWN_TORQUE = 0x10000000, + MOTOR_ERROR_UNKNOWN_CURRENT_COMMAND = 0x20000000, + MOTOR_ERROR_UNKNOWN_CURRENT_MEASUREMENT = 0x40000000, + MOTOR_ERROR_UNKNOWN_VBUS_VOLTAGE = 0x80000000, + MOTOR_ERROR_UNKNOWN_VOLTAGE_COMMAND = 0x100000000, + MOTOR_ERROR_UNKNOWN_GAINS = 0x200000000, + MOTOR_ERROR_CONTROLLER_INITIALIZING = 0x400000000, + MOTOR_ERROR_UNBALANCED_PHASES = 0x800000000, +}; + +// ODrive.Controller.Error +enum ControllerError { + CONTROLLER_ERROR_NONE = 0x00000000, + CONTROLLER_ERROR_OVERSPEED = 0x00000001, + CONTROLLER_ERROR_INVALID_INPUT_MODE = 0x00000002, + CONTROLLER_ERROR_UNSTABLE_GAIN = 0x00000004, + CONTROLLER_ERROR_INVALID_MIRROR_AXIS = 0x00000008, + CONTROLLER_ERROR_INVALID_LOAD_ENCODER = 0x00000010, + CONTROLLER_ERROR_INVALID_ESTIMATE = 0x00000020, + CONTROLLER_ERROR_INVALID_CIRCULAR_RANGE = 0x00000040, + CONTROLLER_ERROR_SPINOUT_DETECTED = 0x00000080, +}; + +// ODrive.Encoder.Error +enum EncoderError { + ENCODER_ERROR_NONE = 0x00000000, + ENCODER_ERROR_UNSTABLE_GAIN = 0x00000001, + ENCODER_ERROR_CPR_POLEPAIRS_MISMATCH = 0x00000002, + ENCODER_ERROR_NO_RESPONSE = 0x00000004, + ENCODER_ERROR_UNSUPPORTED_ENCODER_MODE = 0x00000008, + ENCODER_ERROR_ILLEGAL_HALL_STATE = 0x00000010, + ENCODER_ERROR_INDEX_NOT_FOUND_YET = 0x00000020, + ENCODER_ERROR_ABS_SPI_TIMEOUT = 0x00000040, + ENCODER_ERROR_ABS_SPI_COM_FAIL = 0x00000080, + ENCODER_ERROR_ABS_SPI_NOT_READY = 0x00000100, + ENCODER_ERROR_HALL_NOT_CALIBRATED_YET = 0x00000200, +}; + +// ODrive.SensorlessEstimator.Error +enum SensorlessEstimatorError { + SENSORLESS_ESTIMATOR_ERROR_NONE = 0x00000000, + SENSORLESS_ESTIMATOR_ERROR_UNSTABLE_GAIN = 0x00000001, + SENSORLESS_ESTIMATOR_ERROR_UNKNOWN_CURRENT_MEASUREMENT = 0x00000002, +}; + +#endif diff --git a/tools/arduino_enums_template.j2 b/tools/arduino_enums_template.j2 new file mode 100644 index 00000000..d7cb9cd7 --- /dev/null +++ b/tools/arduino_enums_template.j2 @@ -0,0 +1,22 @@ +#ifndef arduino_enums_template_h +#define arduino_enums_template_h + +/* TODO: This file is dangerous because the enums could potentially change between API versions. Should transmit as part of the JSON. +** To regenerate this file, nagivate to the top level of the ODrive repository and run: +** python Firmware/interface_generator_stub.py --definitions Firmware/odrive-interface.yaml --template tools/arduino_enums_template.j2 --output Arduino/ODriveArduino/enums.h +*/ + +[%- for _, enum in value_types.items() %] +[%- if enum.is_enum %] + +// [[enum.fullname]] +enum [[(enum.parent.name if enum.name in ['Error', 'Mode'] else '') + enum.name ]] { + [%- for k, value in enum['values'].items() %] + [[((((enum.parent.name if enum.name in ['Error', 'Mode'] else '') + enum.name) | to_macro_case) + "_" + (k | to_macro_case)).ljust(40)]] = [% if enum.is_flags %]0x[['%08x' | format(value.value)]][% else %][[value.value]][% endif %], + [%- endfor %] +}; +[%- endif %] +[%- endfor %] + +#endif +