Program Listing for File responses.hpp

Return to documentation for file (include/myactuator_rmd/protocol/responses.hpp)

#ifndef MYACTUATOR_RMD__PROTOCOL__RESPONSES
#define MYACTUATOR_RMD__PROTOCOL__RESPONSES
#pragma once

#include <chrono>
#include <cstdint>

#include "myactuator_rmd/actuator_state/control_mode.hpp"
#include "myactuator_rmd/actuator_state/feedback.hpp"
#include "myactuator_rmd/actuator_state/gains.hpp"
#include "myactuator_rmd/actuator_state/motor_status_1.hpp"
#include "myactuator_rmd/actuator_state/motor_status_2.hpp"
#include "myactuator_rmd/actuator_state/motor_status_3.hpp"
#include "myactuator_rmd/protocol/command_type.hpp"
#include "myactuator_rmd/protocol/single_motor_message.hpp"


namespace myactuator_rmd {

  class GetCanIdResponse: public SingleMotorResponse<CommandType::CAN_ID_SETTING> {
    public:
      GetCanIdResponse() = delete;
      GetCanIdResponse(GetCanIdResponse const&) = default;
      GetCanIdResponse& operator = (GetCanIdResponse const&) = default;
      GetCanIdResponse(GetCanIdResponse&&) = default;
      GetCanIdResponse& operator = (GetCanIdResponse&&) = default;
      using SingleMotorResponse::SingleMotorResponse;

      [[nodiscard]]
      virtual std::uint16_t getCanId() const noexcept;
  };

  class GetAccelerationResponse: public SingleMotorResponse<CommandType::READ_ACCELERATION> {
    public:
      GetAccelerationResponse() = delete;
      GetAccelerationResponse(GetAccelerationResponse const&) = default;
      GetAccelerationResponse& operator = (GetAccelerationResponse const&) = default;
      GetAccelerationResponse(GetAccelerationResponse&&) = default;
      GetAccelerationResponse& operator = (GetAccelerationResponse&&) = default;
      using SingleMotorResponse::SingleMotorResponse;

      [[nodiscard]]
      std::int32_t getAcceleration() const noexcept;
  };

  class GetMultiTurnAngleResponse: public SingleMotorResponse<CommandType::READ_MULTI_TURN_ANGLE> {
    public:
      GetMultiTurnAngleResponse() = delete;
      GetMultiTurnAngleResponse(GetMultiTurnAngleResponse const&) = default;
      GetMultiTurnAngleResponse& operator = (GetMultiTurnAngleResponse const&) = default;
      GetMultiTurnAngleResponse(GetMultiTurnAngleResponse&&) = default;
      GetMultiTurnAngleResponse& operator = (GetMultiTurnAngleResponse&&) = default;
      using SingleMotorResponse::SingleMotorResponse;

      [[nodiscard]]
      float getAngle() const noexcept;
  };

  template <CommandType C>
  class MultiTurnEncoderPositionResponse: public SingleMotorResponse<C> {
    public:
      MultiTurnEncoderPositionResponse() = delete;
      MultiTurnEncoderPositionResponse(MultiTurnEncoderPositionResponse const&) = default;
      MultiTurnEncoderPositionResponse& operator = (MultiTurnEncoderPositionResponse const&) = default;
      MultiTurnEncoderPositionResponse(MultiTurnEncoderPositionResponse&&) = default;
      MultiTurnEncoderPositionResponse& operator = (MultiTurnEncoderPositionResponse&&) = default;
      using SingleMotorResponse<C>::SingleMotorResponse;

      [[nodiscard]]
      std::int32_t getPosition() const noexcept;
  };

  template <CommandType C>
  std::int32_t MultiTurnEncoderPositionResponse<C>::getPosition() const noexcept {
    auto const encoder_position {this->template getAs<std::int32_t>(4)};
    return encoder_position;
  }

