Lely core libraries  1.9.2
master.hpp
Go to the documentation of this file.
1 
22 #ifndef LELY_COCPP_MASTER_HPP_
23 #define LELY_COCPP_MASTER_HPP_
24 
26 #include <lely/coapp/node.hpp>
27 #include <lely/coapp/sdo.hpp>
28 
29 #include <map>
30 
31 namespace lely {
32 
33 namespace canopen {
34 
35 class DriverBase;
36 
46 class BasicMaster : public Node, protected ::std::map<uint8_t, DriverBase*> {
47  public:
48  class Object;
49  class ConstObject;
50 
55  class SubObject {
56  friend class Object;
57 
58  public:
59  SubObject(const SubObject&) = default;
60  SubObject(SubObject&&) = default;
61 
62  SubObject& operator=(const SubObject&) = default;
63  SubObject& operator=(SubObject&&) = default;
64 
75  template <class T>
76  SubObject&
77  operator=(T&& value) {
78  Write(::std::forward<T>(value));
79  return *this;
80  }
81 
90  template <class T>
91  operator T() const {
92  return Read<T>();
93  }
94 
105  template <class T>
106  T
107  Read() const {
108  return master_->Read<T>(idx_, subidx_);
109  }
110 
122  template <class T>
123  T
124  Read(::std::error_code& ec) const {
125  return master_->Read<T>(idx_, subidx_, ec);
126  }
127 
138  template <class T>
139  void
140  Write(T&& value) {
141  master_->Write(idx_, subidx_, ::std::forward<T>(value));
142  }
143 
157  template <class T>
158  void
159  Write(T&& value, ::std::error_code& ec) {
160  master_->Write(idx_, subidx_, ::std::forward<T>(value), ec);
161  }
162 
175  void
176  Write(const void* p, ::std::size_t n) {
177  master_->Write(idx_, subidx_, p, n);
178  }
179 
191  void
192  Write(const void* p, ::std::size_t n, ::std::error_code& ec) {
193  master_->Write(idx_, subidx_, p, n, ec);
194  }
195 
196  private:
197  SubObject(BasicMaster* master, uint16_t idx, uint8_t subidx)
198  : master_(master), idx_(idx), subidx_(subidx) {}
199 
200  BasicMaster* master_;
201  uint16_t idx_;
202  uint8_t subidx_;
203  };
204 
210  friend class Object;
211  friend class ConstObject;
212 
213  public:
222  template <class T>
223  operator T() const {
224  return Read<T>();
225  }
226 
237  template <class T>
238  T
239  Read() const {
240  return master_->Read<T>(idx_, subidx_);
241  }
242 
254  template <class T>
255  T
256  Read(::std::error_code& ec) const {
257  return master_->Read<T>(idx_, subidx_, ec);
258  }
259 
260  private:
261  ConstSubObject(const BasicMaster* master, uint16_t idx, uint8_t subidx)
262  : master_(master), idx_(idx), subidx_(subidx) {}
263 
264  const BasicMaster* master_;
265  uint16_t idx_;
266  uint8_t subidx_;
267  };
268 
273  class Object {
274  friend class BasicMaster;
275 
276  public:
287  SubObject operator[](uint8_t subidx) {
288  return SubObject(master_, idx_, subidx);
289  }
290 
301  ConstSubObject operator[](uint8_t subidx) const {
302  return ConstSubObject(master_, idx_, subidx);
303  }
304 
305  private:
306  Object(BasicMaster* master, uint16_t idx) : master_(master), idx_(idx) {}
307 
308  BasicMaster* master_;
309  uint16_t idx_;
310  };
311 
316  class ConstObject {
317  friend class BasicMaster;
318 
319  public:
330  ConstSubObject operator[](uint8_t subidx) const {
331  return ConstSubObject(master_, idx_, subidx);
332  }
333 
334  private:
335  ConstObject(const BasicMaster* master, uint16_t idx)
336  : master_(master), idx_(idx) {}
337 
338  const BasicMaster* master_;
339  uint16_t idx_;
340  };
341 
355  template <class T>
356  using ReadSignature = void(uint8_t id, uint16_t idx, uint8_t subidx,
357  ::std::error_code ec, T value);
358 
371  using WriteSignature = void(uint8_t id, uint16_t idx, uint8_t subidx,
372  ::std::error_code ec);
373 
389  BasicMaster(aio::TimerBase& timer, aio::CanBusBase& bus,
390  const ::std::string& dcf_txt, const ::std::string& dcf_bin = "",
391  uint8_t id = 0xff);
392 
393  virtual ~BasicMaster();
394 
405  Object operator[](uint16_t idx) { return Object(this, idx); }
406 
417  ConstObject operator[](uint16_t idx) const { return ConstObject(this, idx); }
418 
428  void Error(uint8_t id);
429 
430  /*
431  * Generates an EMCY error and triggers the error handling behavior according
432  * to object 1029:01 (Error behavior object) in case of a communication error
433  * (emergency error code 0x81xx).
434  *
435  * @param eec the emergency error code.
436  * @param er the error register.
437  * @param msef the manufacturer-specific error code.
438  */
439  void Error(uint16_t eec, uint8_t er, const uint8_t msef[5] = nullptr);
440 
446  void RpdoRtr(int num = 0);
447 
456  void TpdoEvent(int num = 0);
457 
464  ::std::chrono::milliseconds GetTimeout() const;
465 
472  void SetTimeout(const ::std::chrono::milliseconds& timeout);
473 
479  template <class T>
480  void
481  SubmitRead(uint8_t id, Sdo::UploadRequest<T>& req) {
482  ::std::error_code ec;
483  SubmitRead<T>(id, req, ec);
484  if (ec) throw SdoError(netid(), id, req.idx, req.subidx, ec, "SubmitRead");
485  }
486 
495  template <class T>
496  void
497  SubmitRead(uint8_t id, Sdo::UploadRequest<T>& req, ::std::error_code& ec) {
498  ::std::lock_guard<BasicLockable> lock(*this);
499 
500  ec.clear();
501  auto sdo = GetSdo(id);
502  if (sdo) {
503  SetTime();
504  sdo->SubmitUpload<T>(req);
505  } else {
506  ec = SdoErrc::NO_SDO;
507  }
508  }
509 
516  template <class T, class F>
517  void
518  SubmitRead(uint8_t id, uint16_t idx, uint8_t subidx, aio::ExecutorBase& exec,
519  F&& con) {
520  SubmitRead<T>(id, idx, subidx, exec, ::std::forward<F>(con), GetTimeout());
521  }
522 
529  template <class T, class F>
530  void
531  SubmitRead(uint8_t id, uint16_t idx, uint8_t subidx, aio::ExecutorBase& exec,
532  F&& con, ::std::error_code& ec) {
533  SubmitRead<T>(id, idx, subidx, exec, ::std::forward<F>(con), GetTimeout(),
534  ec);
535  }
536 
543  template <class T, class F>
544  void
545  SubmitRead(uint8_t id, uint16_t idx, uint8_t subidx, aio::ExecutorBase& exec,
546  F&& con, const Sdo::duration& timeout) {
547  ::std::error_code ec;
548  SubmitRead<T>(id, idx, subidx, exec, ::std::forward<F>(con), timeout, ec);
549  if (ec) throw SdoError(netid(), id, idx, subidx, ec, "SubmitRead");
550  }
551 
569  template <class T, class F>
570  void
571  SubmitRead(uint8_t id, uint16_t idx, uint8_t subidx, aio::ExecutorBase& exec,
572  F&& con, const Sdo::duration& timeout, ::std::error_code& ec) {
573  ::std::lock_guard<BasicLockable> lock(*this);
574 
575  ec.clear();
576  auto sdo = GetSdo(id);
577  if (sdo) {
578  SetTime();
579  if (con) {
580  sdo->SubmitUpload<T>(
581  idx, subidx, exec,
582  [=](uint16_t idx, uint8_t subidx, ::std::error_code ec, T value) {
583  con(id, idx, subidx, ec, ::std::move(value));
584  },
585  timeout);
586  } else {
587  sdo->SubmitUpload<T>(idx, subidx, exec, nullptr, timeout);
588  }
589  } else {
590  ec = SdoErrc::NO_SDO;
591  }
592  }
593 
599  template <class T>
600  void
602  ::std::error_code ec;
603  SubmitWrite<T>(id, req, ec);
604  if (ec) throw SdoError(netid(), id, req.idx, req.subidx, ec, "SubmitWrite");
605  }
606 
615  template <class T>
616  void
617  SubmitWrite(uint8_t id, Sdo::DownloadRequest<T>& req, ::std::error_code& ec) {
618  ::std::lock_guard<BasicLockable> lock(*this);
619 
620  ec.clear();
621  auto sdo = GetSdo(id);
622  if (sdo) {
623  SetTime();
624  sdo->SubmitDownload<T>(req);
625  } else {
626  ec = SdoErrc::NO_SDO;
627  }
628  }
629 
636  template <class T, class F>
637  void
638  SubmitWrite(uint8_t id, uint16_t idx, uint8_t subidx, T&& value,
639  aio::ExecutorBase& exec, F&& con) {
640  SubmitWrite(id, idx, subidx, ::std::forward<T>(value), exec,
641  ::std::forward<F>(con), GetTimeout());
642  }
643 
651  template <class T, class F>
652  void
653  SubmitWrite(uint8_t id, uint16_t idx, uint8_t subidx, T&& value,
654  aio::ExecutorBase& exec, F&& con, ::std::error_code& ec) {
655  SubmitWrite(id, idx, subidx, ::std::forward<T>(value), exec,
656  ::std::forward<F>(con), GetTimeout(), ec);
657  }
658 
666  template <class T, class F>
667  void
668  SubmitWrite(uint8_t id, uint16_t idx, uint8_t subidx, T&& value,
669  aio::ExecutorBase& exec, F&& con, const Sdo::duration& timeout) {
670  ::std::error_code ec;
671  SubmitWrite(id, idx, subidx, ::std::forward<T>(value), exec,
672  ::std::forward<F>(con), timeout, ec);
673  if (ec) throw SdoError(netid(), id, idx, subidx, ec, "SubmitWrite");
674  }
675 
694  template <class T, class F>
695  void
696  SubmitWrite(uint8_t id, uint16_t idx, uint8_t subidx, T&& value,
697  aio::ExecutorBase& exec, F&& con, const Sdo::duration& timeout,
698  ::std::error_code& ec) {
699  ::std::lock_guard<BasicLockable> lock(*this);
700 
701  ec.clear();
702  auto sdo = GetSdo(id);
703  if (sdo) {
704  SetTime();
705  if (con) {
706  sdo->SubmitDownload(
707  idx, subidx, ::std::forward<T>(value), exec,
708  [=](uint16_t idx, uint8_t subidx, ::std::error_code ec) {
709  con(id, idx, subidx, ec);
710  },
711  timeout);
712  } else {
713  sdo->SubmitDownload(idx, subidx, ::std::forward<T>(value), exec,
714  nullptr, timeout);
715  }
716  } else {
717  ec = SdoErrc::NO_SDO;
718  }
719  }
720 
727  template <class T>
728  aio::Future<::std::tuple<::std::error_code, T>>
729  AsyncRead(aio::LoopBase& loop, aio::ExecutorBase& exec, uint8_t id,
730  uint16_t idx, uint8_t subidx) {
731  return AsyncRead<T>(loop, exec, id, idx, subidx, GetTimeout());
732  }
733 
752  template <class T>
753  aio::Future<::std::tuple<::std::error_code, T>>
754  AsyncRead(aio::LoopBase& loop, aio::ExecutorBase& exec, uint8_t id,
755  uint16_t idx, uint8_t subidx, const Sdo::duration& timeout) {
756  ::std::lock_guard<BasicLockable> lock(*this);
757 
758  aio::Future<::std::tuple<::std::error_code, T>> future(nullptr);
759  auto sdo = GetSdo(id);
760  if (sdo) {
761  SetTime();
762  future = sdo->AsyncUpload<T>(loop, exec, idx, subidx, timeout);
763  }
764  return future;
765  }
766 
773  template <class T>
774  aio::Future<::std::error_code>
775  AsyncWrite(aio::LoopBase& loop, aio::ExecutorBase& exec, uint8_t id,
776  uint16_t idx, uint8_t subidx, T&& value) {
777  return AsyncWrite(loop, exec, id, idx, subidx, ::std::forward<T>(value),
778  GetTimeout());
779  }
780 
799  template <class T>
800  aio::Future<::std::error_code>
801  AsyncWrite(aio::LoopBase& loop, aio::ExecutorBase& exec, uint8_t id,
802  uint16_t idx, uint8_t subidx, T&& value,
803  const Sdo::duration& timeout) {
804  ::std::lock_guard<BasicLockable> lock(*this);
805 
806  aio::Future<::std::error_code> future(nullptr);
807  auto sdo = GetSdo(id);
808  if (sdo) {
809  SetTime();
810  future = sdo->AsyncDownload(loop, exec, idx, subidx,
811  ::std::forward<T>(value), timeout);
812  }
813  return future;
814  }
815 
825  void Insert(DriverBase& driver);
826 
832  void Erase(DriverBase& driver);
833 
834  protected:
835  using MapType = ::std::map<uint8_t, DriverBase*>;
836 
842  void OnCanError(CanError error) noexcept override;
843 
850  void OnCanState(CanState new_state, CanState old_state) noexcept override;
851 
859  void OnCommand(NmtCommand cs) noexcept override;
860 
877  virtual void OnNodeGuarding(uint8_t id, bool occurred) noexcept;
878 
885  void OnHeartbeat(uint8_t id, bool occurred) noexcept override;
886 
896  void OnState(uint8_t id, NmtState st) noexcept override;
897 
941  virtual void OnBoot(uint8_t id, NmtState st, char es,
942  const ::std::string& what) noexcept;
943 
956  virtual void OnConfig(uint8_t id) noexcept;
957 
964  void ConfigResult(uint8_t id, ::std::error_code ec) noexcept;
965 
971  void OnRpdo(int num, ::std::error_code ec, const void* p,
972  ::std::size_t n) noexcept override;
973 
979  void OnRpdoError(int num, uint16_t eec, uint8_t er) noexcept override;
980 
986  void OnTpdo(int num, ::std::error_code ec, const void* p,
987  ::std::size_t n) noexcept override;
988 
994  void OnSync(uint8_t cnt, const time_point& t) noexcept override;
995 
1001  void OnSyncError(uint16_t eec, uint8_t er) noexcept override;
1002 
1008  void OnTime(const ::std::chrono::system_clock::time_point&
1009  abs_time) noexcept override;
1010 
1017  void OnEmcy(uint8_t id, uint16_t eec, uint8_t er,
1018  uint8_t msef[5]) noexcept override;
1019 
1025  Sdo* GetSdo(uint8_t id);
1026 
1032  void CancelSdo(uint8_t id = 0);
1033 
1034  private:
1035  struct Impl_;
1036  ::std::unique_ptr<Impl_> impl_;
1037 };
1038 
1044 class AsyncMaster : public BasicMaster {
1045  public:
1047 
1048  protected:
1055  void OnCanError(CanError error) noexcept override;
1056 
1063  void OnCanState(CanState new_state, CanState old_state) noexcept override;
1064 
1072  void OnCommand(NmtCommand cs) noexcept override;
1073 
1080  void OnNodeGuarding(uint8_t id, bool occurred) noexcept override;
1081 
1088  void OnHeartbeat(uint8_t id, bool occurred) noexcept override;
1089 
1097  void OnState(uint8_t id, NmtState st) noexcept override;
1098 
1105  void OnBoot(uint8_t id, NmtState st, char es,
1106  const ::std::string& what) noexcept override;
1107 
1114  void OnConfig(uint8_t id) noexcept override;
1115 
1122  void OnRpdo(int num, ::std::error_code ec, const void* p,
1123  ::std::size_t n) noexcept override;
1124 
1131  void OnRpdoError(int num, uint16_t eec, uint8_t er) noexcept override;
1132 
1139  void OnTpdo(int num, ::std::error_code ec, const void* p,
1140  ::std::size_t n) noexcept override;
1141 
1148  void OnSync(uint8_t cnt, const time_point& t) noexcept override;
1149 
1156  void OnSyncError(uint16_t eec, uint8_t er) noexcept override;
1157 
1164  void OnTime(const ::std::chrono::system_clock::time_point&
1165  abs_time) noexcept override;
1166 
1173  void OnEmcy(uint8_t id, uint16_t eec, uint8_t er,
1174  uint8_t msef[5]) noexcept override;
1175 };
1176 
1177 } // namespace canopen
1178 
1179 } // namespace lely
1180 
1181 #endif // LELY_COCPP_MASTER_HPP_
void SubmitRead(uint8_t id, uint16_t idx, uint8_t subidx, aio::ExecutorBase &exec, F &&con, ::std::error_code &ec)
Equivalent to SubmitRead(uint8_t id, uint16_t idx, uint8_t subidx, aio::ExecutorBase& exec...
Definition: master.hpp:531
virtual void OnConfig(uint8_t id) noexcept
The function invoked when the &#39;update configuration&#39; step is reached during the NMT &#39;boot slave&#39; proc...
Definition: master.cpp:198
void SubmitRead(uint8_t id, Sdo::UploadRequest< T > &req)
Equivalent to SubmitRead(uint8_t id, Sdo::UploadRequest<T>& req, ::std::error_code& ec)...
Definition: master.hpp:481
void OnSyncError(uint16_t eec, uint8_t er) noexcept override
The default implementation notifies all registered drivers.
Definition: master.cpp:259
The CANopen master.
Definition: master.hpp:46
void SubmitRead(uint8_t id, uint16_t idx, uint8_t subidx, aio::ExecutorBase &exec, F &&con)
Equivalent to SubmitRead(uint8_t id, uint16_t idx, uint8_t subidx, aio::ExecutorBase& exec...
Definition: master.hpp:518
An asynchronous CANopen master.
Definition: master.hpp:1044
void CancelSdo(uint8_t id=0)
Aborts any ongoing or pending SDO requests for the specified slave.
Definition: master.cpp:305
void OnCanError(CanError error) noexcept override
The default implementation queues a notification for all registered drivers.
Definition: master.cpp:313
void OnTime(const ::std::chrono::system_clock::time_point &abs_time) noexcept override
The default implementation queues a notification for all registered drivers.
Definition: master.cpp:491
void Write(const void *p, ::std::size_t n, ::std::error_code &ec)
Writes an OCTET_STRING or DOMAIN value to the sub-object by submitting an SDO download request to the...
Definition: master.hpp:192
Object operator[](uint16_t idx)
Returns a mutator object that provides read/write access to the specified CANopen object in the local...
Definition: master.hpp:405
void OnState(uint8_t id, NmtState st) noexcept override
The default implementation notifies the driver registered for node id.
Definition: master.cpp:176
void SubmitWrite(uint8_t id, uint16_t idx, uint8_t subidx, T &&value, aio::ExecutorBase &exec, F &&con, const Sdo::duration &timeout)
Equivalent to SubmitWrite(uint8_t id, uint16_t idx, uint8_t subidx, T&& value, aio::ExecutorBase& exe...
Definition: master.hpp:668
void OnRpdoError(int num, uint16_t eec, uint8_t er) noexcept override
The default implementation queues a notification for all registered drivers.
Definition: master.cpp:443
This header file is part of the C++ CANopen application library; it contains the mutual exclusion fac...
void Write(const void *p, ::std::size_t n)
Writes an OCTET_STRING or DOMAIN value to the sub-object by submitting an SDO download request to the...
Definition: master.hpp:176
void(uint8_t id, uint16_t idx, uint8_t subidx, ::std::error_code ec) WriteSignature
The signature of the callback function invoked on completion of an asynchronous write (SDO download) ...
Definition: master.hpp:372
NmtCommand
The NMT command specifiers.
Definition: node.hpp:36
aio::Future<::std::error_code > AsyncWrite(aio::LoopBase &loop, aio::ExecutorBase &exec, uint8_t id, uint16_t idx, uint8_t subidx, T &&value, const Sdo::duration &timeout)
Queues an asynchronous write (SDO download) operation and returns a future.
Definition: master.hpp:801
T Read(::std::error_code &ec) const
Reads the value of the sub-object by submitting an SDO upload request to the local object dictionary...
Definition: master.hpp:256
ConstSubObject operator[](uint8_t subidx) const
Returns an accessor object that provides read-only access to the specified CANopen sub-object in the ...
Definition: master.hpp:301
aio::Future<::std::tuple<::std::error_code, T > > AsyncRead(aio::LoopBase &loop, aio::ExecutorBase &exec, uint8_t id, uint16_t idx, uint8_t subidx)
Equivalent to AsyncRead(aio::LoopBase& loop, aio::ExecutorBase& exec, uint8_t id, uint16_t idx...
Definition: master.hpp:729
The abstract driver interface for a remote CANopen node.
Definition: driver.hpp:33
An accessor providing read-only access to a CANopen object in a local object dictionary.
Definition: master.hpp:316
void Write(T &&value)
Writes a value to the sub-object by submitting an SDO download request to the local object dictionary...
Definition: master.hpp:140
void SetTimeout(const ::std::chrono::milliseconds &timeout)
Sets the SDO timeout used during the NMT &#39;boot slave&#39; and &#39;check configuration&#39; processes.
Definition: master.cpp:99
void OnTpdo(int num, ::std::error_code ec, const void *p, ::std::size_t n) noexcept override
The default implementation notifies all registered drivers.
Definition: master.cpp:242
An SDO download request.
Definition: sdo.hpp:132
void SubmitRead(uint8_t id, uint16_t idx, uint8_t subidx, aio::ExecutorBase &exec, F &&con, const Sdo::duration &timeout, ::std::error_code &ec)
Queues an asynchronous read (SDO upload) operation.
Definition: master.hpp:571
Resource not available: SDO connection.
void OnSync(uint8_t cnt, const time_point &t) noexcept override
The default implementation notifies all registered drivers.
Definition: master.cpp:251
void(uint8_t id, uint16_t idx, uint8_t subidx, ::std::error_code ec, T value) ReadSignature
The signature of the callback function invoked on completion of an asynchronous read (SDO upload) ope...
Definition: master.hpp:357
void Error(uint8_t id)
Indicates the occurrence of an error event on a remote node and triggers the error handling process (...
Definition: master.cpp:64
void OnHeartbeat(uint8_t id, bool occurred) noexcept override
The default implementation queues a notification for the driver registered for node id...
Definition: master.cpp:361
void OnEmcy(uint8_t id, uint16_t eec, uint8_t er, uint8_t msef[5]) noexcept override
The default implementation notifies the driver registered for node id.
Definition: master.cpp:276
typename ::std::enable_if< detail::IsCanopenType< T >::value, T >::type Read(uint16_t idx, uint8_t subidx) const
Submits an SDO upload request to the local object dictionary.
void OnEmcy(uint8_t id, uint16_t eec, uint8_t er, uint8_t msef[5]) noexcept override
The default implementation queues a notification for the driver registered for node id...
Definition: master.cpp:503
void SetTime()
Update the CAN network time.
Definition: io_context.cpp:91
uint8_t netid() const noexcept
Returns the network-ID.
Definition: device.cpp:87
An SDO upload request.
Definition: sdo.hpp:197
aio::Future<::std::tuple<::std::error_code, T > > AsyncRead(aio::LoopBase &loop, aio::ExecutorBase &exec, uint8_t id, uint16_t idx, uint8_t subidx, const Sdo::duration &timeout)
Queues an asynchronous read (SDO upload) operation and returns a future.
Definition: master.hpp:754
virtual void OnBoot(uint8_t id, NmtState st, char es, const ::std::string &what) noexcept
The function invoked when the NMT &#39;boot slave&#39; process completes.
Definition: master.cpp:188
void SubmitWrite(uint8_t id, Sdo::DownloadRequest< T > &req, ::std::error_code &ec)
Queues an asynchronous write (SDO download) operation.
Definition: master.hpp:617
An accessor providing read-only access to a CANopen sub-object in a local object dictionary.
Definition: master.hpp:209
void OnSync(uint8_t cnt, const time_point &t) noexcept override
The default implementation queues a notification for all registered drivers.
Definition: master.cpp:469
ConstObject operator[](uint16_t idx) const
Returns an accessor object that provides read-only access to the specified CANopen object in the loca...
Definition: master.hpp:417
::std::chrono::milliseconds duration
The type used to represent an SDO timeout duration.
Definition: sdo.hpp:51
void OnNodeGuarding(uint8_t id, bool occurred) noexcept override
The default implementation queues a notification for all registered drivers.
Definition: master.cpp:349
virtual void OnNodeGuarding(uint8_t id, bool occurred) noexcept
The function invoked when a node guarding timeout event occurs or is resolved.
Definition: master.cpp:158
void OnCommand(NmtCommand cs) noexcept override
The default implementation notifies all registered drivers.
Definition: master.cpp:147
void RpdoRtr(int num=0)
Requests the transmission of a PDO.
Definition: master.cpp:78
void SubmitWrite(uint8_t id, uint16_t idx, uint8_t subidx, T &&value, aio::ExecutorBase &exec, F &&con, ::std::error_code &ec)
Equivalent to SubmitWrite(uint8_t id, uint16_t idx, uint8_t subidx, T&& value, aio::ExecutorBase& exe...
Definition: master.hpp:653
The type of objects thrown as exceptions to report a system error with an associated error code...
Definition: exception.hpp:54
void OnCanState(CanState new_state, CanState old_state) noexcept override
The default implementation invokes lely::canopen::Node::OnCanState() and notifies each registered dri...
Definition: master.cpp:139
void OnCanError(CanError error) noexcept override
The default implementation notifies all registered drivers.
Definition: master.cpp:131
void OnBoot(uint8_t id, NmtState st, char es, const ::std::string &what) noexcept override
The default implementation queues a notification for the driver registered for node id...
Definition: master.cpp:388
void OnState(uint8_t id, NmtState st) noexcept override
The default implementation queues a notification for the driver registered for node id...
Definition: master.cpp:373
T Read() const
Reads the value of the sub-object by submitting an SDO upload request to the local object dictionary...
Definition: master.hpp:107
void TpdoEvent(int num=0)
Triggers the transmission of an event-driven (asynchronous) PDO.
Definition: master.cpp:85
void OnCommand(NmtCommand cs) noexcept override
The default implementation queues a notification for all registered drivers.
Definition: master.cpp:335
void SubmitRead(uint8_t id, Sdo::UploadRequest< T > &req, ::std::error_code &ec)
Queues an asynchronous read (SDO upload) operation.
Definition: master.hpp:497
void Insert(DriverBase &driver)
Registers a driver for a remote CANopen node.
Definition: master.cpp:106
void OnSyncError(uint16_t eec, uint8_t er) noexcept override
The default implementation queues a notification for all registered drivers.
Definition: master.cpp:480
void SubmitWrite(uint8_t id, uint16_t idx, uint8_t subidx, T &&value, aio::ExecutorBase &exec, F &&con, const Sdo::duration &timeout, ::std::error_code &ec)
Queues an asynchronous write (SDO download) operation.
Definition: master.hpp:696
ConstSubObject operator[](uint8_t subidx) const
Returns an accessor object that provides read-only access to the specified CANopen sub-object in the ...
Definition: master.hpp:330
void SubmitWrite(uint8_t id, uint16_t idx, uint8_t subidx, T &&value, aio::ExecutorBase &exec, F &&con)
Equivalent to SubmitWrite(uint8_t id, uint16_t idx, uint8_t subidx, T&& value, aio::ExecutorBase& exe...
Definition: master.hpp:638
This header file is part of the C++ CANopen application library; it contains the CANopen node declara...
void OnConfig(uint8_t id) noexcept override
The default implementation queues a notification for the driver registered for node id...
Definition: master.cpp:401
void OnHeartbeat(uint8_t id, bool occurred) noexcept override
The default implementation notifies the driver registered for node id.
Definition: master.cpp:167
A mutator providing read/write access to a CANopen object in a local object dictionary.
Definition: master.hpp:273
typename ::std::enable_if< detail::IsCanopenBasic< T >::value >::type Write(uint16_t idx, uint8_t subidx, T value)
Submits an SDO download request to the local object dictionary.
::std::chrono::milliseconds GetTimeout() const
Returns the SDO timeout used during the NMT &#39;boot slave&#39; and &#39;check configuration&#39; processes...
Definition: master.cpp:92
NmtState
The NMT states.
Definition: node.hpp:50
void Write(T &&value, ::std::error_code &ec)
Writes a value to the sub-object by submitting an SDO download request to the local object dictionary...
Definition: master.hpp:159
void SubmitRead(uint8_t id, uint16_t idx, uint8_t subidx, aio::ExecutorBase &exec, F &&con, const Sdo::duration &timeout)
Equivalent to SubmitRead(uint8_t id, uint16_t idx, uint8_t subidx, aio::ExecutorBase& exec...
Definition: master.hpp:545
T Read(::std::error_code &ec) const
Reads the value of the sub-object by submitting an SDO upload request to the local object dictionary...
Definition: master.hpp:124
void OnCanState(CanState new_state, CanState old_state) noexcept override
The default implementation invokes lely::canopen::Node::OnCanState() and queues a notification for ea...
Definition: master.cpp:324
BasicMaster(aio::TimerBase &timer, aio::CanBusBase &bus, const ::std::string &dcf_txt, const ::std::string &dcf_bin="", uint8_t id=0xff)
Creates a new CANopen master.
Definition: master.cpp:55
void OnRpdo(int num, ::std::error_code ec, const void *p, ::std::size_t n) noexcept override
The default implementation queues a notification for all registered drivers.
Definition: master.cpp:427
virtual void lock() final override
Blocks until a lock can be obtained for the current execution agent (thread, process, task).
Definition: node.cpp:114
The Client-SDO queue.
Definition: sdo.hpp:48
Global namespace for the Lely Industries N.V. libraries.
Definition: buf.hpp:32
void SubmitWrite(uint8_t id, Sdo::DownloadRequest< T > &req)
Equivalent to SubmitWrite(uint8_t id, Sdo::DownloadRequest<T>& req, ::std::error_code& ec)...
Definition: master.hpp:601
SubObject & operator=(T &&value)
Sets the value of the sub-object.
Definition: master.hpp:77
T Read() const
Reads the value of the sub-object by submitting an SDO upload request to the local object dictionary...
Definition: master.hpp:239
uint8_t id() const noexcept
Returns the node-ID.
Definition: device.cpp:94
void OnTime(const ::std::chrono::system_clock::time_point &abs_time) noexcept override
The default implementation notifies all registered drivers.
Definition: master.cpp:267
void ConfigResult(uint8_t id, ::std::error_code ec) noexcept
Reports the result of the &#39;update configuration&#39; step to the NMT service.
Definition: master.cpp:216
Sdo * GetSdo(uint8_t id)
Returns a pointer to the default client-SDO service for the given node.
Definition: master.cpp:286
The base class for CANopen nodes.
Definition: node.hpp:109
void OnRpdo(int num, ::std::error_code ec, const void *p, ::std::size_t n) noexcept override
The default implementation notifies all registered drivers.
Definition: master.cpp:225
This header file is part of the C++ CANopen master library; it contains the Client-SDO queue declarat...
void OnTpdo(int num, ::std::error_code ec, const void *p, ::std::size_t n) noexcept override
The default implementation queues a notification for all registered drivers.
Definition: master.cpp:454
SubObject operator[](uint8_t subidx)
Returns a mutator object that provides read/write access to the specified CANopen sub-object in the l...
Definition: master.hpp:287
A mutator providing read/write access to a CANopen sub-object in a local object dictionary.
Definition: master.hpp:55
void OnRpdoError(int num, uint16_t eec, uint8_t er) noexcept override
The default implementation notifies all registered drivers.
Definition: master.cpp:234
aio::Future<::std::error_code > AsyncWrite(aio::LoopBase &loop, aio::ExecutorBase &exec, uint8_t id, uint16_t idx, uint8_t subidx, T &&value)
Equivalent to AsyncWrite(aio::LoopBase& loop, aio::ExecutorBase& exec, uint8_t id, uint16_t idx, uint8_t subidx, T&& value, const Sdo::duration& timeout), except that it uses the SDO timeout given by GetTimeout().
Definition: master.hpp:775
The type of exception thrown when an SDO abort code is received.
Definition: sdo_error.hpp:116
void Erase(DriverBase &driver)
Unregisters a driver for a remote CANopen node.
Definition: master.cpp:123