diff --git a/Firmware/communication/can/can_simple.cpp b/Firmware/communication/can/can_simple.cpp index 904af01cd..563e936ef 100644 --- a/Firmware/communication/can/can_simple.cpp +++ b/Firmware/communication/can/can_simple.cpp @@ -269,7 +269,20 @@ void CANSimple::set_input_torque_callback(Axis& axis, const can_Message_t& msg) } void CANSimple::set_controller_modes_callback(Axis& axis, const can_Message_t& msg) { - axis.controller_.config_.control_mode = static_cast(can_getSignal(msg, 0, 32, true)); + + Controller::ControlMode const mode = static_cast(can_getSignal(msg, 0, 32, true)); + if (mode == Controller::CONTROL_MODE_POSITION_CONTROL) { + float estimate = 0.0f; + if (axis.controller_.config_.circular_setpoints) { + estimate = axis.encoder_.pos_circular_.any().value_or(0.0f); + } else { + estimate = axis.encoder_.pos_estimate_.any().value_or(0.0f); + } + + axis.controller_.set_input_pos_and_steps(estimate); + } + + axis.controller_.config_.control_mode = static_cast(mode); axis.controller_.config_.input_mode = static_cast(can_getSignal(msg, 32, 32, true)); }