  using GetMultiTurnEncoderPositionResponse = MultiTurnEncoderPositionResponse<CommandType::READ_MULTI_TURN_ENCODER_POSITION>;
  using GetMultiTurnEncoderOriginalPositionResponse = MultiTurnEncoderPositionResponse<CommandType::READ_MULTI_TURN_ENCODER_ORIGINAL_POSITION>;
  using GetMultiTurnEncoderZeroOffsetResponse = MultiTurnEncoderPositionResponse<CommandType::READ_MULTI_TURN_ENCODER_ZERO_OFFSET>;

  class GetSingleTurnAngleResponse: public SingleMotorResponse<CommandType::READ_SINGLE_TURN_ANGLE> {
    public:
      GetSingleTurnAngleResponse() = delete;
      GetSingleTurnAngleResponse(GetSingleTurnAngleResponse const&) = default;
      GetSingleTurnAngleResponse& operator = (GetSingleTurnAngleResponse const&) = default;
      GetSingleTurnAngleResponse(GetSingleTurnAngleResponse&&) = default;
      GetSingleTurnAngleResponse& operator = (GetSingleTurnAngleResponse&&) = default;
      using SingleMotorResponse::SingleMotorResponse;

      [[nodiscard]]
      float getAngle() const noexcept;
  };

  class GetSingleTurnEncoderPositionResponse: public SingleMotorResponse<CommandType::READ_SINGLE_TURN_ENCODER> {
    public:
      GetSingleTurnEncoderPositionResponse() = delete;
      GetSingleTurnEncoderPositionResponse(GetSingleTurnEncoderPositionResponse const&) = default;
      GetSingleTurnEncoderPositionResponse& operator = (GetSingleTurnEncoderPositionResponse const&) = default;
      GetSingleTurnEncoderPositionResponse(GetSingleTurnEncoderPositionResponse&&) = default;
      GetSingleTurnEncoderPositionResponse& operator = (GetSingleTurnEncoderPositionResponse&&) = default;
      using SingleMotorResponse::SingleMotorResponse;

      [[nodiscard]]
      std::int16_t getPosition() const noexcept;

      [[nodiscard]]
      std::int16_t getRawPosition() const noexcept;

      [[nodiscard]]
      std::int16_t getOffset() const noexcept;
  };

  using LockBrakeResponse = SingleMotorResponse<CommandType::LOCK_BRAKE>;
  using ReleaseBrakeResponse = SingleMotorResponse<CommandType::RELEASE_BRAKE>;

  template <CommandType C>
  class FeedbackResponse: public SingleMotorResponse<C> {
    public:
      FeedbackResponse() = delete;
      FeedbackResponse(FeedbackResponse const&) = default;
      FeedbackResponse& operator = (FeedbackResponse const&) = default;
      FeedbackResponse(FeedbackResponse&&) = default;
      FeedbackResponse& operator = (FeedbackResponse&&) = default;
      using SingleMotorResponse<C>::SingleMotorResponse;

      [[nodiscard]]
      Feedback getStatus() const noexcept;
  };

  template <CommandType C>
  Feedback FeedbackResponse<C>::getStatus() const noexcept {
    auto const temperature {static_cast<int>(this->template getAs<std::int8_t>(1))};
    auto const current {static_cast<float>(this->template getAs<std::int16_t>(2))*0.01f};
    auto const shaft_speed {static_cast<float>(this->template getAs<std::int16_t>(4))};
    auto const shaft_angle {static_cast<float>(this->template getAs<std::int16_t>(6))};
    return Feedback{temperature, current, shaft_speed, shaft_angle};
  }

  using GetMotorStatus2Response = FeedbackResponse<CommandType::READ_MOTOR_STATUS_2>;
  using SetPositionAbsoluteResponse = FeedbackResponse<CommandType::ABSOLUTE_POSITION_CLOSED_LOOP_CONTROL>;
  using SetTorqueResponse = FeedbackResponse<CommandType::TORQUE_CLOSED_LOOP_CONTROL>;
  using SetVelocityResponse = FeedbackResponse<CommandType::SPEED_CLOSED_LOOP_CONTROL>;

