Lely core libraries  1.9.2
lely::canopen::BasicSlave Class Reference

The base class for CANopen slaves. More...

#include <slave.hpp>

Inheritance diagram for lely::canopen::BasicSlave:
Collaboration diagram for lely::canopen::BasicSlave:

Data Structures

class  ConstObject
 An accessor providing read-only access to a CANopen object in a local object dictionary. More...
 
class  ConstSubObject
 An accessor providing read-only access to a CANopen sub-object in a local object dictionary. More...
 
struct  Impl_
 The internal implementation of the CANopen slave. More...
 
class  Object
 A mutator providing read/write access to a CANopen object in a local object dictionary. More...
 
class  SubObject
 A mutator providing read/write access to a CANopen sub-object in a local object dictionary. More...
 

Public Member Functions

 BasicSlave (aio::TimerBase &timer, aio::CanBusBase &bus, const ::std::string &dcf_txt, const ::std::string &dcf_bin="", uint8_t id=0xff)
 Creates a new CANopen slave. More...
 
- Public Member Functions inherited from lely::canopen::Node
 Node (aio::TimerBase &timer, aio::CanBusBase &bus, const ::std::string &dcf_txt, const ::std::string &dcf_bin="", uint8_t id=0xff)
 Creates a new CANopen node. More...
 
void Reset ()
 (Re)starts the node. More...
 
- Public Member Functions inherited from lely::canopen::IoContext
 IoContext (aio::TimerBase &timer, aio::CanBusBase &bus, BasicLockable *mutex=nullptr)
 Creates a new I/O context. More...
 
aio::ExecutorBase GetExecutor () const noexcept
 Returns the executor used to process I/O events on the CAN bus.
 
template<class F >
void Post (F &&f)
 Schedules the specified Callable object for execution. More...
 
- Public Member Functions inherited from lely::canopen::Device
 Device (const ::std::string &dcf_txt, const ::std::string &dcf_bin="", uint8_t id=0xff, BasicLockable *mutex=nullptr)
 Creates a new CANopen device description. More...
 
uint8_t netid () const noexcept
 Returns the network-ID.
 
uint8_t id () const noexcept
 Returns the node-ID.
 
template<class T >
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. More...
 
template<class T >
typename ::std::enable_if< detail::IsCanopenType< T >::value, T >::type Read (uint16_t idx, uint8_t subidx, ::std::error_code &ec) const
 Submits an SDO upload request to the local object dictionary. More...
 
template<class T >
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. More...
 
template<class T >
typename ::std::enable_if< detail::IsCanopenBasic< T >::value >::type Write (uint16_t idx, uint8_t subidx, T value, ::std::error_code &ec)
 Submits an SDO download request to the local object dictionary. More...
 
template<class T >
typename ::std::enable_if< detail::IsCanopenArray< T >::value >::type Write (uint16_t idx, uint8_t subidx, const T &value)
 Submits an SDO download request to the local object dictionary. More...
 
template<class T >
typename ::std::enable_if< detail::IsCanopenArray< T >::value >::type Write (uint16_t idx, uint8_t subidx, const T &value, ::std::error_code &ec)
 Submits an SDO download request to the local object dictionary. More...
 
void Write (uint16_t idx, uint8_t subidx, const char *value)
 Submits an SDO download request to the local object dictionary. More...
 
void Write (uint16_t idx, uint8_t subidx, const char *value, ::std::error_code &ec)
 Submits an SDO download request to the local object dictionary. More...
 
void Write (uint16_t idx, uint8_t subidx, const char16_t *value)
 Submits an SDO download request to the local object dictionary. More...
 
void Write (uint16_t idx, uint8_t subidx, const char16_t *value, ::std::error_code &ec)
 Submits an SDO download request to the local object dictionary. More...
 
void Write (uint16_t idx, uint8_t subidx, const void *p, ::std::size_t n)
 Submits an SDO download request to the local object dictionary. More...
 
void Write (uint16_t idx, uint8_t subidx, const void *p, ::std::size_t n, ::std::error_code &ec)
 Submits an SDO download request to the local object dictionary. More...
 

Protected Types

template<class T >
using OnReadSignature = ::std::error_code(uint16_t idx, uint8_t subdx, T &value)
 The signature of the callback function invoked on read (SDO upload) access to the local object dictionary. More...
 
