Program Listing for File requests.hpp
↰ Return to documentation for file (/tmp/ws/src/myactuator_rmd/include/myactuator_rmd/protocol/requests.hpp
)
#ifndef MYACTUATOR_RMD__PROTOCOL__REQUESTS
#define MYACTUATOR_RMD__PROTOCOL__REQUESTS
#pragma once
#include <chrono>
#include <cstdint>
#include "myactuator_rmd/actuator_state/baud_rate.hpp"
#include "myactuator_rmd/actuator_state/acceleration_type.hpp"
#include "myactuator_rmd/actuator_state/gains.hpp"
#include "myactuator_rmd/protocol/command_type.hpp"
#include "myactuator_rmd/protocol/single_motor_message.hpp"
namespace myactuator_rmd {
using GetAccelerationRequest = SingleMotorRequest<CommandType::READ_ACCELERATION>;
using GetControllerGainsRequest = SingleMotorRequest<CommandType::READ_PID_PARAMETERS>;
using GetControlModeRequest = SingleMotorRequest<CommandType::READ_SYSTEM_OPERATING_MODE>;
using GetMotorModelRequest = SingleMotorRequest<CommandType::READ_MOTOR_MODEL>;
using GetMotorPowerRequest = SingleMotorRequest<CommandType::READ_MOTOR_POWER>;
using GetMotorStatus1Request = SingleMotorRequest<CommandType::READ_MOTOR_STATUS_1_AND_ERROR_FLAG>;
using GetMotorStatus2Request = SingleMotorRequest<CommandType::READ_MOTOR_STATUS_2>;
using GetMotorStatus3Request = SingleMotorRequest<CommandType::READ_MOTOR_STATUS_3>;
using GetMultiTurnAngleRequest = SingleMotorRequest<CommandType::READ_MULTI_TURN_ANGLE>;
using GetMultiTurnEncoderPositionRequest = SingleMotorRequest<CommandType::READ_MULTI_TURN_ENCODER_POSITION>;
using GetMultiTurnEncoderOriginalPositionRequest = SingleMotorRequest<CommandType::READ_MULTI_TURN_ENCODER_ORIGINAL_POSITION>;
using GetMultiTurnEncoderZeroOffsetRequest = SingleMotorRequest<CommandType::READ_MULTI_TURN_ENCODER_ZERO_OFFSET>;
using GetSingleTurnAngleRequest = SingleMotorRequest<CommandType::READ_SINGLE_TURN_ANGLE>;
using GetSingleTurnEncoderPositionRequest = SingleMotorRequest<CommandType::READ_SINGLE_TURN_ENCODER>;
using GetSystemRuntimeRequest = SingleMotorRequest<CommandType::READ_SYSTEM_RUNTIME>;
using GetVersionDateRequest = SingleMotorRequest<CommandType::READ_SYSTEM_SOFTWARE_VERSION_DATE>;
using LockBrakeRequest = SingleMotorRequest<CommandType::LOCK_BRAKE>;
using ReleaseBrakeRequest = SingleMotorRequest<CommandType::RELEASE_BRAKE>;
using ResetRequest = SingleMotorRequest<CommandType::RESET_SYSTEM>;
using SetCurrentPositionAsEncoderZeroRequest = SingleMotorRequest<CommandType::WRITE_CURRENT_MULTI_TURN_POSITION_TO_ROM_AS_ZERO>;
class CanIdRequest: public SingleMotorRequest<CommandType::CAN_ID_SETTING> {
public:
using SingleMotorRequest::SingleMotorRequest;
[[nodiscard]]
bool isWrite() const noexcept;
protected:
CanIdRequest() = default;
CanIdRequest(CanIdRequest const&) = default;
CanIdRequest& operator = (CanIdRequest const&) = default;
CanIdRequest(CanIdRequest&&) = default;
CanIdRequest& operator = (CanIdRequest&&) = default;
};
class GetCanIdRequest: public CanIdRequest {
public:
GetCanIdRequest();
GetCanIdRequest(GetCanIdRequest const&) = default;
GetCanIdRequest& operator = (GetCanIdRequest const&) = default;
GetCanIdRequest(GetCanIdRequest&&) = default;
GetCanIdRequest& operator = (GetCanIdRequest&&) = default;
using CanIdRequest::CanIdRequest;
};
class SetCanIdRequest: public CanIdRequest {
public:
SetCanIdRequest(std::uint16_t const can_id);
SetCanIdRequest(SetCanIdRequest const&) = default;
SetCanIdRequest& operator = (SetCanIdRequest const&) = default;
SetCanIdRequest(SetCanIdRequest&&) = default;
SetCanIdRequest& operator = (SetCanIdRequest&&) = default;
using CanIdRequest::CanIdRequest;
[[nodiscard]]
std::uint16_t getCanId() const noexcept;
};
class SetAccelerationRequest: public SingleMotorRequest<CommandType::WRITE_ACCELERATION_TO_RAM_AND_ROM> {
public:
SetAccelerationRequest(std::uint32_t const acceleration, AccelerationType const mode);
SetAccelerationRequest() = delete;
SetAccelerationRequest(SetAccelerationRequest const&) = default;
SetAccelerationRequest& operator = (SetAccelerationRequest const&) = default;
SetAccelerationRequest(SetAccelerationRequest&&) = default;
SetAccelerationRequest& operator = (SetAccelerationRequest&&) = default;
using SingleMotorRequest::SingleMotorRequest;
[[nodiscard]]
std::uint32_t getAcceleration() const noexcept;
[[nodiscard]]
AccelerationType getMode() const noexcept;
};
class SetBaudRateRequest: public SingleMotorRequest<CommandType::COMMUNICATION_BAUD_RATE_SETTING> {
public:
SetBaudRateRequest(BaudRate const baud_rate);
SetBaudRateRequest(SetBaudRateRequest const&) = default;
SetBaudRateRequest& operator = (SetBaudRateRequest const&) = default;
SetBaudRateRequest(SetBaudRateRequest&&) = default;
SetBaudRateRequest& operator = (SetBaudRateRequest&&) = default;
using SingleMotorRequest::SingleMotorRequest;
[[nodiscard]]
BaudRate getBaudRate() const noexcept;
};
class SetEncoderZeroRequest: public SingleMotorRequest<CommandType::WRITE_ENCODER_MULTI_TURN_VALUE_TO_ROM_AS_ZERO> {
public:
SetEncoderZeroRequest(std::int32_t const encoder_offset);
SetEncoderZeroRequest(SetEncoderZeroRequest const&) = default;
SetEncoderZeroRequest& operator = (SetEncoderZeroRequest const&) = default;
SetEncoderZeroRequest(SetEncoderZeroRequest&&) = default;
SetEncoderZeroRequest& operator = (SetEncoderZeroRequest&&) = default;
using SingleMotorRequest::SingleMotorRequest;
[[nodiscard]]
std::int32_t getEncoderZero() const noexcept;
};
template <CommandType C>
class SetGainsRequest: public SingleMotorRequest<C> {
public:
constexpr SetGainsRequest(Gains const& gains) noexcept;
SetGainsRequest() = delete;
SetGainsRequest(SetGainsRequest const&) = default;
SetGainsRequest& operator = (SetGainsRequest const&) = default;
SetGainsRequest(SetGainsRequest&&) = default;
SetGainsRequest& operator = (SetGainsRequest&&) = default;
using SingleMotorRequest<C>::SingleMotorRequest;
[[nodiscard]]
constexpr Gains getGains() const noexcept;
};
template <CommandType C>
constexpr SetGainsRequest<C>::SetGainsRequest(Gains const& gains) noexcept
: SingleMotorRequest<C>{} {
this->data_[2] = gains.current.kp;
this->data_[3] = gains.current.ki;
this->data_[4] = gains.speed.kp;
this->data_[5] = gains.speed.ki;
this->data_[6] = gains.position.kp;
this->data_[7] = gains.position.ki;
return;
}
template <CommandType C>
constexpr Gains SetGainsRequest<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 SetControllerGainsPersistentlyRequest = SetGainsRequest<CommandType::WRITE_PID_PARAMETERS_TO_ROM>;
using SetControllerGainsRequest = SetGainsRequest<CommandType::WRITE_PID_PARAMETERS_TO_RAM>;
class SetPositionAbsoluteRequest: public SingleMotorRequest<CommandType::ABSOLUTE_POSITION_CLOSED_LOOP_CONTROL> {
public:
SetPositionAbsoluteRequest(float const position, float const max_speed);
SetPositionAbsoluteRequest() = delete;
SetPositionAbsoluteRequest(SetPositionAbsoluteRequest const&) = default;
SetPositionAbsoluteRequest& operator = (SetPositionAbsoluteRequest const&) = default;
SetPositionAbsoluteRequest(SetPositionAbsoluteRequest&&) = default;
SetPositionAbsoluteRequest& operator = (SetPositionAbsoluteRequest&&) = default;
using SingleMotorRequest::SingleMotorRequest;
[[nodiscard]]
float getMaxSpeed() const noexcept;
[[nodiscard]]
float getPosition() const noexcept;
};
class SetTimeoutRequest: public SingleMotorRequest<CommandType::COMMUNICATION_INTERRUPTION_PROTECTION_TIME_SETTING> {
public:
SetTimeoutRequest(std::chrono::milliseconds const& timeout);
SetTimeoutRequest() = delete;
SetTimeoutRequest(SetTimeoutRequest const&) = default;
SetTimeoutRequest& operator = (SetTimeoutRequest const&) = default;
SetTimeoutRequest(SetTimeoutRequest&&) = default;
SetTimeoutRequest& operator = (SetTimeoutRequest&&) = default;
using SingleMotorRequest::SingleMotorRequest;
[[nodiscard]]
std::chrono::milliseconds getTimeout() const noexcept;
};
class SetTorqueRequest: public SingleMotorRequest<CommandType::TORQUE_CLOSED_LOOP_CONTROL> {
public:
SetTorqueRequest(float const current);
SetTorqueRequest() = delete;
SetTorqueRequest(SetTorqueRequest const&) = default;
SetTorqueRequest& operator = (SetTorqueRequest const&) = default;
SetTorqueRequest(SetTorqueRequest&&) = default;
SetTorqueRequest& operator = (SetTorqueRequest&&) = default;
using SingleMotorRequest::SingleMotorRequest;
[[nodiscard]]
float getTorqueCurrent() const noexcept;
};
class SetVelocityRequest: public SingleMotorRequest<CommandType::SPEED_CLOSED_LOOP_CONTROL> {
public:
SetVelocityRequest(float const speed);
SetVelocityRequest() = delete;
SetVelocityRequest(SetVelocityRequest const&) = default;
SetVelocityRequest& operator = (SetVelocityRequest const&) = default;
SetVelocityRequest(SetVelocityRequest&&) = default;
SetVelocityRequest& operator = (SetVelocityRequest&&) = default;
using SingleMotorRequest::SingleMotorRequest;
[[nodiscard]]
float getSpeed() const noexcept;
};
using ShutdownMotorRequest = SingleMotorRequest<CommandType::SHUTDOWN_MOTOR>;
using StopMotorRequest = SingleMotorRequest<CommandType::STOP_MOTOR>;
}
#endif // MYACTUATOR_RMD__PROTOCOL__REQUESTS