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
31namespace lely {
32
33namespace canopen {
34
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
52
55
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
92
107
119
130 virtual void OnSync(uint8_t cnt, const time_point& t) noexcept = 0;
131
142
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
178
219 virtual void OnBoot(NmtState st, char es,
220 const ::std::string& what) noexcept = 0;
221
238 ::std::function<void(::std::error_code ec)> res) noexcept = 0;
239
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
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
312 return ev::Executor(exec_);
313 }
314
315 uint8_t
317 return master.netid();
318 }
319
320 uint8_t
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
361 return master.Boot(id());
362 }
363
373 bool
374 IsReady() const {
375 return master.IsReady(id());
376 }
377
384 void
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>
868 return master.AsyncRead<T>(GetExecutor(), id(), idx, subidx);
869 }
870
885 template <class T>
888 const ::std::chrono::milliseconds& timeout) {
889 return master.AsyncRead<T>(GetExecutor(), id(), idx, subidx, timeout);
890 }
891
898 template <class T>
901 return master.AsyncBlockRead<T>(GetExecutor(), id(), idx, subidx);
902 }
903
922 template <class T>
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
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_
A CANopen value.
Definition val.hpp:42
The base class for drivers for remote CANopen nodes.
Definition driver.hpp:279
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
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
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
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
uint8_t netid() const noexcept final
Returns the network-ID.
Definition driver.hpp:316
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
SdoFuture< void > AsyncWriteDcf(const char *path)
Equivalent to AsyncWriteDcf(const char* path, const ::std::chrono::milliseconds& timeout),...
Definition driver.hpp:1043
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
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
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 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 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, 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
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
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< 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
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
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
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
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
bool Boot()
Requests the NMT 'boot slave' process for the remote node.
Definition driver.hpp:360
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
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
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 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 > 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
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 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
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
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
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 > 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
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< 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
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.
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
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
STL namespace.