template<class T >
using OnWriteSignature = typename ::std::conditional< detail::IsCanopenBasic< T >::value, ::std::error_code(uint16_t idx, uint8_t subidx, T &new_val, T old_val), ::std::error_code(uint16_t idx, uint8_t subidx, T &new_val)>::type
 The signature of the callback function invoked on write (SDO download) access to the local object dictionary. More...
 

Protected Member Functions

Object operator[] (uint16_t idx)
 Returns a mutator object that provides read/write access to the specified CANopen object in the local object dictionary. More...
 
ConstObject operator[] (uint16_t idx) const
 Returns an accessor object that provides read-only access to the specified CANopen object in the local object dictionary. More...
 
template<class T >
typename ::std::enable_if< detail::IsCanopenType< T >::value >::type OnRead (uint16_t idx, uint8_t subidx, ::std::function< OnReadSignature< T >> ind)
 Registers a callback function to be invoked on read (SDO upload) access to the specified CANopen sub-object in the local object dictionary. More...
 
template<class T >
typename ::std::enable_if< detail::IsCanopenType< T >::value >::type OnRead (uint16_t idx, uint8_t subidx, ::std::function< OnReadSignature< T >> ind, ::std::error_code &ec)
 Registers a callback function to be invoked on read (SDO upload) access to the specified CANopen sub-object in the local object dictionary. More...
 
template<class T >
typename ::std::enable_if< detail::IsCanopenType< T >::value >::type OnWrite (uint16_t idx, uint8_t subidx, ::std::function< OnWriteSignature< T >> ind)
 Registers a callback function to be invoked on write (SDO download) access to the specified CANopen sub-object in the local object dictionary. More...
 
template<class T >
typename ::std::enable_if< detail::IsCanopenType< T >::value >::type OnWrite (uint16_t idx, uint8_t subidx, ::std::function< OnWriteSignature< T >> ind, ::std::error_code &ec)
 Registers a callback function to be invoked on write (SDO download) access to the specified CANopen sub-object in the local object dictionary. More...
 
virtual void OnLifeGuarding (bool occurred) noexcept
 The function invoked when a life guarding event occurs or is resolved. More...
 
- Protected Member Functions inherited from lely::canopen::Node
virtual void lock () final override
 Blocks until a lock can be obtained for the current execution agent (thread, process, task). More...
 
virtual void unlock () final override
 Releases the lock held by the execution agent. Throws no exceptions.
 
void OnCanState (CanState new_state, CanState old_state) noexcept override
 Implements the default behavior for a CAN bus state change. More...
 
CONMTnmt () const noexcept
 Returns a pointer to the internal CANopen NMT master/slave service from <lely/co/nmt.hpp>.
 
void RpdoRtr (int num=0)
 Requests the transmission of a PDO. More...
 
void TpdoEvent (int num=0)
 Triggers the transmission of an event-driven (asynchronous) PDO. More...
 
virtual void OnCommand (NmtCommand cs) noexcept
 The function invoked when an NMT command is received from the master. More...
 
virtual void OnHeartbeat (uint8_t id, bool occurred) noexcept
 The function invoked when a heartbeat timeout event occurs or is resolved. More...
 
virtual void OnState (uint8_t id, NmtState st) noexcept
 The function invoked when an NMT state change or boot-up event is detected for a remote node by the heartbeat protocol. More...
 
virtual void OnRpdo (int num, ::std::error_code ec, const void *p, ::std::size_t n) noexcept
 The function invoked when a Receive-PDO is processed. More...
 
virtual void OnRpdoError (int num, uint16_t eec, uint8_t er) noexcept
 The function invoked when a Receive-PDO length mismatch or timeout error occurs. More...
 
virtual void OnTpdo (int num, ::std::error_code ec, const void *p, ::std::size_t n) noexcept
 The function invoked after a Transmit-PDO is sent or an error occurs. More...
 
virtual void OnSync (uint8_t cnt, const time_point &t) noexcept
 The function invoked when a SYNC message is sent/received. More...
 
virtual void OnSyncError (uint16_t eec, uint8_t er) noexcept
 The function invoked when the data length of a received SYNC message does not match. More...
 