  template <CommandType C>
  class GainsResponse: public SingleMotorResponse<C> {
    public:
      GainsResponse() = delete;
      GainsResponse(GainsResponse const&) = default;
      GainsResponse& operator = (GainsResponse const&) = default;
      GainsResponse(GainsResponse&&) = default;
      GainsResponse& operator = (GainsResponse&&) = default;
      using SingleMotorResponse<C>::SingleMotorResponse;

      [[nodiscard]]
      constexpr Gains getGains() const noexcept;
  };

  template <CommandType C>
  constexpr Gains GainsResponse<C>::getGains() const noexcept {
    auto const current_kp {this->data_[2]};
    auto const current_ki {this->data_[3]};
    auto const speed_kp {this->data_[4]};
    auto const speed_ki {this->data_[5]};
    auto const position_kp {this->data_[6]};
    auto const position_ki {this->data_[7]};
    return Gains{current_kp, current_ki, speed_kp, speed_ki, position_kp, position_ki};
  }

  using GetControllerGainsResponse = GainsResponse<CommandType::READ_PID_PARAMETERS>;
  using SetControllerGainsPersistentlyResponse = GainsResponse<CommandType::WRITE_PID_PARAMETERS_TO_ROM>;
  using SetControllerGainsResponse = GainsResponse<CommandType::WRITE_PID_PARAMETERS_TO_RAM>;

  class GetControlModeResponse: public SingleMotorResponse<CommandType::READ_SYSTEM_OPERATING_MODE> {
    public:
      GetControlModeResponse() = delete;
      GetControlModeResponse(GetControlModeResponse const&) = default;
      GetControlModeResponse& operator = (GetControlModeResponse const&) = default;
      GetControlModeResponse(GetControlModeResponse&&) = default;
      GetControlModeResponse& operator = (GetControlModeResponse&&) = default;
      using SingleMotorResponse::SingleMotorResponse;

      [[nodiscard]]
      constexpr ControlMode getMode() const noexcept;
  };

  constexpr ControlMode GetControlModeResponse::getMode() const noexcept {
    return static_cast<ControlMode>(data_[7]);
  }

  class GetMotorModelResponse: public SingleMotorResponse<CommandType::READ_MOTOR_MODEL> {
    public:
      GetMotorModelResponse() = delete;
      GetMotorModelResponse(GetMotorModelResponse const&) = default;
      GetMotorModelResponse& operator = (GetMotorModelResponse const&) = default;
      GetMotorModelResponse(GetMotorModelResponse&&) = default;
      GetMotorModelResponse& operator = (GetMotorModelResponse&&) = default;
      using SingleMotorResponse::SingleMotorResponse;

      [[nodiscard]]
      std::string getModel() const noexcept;
  };

  class GetMotorPowerResponse: public SingleMotorResponse<CommandType::READ_MOTOR_POWER> {
    public:
      GetMotorPowerResponse() = delete;
      GetMotorPowerResponse(GetMotorPowerResponse const&) = default;
      GetMotorPowerResponse& operator = (GetMotorPowerResponse const&) = default;
      GetMotorPowerResponse(GetMotorPowerResponse&&) = default;
      GetMotorPowerResponse& operator = (GetMotorPowerResponse&&) = default;
      using SingleMotorResponse::SingleMotorResponse;

      [[nodiscard]]
      float getPower() const noexcept;
  };

  class GetMotorStatus1Response: public SingleMotorResponse<CommandType::READ_MOTOR_STATUS_1_AND_ERROR_FLAG> {
    public:
      GetMotorStatus1Response() = delete;
      GetMotorStatus1Response(GetMotorStatus1Response const&) = default;
      GetMotorStatus1Response& operator = (GetMotorStatus1Response const&) = default;
      GetMotorStatus1Response(GetMotorStatus1Response&&) = default;
      GetMotorStatus1Response& operator = (GetMotorStatus1Response&&) = default;
      using SingleMotorResponse::SingleMotorResponse;

