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
31namespace lely {
32
33namespace canopen {
34
35class DriverBase;
36
46class 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>
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
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
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
1044class 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_
An asynchronous CANopen master.
Definition: master.hpp:1044
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
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 OnConfig(uint8_t id) noexcept override
The default implementation queues a notification for the driver registered for node id.
Definition: master.cpp:401
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 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
void OnNodeGuarding(uint8_t id, bool occurred) noexcept override
The default implementation queues a notification for all registered drivers.
Definition: master.cpp:349
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
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
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 OnSyncError(uint16_t eec, uint8_t er) noexcept override
The default implementation queues a notification for all registered drivers.
Definition: master.cpp:480
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
void OnCommand(NmtCommand cs) noexcept override
The default implementation queues a notification for all registered drivers.
Definition: master.cpp:335
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
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
An accessor providing read-only access to a CANopen object in a local object dictionary.
Definition: master.hpp:316
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
An accessor providing read-only access to a CANopen sub-object in a local object dictionary.
Definition: master.hpp:209
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
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
A mutator providing read/write access to a CANopen object in a local object dictionary.
Definition: master.hpp:273
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
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
A mutator providing read/write access to a CANopen sub-object in a local object dictionary.
Definition: master.hpp:55
SubObject & operator=(T &&value)
Sets the value of the sub-object.
Definition: master.hpp:77
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
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 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
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 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
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
The CANopen master.
Definition: master.hpp:46
void OnSyncError(uint16_t eec, uint8_t er) noexcept override
The default implementation notifies all registered drivers.
Definition: master.cpp:259
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
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
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
void RpdoRtr(int num=0)
Requests the transmission of a PDO.
Definition: master.cpp:78
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
virtual void OnConfig(uint8_t id) noexcept
The function invoked when the 'update configuration' step is reached during the NMT 'boot slave' proc...
Definition: master.cpp:198
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
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,...
Definition: master.hpp:775
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 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
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 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
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
void SubmitWrite(uint8_t id, Sdo::DownloadRequest< T > &req, ::std::error_code &ec)
Queues an asynchronous write (SDO download) operation.
Definition: master.hpp:617
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
void OnHeartbeat(uint8_t id, bool occurred) noexcept override
The default implementation notifies the driver registered for node id.
Definition: master.cpp:167
void Erase(DriverBase &driver)
Unregisters a driver for a remote CANopen node.
Definition: master.cpp:123
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 OnSync(uint8_t cnt, const time_point &t) noexcept override
The default implementation notifies all registered drivers.
Definition: master.cpp:251
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 TpdoEvent(int num=0)
Triggers the transmission of an event-driven (asynchronous) PDO.
Definition: master.cpp:85
void Insert(DriverBase &driver)
Registers a driver for a remote CANopen node.
Definition: master.cpp:106
void OnRpdoError(int num, uint16_t eec, uint8_t er) noexcept override
The default implementation notifies all registered drivers.
Definition: master.cpp:234
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
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
void OnCanError(CanError error) noexcept override
The default implementation notifies all registered drivers.
Definition: master.cpp:131
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
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
::std::chrono::milliseconds GetTimeout() const
Returns the SDO timeout used during the NMT 'boot slave' and 'check configuration' processes.
Definition: master.cpp:92
void OnState(uint8_t id, NmtState st) noexcept override
The default implementation notifies the driver registered for node id.
Definition: master.cpp:176
void OnCommand(NmtCommand cs) noexcept override
The default implementation notifies all registered drivers.
Definition: master.cpp:147
virtual void OnBoot(uint8_t id, NmtState st, char es, const ::std::string &what) noexcept
The function invoked when the NMT 'boot slave' process completes.
Definition: master.cpp:188
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
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
void SetTimeout(const ::std::chrono::milliseconds &timeout)
Sets the SDO timeout used during the NMT 'boot slave' and 'check configuration' processes.
Definition: master.cpp:99
void ConfigResult(uint8_t id, ::std::error_code ec) noexcept
Reports the result of the 'update configuration' step to the NMT service.
Definition: master.cpp:216
void CancelSdo(uint8_t id=0)
Aborts any ongoing or pending SDO requests for the specified slave.
Definition: master.cpp:305
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 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
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
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
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
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
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
Sdo * GetSdo(uint8_t id)
Returns a pointer to the default client-SDO service for the given node.
Definition: master.cpp:286
uint8_t netid() const noexcept
Returns the network-ID.
Definition: device.cpp:87
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.
Definition: device.cpp:118
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.
Definition: device.cpp:145
The abstract driver interface for a remote CANopen node.
Definition: driver.hpp:33
void SetTime()
Update the CAN network time.
Definition: io_context.cpp:91
The base class for CANopen nodes.
Definition: node.hpp:109
virtual void lock() final override
Blocks until a lock can be obtained for the current execution agent (thread, process,...
Definition: node.cpp:114
The type of exception thrown when an SDO abort code is received.
Definition: sdo_error.hpp:116
An SDO download request.
Definition: sdo.hpp:132
An SDO upload request.
Definition: sdo.hpp:197
The Client-SDO queue.
Definition: sdo.hpp:48
::std::chrono::milliseconds duration
The type used to represent an SDO timeout duration.
Definition: sdo.hpp:51
The type of objects thrown as exceptions to report a system error with an associated error code.
Definition: exception.hpp:54
This header file is part of the C++ CANopen application library; it contains the mutual exclusion fac...
NmtState
The NMT states.
Definition: node.hpp:50
@ NO_SDO
Resource not available: SDO connection.
NmtCommand
The NMT command specifiers.
Definition: node.hpp:36
Global namespace for the Lely Industries N.V. libraries.
Definition: buf.hpp:32
This header file is part of the C++ CANopen application library; it contains the CANopen node declara...
This header file is part of the C++ CANopen master library; it contains the Client-SDO queue declarat...