Lely core libraries
2.3.4
|
Go to the documentation of this file.
22 #ifndef LELY_COAPP_DRIVER_HPP_
23 #define LELY_COAPP_DRIVER_HPP_
38 using time_point = BasicMaster::time_point;
54 virtual uint8_t
netid()
const noexcept = 0;
57 virtual uint8_t
id()
const noexcept = 0;
82 virtual void OnRpdoWrite(uint16_t idx, uint8_t subidx) noexcept = 0;
106 virtual void OnHeartbeat(
bool occurred) noexcept = 0;
130 virtual void OnSync(uint8_t cnt,
const time_point& t) noexcept = 0;
141 virtual void OnSyncError(uint16_t eec, uint8_t er) noexcept = 0;
151 const ::std::chrono::system_clock::time_point& abs_time) noexcept = 0;
162 virtual void OnEmcy(uint16_t eec, uint8_t er, uint8_t msef[5]) noexcept = 0;
220 const ::std::string& what) noexcept = 0;
238 ::std::function<
void(::std::error_code ec)> res) noexcept = 0;
254 ::std::function<
void(::std::error_code ec)> res) noexcept = 0;
261 virtual int Number()
const noexcept = 0;
279 protected ::std::map<uint8_t, LogicalDriverBase*> {
283 using DriverBase::time_point;
284 using duration = BasicMaster::duration;
321 id() const noexcept final {
335 ::std::error_code& ec) {
464 template <
class T,
class F>
468 ::std::forward<F>(con));
477 template <
class T,
class F>
479 SubmitRead(uint16_t idx, uint8_t subidx, F&& con, ::std::error_code& ec) {
481 ::std::forward<F>(con), ec);
489 template <
class T,
class F>
492 const ::std::chrono::milliseconds& timeout) {
494 ::std::forward<F>(con), timeout);
512 template <
class T,
class F>
515 const ::std::chrono::milliseconds& timeout,
516 ::std::error_code& ec) {
518 ::std::forward<F>(con), timeout, ec);
527 template <
class T,
class F>
531 ::std::forward<F>(con));
540 template <
class T,
class F>
543 ::std::error_code& ec) {
545 ::std::forward<F>(con), ec);
553 template <
class T,
class F>
556 const ::std::chrono::milliseconds& timeout) {
558 ::std::forward<F>(con), timeout);
580 template <
class T,
class F>
583 const ::std::chrono::milliseconds& timeout,
584 ::std::error_code& ec) {
586 ::std::forward<F>(con), timeout, ec);
595 template <
class T,
class F>
599 ::std::forward<T>(value), ::std::forward<F>(con));
608 template <
class T,
class F>
611 ::std::error_code& ec) {
613 ::std::forward<T>(value), ::std::forward<F>(con), ec);
621 template <
class T,
class F>
624 const ::std::chrono::milliseconds& timeout) {
626 ::std::forward<T>(value), ::std::forward<F>(con),
646 template <
class T,
class F>
649 const ::std::chrono::milliseconds& timeout,
650 ::std::error_code& ec) {
652 ::std::forward<T>(value), ::std::forward<F>(con),
662 template <
class T,
class F>
666 ::std::forward<T>(value), ::std::forward<F>(con));
675 template <
class T,
class F>
678 ::std::error_code& ec) {
680 ::std::forward<T>(value), ::std::forward<F>(con),
689 template <
class T,
class F>
692 const ::std::chrono::milliseconds& timeout) {
694 ::std::forward<T>(value), ::std::forward<F>(con),
718 template <
class T,
class F>
721 const ::std::chrono::milliseconds& timeout,
722 ::std::error_code& ec) {
724 ::std::forward<T>(value), ::std::forward<F>(con),
738 ::std::forward<F>(con));
750 ::std::error_code& ec) {
752 ::std::forward<F>(con), ec);
763 const ::std::chrono::milliseconds& timeout) {
765 ::std::forward<F>(con), timeout);
790 const ::std::chrono::milliseconds& timeout,
791 ::std::error_code& ec) {
793 ::std::forward<F>(con), timeout, ec);
829 const ::std::chrono::milliseconds& timeout) {
853 const ::std::chrono::milliseconds& timeout,
854 ::std::error_code& ec) {
888 const ::std::chrono::milliseconds& timeout) {
925 const ::std::chrono::milliseconds& timeout) {
939 ::std::forward<T>(value));
959 const ::std::chrono::milliseconds& timeout) {
961 ::std::forward<T>(value), timeout);
974 ::std::forward<T>(value));
998 const ::std::chrono::milliseconds& timeout) {
1000 ::std::forward<T>(value), timeout);
1032 const ::std::chrono::milliseconds& timeout) {
1090 template <
class F,
class... Args>
1093 GetExecutor().
post(::std::forward<F>(f), ::std::forward<Args>(args)...);
1119 using MapType = ::std::map<uint8_t, LogicalDriverBase*>;
1145 void OnRpdoWrite(uint16_t idx, uint8_t subidx) noexcept
override;
1159 void OnHeartbeat(
bool occurred) noexcept
override;
1173 void OnSync(uint8_t cnt,
const time_point& t) noexcept
override;
1180 void OnSyncError(uint16_t eec, uint8_t er) noexcept
override;
1187 void OnTime(const ::std::chrono::system_clock::time_point& abs_time) noexcept
1195 void OnEmcy(uint16_t eec, uint8_t er, uint8_t msef[5]) noexcept
override;
1210 const ::std::string& what) noexcept
override;
1219 ::std::function<
void(::std::error_code ec)> res) noexcept
override;
1228 ::std::function<
void(::std::error_code ec)> res) noexcept
override;
1248 const uint8_t id_{0xff};
1255 #endif // LELY_COAPP_DRIVER_HPP_
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.
void OnCommand(NmtCommand cs) noexcept override
The default implementation notifies all registered logical device drivers.
void post(ev_task &task) noexcept
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,...
void OnSyncError(uint16_t eec, uint8_t er) noexcept override
The default implementation notifies all registered logical device drivers.
The abstract driver interface for a remote CANopen node.
void SubmitWriteDcf(const char *path, F &&con, ::std::error_code &ec)
Equivalent to SubmitWriteDcf(const char* path, F&& con, const ::std::chrono::milliseconds& timeout,...
SdoFuture< T > AsyncRead(uint16_t idx, uint8_t subidx)
Equivalent to AsyncRead(uint16_t idx, uint8_t subidx, const ::std::chrono::milliseconds& timeout),...
NmtCommand
The NMT command specifiers.
const struct ev_exec_vtbl *const ev_exec_t
An abstract task executor.
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...
BasicMaster & master
A reference to the master with which this driver is registered.
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.
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...
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 ...
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...
void SubmitWriteDcf(uint8_t id, SdoDownloadDcfRequest &req)
Equivalent to SubmitWriteDcf(uint8_t id, SdoDownloadDcfRequest& req, ::std::error_code& ec),...
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.
The base class for drivers for remote CANopen nodes.
virtual void OnNodeGuarding(bool occurred) noexcept=0
The function invoked when a node guarding timeout event occurs or is resolved for the remote node.
BasicDriver(BasicMaster &master, uint8_t id)
Creates a new driver for a remote CANopen node and registers it with the master.
void OnSync(uint8_t cnt, const time_point &t) noexcept override
The default implementation notifies all registered logical device drivers.
virtual SdoFuture< void > AsyncConfig()=0
Asynchronously updates the logical device type and, on success, queues the DriverBase::OnConfig() met...
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,...
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...
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:...
void OnEmcy(uint16_t eec, uint8_t er, uint8_t msef[5]) noexcept override
The default implementation notifies all registered logical device drivers.
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...
void OnTime(const ::std::chrono::system_clock::time_point &abs_time) noexcept override
The default implementation notifies all registered logical device drivers.
bool Boot()
Requests the NMT 'boot slave' process for the remote node.
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& ...
void DamMpdoEvent(int num, uint8_t id, uint16_t idx, uint8_t subidx, T value)
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.
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...
A CANopen driver running its own dedicated event loop in a separate thread.
void OnHeartbeat(bool occurred) noexcept override
The default implementation notifies all registered logical device drivers.
void OnCanError(io::CanError error) noexcept override
The default implementation notifies all registered logical device drivers.
uint8_t netid() const noexcept final
Returns the network-ID.
bool Boot(uint8_t id)
Requests the NMT 'boot slave' process for the specified node.
The type of objects thrown as exceptions to report a system error with an associated error code.
void Error(uint8_t id)
Indicates the occurrence of an error event on a remote node and triggers the error handling process (...
virtual void OnCanState(io::CanState new_state, io::CanState old_state) noexcept=0
The function invoked when a CAN bus state change is detected.
SdoFuture< void > AsyncWait(const time_point &t)
Submits an asynchronous wait operation and creates a future which becomes ready once the wait operati...
void ConfigHeartbeat(const ::std::chrono::milliseconds &ms)
Configures heartbeat consumption by updating CANopen object 1016 (Consumer heartbeat time).
void OnRpdoWrite(uint16_t idx, uint8_t subidx) noexcept override
The default implementation notifies all registered logical device drivers, unless the object index is...
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...
uint8_t netid() const noexcept
Returns the network-ID.
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::...
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 uint8_t id() const noexcept=0
Returns the node-ID.
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.
CanError
The error flags of a CAN bus, which are not mutually exclusive.
virtual uint8_t netid() const noexcept=0
Returns the network-ID.
CanState
The states of a CAN node, depending on the TX/RX error count.
A mutator providing read/write access to TPDO-mapped objects in a remote object dictionary.
TpdoEventMutex & tpdo_event_mutex
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.
An accessor providing read-only access to TPDO-mapped objects in a remote object dictionary.
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,...
void OnState(NmtState st) noexcept override
The default implementation notifies all registered logical device drivers.
An abstract task executor. This class is a wrapper around #ev_exec_t*.
ev::Executor GetExecutor() const noexcept final
Returns the executor used to execute event handlers for this driver, including SDO confirmation funct...
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,...
class BasicMaster::TpdoMapped tpdo_mapped
A mutator providing read/write access to TPDO-mapped objects in the remote object dictionary.
SdoFuture< void > AsyncWait(const duration &d)
Submits an asynchronous wait operation and creates a future which becomes ready once the wait operati...
void OnCanState(io::CanState new_state, io::CanState old_state) noexcept override
The default implementation notifies all registered logical device drivers.
SdoFuture< void > AsyncDeconfig(int num=0)
Invokes LogicalDriverBase::AsyncDeconfig() for the specified logical device driver.
void OnNodeGuarding(bool occurred) noexcept override
The default implementation notifies all registered logical device drivers.
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 ...
virtual ev::Executor GetExecutor() const noexcept=0
Returns the executor used to execute event handlers for this driver, including SDO confirmation funct...
void SubmitWrite(uint8_t id, SdoDownloadRequest< T > &req)
Equivalent to SubmitWrite(uint8_t id, SdoDownloadRequest<T>& req, ::std::error_code& ec),...
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.
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::...
void OnConfig(::std::function< void(::std::error_code ec)> res) noexcept override
The default implementation invokes AsyncConfig() to start the configuration process for all registere...
void Erase(LogicalDriverBase &driver)
Unregisters a logical device driver for the remote node.
class BasicMaster::RpdoMapped rpdo_mapped
An accessor providing read-only access to RPDO-mapped objects in the remote object dictionary.
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.
void SubmitRead(uint8_t id, SdoUploadRequest< T > &req)
Equivalent to SubmitRead(uint8_t id, SdoUploadRequest<T>& req, ::std::error_code& ec),...
SdoFuture< void > AsyncConfig(int num=0)
Invokes LogicalDriverBase::AsyncConfig() for the specified logical device driver.
void SubmitWriteDcf(const char *path, F &&con)
Equivalent to SubmitWriteDcf(const char* path, F&& con, const ::std::chrono::milliseconds& timeout),...
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...
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...
void Error()
Indicates the occurrence of an error event on the remote node and triggers the error handling process...
void ConfigHeartbeat(const ::std::chrono::milliseconds &ms, ::std::error_code &ec)
Configures heartbeat consumption by updating CANopen object 1016 (Consumer heartbeat time).
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 ...
void OnBoot(NmtState st, char es, const ::std::string &what) noexcept override
The default implementation notifies all registered logical device drivers.
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...
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,...
bool IsReady(uint8_t id) const
Returns true if the remote node is ready (i.e., the NMT 'boot slave' process has successfully complet...
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...
SdoFuture< void > AsyncWriteDcf(const char *path)
Equivalent to AsyncWriteDcf(const char* path, const ::std::chrono::milliseconds& timeout),...
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,...
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.
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:...
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...
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...
void SubmitWait(const duration &d, F &&f)
Submits a wait operation.
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...
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.
void SubmitWait(const time_point &t, F &&f)
Submits a wait operation.
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:...
uint8_t id() const noexcept final
Returns the node-ID.
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...
virtual SdoFuture< void > AsyncDeconfig()=0
Queues the DriverBase::OnDeconfig() method and creates a future which becomes ready once the deconfig...
void SubmitWait(const time_point &t, io_tqueue_wait &wait)
Submits a wait operation.
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,...
void Insert(LogicalDriverBase &driver)
Registers a logical device driver for the remote node.
The abstract driver interface for a logical device on a remote CANopen node.
BasicDriver(ev_exec_t *exec, BasicMaster &master, uint8_t id)
Creates a new driver for a remote CANopen node and registers it with the master.
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,...
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 ...
void DamMpdoEvent(int num, uint16_t idx, uint8_t subidx, T value)
Triggers the transmission of a destination address mode multiplex PDO (DAM-MPDO).
virtual void OnCanError(io::CanError error) noexcept=0
The function invoked when an error is detected on the CAN bus.
SdoFuture< T > AsyncBlockRead(uint16_t idx, uint8_t subidx)
Equivalent to AsyncBlockRead(uint16_t idx, uint8_t subidx, const ::std::chrono::milliseconds& timeout...
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.
virtual void OnCommand(NmtCommand cs) noexcept=0
The function invoked when an NMT state change occurs on the master.
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...
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...
void OnDeconfig(::std::function< void(::std::error_code ec)> res) noexcept override
The default implementation invokes AsyncDeconfig() to start the deconfiguration process for all regis...
void Post(F &&f, Args &&... args)
Schedules the specified Callable object for execution by the executor for this driver.
bool IsReady() const
Returns true if the remote node is ready (i.e., the NMT boot slave process has successfully completed...
virtual void OnHeartbeat(bool occurred) noexcept=0
The function invoked when a heartbeat timeout event occurs or is resolved for the remote node.
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::...
virtual int Number() const noexcept=0
Returns the number of the logical device on the remote node.