Lely core libraries  2.3.4
driver.hpp
Go to the documentation of this file.
1 
22 #ifndef LELY_COAPP_DRIVER_HPP_
23 #define LELY_COAPP_DRIVER_HPP_
24 
25 #include <lely/coapp/master.hpp>
26 
27 #include <map>
28 #include <string>
29 #include <utility>
30 
31 namespace lely {
32 
33 namespace canopen {
34 
36 class DriverBase {
37  public:
38  using time_point = BasicMaster::time_point;
39 
40  DriverBase() = default;
41 
42  DriverBase(const DriverBase&) = delete;
43  DriverBase& operator=(const DriverBase&) = delete;
44 
45  virtual ~DriverBase() = default;
46 
51  virtual ev::Executor GetExecutor() const noexcept = 0;
52 
54  virtual uint8_t netid() const noexcept = 0;
55 
57  virtual uint8_t id() const noexcept = 0;
58 
64  virtual void OnCanState(io::CanState new_state,
65  io::CanState old_state) noexcept = 0;
66 
72  virtual void OnCanError(io::CanError error) noexcept = 0;
73 
74  /*
75  * The function invoked when a value is successfully written to an RPDO-mapped
76  * object in the local object dictionary by a Receive-PDO (or SDO download)
77  * request.
78  *
79  * @param idx the remote object index.
80  * @param subidx the remote object sub-index.
81  */
82  virtual void OnRpdoWrite(uint16_t idx, uint8_t subidx) noexcept = 0;
83 
91  virtual void OnCommand(NmtCommand cs) noexcept = 0;
92 
106  virtual void OnHeartbeat(bool occurred) noexcept = 0;
107 
118  virtual void OnState(NmtState st) noexcept = 0;
119 
130  virtual void OnSync(uint8_t cnt, const time_point& t) noexcept = 0;
131 
141  virtual void OnSyncError(uint16_t eec, uint8_t er) noexcept = 0;
142 
150  virtual void OnTime(
151  const ::std::chrono::system_clock::time_point& abs_time) noexcept = 0;
152 
162  virtual void OnEmcy(uint16_t eec, uint8_t er, uint8_t msef[5]) noexcept = 0;
163 
177  virtual void OnNodeGuarding(bool occurred) noexcept = 0;
178 
219  virtual void OnBoot(NmtState st, char es,
220  const ::std::string& what) noexcept = 0;
221 
237  virtual void OnConfig(
238  ::std::function<void(::std::error_code ec)> res) noexcept = 0;
239 
253  virtual void OnDeconfig(
254  ::std::function<void(::std::error_code ec)> res) noexcept = 0;
255 };
256 
259  public:
261  virtual int Number() const noexcept = 0;
262 
268  virtual SdoFuture<void> AsyncConfig() = 0;
269 
274  virtual SdoFuture<void> AsyncDeconfig() = 0;
275 };
276 
279  protected ::std::map<uint8_t, LogicalDriverBase*> {
280  friend class LoopDriver;
281 
282  public:
283  using DriverBase::time_point;
284  using duration = BasicMaster::duration;
286 
299  explicit BasicDriver(ev_exec_t* exec, BasicMaster& master, uint8_t id);
300 
305  explicit BasicDriver(BasicMaster& master, uint8_t id)
306  : BasicDriver(nullptr, master, id) {}
307 
308  virtual ~BasicDriver();
309 
311  GetExecutor() const noexcept final {
312  return ev::Executor(exec_);
313  }
314 
315  uint8_t
316  netid() const noexcept final {
317  return master.netid();
318  }
319 
320  uint8_t
321  id() const noexcept final {
322  return id_;
323  }
324 
333  void
334  ConfigHeartbeat(const ::std::chrono::milliseconds& ms,
335  ::std::error_code& ec) {
336  master.ConfigHeartbeat(id(), ms, ec);
337  }
338 
348  void
349  ConfigHeartbeat(const ::std::chrono::milliseconds& ms) {
350  master.ConfigHeartbeat(id(), ms);
351  }
352 
359  bool
360  Boot() {
361  return master.Boot(id());
362  }
363 
373  bool
374  IsReady() const {
375  return master.IsReady(id());
376  }
377 
384  void
385  Error() {
386  master.Error(id());
387  }
388 
400  template <class T>
401  void
402  DamMpdoEvent(int num, uint16_t idx, uint8_t subidx, T value) {
403  master.DamMpdoEvent(num, id(), idx, subidx, value);
404  }
405 
413  template <class F>
414  void
415  SubmitWait(const time_point& t, F&& f) {
416  return master.SubmitWait(t, GetExecutor(), ::std::forward<F>(f));
417  }
418 
426  template <class F>
427  void
428  SubmitWait(const duration& d, F&& f) {
429  return master.SubmitWait(d, GetExecutor(), ::std::forward<F>(f));
430  }
431 
441  AsyncWait(const time_point& t) {
442  return master.AsyncWait(GetExecutor(), t);
443  }
444 
454  AsyncWait(const duration& d) {
455  return master.AsyncWait(GetExecutor(), d);
456  }
457 
464  template <class T, class F>
465  void
466  SubmitRead(uint16_t idx, uint8_t subidx, F&& con) {
467  master.SubmitRead<T>(GetExecutor(), id(), idx, subidx,
468  ::std::forward<F>(con));
469  }
470 
477  template <class T, class F>
478  void
479  SubmitRead(uint16_t idx, uint8_t subidx, F&& con, ::std::error_code& ec) {
480  master.SubmitRead<T>(GetExecutor(), id(), idx, subidx,
481  ::std::forward<F>(con), ec);
482  }
483 
489  template <class T, class F>
490  void
491  SubmitRead(uint16_t idx, uint8_t subidx, F&& con,
492  const ::std::chrono::milliseconds& timeout) {
493  master.SubmitRead<T>(GetExecutor(), id(), idx, subidx,
494  ::std::forward<F>(con), timeout);
495  }
496 
512  template <class T, class F>
513  void
514  SubmitRead(uint16_t idx, uint8_t subidx, F&& con,
515  const ::std::chrono::milliseconds& timeout,
516  ::std::error_code& ec) {
517  master.SubmitRead<T>(GetExecutor(), id(), idx, subidx,
518  ::std::forward<F>(con), timeout, ec);
519  }
520 
527  template <class T, class F>
528  void
529  SubmitBlockRead(uint16_t idx, uint8_t subidx, F&& con) {
530  master.SubmitBlockRead<T>(GetExecutor(), id(), idx, subidx,
531  ::std::forward<F>(con));
532  }
533 
540  template <class T, class F>
541  void
542  SubmitBlockRead(uint16_t idx, uint8_t subidx, F&& con,
543  ::std::error_code& ec) {
544  master.SubmitBlockRead<T>(GetExecutor(), id(), idx, subidx,
545  ::std::forward<F>(con), ec);
546  }
547 
553  template <class T, class F>
554  void
555  SubmitBlockRead(uint16_t idx, uint8_t subidx, F&& con,
556  const ::std::chrono::milliseconds& timeout) {
557  master.SubmitBlockRead<T>(GetExecutor(), id(), idx, subidx,
558  ::std::forward<F>(con), timeout);
559  }
560 
580  template <class T, class F>
581  void
582  SubmitBlockRead(uint16_t idx, uint8_t subidx, F&& con,
583  const ::std::chrono::milliseconds& timeout,
584  ::std::error_code& ec) {
585  master.SubmitBlockRead<T>(GetExecutor(), id(), idx, subidx,
586  ::std::forward<F>(con), timeout, ec);
587  }
588 
595  template <class T, class F>
596  void
597  SubmitWrite(uint16_t idx, uint8_t subidx, T&& value, F&& con) {
598  master.SubmitWrite(GetExecutor(), id(), idx, subidx,
599  ::std::forward<T>(value), ::std::forward<F>(con));
600  }
601 
608  template <class T, class F>
609  void
610  SubmitWrite(uint16_t idx, uint8_t subidx, T&& value, F&& con,
611  ::std::error_code& ec) {
612  master.SubmitWrite(GetExecutor(), id(), idx, subidx,
613  ::std::forward<T>(value), ::std::forward<F>(con), ec);
614  }
615 
621  template <class T, class F>
622  void
623  SubmitWrite(uint16_t idx, uint8_t subidx, T&& value, F&& con,
624  const ::std::chrono::milliseconds& timeout) {
625  master.SubmitWrite(GetExecutor(), id(), idx, subidx,
626  ::std::forward<T>(value), ::std::forward<F>(con),
627  timeout);
628  }
629 
646  template <class T, class F>
647  void
648  SubmitWrite(uint16_t idx, uint8_t subidx, T&& value, F&& con,
649  const ::std::chrono::milliseconds& timeout,
650  ::std::error_code& ec) {
651  master.SubmitWrite(GetExecutor(), id(), idx, subidx,
652  ::std::forward<T>(value), ::std::forward<F>(con),
653  timeout, ec);
654  }
655 
662  template <class T, class F>
663  void
664  SubmitBlockWrite(uint16_t idx, uint8_t subidx, T&& value, F&& con) {
665  master.SubmitBlockWrite(GetExecutor(), id(), idx, subidx,
666  ::std::forward<T>(value), ::std::forward<F>(con));
667  }
668 
675  template <class T, class F>
676  void
677  SubmitBlockWrite(uint16_t idx, uint8_t subidx, T&& value, F&& con,
678  ::std::error_code& ec) {
679  master.SubmitBlockWrite(GetExecutor(), id(), idx, subidx,
680  ::std::forward<T>(value), ::std::forward<F>(con),
681  ec);
682  }
683 
689  template <class T, class F>
690  void
691  SubmitBlockWrite(uint16_t idx, uint8_t subidx, T&& value, F&& con,
692  const ::std::chrono::milliseconds& timeout) {
693  master.SubmitBlockWrite(GetExecutor(), id(), idx, subidx,
694  ::std::forward<T>(value), ::std::forward<F>(con),
695  timeout);
696  }
697 
718  template <class T, class F>
719  void
720  SubmitBlockWrite(uint16_t idx, uint8_t subidx, T&& value, F&& con,
721  const ::std::chrono::milliseconds& timeout,
722  ::std::error_code& ec) {
723  master.SubmitBlockWrite(GetExecutor(), id(), idx, subidx,
724  ::std::forward<T>(value), ::std::forward<F>(con),
725  timeout, ec);
726  }
727 
734  template <class F>
735  void
736  SubmitWriteDcf(const uint8_t* begin, const uint8_t* end, F&& con) {
737  master.SubmitWriteDcf(GetExecutor(), id(), begin, end,
738  ::std::forward<F>(con));
739  }
740 
747  template <class F>
748  void
749  SubmitWriteDcf(const uint8_t* begin, const uint8_t* end, F&& con,
750  ::std::error_code& ec) {
751  master.SubmitWriteDcf(GetExecutor(), id(), begin, end,
752  ::std::forward<F>(con), ec);
753  }
754 
760  template <class F>
761  void
762  SubmitWriteDcf(const uint8_t* begin, const uint8_t* end, F&& con,
763  const ::std::chrono::milliseconds& timeout) {
764  master.SubmitWriteDcf(GetExecutor(), id(), begin, end,
765  ::std::forward<F>(con), timeout);
766  }
767 
787  template <class F>
788  void
789  SubmitWriteDcf(const uint8_t* begin, const uint8_t* end, F&& con,
790  const ::std::chrono::milliseconds& timeout,
791  ::std::error_code& ec) {
792  master.SubmitWriteDcf(GetExecutor(), id(), begin, end,
793  ::std::forward<F>(con), timeout, ec);
794  }
795 
802  template <class F>
803  void
804  SubmitWriteDcf(const char* path, F&& con) {
805  master.SubmitWriteDcf(GetExecutor(), id(), path, ::std::forward<F>(con));
806  }
807 
814  template <class F>
815  void
816  SubmitWriteDcf(const char* path, F&& con, ::std::error_code& ec) {
817  master.SubmitWriteDcf(GetExecutor(), id(), path, ::std::forward<F>(con),
818  ec);
819  }
820 
826  template <class F>
827  void
828  SubmitWriteDcf(const char* path, F&& con,
829  const ::std::chrono::milliseconds& timeout) {
830  master.SubmitWriteDcf(GetExecutor(), id(), path, ::std::forward<F>(con),
831  timeout);
832  }
833 
850  template <class F>
851  void
852  SubmitWriteDcf(const char* path, F&& con,
853  const ::std::chrono::milliseconds& timeout,
854  ::std::error_code& ec) {
855  master.SubmitWriteDcf(GetExecutor(), id(), path, ::std::forward<F>(con),
856  timeout, ec);
857  }
858 
865  template <class T>
867  AsyncRead(uint16_t idx, uint8_t subidx) {
868  return master.AsyncRead<T>(GetExecutor(), id(), idx, subidx);
869  }
870 
885  template <class T>
887  AsyncRead(uint16_t idx, uint8_t subidx,
888  const ::std::chrono::milliseconds& timeout) {
889  return master.AsyncRead<T>(GetExecutor(), id(), idx, subidx, timeout);
890  }
891 
898  template <class T>
900  AsyncBlockRead(uint16_t idx, uint8_t subidx) {
901  return master.AsyncBlockRead<T>(GetExecutor(), id(), idx, subidx);
902  }
903 
922  template <class T>
924  AsyncBlockRead(uint16_t idx, uint8_t subidx,
925  const ::std::chrono::milliseconds& timeout) {
926  return master.AsyncBlockRead<T>(GetExecutor(), id(), idx, subidx, timeout);
927  }
928 
935  template <class T>
937  AsyncWrite(uint16_t idx, uint8_t subidx, T&& value) {
938  return master.AsyncWrite(GetExecutor(), id(), idx, subidx,
939  ::std::forward<T>(value));
940  }
941 
956  template <class T>
958  AsyncWrite(uint16_t idx, uint8_t subidx, T&& value,
959  const ::std::chrono::milliseconds& timeout) {
960  return master.AsyncWrite(GetExecutor(), id(), idx, subidx,
961  ::std::forward<T>(value), timeout);
962  }
963 
970  template <class T>
972  AsyncBlockWrite(uint16_t idx, uint8_t subidx, T&& value) {
973  return master.AsyncBlockWrite(GetExecutor(), id(), idx, subidx,
974  ::std::forward<T>(value));
975  }
976 
995  template <class T>
997  AsyncBlockWrite(uint16_t idx, uint8_t subidx, T&& value,
998  const ::std::chrono::milliseconds& timeout) {
999  return master.AsyncBlockWrite(GetExecutor(), id(), idx, subidx,
1000  ::std::forward<T>(value), timeout);
1001  }
1002 
1010  AsyncWriteDcf(const uint8_t* begin, const uint8_t* end) {
1011  return master.AsyncWriteDcf(GetExecutor(), id(), begin, end);
1012  }
1013 
1031  AsyncWriteDcf(const uint8_t* begin, const uint8_t* end,
1032  const ::std::chrono::milliseconds& timeout) {
1033  return master.AsyncWriteDcf(GetExecutor(), id(), begin, end, timeout);
1034  }
1035 
1043  AsyncWriteDcf(const char* path) {
1044  return master.AsyncWriteDcf(GetExecutor(), id(), path);
1045  }
1046 
1061  AsyncWriteDcf(const char* path, const ::std::chrono::milliseconds& timeout) {
1062  return master.AsyncWriteDcf(GetExecutor(), id(), path, timeout);
1063  }
1064 
1075  void Insert(LogicalDriverBase& driver);
1076 
1082  void Erase(LogicalDriverBase& driver);
1083 
1090  template <class F, class... Args>
1091  void
1092  Post(F&& f, Args&&... args) {
1093  GetExecutor().post(::std::forward<F>(f), ::std::forward<Args>(args)...);
1094  }
1095 
1098 
1105  class BasicMaster::RpdoMapped rpdo_mapped;
1106 
1113  class BasicMaster::TpdoMapped tpdo_mapped;
1114 
1117 
1118  protected:
1119  using MapType = ::std::map<uint8_t, LogicalDriverBase*>;
1120 
1126  void OnCanState(io::CanState new_state,
1127  io::CanState old_state) noexcept override;
1128 
1134  void OnCanError(io::CanError error) noexcept override;
1135 
1145  void OnRpdoWrite(uint16_t idx, uint8_t subidx) noexcept override;
1146 
1152  void OnCommand(NmtCommand cs) noexcept override;
1153 
1159  void OnHeartbeat(bool occurred) noexcept override;
1160 
1166  void OnState(NmtState st) noexcept override;
1167 
1173  void OnSync(uint8_t cnt, const time_point& t) noexcept override;
1174 
1180  void OnSyncError(uint16_t eec, uint8_t er) noexcept override;
1181 
1187  void OnTime(const ::std::chrono::system_clock::time_point& abs_time) noexcept
1188  override;
1189 
1195  void OnEmcy(uint16_t eec, uint8_t er, uint8_t msef[5]) noexcept override;
1196 
1202  void OnNodeGuarding(bool occurred) noexcept override;
1203 
1209  void OnBoot(NmtState st, char es,
1210  const ::std::string& what) noexcept override;
1211 
1218  void OnConfig(
1219  ::std::function<void(::std::error_code ec)> res) noexcept override;
1220 
1227  void OnDeconfig(
1228  ::std::function<void(::std::error_code ec)> res) noexcept override;
1229 
1236  SdoFuture<void> AsyncConfig(int num = 0);
1237 
1244  SdoFuture<void> AsyncDeconfig(int num = 0);
1245 
1246  private:
1247  ev_exec_t* exec_{nullptr};
1248  const uint8_t id_{0xff};
1249 };
1250 
1251 } // namespace canopen
1252 
1253 } // namespace lely
1254 
1255 #endif // LELY_COAPP_DRIVER_HPP_
The base class for drivers for remote CANopen nodes.
Definition: driver.hpp:279
SdoFuture< void > AsyncBlockWrite(uint16_t idx, uint8_t subidx, T &&value)
Equivalent to AsyncBlockWrite(uint16_t idx, uint8_t subidx, T&& value, const ::std::chrono::milliseco...
Definition: driver.hpp:972
SdoFuture< void > AsyncWriteDcf(const char *path, const ::std::chrono::milliseconds &timeout)
Queues a series of asynchronous write (SDO download) operations, corresponding to the entries in the ...
Definition: driver.hpp:1061
void SubmitWrite(uint16_t idx, uint8_t subidx, T &&value, F &&con)
Equivalent to SubmitWrite(uint16_t idx, uint8_t subidx, T&& value, F&& con, const ::std::chrono::mill...
Definition: driver.hpp:597
SdoFuture< void > AsyncWrite(uint16_t idx, uint8_t subidx, T &&value)
Equivalent to AsyncWrite(uint16_t idx, uint8_t subidx, T&& value, const ::std::chrono::milliseconds& ...
Definition: driver.hpp:937
SdoFuture< void > AsyncWait(const duration &d)
Submits an asynchronous wait operation and creates a future which becomes ready once the wait operati...
Definition: driver.hpp:454
void SubmitRead(uint16_t idx, uint8_t subidx, F &&con, const ::std::chrono::milliseconds &timeout)
Equivalent to SubmitRead(uint16_t idx, uint8_t subidx, F&& con, const ::std::chrono::milliseconds& ti...
Definition: driver.hpp:491
SdoFuture< void > AsyncBlockWrite(uint16_t idx, uint8_t subidx, T &&value, const ::std::chrono::milliseconds &timeout)
Queues an asynchronous write (SDO block download) operation and creates a future which becomes ready ...
Definition: driver.hpp:997
uint8_t netid() const noexcept final
Returns the network-ID.
Definition: driver.hpp:316
SdoFuture< void > AsyncWait(const time_point &t)
Submits an asynchronous wait operation and creates a future which becomes ready once the wait operati...
Definition: driver.hpp:441
void ConfigHeartbeat(const ::std::chrono::milliseconds &ms)
Configures heartbeat consumption by updating CANopen object 1016 (Consumer heartbeat time).
Definition: driver.hpp:349
void SubmitBlockWrite(uint16_t idx, uint8_t subidx, T &&value, F &&con, const ::std::chrono::milliseconds &timeout, ::std::error_code &ec)
Queues an asynchronous write (SDO block download) operation.
Definition: driver.hpp:720
void SubmitBlockWrite(uint16_t idx, uint8_t subidx, T &&value, F &&con)
Equivalent to SubmitBlockWrite(uint16_t idx, uint8_t subidx, T&& value, F&& con, const ::std::chrono:...
Definition: driver.hpp:664
bool IsReady() const
Returns true if the remote node is ready (i.e., the NMT boot slave process has successfully completed...
Definition: driver.hpp:374
void SubmitBlockRead(uint16_t idx, uint8_t subidx, F &&con, const ::std::chrono::milliseconds &timeout)
Equivalent to SubmitBlockRead(uint16_t idx, uint8_t subidx, F&& con, const ::std::chrono::millisecond...
Definition: driver.hpp:555
SdoFuture< void > AsyncWriteDcf(const uint8_t *begin, const uint8_t *end, const ::std::chrono::milliseconds &timeout)
Queues a series of asynchronous write (SDO download) operations, corresponding to the entries in the ...
Definition: driver.hpp:1031
void SubmitWrite(uint16_t idx, uint8_t subidx, T &&value, F &&con, const ::std::chrono::milliseconds &timeout)
Equivalent to SubmitWrite(uint16_t idx, uint8_t subidx, T&& value, F&& con, const ::std::chrono::mill...
Definition: driver.hpp:623
void SubmitWriteDcf(const uint8_t *begin, const uint8_t *end, F &&con, ::std::error_code &ec)
Equivalent to SubmitWriteDcf(const uint8_t* begin, const uint8_t* end, F&& con, const ::std::chrono::...
Definition: driver.hpp:749
void DamMpdoEvent(int num, uint16_t idx, uint8_t subidx, T value)
Triggers the transmission of a destination address mode multiplex PDO (DAM-MPDO).
Definition: driver.hpp:402
TpdoEventMutex & tpdo_event_mutex
Definition: driver.hpp:1116
void SubmitWriteDcf(const char *path, F &&con)
Equivalent to SubmitWriteDcf(const char* path, F&& con, const ::std::chrono::milliseconds& timeout),...
Definition: driver.hpp:804
SdoFuture< void > AsyncWriteDcf(const char *path)
Equivalent to AsyncWriteDcf(const char* path, const ::std::chrono::milliseconds& timeout),...
Definition: driver.hpp:1043
SdoFuture< T > AsyncBlockRead(uint16_t idx, uint8_t subidx)
Equivalent to AsyncBlockRead(uint16_t idx, uint8_t subidx, const ::std::chrono::milliseconds& timeout...
Definition: driver.hpp:900
ev::Executor GetExecutor() const noexcept final
Returns the executor used to execute event handlers for this driver, including SDO confirmation funct...
Definition: driver.hpp:311
void SubmitWriteDcf(const uint8_t *begin, const uint8_t *end, F &&con)
Equivalent to SubmitWriteDcf(const uint8_t* begin, const uint8_t* end, F&& con, const ::std::chrono::...
Definition: driver.hpp:736
BasicDriver(BasicMaster &master, uint8_t id)
Creates a new driver for a remote CANopen node and registers it with the master.
Definition: driver.hpp:305
void SubmitRead(uint16_t idx, uint8_t subidx, F &&con, const ::std::chrono::milliseconds &timeout, ::std::error_code &ec)
Queues an asynchronous read (SDO upload) operation.
Definition: driver.hpp:514
SdoFuture< T > AsyncRead(uint16_t idx, uint8_t subidx, const ::std::chrono::milliseconds &timeout)
Queues an asynchronous read (SDO upload) operation and creates a future which becomes ready once the ...
Definition: driver.hpp:887
uint8_t id() const noexcept final
Returns the node-ID.
Definition: driver.hpp:321
void SubmitBlockWrite(uint16_t idx, uint8_t subidx, T &&value, F &&con, const ::std::chrono::milliseconds &timeout)
Equivalent to SubmitBlockWrite(uint16_t idx, uint8_t subidx, T&& value, F&& con, const ::std::chrono:...
Definition: driver.hpp:691
void SubmitWrite(uint16_t idx, uint8_t subidx, T &&value, F &&con, const ::std::chrono::milliseconds &timeout, ::std::error_code &ec)
Queues an asynchronous write (SDO download) operation.
Definition: driver.hpp:648
void ConfigHeartbeat(const ::std::chrono::milliseconds &ms, ::std::error_code &ec)
Configures heartbeat consumption by updating CANopen object 1016 (Consumer heartbeat time).
Definition: driver.hpp:334
void SubmitRead(uint16_t idx, uint8_t subidx, F &&con, ::std::error_code &ec)
Equivalent to SubmitRead(uint16_t idx, uint8_t subidx, F&& con, const ::std::chrono::milliseconds& ti...
Definition: driver.hpp:479
void SubmitWrite(uint16_t idx, uint8_t subidx, T &&value, F &&con, ::std::error_code &ec)
Equivalent to SubmitWrite(uint16_t idx, uint8_t subidx, T&& value, F&& con, const ::std::chrono::mill...
Definition: driver.hpp:610
bool Boot()
Requests the NMT 'boot slave' process for the remote node.
Definition: driver.hpp:360
SdoFuture< T > AsyncRead(uint16_t idx, uint8_t subidx)
Equivalent to AsyncRead(uint16_t idx, uint8_t subidx, const ::std::chrono::milliseconds& timeout),...
Definition: driver.hpp:867
void SubmitBlockRead(uint16_t idx, uint8_t subidx, F &&con, const ::std::chrono::milliseconds &timeout, ::std::error_code &ec)
Queues an asynchronous read (SDO block upload) operation.
Definition: driver.hpp:582
void SubmitBlockWrite(uint16_t idx, uint8_t subidx, T &&value, F &&con, ::std::error_code &ec)
Equivalent to SubmitBlockWrite(uint16_t idx, uint8_t subidx, T&& value, F&& con, const ::std::chrono:...
Definition: driver.hpp:677
SdoFuture< void > AsyncWrite(uint16_t idx, uint8_t subidx, T &&value, const ::std::chrono::milliseconds &timeout)
Queues an asynchronous write (SDO download) operation and creates a future which becomes ready once t...
Definition: driver.hpp:958
void SubmitWait(const duration &d, F &&f)
Submits a wait operation.
Definition: driver.hpp:428
void SubmitWriteDcf(const char *path, F &&con, const ::std::chrono::milliseconds &timeout, ::std::error_code &ec)
Queues a series of asynchronous write (SDO download) operations.
Definition: driver.hpp:852
void SubmitRead(uint16_t idx, uint8_t subidx, F &&con)
Equivalent to SubmitRead(uint16_t idx, uint8_t subidx, F&& con, const ::std::chrono::milliseconds& ti...
Definition: driver.hpp:466
void SubmitWriteDcf(const uint8_t *begin, const uint8_t *end, F &&con, const ::std::chrono::milliseconds &timeout)
Equivalent to SubmitWriteDcf(const uint8_t* begin, const uint8_t* end, F&& con, const ::std::chrono::...
Definition: driver.hpp:762
void Error()
Indicates the occurrence of an error event on the remote node and triggers the error handling process...
Definition: driver.hpp:385
void SubmitWriteDcf(const uint8_t *begin, const uint8_t *end, F &&con, const ::std::chrono::milliseconds &timeout, ::std::error_code &ec)
Queues a series of asynchronous write (SDO download) operations.
Definition: driver.hpp:789
void SubmitWriteDcf(const char *path, F &&con, const ::std::chrono::milliseconds &timeout)
Equivalent to SubmitWriteDcf(const char* path, F&& con, const ::std::chrono::milliseconds& timeout,...
Definition: driver.hpp:828
SdoFuture< void > AsyncWriteDcf(const uint8_t *begin, const uint8_t *end)
Equivalent to AsyncWriteDcf(const uint8_t* begin, const uint8_t* end, const ::std::chrono::millisecon...
Definition: driver.hpp:1010
void SubmitWriteDcf(const char *path, F &&con, ::std::error_code &ec)
Equivalent to SubmitWriteDcf(const char* path, F&& con, const ::std::chrono::milliseconds& timeout,...
Definition: driver.hpp:816
void SubmitWait(const time_point &t, F &&f)
Submits a wait operation.
Definition: driver.hpp:415
void SubmitBlockRead(uint16_t idx, uint8_t subidx, F &&con, ::std::error_code &ec)
Equivalent to SubmitBlockRead(uint16_t idx, uint8_t subidx, F&& con, const ::std::chrono::millisecond...
Definition: driver.hpp:542
BasicMaster & master
A reference to the master with which this driver is registered.
Definition: driver.hpp:1097
void Post(F &&f, Args &&... args)
Schedules the specified Callable object for execution by the executor for this driver.
Definition: driver.hpp:1092
void SubmitBlockRead(uint16_t idx, uint8_t subidx, F &&con)
Equivalent to SubmitBlockRead(uint16_t idx, uint8_t subidx, F&& con, const ::std::chrono::millisecond...
Definition: driver.hpp:529
SdoFuture< T > AsyncBlockRead(uint16_t idx, uint8_t subidx, const ::std::chrono::milliseconds &timeout)
Queues an asynchronous read (SDO block upload) operation and creates a future which becomes ready onc...
Definition: driver.hpp:924
An accessor providing read-only access to TPDO-mapped objects in a remote object dictionary.
Definition: master.hpp:451
A mutator providing read/write access to TPDO-mapped objects in a remote object dictionary.
Definition: master.hpp:482
The CANopen master.
Definition: master.hpp:50
void SubmitBlockRead(ev_exec_t *exec, uint8_t id, uint16_t idx, uint8_t subidx, F &&con)
Equivalent to SubmitBlockRead(ev_exec_t* exec, uint8_t id, uint16_t idx, uint8_t subidx,...
Definition: master.hpp:871
void SubmitBlockWrite(ev_exec_t *exec, uint8_t id, uint16_t idx, uint8_t subidx, T &&value, F &&con)
Equivalent to SubmitBlockWrite(ev_exec_t* exec, uint8_t id, uint16_t idx, uint8_t subidx,...
Definition: master.hpp:1082
SdoFuture< void > AsyncBlockWrite(ev_exec_t *exec, uint8_t id, uint16_t idx, uint8_t subidx, T &&value)
Equivalent to AsyncBlockWrite(ev_exec_t* exec, uint8_t id, uint16_t idx, uint8_t subidx,...
Definition: master.hpp:1508
void SubmitWriteDcf(uint8_t id, SdoDownloadDcfRequest &req)
Equivalent to SubmitWriteDcf(uint8_t id, SdoDownloadDcfRequest& req, ::std::error_code& ec),...
Definition: master.cpp:200
SdoFuture< void > AsyncWrite(ev_exec_t *exec, uint8_t id, uint16_t idx, uint8_t subidx, T &&value)
Equivalent to AsyncWrite(ev_exec_t* exec, uint8_t id, uint16_t idx, uint8_t subidx,...
Definition: master.hpp:1471
SdoFuture< T > AsyncRead(ev_exec_t *exec, uint8_t id, uint16_t idx, uint8_t subidx)
Equivalent to AsyncRead(ev_exec_t* exec, uint8_t id, uint16_t idx, uint8_t subidx,...
Definition: master.hpp:1363
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:150
bool Boot(uint8_t id)
Requests the NMT 'boot slave' process for the specified node.
Definition: master.cpp:91
SdoFuture< void > AsyncWriteDcf(ev_exec_t *exec, uint8_t id, const uint8_t *begin, const uint8_t *end)
Equivalent to AsyncWriteDcf(ev_exec_t* exec, uint8_t id, const uint8_t* begin, const uint8_t* end,...
Definition: master.hpp:1586
bool IsReady(uint8_t id) const
Returns true if the remote node is ready (i.e., the NMT 'boot slave' process has successfully complet...
Definition: master.cpp:117
void SubmitRead(uint8_t id, SdoUploadRequest< T > &req)
Equivalent to SubmitRead(uint8_t id, SdoUploadRequest<T>& req, ::std::error_code& ec),...
Definition: master.hpp:770
void SubmitWrite(uint8_t id, SdoDownloadRequest< T > &req)
Equivalent to SubmitWrite(uint8_t id, SdoDownloadRequest<T>& req, ::std::error_code& ec),...
Definition: master.hpp:978
SdoFuture< T > AsyncBlockRead(ev_exec_t *exec, uint8_t id, uint16_t idx, uint8_t subidx)
Equivalent to AsyncBlockRead(ev_exec_t* exec, uint8_t id, uint16_t idx, uint8_t subidx,...
Definition: master.hpp:1397
void DamMpdoEvent(int num, uint8_t id, uint16_t idx, uint8_t subidx, T value)
Definition: master.hpp:741
uint8_t netid() const noexcept
Returns the network-ID.
Definition: device.cpp:186
The abstract driver interface for a remote CANopen node.
Definition: driver.hpp:36
virtual void OnCommand(NmtCommand cs) noexcept=0
The function invoked when an NMT state change occurs on the master.
virtual void OnSync(uint8_t cnt, const time_point &t) noexcept=0
The function invoked when a SYNC message is sent/received by the master.
virtual uint8_t netid() const noexcept=0
Returns the network-ID.
virtual void OnNodeGuarding(bool occurred) noexcept=0
The function invoked when a node guarding timeout event occurs or is resolved for the remote node.
virtual void OnHeartbeat(bool occurred) noexcept=0
The function invoked when a heartbeat timeout event occurs or is resolved for the remote node.
virtual void OnConfig(::std::function< void(::std::error_code ec)> res) noexcept=0
The function invoked when the 'update configuration' step is reached during the NMT 'boot slave' proc...
virtual void OnCanError(io::CanError error) noexcept=0
The function invoked when an error is detected on the CAN bus.
virtual ev::Executor GetExecutor() const noexcept=0
Returns the executor used to execute event handlers for this driver, including SDO confirmation funct...
virtual void OnTime(const ::std::chrono::system_clock::time_point &abs_time) noexcept=0
The function invoked when a TIME message is received by the master.
virtual void OnDeconfig(::std::function< void(::std::error_code ec)> res) noexcept=0
The function invoked by BasicMaster::AsyncDeconfig() to start the deconfiguration process.
virtual void OnSyncError(uint16_t eec, uint8_t er) noexcept=0
The function invoked when the data length of a received SYNC message does not match.
virtual void OnState(NmtState st) noexcept=0
The function invoked when an NMT state change or boot-up event is detected for the remote node by the...
virtual uint8_t id() const noexcept=0
Returns the node-ID.
virtual void OnCanState(io::CanState new_state, io::CanState old_state) noexcept=0
The function invoked when a CAN bus state change is detected.
virtual void OnEmcy(uint16_t eec, uint8_t er, uint8_t msef[5]) noexcept=0
The function invoked when an EMCY message is received from the remote node.
virtual void OnBoot(NmtState st, char es, const ::std::string &what) noexcept=0
The function invoked when the NMT 'boot slave' process completes for the remote node.
The abstract driver interface for a logical device on a remote CANopen node.
Definition: driver.hpp:258
virtual int Number() const noexcept=0
Returns the number of the logical device on the remote node.
A CANopen driver running its own dedicated event loop in a separate thread.
Definition: loop_driver.hpp:51
ev::Future< void, ::std::exception_ptr > AsyncWait(ev_exec_t *exec, const time_point &t, io_tqueue_wait **pwait=nullptr)
Submits an asynchronous wait operation and creates a future which becomes ready once the wait operati...
Definition: node.cpp:185
void ConfigHeartbeat(uint8_t id, const ::std::chrono::milliseconds &ms, ::std::error_code &ec)
Configures heartbeat consumption for the specified node by updating CANopen object 1016 (Consumer hea...
Definition: node.cpp:270
void SubmitWait(const time_point &t, io_tqueue_wait &wait)
Submits a wait operation.
Definition: node.cpp:174
The type of objects thrown as exceptions to report a system error with an associated error code.
Definition: exception.hpp:54
An abstract task executor. This class is a wrapper around #ev_exec_t*.
Definition: exec.hpp:38
void post(ev_task &task) noexcept
Definition: exec.hpp:75
A future.
Definition: future.hpp:384
CanError
The error flags of a CAN bus, which are not mutually exclusive.
Definition: err.hpp:47
CanState
The states of a CAN node, depending on the TX/RX error count.
Definition: err.hpp:33
const struct ev_exec_vtbl *const ev_exec_t
An abstract task executor.
Definition: ev.h:29
This header file is part of the C++ CANopen application library; it contains the CANopen master decla...
NmtState
The NMT states.
Definition: node.hpp:56
NmtCommand
The NMT command specifiers.
Definition: node.hpp:42