      [[nodiscard]]
      MotorStatus1 getStatus() const noexcept;
  };

  class GetMotorStatus3Response: public SingleMotorResponse<CommandType::READ_MOTOR_STATUS_3> {
    public:
      GetMotorStatus3Response() = delete;
      GetMotorStatus3Response(GetMotorStatus3Response const&) = default;
      GetMotorStatus3Response& operator = (GetMotorStatus3Response const&) = default;
      GetMotorStatus3Response(GetMotorStatus3Response&&) = default;
      GetMotorStatus3Response& operator = (GetMotorStatus3Response&&) = default;
      using SingleMotorResponse::SingleMotorResponse;

      [[nodiscard]]
      MotorStatus3 getStatus() const noexcept;
  };

  class GetSystemRuntimeResponse: public SingleMotorResponse<CommandType::READ_SYSTEM_RUNTIME> {
    public:
      GetSystemRuntimeResponse() = delete;
      GetSystemRuntimeResponse(GetSystemRuntimeResponse const&) = default;
      GetSystemRuntimeResponse& operator = (GetSystemRuntimeResponse const&) = default;
      GetSystemRuntimeResponse(GetSystemRuntimeResponse&&) = default;
      GetSystemRuntimeResponse& operator = (GetSystemRuntimeResponse&&) = default;
      using SingleMotorResponse::SingleMotorResponse;

      [[nodiscard]]
      std::chrono::milliseconds getRuntime() const noexcept;
  };

  class GetVersionDateResponse: public SingleMotorResponse<CommandType::READ_SYSTEM_SOFTWARE_VERSION_DATE> {
    public:
      GetVersionDateResponse() = delete;
      GetVersionDateResponse(GetVersionDateResponse const&) = default;
      GetVersionDateResponse& operator = (GetVersionDateResponse const&) = default;
      GetVersionDateResponse(GetVersionDateResponse&&) = default;
      GetVersionDateResponse& operator = (GetVersionDateResponse&&) = default;
      using SingleMotorResponse::SingleMotorResponse;

      [[nodiscard]]
      std::uint32_t getVersion() const noexcept;
  };

  using SetAccelerationResponse = SingleMotorResponse<CommandType::WRITE_ACCELERATION_TO_RAM_AND_ROM>;
  using SetCanIdResponse = SingleMotorResponse<CommandType::CAN_ID_SETTING>;

  class SetCurrentPositionAsEncoderZeroResponse: public SingleMotorResponse<CommandType::WRITE_CURRENT_MULTI_TURN_POSITION_TO_ROM_AS_ZERO> {
    public:
      SetCurrentPositionAsEncoderZeroResponse() = delete;
      SetCurrentPositionAsEncoderZeroResponse(SetCurrentPositionAsEncoderZeroResponse const&) = default;
      SetCurrentPositionAsEncoderZeroResponse& operator = (SetCurrentPositionAsEncoderZeroResponse const&) = default;
      SetCurrentPositionAsEncoderZeroResponse(SetCurrentPositionAsEncoderZeroResponse&&) = default;
      SetCurrentPositionAsEncoderZeroResponse& operator = (SetCurrentPositionAsEncoderZeroResponse&&) = default;
      using SingleMotorResponse::SingleMotorResponse;

      [[nodiscard]]
      std::int32_t getEncoderZero() const noexcept;
  };

  using SetEncoderZeroResponse = SingleMotorRequest<CommandType::WRITE_ENCODER_MULTI_TURN_VALUE_TO_ROM_AS_ZERO>;
  using SetTimeoutResponse = SingleMotorResponse<CommandType::COMMUNICATION_INTERRUPTION_PROTECTION_TIME_SETTING>;
  using ShutdownMotorResponse = SingleMotorResponse<CommandType::SHUTDOWN_MOTOR>;
  using StopMotorResponse = SingleMotorResponse<CommandType::STOP_MOTOR>;

}

#endif // MYACTUATOR_RMD__PROTOCOL__RESPONSES