HEBI C++ API  3.5.1
info.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "hebi.h"
4 
5 #include <string>
6 
7 #include "color.hpp"
8 #include "gains.hpp"
9 #include "message_helpers.hpp"
10 #include "util.hpp"
11 
12 namespace hebi {
13 
33 class Info final {
34 public:
35  enum class ControlStrategy {
37  Off,
39  DirectPWM,
42  Strategy2,
45  Strategy3,
48  Strategy4,
49  };
50 
51  enum class CalibrationState {
53  Normal,
60  };
61 
62  enum class MstopStrategy {
64  Disabled,
66  MotorOff,
69  };
70 
71  enum class PositionLimitStrategy {
77  MotorOff,
79  Disabled,
80  };
81 
82 protected:
84  class FloatField final {
85  public:
86 #ifndef DOXYGEN_OMIT_INTERNAL
87  FloatField(const HebiInfoRef& internal, HebiInfoFloatField field);
88 #endif // DOXYGEN_OMIT_INTERNAL
89  explicit operator bool() const { return has(); }
103  bool has() const;
106  float get() const;
107 
109  private:
110  const HebiInfoRef& internal_;
111  HebiInfoFloatField const field_;
112  };
113 
119  class HighResAngleField final {
120  public:
121 #ifndef DOXYGEN_OMIT_INTERNAL
122  HighResAngleField(const HebiInfoRef& internal, HebiInfoHighResAngleField field);
123 #endif // DOXYGEN_OMIT_INTERNAL
124  explicit operator bool() const { return has(); }
138  bool has() const;
144  double get() const;
156  void get(int64_t* revolutions, float* radian_offset) const;
157 
159  private:
160  const HebiInfoRef& internal_;
161  HebiInfoHighResAngleField const field_;
162  };
163 
165  class BoolField final {
166  public:
167 #ifndef DOXYGEN_OMIT_INTERNAL
168  BoolField(const HebiInfoRef& internal, HebiInfoBoolField field);
169 #endif // DOXYGEN_OMIT_INTERNAL
170  bool has() const;
174  bool get() const;
175 
177  private:
178  const HebiInfoRef& internal_;
179  HebiInfoBoolField const field_;
180  };
181 
183  class StringField final {
184  public:
185 #ifndef DOXYGEN_OMIT_INTERNAL
186  StringField(HebiInfoPtr internal, HebiInfoStringField field);
187 #endif // DOXYGEN_OMIT_INTERNAL
188  explicit operator bool() const { return has(); }
202  bool has() const;
205  std::string get() const;
206 
208  private:
209  HebiInfoPtr const internal_;
210  HebiInfoStringField const field_;
211  };
212 
214  class FlagField final {
215  public:
216 #ifndef DOXYGEN_OMIT_INTERNAL
217  FlagField(const HebiInfoRef& internal, HebiInfoFlagField field);
218 #endif // DOXYGEN_OMIT_INTERNAL
219  explicit operator bool() const { return has(); }
233  bool has() const;
234 
236  private:
237  const HebiInfoRef& internal_;
238  HebiInfoFlagField const field_;
239  };
240 
242  template<typename T>
243  class EnumField final {
244  public:
245 #ifndef DOXYGEN_OMIT_INTERNAL
246  EnumField(const HebiInfoRef& internal, HebiInfoEnumField field) : internal_(internal), field_(field) {}
247 #endif // DOXYGEN_OMIT_INTERNAL
248  explicit operator bool() const { return has(); }
262  bool has() const {
263  return (enumGetter(internal_, field_, nullptr) == HebiStatusSuccess);
264  }
267  T get() const {
268  int32_t ret{};
269  enumGetter(internal_, field_, &ret);
270  return static_cast<T>(ret);
271  }
272 
274  private:
275  const HebiInfoRef& internal_;
276  HebiInfoEnumField const field_;
277  };
278 
280  class IoBank final {
281  public:
282 #ifndef DOXYGEN_OMIT_INTERNAL
283  IoBank(HebiInfoPtr internal, HebiInfoRef& internal_ref, HebiInfoIoPinBank bank);
284 #endif // DOXYGEN_OMIT_INTERNAL
285  bool hasLabel(size_t pinNumber) const;
296  std::string getLabel(size_t pinNumber) const;
297 
299  private:
300  HebiInfoPtr internal_;
301  HebiInfoRef& internal_ref_;
302  HebiInfoIoPinBank const bank_;
303  };
305  class LedField final {
306  public:
307 #ifndef DOXYGEN_OMIT_INTERNAL
308  LedField(const HebiInfoRef& internal, HebiInfoLedField field);
309 #endif // DOXYGEN_OMIT_INTERNAL
310  explicit operator bool() const { return hasColor(); }
324  bool hasColor() const;
326  Color getColor() const;
327 
329  private:
330  const HebiInfoRef& internal_;
331  HebiInfoLedField const field_;
332  };
333 
335  class Io final {
336  public:
337 #ifndef DOXYGEN_OMIT_INTERNAL
338  Io(HebiInfoPtr internal, HebiInfoRef& internal_ref)
339  : a_(internal, internal_ref, HebiInfoIoBankA),
340  b_(internal, internal_ref, HebiInfoIoBankB),
341  c_(internal, internal_ref, HebiInfoIoBankC),
342  d_(internal, internal_ref, HebiInfoIoBankD),
343  e_(internal, internal_ref, HebiInfoIoBankE),
344  f_(internal, internal_ref, HebiInfoIoBankF) {}
345 #endif // DOXYGEN_OMIT_INTERNAL
346 
347  // With all submessage and field getters: Note that the returned reference
348  // should not be used after the lifetime of this parent.
349 
350  // Subfields ----------------
351 
353  IoBank& a() { return a_; }
355  const IoBank& a() const { return a_; }
357  IoBank& b() { return b_; }
359  const IoBank& b() const { return b_; }
361  IoBank& c() { return c_; }
363  const IoBank& c() const { return c_; }
365  IoBank& d() { return d_; }
367  const IoBank& d() const { return d_; }
369  IoBank& e() { return e_; }
371  const IoBank& e() const { return e_; }
373  IoBank& f() { return f_; }
375  const IoBank& f() const { return f_; }
376 
378  private:
379  IoBank a_;
380  IoBank b_;
381  IoBank c_;
382  IoBank d_;
383  IoBank e_;
384  IoBank f_;
385  };
386 
388 
390  class Settings final {
391  protected:
393  class Actuator final {
394  public:
395 #ifndef DOXYGEN_OMIT_INTERNAL
396  Actuator(const HebiInfoRef& internal)
397  : position_gains_(internal, HebiInfoFloatPositionKp, HebiInfoBoolPositionDOnError),
398  velocity_gains_(internal, HebiInfoFloatVelocityKp, HebiInfoBoolVelocityDOnError),
399  effort_gains_(internal, HebiInfoFloatEffortKp, HebiInfoBoolEffortDOnError),
400  spring_constant_(internal, HebiInfoFloatSpringConstant),
401  velocity_limit_min_(internal, HebiInfoFloatVelocityLimitMin),
402  velocity_limit_max_(internal, HebiInfoFloatVelocityLimitMax),
403  effort_limit_min_(internal, HebiInfoFloatEffortLimitMin),
404  effort_limit_max_(internal, HebiInfoFloatEffortLimitMax),
405  position_limit_min_(internal, HebiInfoHighResAnglePositionLimitMin),
406  position_limit_max_(internal, HebiInfoHighResAnglePositionLimitMax),
407  control_strategy_(internal, HebiInfoEnumControlStrategy),
408  mstop_strategy_(internal, HebiInfoEnumMstopStrategy),
409  min_position_limit_strategy_(internal, HebiInfoEnumMinPositionLimitStrategy),
410  max_position_limit_strategy_(internal, HebiInfoEnumMaxPositionLimitStrategy) {}
411 #endif // DOXYGEN_OMIT_INTERNAL
412 
413  // With all submessage and field getters: Note that the returned reference
414  // should not be used after the lifetime of this parent.
415 
416  // Submessages ----------------
417 
419  const InfoGains& positionGains() const { return position_gains_; }
421  const InfoGains& velocityGains() const { return velocity_gains_; }
423  const InfoGains& effortGains() const { return effort_gains_; }
424 
425  // Subfields ----------------
426 
428  const FloatField& springConstant() const { return spring_constant_; }
430  const FloatField& velocityLimitMin() const { return velocity_limit_min_; }
432  const FloatField& velocityLimitMax() const { return velocity_limit_max_; }
434  const FloatField& effortLimitMin() const { return effort_limit_min_; }
436  const FloatField& effortLimitMax() const { return effort_limit_max_; }
438  const HighResAngleField& positionLimitMin() const { return position_limit_min_; }
440  const HighResAngleField& positionLimitMax() const { return position_limit_max_; }
442  const EnumField<ControlStrategy>& controlStrategy() const { return control_strategy_; }
444  const EnumField<MstopStrategy>& mstopStrategy() const { return mstop_strategy_; }
446  const EnumField<PositionLimitStrategy>& minPositionLimitStrategy() const { return min_position_limit_strategy_; }
448  const EnumField<PositionLimitStrategy>& maxPositionLimitStrategy() const { return max_position_limit_strategy_; }
449 
451  private:
452  InfoGains position_gains_;
453  InfoGains velocity_gains_;
454  InfoGains effort_gains_;
455 
456  FloatField spring_constant_;
457  FloatField velocity_limit_min_;
458  FloatField velocity_limit_max_;
459  FloatField effort_limit_min_;
460  FloatField effort_limit_max_;
461  HighResAngleField position_limit_min_;
462  HighResAngleField position_limit_max_;
463  EnumField<ControlStrategy> control_strategy_;
464  EnumField<MstopStrategy> mstop_strategy_;
465  EnumField<PositionLimitStrategy> min_position_limit_strategy_;
466  EnumField<PositionLimitStrategy> max_position_limit_strategy_;
467  };
468 
470  class Imu final {
471  public:
472 #ifndef DOXYGEN_OMIT_INTERNAL
473  Imu(const HebiInfoRef& internal)
474  : accel_includes_gravity_(internal, HebiInfoBoolAccelIncludesGravity) {}
475 #endif // DOXYGEN_OMIT_INTERNAL
476 
477  // With all submessage and field getters: Note that the returned reference
478  // should not be used after the lifetime of this parent.
479 
480  // Subfields ----------------
481 
483  const BoolField& accelIncludesGravity() const { return accel_includes_gravity_; }
484 
486  private:
487  BoolField accel_includes_gravity_;
488  };
489 
490  public:
491 #ifndef DOXYGEN_OMIT_INTERNAL
492  Settings(HebiInfoPtr internal_ptr, const HebiInfoRef& internal)
493  : actuator_(internal),
494  imu_(internal),
495  name_(internal_ptr, HebiInfoStringName),
496  family_(internal_ptr, HebiInfoStringFamily),
497  save_current_settings_(internal, HebiInfoFlagSaveCurrentSettings) {}
498 #endif // DOXYGEN_OMIT_INTERNAL
499 
500  // With all submessage and field getters: Note that the returned reference
501  // should not be used after the lifetime of this parent.
502 
503  // Submessages ----------------
504 
506  const Actuator& actuator() const { return actuator_; }
508  const Imu& imu() const { return imu_; }
509 
510  // Subfields ----------------
511 
513  const StringField& name() const { return name_; }
515  const StringField& family() const { return family_; }
517  const FlagField& saveCurrentSettings() const { return save_current_settings_; }
518 
520  private:
521  Actuator actuator_;
522  Imu imu_;
523 
524  StringField name_;
525  StringField family_;
526  FlagField save_current_settings_;
527  };
528 
530  class Actuator final {
531  public:
532 #ifndef DOXYGEN_OMIT_INTERNAL
533  Actuator(const HebiInfoRef& internal) : calibration_state_(internal, HebiInfoEnumCalibrationState) {}
534 #endif // DOXYGEN_OMIT_INTERNAL
535 
536  // With all submessage and field getters: Note that the returned reference
537  // should not be used after the lifetime of this parent.
538 
539  // Subfields ----------------
540 
542  const EnumField<CalibrationState>& calibrationState() const { return calibration_state_; }
543 
545  private:
546  EnumField<CalibrationState> calibration_state_;
547  };
548 
549 private:
554  HebiInfoPtr internal_;
555  HebiInfoRef internal_ref_;
556 
557 public:
558 #ifndef DOXYGEN_OMIT_INTERNAL
559 
563  Info(HebiInfoPtr);
564 #endif // DOXYGEN_OMIT_INTERNAL
565 
568  Info(Info&& other);
569 
570  // With all submessage and field getters: Note that the returned reference
571  // should not be used after the lifetime of this parent.
572 
573  // Submessages -------------------------------------------------------------
574 
576  Io& io() { return io_; }
578  const Io& io() const { return io_; }
580  const Settings& settings() const { return settings_; }
582  const Actuator& actuator() const { return actuator_; }
583 
584  // Subfields -------------------------------------------------------------
585 
587  const StringField& serial() const { return serial_; }
589  const LedField& led() const { return led_; }
590 
595 
596  /* Disable move assigment operator. */
597  Info& operator=(Info&& other) = delete;
598 
599 private:
600  Io io_;
601  Settings settings_;
602  Actuator actuator_;
603 
604  StringField serial_;
605  LedField led_;
606 };
607 
608 } // namespace hebi
const FlagField & saveCurrentSettings() const
Indicates if the module should save the current values of all of its settings.
Definition: info.hpp:517
std::string get() const
If the field has a value, returns a copy of that value; otherwise, returns a default.
Definition: info.cpp:58
const HighResAngleField & positionLimitMin() const
The firmware safety limit for the minimum allowed position.
Definition: info.hpp:438
Module settings that are typically changed at a slower rate.
Definition: info.hpp:390
IoBank & f()
I/O pin bank f (pins 1-8 available)
Definition: info.hpp:373
bool has() const
True if (and only if) the field has a value.
Definition: info.cpp:54
A message field for an angle measurement which does not lose precision at very high angles.
Definition: info.hpp:119
#define HEBI_DISABLE_COPY(Class)
Definition: util.hpp:16
const IoBank & c() const
I/O pin bank c (pins 1-8 available)
Definition: info.hpp:363
Actuator-specific settings, such as controller gains.
Definition: info.hpp:393
const FloatField & effortLimitMin() const
The firmware safety limit for the minimum allowed effort.
Definition: info.hpp:434
bool has() const
True if (and only if) the field has a value.
Definition: info.cpp:44
const LedField & led() const
The module's LED.
Definition: info.hpp:589
const FloatField & springConstant() const
The spring constant of the module.
Definition: info.hpp:428
T get() const
If the field has a value, returns that value; otherwise, returns a default.
Definition: info.hpp:267
const FloatField & effortLimitMax() const
The firmware safety limit for the maximum allowed effort.
Definition: info.hpp:436
const IoBank & b() const
I/O pin bank b (pins 1-8 available)
Definition: info.hpp:359
const EnumField< ControlStrategy > & controlStrategy() const
How the position, velocity, and effort PID loops are connected in order to control motor PWM.
Definition: info.hpp:442
PositionLimitStrategy
Definition: info.hpp:71
A message field representable by a bool value.
Definition: info.hpp:165
Definition: arm.cpp:5
IoBank & b()
I/O pin bank b (pins 1-8 available)
Definition: info.hpp:357
const HighResAngleField & positionLimitMax() const
The firmware safety limit for the maximum allowed position.
Definition: info.hpp:440
A message field for interfacing with a bank of I/O pins.
Definition: info.hpp:280
Actuator-specific information.
Definition: info.hpp:530
const EnumField< CalibrationState > & calibrationState() const
The calibration state of the module.
Definition: info.hpp:542
const Actuator & actuator() const
Actuator-specific settings, such as controller gains.
Definition: info.hpp:506
const InfoGains & effortGains() const
Controller gains for the effort PID loop.
Definition: info.hpp:423
Info objects have various fields representing the module state; which fields are populated depends on...
Definition: info.hpp:33
const StringField & serial() const
Gets the serial number for this module (e.g., X5-0001).
Definition: info.hpp:587
MstopStrategy
Definition: info.hpp:62
IoBank & a()
I/O pin bank a (pins 1-8 available)
Definition: info.hpp:353
CalibrationState
Definition: info.hpp:51
#define HEBI_DISABLE_COPY_MOVE(Class)
Definition: util.hpp:6
const Imu & imu() const
IMU-specific settings.
Definition: info.hpp:508
const IoBank & e() const
I/O pin bank e (pins 1-8 available)
Definition: info.hpp:371
const InfoGains & positionGains() const
Controller gains for the position PID loop.
Definition: info.hpp:419
const Actuator & actuator() const
Actuator-specific information.
Definition: info.hpp:582
A two-state message field (either set/true or cleared/false).
Definition: info.hpp:214
const BoolField & accelIncludesGravity() const
Whether to include acceleration due to gravity in acceleration feedback.
Definition: info.hpp:483
A message field for interfacing with an LED.
Definition: info.hpp:305
const FloatField & velocityLimitMin() const
The firmware safety limit for the minimum allowed velocity.
Definition: info.hpp:430
bool hasLabel(size_t pinNumber) const
True if (and only if) the particular numbered pin in this bank has a string label set in this message...
Definition: info.cpp:76
const InfoGains & velocityGains() const
Controller gains for the velocity PID loop.
Definition: info.hpp:421
std::string getLabel(size_t pinNumber) const
If this numbered pin in this bank has a string label value, returns that value; otherwise returns an ...
Definition: info.cpp:80
Triggering the M-Stop results in the control strategy being set to 'off'. Remains 'off' until changed...
const Settings & settings() const
Module settings that are typically changed at a slower rate.
Definition: info.hpp:580
A direct PWM value (-1 to 1) can be sent to the motor (subject to onboard safety limiting).
HebiStatusCode enumGetter(const RefT &ref, MetadataT &metadata, int field, int32_t *value)
Definition: message_helpers.cpp:298
The effort (e.g., spring nonlinearity) has not been calibrated.
Any available digital or analog output pins on the device.
Definition: info.hpp:335
Io & io()
Any available digital or analog output pins on the device.
Definition: info.hpp:576
The motor is not given power (equivalent to a 0 PWM value)
The current has not been calibrated.
Info & operator=(Info &&other)=delete
ControlStrategy
Definition: info.hpp:35
Info(Info &&other)
Move constructor (necessary for containment in STL template classes)
Definition: info.cpp:109
double get() const
If the field has a value, returns that value as a double; otherwise, returns a default.
Definition: info.cpp:26
A message field representable by a std::string.
Definition: info.hpp:183
const IoBank & a() const
I/O pin bank a (pins 1-8 available)
Definition: info.hpp:355
bool has() const
True if (and only if) the field has a value.
Definition: info.cpp:9
const StringField & family() const
Gets the family for this module.
Definition: info.hpp:515
IoBank & e()
I/O pin bank e (pins 1-8 available)
Definition: info.hpp:369
const IoBank & d() const
I/O pin bank d (pins 1-8 available)
Definition: info.hpp:367
Color getColor() const
Returns the led color.
Definition: info.cpp:98
Exceeding the position limit results in the control strategy being set to 'off'. Remains 'off' until ...
const Io & io() const
Any available digital or analog output pins on the device.
Definition: info.hpp:578
float get() const
If the field has a value, returns that value; otherwise, returns a default.
Definition: info.cpp:11
const FloatField & velocityLimitMax() const
The firmware safety limit for the maximum allowed velocity.
Definition: info.hpp:432
const StringField & name() const
Gets the name for this module.
Definition: info.hpp:513
The module has been calibrated; this is the normal state.
bool hasColor() const
Returns true if the LED color is set, and false otherwise.
Definition: info.cpp:94
const IoBank & f() const
I/O pin bank f (pins 1-8 available)
Definition: info.hpp:375
Triggering the M-Stop has no effect.
IoBank & d()
I/O pin bank d (pins 1-8 available)
Definition: info.hpp:365
const EnumField< PositionLimitStrategy > & minPositionLimitStrategy() const
The position limit strategy (at the minimum position) for the actuator.
Definition: info.hpp:446
bool get() const
If the field has a value, returns that value; otherwise, returns false.
Definition: info.cpp:46
const EnumField< PositionLimitStrategy > & maxPositionLimitStrategy() const
The position limit strategy (at the maximum position) for the actuator.
Definition: info.hpp:448
Exceeding the position limit has no effect.
A message field representable by an enum of a given type.
Definition: info.hpp:243
Structure to describe an RGB color.
Definition: color.hpp:8
IMU-specific settings.
Definition: info.hpp:470
Exceeding the position limit results in the actuator holding the position. Needs to be manually set t...
Exceeding the position limit results in a virtual spring that pushes the actuator back to within the ...
bool has() const
True if (and only if) the field has a value.
Definition: info.cpp:22
const EnumField< MstopStrategy > & mstopStrategy() const
The motion stop strategy for the actuator.
Definition: info.hpp:444
bool has() const
Returns true if the flag is set, false if it is cleared.
Definition: info.cpp:72
IoBank & c()
I/O pin bank c (pins 1-8 available)
Definition: info.hpp:361
Triggering the M-Stop results in the motor holding the motor position. Operations resume to normal on...
A message field representable by a single-precision floating point value.
Definition: info.hpp:84
The factory zero position has not been set.
bool has() const
True if (and only if) the field has a value.
Definition: info.hpp:262