virtual void OnTime (const ::std::chrono::system_clock::time_point &abs_time) noexcept
 The function invoked when a TIME message is received. More...
 
virtual void OnEmcy (uint8_t id, uint16_t eec, uint8_t er, uint8_t msef[5]) noexcept
 The function invoked when an EMCY message is received. More...
 
- Protected Member Functions inherited from lely::canopen::IoContext
CANNetnet () const noexcept
 Returns a pointer to the internal CAN network interface from <lely/can/net.hpp>.
 
void SetTime ()
 Update the CAN network time. More...
 
virtual void OnCanError (CanError error) noexcept
 The function invoked when an error is detected on the CAN bus. More...
 
 IoContext (aio::TimerBase &timer, aio::CanBusBase &bus, BasicLockable *mutex=nullptr)
 Creates a new I/O context. More...
 
aio::ExecutorBase GetExecutor () const noexcept
 Returns the executor used to process I/O events on the CAN bus.
 
template<class F >
void Post (F &&f)
 Schedules the specified Callable object for execution. More...
 
- Protected Member Functions inherited from lely::canopen::Device
CODevdev () const noexcept
 Returns a pointer to the internal CANopen device from <lely/co/dev.hpp>.
 
const ::std::type_info & Type (uint16_t idx, uint8_t subidx) const
 Returns the type of a sub-object. More...
 
const ::std::type_info & Type (uint16_t idx, uint8_t subidx, ::std::error_code &ec) const
 Returns the type of a sub-object. More...
 
template<class T >
typename ::std::enable_if< detail::IsCanopenType< T >::value, T >::type Get (uint16_t idx, uint8_t subidx) const
 Reads the value of a sub-object. More...
 
template<class T >
typename ::std::enable_if< detail::IsCanopenType< T >::value, T >::type Get (uint16_t idx, uint8_t subidx, ::std::error_code &ec) const
 Reads the value of a sub-object. More...
 
template<class T >
typename ::std::enable_if< detail::IsCanopenBasic< T >::value >::type Set (uint16_t idx, uint8_t subidx, T value)
 Writes a CANopen basic value to a sub-object. More...
 
template<class T >
typename ::std::enable_if< detail::IsCanopenBasic< T >::value >::type Set (uint16_t idx, uint8_t subidx, T value, ::std::error_code &ec)
 Writes a CANopen basic value to a sub-object. More...
 
template<class T >
typename ::std::enable_if< detail::IsCanopenArray< T >::value >::type Set (uint16_t idx, uint8_t subidx, const T &value)
 Writes a CANopen array value to a sub-object. More...
 
template<class T >
typename ::std::enable_if< detail::IsCanopenArray< T >::value >::type Set (uint16_t idx, uint8_t subidx, const T &value, ::std::error_code &ec)
 Writes a CANopen array value to a sub-object. More...
 
void Set (uint16_t idx, uint8_t subidx, const char *value)
 Writes a VISIBLE_STRING to a sub-object. More...
 
void Set (uint16_t idx, uint8_t subidx, const char *value, ::std::error_code &ec)
 Writes a VISIBLE_STRING to a sub-object. More...
 
void Set (uint16_t idx, uint8_t subidx, const char16_t *value)
 Writes a UNICODE_STRING to a sub-object. More...
 
void Set (uint16_t idx, uint8_t subidx, const char16_t *value, ::std::error_code &ec)
 Writes a UNICODE_STRING to a sub-object. More...
 
void Set (uint16_t idx, uint8_t subidx, const void *p, ::std::size_t n)
 Writes an OCTET_STRING or DOMAIN value to a sub-object. More...
 
void Set (uint16_t idx, uint8_t subidx, const void *p, ::std::size_t n, ::std::error_code &ec)
 Writes an OCTET_STRING or DOMAIN value to a sub-object. More...
 
 Device (const ::std::string &dcf_txt, const ::std::string &dcf_bin="", uint8_t id=0xff, BasicLockable *mutex=nullptr)
 Creates a new CANopen device description. More...
 
uint8_t netid () const noexcept
 Returns the network-ID.
 
uint8_t id () const noexcept
 Returns the node-ID.
 
template<class T >
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. More...
 
template<class T >
typename ::std::enable_if< detail::IsCanopenType< T >::value, T >::type Read (uint16_t idx, uint8_t subidx, ::std::error_code &ec) const
 Submits an SDO upload request to the local object dictionary. More...
 
