Class LelyDriverBridge
Defined in File lely_driver_bridge.hpp
Inheritance Relationships
Base Type
public canopen::FiberDriver
Class Documentation
-
class LelyDriverBridge : public canopen::FiberDriver
Lely Driver Bridge.
This class provides functionalities for bridging between Lelycore drivers and standard C++ functions. This means it provides async and sync functions for interacting with CANopen devices using synchronisation functionalities from C++ standard library.
Public Functions
-
inline LelyDriverBridge(ev_exec_t *exec, canopen::AsyncMaster &master, uint8_t id, std::string name, std::string eds, std::string bin, std::chrono::milliseconds timeout = 20ms)
Construct a new Lely Bridge object.
- Parameters:
exec – [in] Executor to use
master – [in] Master to use
id – [in] NodeId to connect to
eds – [in] EDS file
bin – [in] BIN file (concise dcf)
timeout – [in] Timeout in milliseconds for SDO reads/writes
-
std::future<bool> async_sdo_write(COData data)
Asynchronous SDO Write.
Writes the data passed to the function via SDO to the connected device.
- Parameters:
data – [in] Data to written.
- Returns:
std::future<bool> Returns an std::future<bool> that is fulfilled when the write request was done. An error is stored when the write request was unsuccessful.
-
template<typename T>
inline std::future<bool> async_sdo_write_typed(uint16_t idx, uint8_t subidx, T value)
-
template<typename T>
inline bool sync_sdo_write_typed(uint16_t idx, uint8_t subidx, T value, std::chrono::milliseconds timeout)
-
std::future<COData> async_sdo_read(COData data)
Aynchronous SDO Read.
Reads the indicated SDO object from the connected device.
- Parameters:
data – [in] Data to be read, the data entry is not used.
- Returns:
std::future<COData> Returns an std::future<COData> that is fulfilled when the read request was done. The result of the request is stored in the future. An error is stored when the read request was unsuccessful.
-
template<typename T>
inline bool sync_sdo_read_typed(uint16_t idx, uint8_t subidx, T &value, std::chrono::milliseconds timeout)
-
std::future<canopen::NmtState> async_request_nmt()
Asynchronous request for NMT.
Waits for an NMT state change to occur. The new state is stored in the future returned by the function.
- Returns:
std::future<canopen::NmtState> The returned future is set when NMT State changes.
-
std::shared_ptr<SafeQueue<COData>> get_rpdo_queue()
Asynchronous request for RPDO.
Waits for an RPDO write request to be received from the slave. The content of the request are stored in the returned future.
- Todo:
This function should use a threadsafe queue not the icky implementation we have now.
- Returns:
std::future<COData> The returned future is set when an RPDO event is detected.
-
std::shared_ptr<SafeQueue<COEmcy>> get_emcy_queue()
Asynchronous request for EMCY.
- Todo:
This function should use a threadsafe queue not the icky implementation we have now.
- Returns:
std::future<COEmcy> The returned future is set when an EMCY event is detected.
-
void tpdo_transmit(COData data)
Executes a TPDO transmission.
This function executes a TPDO transmission. The{false, true} object specified in the input data is sent if it is registered as a TPDO with the master.
- Parameters:
data – [in] Object and data to be written
-
void nmt_command(canopen::NmtCommand command)
Executes a NMT Command.
This function sends the NMT command specified as parameter.
- Parameters:
command – [in] NMT Command to execute
-
uint8_t get_id()
Get the nodeid.
- Returns:
uint8_t
-
inline bool wait_for_boot()
Wait for device to be booted.
- Returns:
true
- Returns:
false
-
inline void set_sync_function(std::function<void()> on_sync_function)
-
inline void unset_sync_function()
-
inline void Boot()
Request master to boot device.
-
inline bool is_booted()
Indicates if Device is booted.
- Returns:
true
- Returns:
false
-
template<typename T>
inline void submit_write(COData data)
-
template<typename T>
inline void submit_read(COData data)
Protected Functions
-
inline void OnSync(uint8_t cnt, const time_point &t) noexcept override
-
void OnState(canopen::NmtState state) noexcept override
OnState Callback.
This callback function is called when an Nmt state change is detected on the connected device.
- Parameters:
state – [in] NMT State
-
virtual void OnBoot(canopen::NmtState st, char es, const ::std::string &what) noexcept override
OnBoot Callback This callback is called when the Boot process of the slave that was initiated by the master has been success fully finished.
- Parameters:
st –
es –
what –
-
void OnRpdoWrite(uint16_t idx, uint8_t subidx) noexcept override
OnRpdoWrite Callback.
This callback function is called when an RPDO write request is received from the connected device.
- Todo:
This function should use a threadsafe queue not the icky implementation we have now.
- Parameters:
idx – [in] Object Index
subidx – [in] Object Subindex
-
void OnEmcy(uint16_t eec, uint8_t er, uint8_t msef[5]) noexcept override
The function invoked when an EMCY message is received from the remote node.
- Todo:
This function should use a threadsafe queue not the icky implementation we have now.
- Parameters:
eec – the emergency error code.
er – the error register.
msef – the manufacturer-specific error code.
Protected Attributes
-
std::unique_ptr<DriverDictionary> dictionary_
-
std::mutex dictionary_mutex_
-
std::shared_ptr<std::promise<COData>> sdo_read_data_promise
-
std::shared_ptr<std::promise<bool>> sdo_write_data_promise
-
std::mutex sdo_mutex
-
bool running
-
std::condition_variable sdo_cond
-
std::promise<canopen::NmtState> nmt_state_promise
-
std::atomic<bool> nmt_state_is_set
-
std::mutex nmt_mtex
-
std::promise<COData> rpdo_promise
-
std::atomic<bool> rpdo_is_set
-
std::mutex pdo_mtex
-
std::shared_ptr<SafeQueue<COData>> rpdo_queue
-
std::promise<COEmcy> emcy_promise
-
std::atomic<bool> emcy_is_set
-
std::mutex emcy_mtex
-
std::shared_ptr<SafeQueue<COEmcy>> emcy_queue
-
std::atomic<bool> booted
-
char boot_status
-
std::string boot_what
-
canopen::NmtState boot_state
-
std::condition_variable boot_cond
-
std::mutex boot_mtex
-
uint8_t nodeid
-
std::string name_
-
std::chrono::milliseconds sdo_timeout
-
std::function<void()> on_sync_function_
-
inline LelyDriverBridge(ev_exec_t *exec, canopen::AsyncMaster &master, uint8_t id, std::string name, std::string eds, std::string bin, std::chrono::milliseconds timeout = 20ms)