Go to the documentation of this file. 1 #ifndef CANOPEN_402_MOTOR_H
2 #define CANOPEN_402_MOTOR_H
7 #include <boost/container/flat_map.hpp>
9 #include <boost/numeric/conversion/cast.hpp>
55 boost::condition_variable
cond_;
70 boost::container::flat_map< std::pair<State402::InternalState, State402::InternalState>,
Op >
transitions_;
72 transitions_.insert(std::make_pair(std::make_pair(from, to), op));
111 uint16_t val = MASK & (1<<bit);
116 uint16_t val = MASK & (1<<bit);
120 bool get(uint8_t bit)
const {
return word_ & (1<<bit); }
123 uint16_t was =
word_;
134 virtual bool start() = 0;
135 virtual bool read(
const uint16_t &sw) = 0;
156 using boost::numeric_cast;
157 using boost::numeric::positive_overflow;
158 using boost::numeric::negative_overflow;
164 catch(negative_overflow&) {
165 ROSCANOPEN_WARN(
"canopen_402",
"Command " << val <<
" does not fit into target, clamping to min limit");
166 target_= std::numeric_limits<T>::min();
168 catch(positive_overflow&) {
169 ROSCANOPEN_WARN(
"canopen_402",
"Command " << val <<
" does not fit into target, clamping to max limit");
170 target_= std::numeric_limits<T>::max();
190 virtual bool read(
const uint16_t &sw) {
return true;}
193 cw = cw.
get() | CW_MASK;
197 cw = cw.
get() & ~CW_MASK;
284 virtual bool start();
285 virtual bool read(
const uint16_t &sw);
298 monitor_mode_(settings.get_optional<bool>(
"monitor_mode", true)),
317 template<
typename T,
typename ...Args>
319 return mode_allocators_.insert(std::make_pair(mode, [args..., mode,
this](){
320 if(isModeSupportedByDevice(mode)) registerMode(mode, ModeSharedPtr(new T(args...)));
369 std::unordered_map<uint16_t, ModeSharedPtr >
modes_;
virtual void handleWrite(LayerStatus &status, const LayerState ¤t_state)
Op(uint16_t to_set, uint16_t to_reset)
std::shared_ptr< MotorBase > MotorBaseSharedPtr
std::atomic< bool > has_target_
canopen::ObjectStorage::Entry< int8_t > op_mode_
canopen::ObjectStorage::Entry< int32_t > target_position_
std::atomic< bool > start_fault_reset_
WordAccessor & operator=(const uint16_t &val)
@ CW_Manufacturer_specific3
canopen::ObjectStorage::Entry< uint16_t > control_word_entry_
virtual MotorBaseSharedPtr allocate(const std::string &name, ObjectStorageSharedPtr storage, const canopen::Settings &settings)
const void error(const std::string &r)
virtual bool setTarget(const double &val)
virtual bool isModeSupported(uint16_t mode)
bool get(uint8_t bit) const
std::function< void()> AllocFuncType
boost::condition_variable cond_
virtual void registerDefaultModes(ObjectStorageSharedPtr storage)
@ SW_Manufacturer_specific0
virtual bool read(const uint16_t &sw)
bool waitForNewState(const time_point &abstime, InternalState &state)
virtual bool isModeSupportedByDevice(uint16_t mode)
ModeForwardHelper< MotorBase::Profiled_Torque, int16_t, 0x6071, 0, 0 > ProfiledTorqueMode
ModeForwardHelper< MotorBase::Cyclic_Synchronous_Position, int32_t, 0x607A, 0, 0 > CyclicSynchronousPositionMode
static const TransitionTable transitions_
ModeForwardHelper< MotorBase::Profiled_Velocity, int32_t, 0x60FF, 0, 0 > ProfiledVelocityMode
void operator()(uint16_t &val) const
@ CW_Operation_mode_specific2
@ CW_Operation_mode_specific1
boost::chrono::high_resolution_clock::time_point time_point
@ Cyclic_Synchronous_Position
canopen::ObjectStorage::Entry< TYPE > target_entry_
const State402::InternalState switching_state_
virtual bool setTarget(const double &val)
static State402::InternalState nextStateForEnabling(State402::InternalState state)
bool error(canopen::LayerStatus &status, const std::string &msg)
canopen::ObjectStorage::Entry< uint32_t > supported_drive_modes_
@ SW_Operation_mode_specific1
std::shared_ptr< Mode > ModeSharedPtr
virtual uint16_t getMode()
@ CW_Manufacturer_specific1
@ SW_Manufacturer_specific1
virtual bool executeHoming(canopen::LayerStatus &status)
virtual bool setTarget(double val)
Motor402(const std::string &name, ObjectStorageSharedPtr storage, const canopen::Settings &settings)
virtual void handleRecover(LayerStatus &status)
DefaultHomingMode(ObjectStorageSharedPtr storage)
@ Cyclic_Synchronous_Torque
#define ROSCANOPEN_ERROR(name, args)
canopen::ObjectStorage::Entry< int8_t > homing_method_
WordAccessor<(1<< Command402::CW_Operation_mode_specific0)|(1<< Command402::CW_Operation_mode_specific1)|(1<< Command402::CW_Operation_mode_specific2)|(1<< Command402::CW_Operation_mode_specific3)> OpModeAccesser
boost::condition_variable mode_cond_
bool switchMode(LayerStatus &status, uint16_t mode)
bool switchState(LayerStatus &status, const State402::InternalState &target)
std::atomic< uint16_t > status_word_
virtual bool write(OpModeAccesser &cw)=0
@ Cyclic_Synchronous_Velocity
std::atomic< State402::InternalState > target_state_
canopen::ObjectStorage::Entry< int8_t > op_mode_display_
WordAccessor(uint16_t &word)
ModeForwardHelper< MotorBase::Cyclic_Synchronous_Torque, int16_t, 0x6071, 0, 0 > CyclicSynchronousTorqueMode
virtual bool write(OpModeAccesser &cw)
virtual void handleRead(LayerStatus &status, const LayerState ¤t_state)
canopen::ObjectStorage::Entry< uint16_t > status_word_entry_
static bool setTransition(uint16_t &cw, const State402::InternalState &from, const State402::InternalState &to, State402::InternalState *next)
@ CW_Manufacturer_specific0
virtual void handleDiag(LayerReport &report)
const Op & get(const State402::InternalState &from, const State402::InternalState &to) const
virtual bool enterModeAndWait(uint16_t mode)
ModeSharedPtr allocMode(uint16_t mode)
ModeForwardHelper(ObjectStorageSharedPtr storage)
@ CW_Operation_mode_specific3
@ SW_Operation_mode_specific0
const boost::chrono::seconds state_switch_timeout_
@ CW_Operation_mode_specific0
@ CW_Manufacturer_specific4
@ SW_Manufacturer_specific2
virtual bool write(Mode::OpModeAccesser &cw)
InternalState read(uint16_t sw)
virtual void handleShutdown(LayerStatus &status)
ModeTargetHelper(uint16_t mode)
ModeForwardHelper< MotorBase::Cyclic_Synchronous_Velocity, int32_t, 0x60FF, 0, 0 > CyclicSynchronousVelocityMode
bool registerMode(uint16_t mode, Args &&... args)
virtual bool read(const uint16_t &sw)
bool readState(LayerStatus &status, const LayerState ¤t_state)
ModeSharedPtr selected_mode_
virtual bool executeHoming(canopen::LayerStatus &status)=0
ProfiledPositionMode(ObjectStorageSharedPtr storage)
std::unordered_map< uint16_t, ModeSharedPtr > modes_
std::atomic< bool > execute_
virtual void handleHalt(LayerStatus &status)
virtual bool write(OpModeAccesser &cw)
virtual bool read(const uint16_t &sw)=0
virtual bool read(const uint16_t &sw)
@ CW_Manufacturer_specific2
std::unordered_map< uint16_t, AllocFuncType > mode_allocators_
ObjectStorage::ObjectStorageSharedPtr ObjectStorageSharedPtr
virtual void handleInit(LayerStatus &status)
#define ROSCANOPEN_WARN(name, args)
boost::condition_variable cond_
boost::container::flat_map< std::pair< State402::InternalState, State402::InternalState >, Op > transitions_
void add(const State402::InternalState &from, const State402::InternalState &to, Op op)
canopen_402
Author(s): Thiago de Freitas
, Mathias Lüdtke
autogenerated on Wed Mar 2 2022 00:52:28