template<class T >
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. More...
 
template<class T >
typename ::std::enable_if< detail::IsCanopenBasic< T >::value >::type Write (uint16_t idx, uint8_t subidx, T value, ::std::error_code &ec)
 Submits an SDO download request to the local object dictionary. More...
 
template<class T >
typename ::std::enable_if< detail::IsCanopenArray< T >::value >::type Write (uint16_t idx, uint8_t subidx, const T &value)
 Submits an SDO download request to the local object dictionary. More...
 
template<class T >
typename ::std::enable_if< detail::IsCanopenArray< T >::value >::type Write (uint16_t idx, uint8_t subidx, const T &value, ::std::error_code &ec)
 Submits an SDO download request to the local object dictionary. More...
 
void Write (uint16_t idx, uint8_t subidx, const char *value)
 Submits an SDO download request to the local object dictionary. More...
 
void Write (uint16_t idx, uint8_t subidx, const char *value, ::std::error_code &ec)
 Submits an SDO download request to the local object dictionary. More...
 
void Write (uint16_t idx, uint8_t subidx, const char16_t *value)
 Submits an SDO download request to the local object dictionary. More...
 
void Write (uint16_t idx, uint8_t subidx, const char16_t *value, ::std::error_code &ec)
 Submits an SDO download request to the local object dictionary. More...
 
void Write (uint16_t idx, uint8_t subidx, const void *p, ::std::size_t n)
 Submits an SDO download request to the local object dictionary. More...
 
void Write (uint16_t idx, uint8_t subidx, const void *p, ::std::size_t n, ::std::error_code &ec)
 Submits an SDO download request to the local object dictionary. More...
 

Detailed Description

The base class for CANopen slaves.

Definition at line 32 of file slave.hpp.

Member Typedef Documentation

◆ OnReadSignature

template<class T >
using lely::canopen::BasicSlave::OnReadSignature = ::std::error_code(uint16_t idx, uint8_t subdx, T& value)
protected

The signature of the callback function invoked on read (SDO upload) access to the local object dictionary.

Note that the callback function SHOULD NOT throw exceptions. Since it is invoked from C, any exception that is thrown cannot be caught and will result in a call to std::terminate(). The lely::canopen::BasicLockable mutex implemented by this class is held for the duration of the call.

Parameters
idxthe object index.
subidxthe object sub-index.
valuethe current value in the object dictionary. This value can be modified before it is returned to the client.
Returns
0 on success, or an SDO abort code on error.

Definition at line 433 of file slave.hpp.

◆ OnWriteSignature

template<class T >
using lely::canopen::BasicSlave::OnWriteSignature = typename ::std::conditional< detail::IsCanopenBasic<T>::value, ::std::error_code(uint16_t idx, uint8_t subidx, T& new_val, T old_val), ::std::error_code(uint16_t idx, uint8_t subidx, T& new_val)>::type
protected

The signature of the callback function invoked on write (SDO download) access to the local object dictionary.

Note that the callback function SHOULD NOT throw exceptions. Since it is invoked from C, any exception that is thrown cannot be caught and will result in a call to std::terminate(). The lely::canopen::BasicLockable mutex implemented by this class is held for the duration of the call.

Parameters
idxthe object index.
subidxthe object sub-index.
new_valthe value to be written to the object dictionary. This value can be modified before it is committed.
old_valthe current value in the object dictionary (only for CANopen basic data types).
Returns
0 on success, or an SDO abort code on error.

Definition at line 456 of file slave.hpp.

Constructor & Destructor Documentation

◆ BasicSlave()

lely::canopen::BasicSlave::BasicSlave ( aio::TimerBase &  timer,
aio::CanBusBase &  bus,
const ::std::string &  dcf_txt,
const ::std::string &  dcf_bin = "",
uint8_t  id = 0xff 
)

Creates a new CANopen slave.

After creation, the slave is in the NMT 'Initialisation' state and does not yet create any services or perform any communication. Call Reset() to start the boot-up process.

Parameters
timerthe timer used for CANopen events.
busa handle to the CAN bus.
dcf_txtthe path of the text EDS or DCF containing the device description.
dcf_binthe path of the (binary) concise DCF containing the values of (some of) the objets in the object dictionary. If dcf_bin is empty, no concise DCF is loaded.
idthe node-ID (in the range [1..127, 255]). If id is 255 (unconfigured), the node-ID is obtained from the DCF.

Definition at line 72 of file slave.cpp.

Member Function Documentation

◆ operator[]() [1/2]

Object lely::canopen::BasicSlave::operator[] ( uint16_t  idx)
inlineprotected

Returns a mutator object that provides read/write access to the specified CANopen object in the local object dictionary.

Note that this function succeeds even if the object does not exist.

Parameters
idxthe object index.
Returns
a mutator object for a CANopen object in the local object dictionary.

Definition at line 468 of file slave.hpp.

◆ operator[]() [2/2]

ConstObject lely::canopen::BasicSlave::operator[] ( uint16_t  idx) const
inlineprotected

Returns an accessor object that provides read-only access to the specified CANopen object in the local object dictionary.

Note that this function succeeds even if the object does not exist.

Parameters
idxthe object index.
Returns
an accessor object for a CANopen object in the local object dictionary.

Definition at line 480 of file slave.hpp.

◆ OnRead() [1/2]

template<class T >
typename ::std::enable_if<detail::IsCanopenType<T>::value>::type lely::canopen::BasicSlave::OnRead ( uint16_t  idx,
uint8_t  subidx,
::std::function< OnReadSignature< T >>  ind 
)
protected

Registers a callback function to be invoked on read (SDO upload) access to the specified CANopen sub-object in the local object dictionary.

Note that the callback function is not invoked if the access checks fail.

Parameters
idxthe object index.
subidxthe object sub-index.
indthe indication function to be called on read access to the specified sub-object.
Exceptions
lely::canopen::SdoErroron error.

◆ OnRead() [2/2]

template<class T >
typename ::std::enable_if<detail::IsCanopenType<T>::value>::type lely::canopen::BasicSlave::OnRead ( uint16_t  idx,
uint8_t  subidx,
::std::function< OnReadSignature< T >>  ind,
::std::error_code &  ec 
)
protected

Registers a callback function to be invoked on read (SDO upload) access to the specified CANopen sub-object in the local object dictionary.

Note that the callback function is not invoked if the access checks fail.

Parameters
idxthe object index.
subidxthe object sub-index.
indthe indication function to be called on read access to the specified sub-object.
econ error, the SDO abort code is stored in ec.

◆ OnWrite() [1/2]

template<class T >
typename ::std::enable_if<detail::IsCanopenType<T>::value>::type lely::canopen::BasicSlave::OnWrite ( uint16_t  idx,
uint8_t  subidx,
::std::function< OnWriteSignature< T >>  ind 
)
protected

Registers a callback function to be invoked on write (SDO download) access to the specified CANopen sub-object in the local object dictionary.

Note that the callback function is not invoked if the access or range checks fail.

Parameters
idxthe object index.
subidxthe object sub-index.
indthe indication function to be called on read access to the specified sub-object.
Exceptions
lely::canopen::SdoErroron error.

◆ OnWrite() [2/2]

template<class T >
typename ::std::enable_if<detail::IsCanopenType<T>::value>::type lely::canopen::BasicSlave::OnWrite ( uint16_t  idx,
uint8_t  subidx,
::std::function< OnWriteSignature< T >>  ind,
::std::error_code &  ec 
)
protected

Registers a callback function to be invoked on write (SDO download) access to the specified CANopen sub-object in the local object dictionary.

Note that the callback function is not invoked if the access or range checks fail.

Parameters
idxthe object index.
subidxthe object sub-index.
indthe indication function to be called on read access to the specified sub-object.
econ error, the SDO abort code is stored in ec.

◆ OnLifeGuarding()

virtual void lely::canopen::BasicSlave::OnLifeGuarding ( bool  occurred)
inlineprotectedvirtualnoexcept

The function invoked when a life guarding event occurs or is resolved.

Note that depending on the value of object 1029:01 (Error behavior object), the occurrence of a life guarding event MAY trigger an NMT state transition. If so, this function is called after the state change completes.

Parameters
occurredtrue if the life guarding event occurred, false if it was resolved.

Definition at line 561 of file slave.hpp.


The documentation for this class was generated from the following files: