Motion Master
Loading...
Searching...
No Matches
soem_slave.h
Go to the documentation of this file.
1#include <ethercat.h>
2
3#include <chrono>
4#include <map>
5#include <mutex>
6#include <variant>
7
8#include "ethercat_slave.h"
10#include "soem_od_entry.h"
11
12#define OTYPE_VAR 0x0007
13#define OTYPE_ARRAY 0x0008
14#define OTYPE_RECORD 0x0009
15
17
18class SoemSlave : public EthercatSlave {
19 uint16_t position_;
20 Type type_;
21 uint16_t hardware_id_;
22 std::map<uint32_t, SoemOdEntry> od_entry_map_;
23 std::map<std::string, std::variant<MotionMasterError, std::vector<uint8_t>>>
24 file_cache_;
25 std::mutex file_cache_mutex_;
26
27 class Pdo {
28 public:
29 explicit Pdo(SoemOdEntry* od_entry, uint32_t offset)
30 : od_entry_{od_entry}, offset_{offset} {}
31
32 explicit Pdo(VirtualParameter* virtual_parameter, uint32_t offset) {
33 SoemOdEntry* od_entry = dynamic_cast<SoemOdEntry*>(virtual_parameter);
34 if (!od_entry) {
35 throw std::invalid_argument(
36 "Invalid argument provided for Pdo object construction.");
37 }
38 *this = Pdo(od_entry, offset);
39 }
40
41 SoemOdEntry* od_entry_ = nullptr;
42 uint32_t offset_ = 0;
43 };
44
45 std::list<Pdo> rx_pdos_;
46 std::list<Pdo> tx_pdos_;
47
48 int setup_od_entries();
49
50 void config_detected_smm();
51
52 void init_hardware_id();
53 void init_type();
54
55 void update_pdo_mapping_od() override;
56
57 public:
58 explicit SoemSlave(const uint16_t position);
59
60 ~SoemSlave() override {};
61
62 [[nodiscard]] uint16_t get_device_id() const override;
63
64 [[nodiscard]] uint16_t get_hardware_id() const override;
65
66 [[nodiscard]] Type get_device_type() const override;
67
68 [[nodiscard]] std::list<VirtualParameter*> get_all_virtual_parameters()
69 override;
70
71 [[nodiscard]] bool has_virtual_parameters() override;
72
74 uint16_t index, uint8_t subindex) override;
75
76 [[nodiscard]] std::variant<MotionMasterError, std::list<std::string>>
77 get_file_list() override;
78
79 [[nodiscard]] std::variant<MotionMasterError, std::vector<uint8_t>> read_file(
80 const std::string& file_name) override;
81
83 const std::string& file_name, const std::vector<uint8_t>& content,
84 std::function<void(uint8_t)> progress_callback) override;
85
86 MotionMasterError remove_file(const std::string& file_name) override;
87
88 bool has_firmware() override;
89
90 [[nodiscard]] bool is_operational() const override;
91
92 bool is_supported();
93
110 void initialize();
111
112 [[nodiscard]] bool has_pdos() override;
113
114 [[nodiscard]] State get_state(bool force_refresh) const override;
115
116 bool set_state(State state, uint32_t timeout_ms = 10000) override;
117
118 bool request_state_switch(State state) override;
119
120 MotionMasterError write_sii(const std::vector<uint8_t>& content) override;
121
122 [[maybe_unused]] void receive_pdos(const uint8_t* process_data) override;
123
124 void update_outputs();
125
126 [[maybe_unused]] void send_pdos(const uint8_t* process_data) override;
127
128 void update_inputs();
129
130 [[nodiscard]] std::variant<MotionMasterError, std::vector<uint8_t>>
131 get_file_content(const std::string& file_name);
132 [[nodiscard]] int32_t set_file_content(const std::string& file_name,
133 const std::vector<uint8_t>& content);
134 bool write_file_as_parts(const std::string& file_name,
135 const std::vector<uint8_t>& content,
136 std::function<void(uint8_t)> progress_callback);
137 MotionMasterError do_remove_file(const std::string& file_name);
138 std::vector<uint8_t> read_sii();
139};
State
Definition ethercat_slave.h:19
virtual void update_pdo_mapping_od()
Definition ethercat_slave.h:268
EthercatSlave()
Definition ethercat_slave.h:13
Definition motion_master_error.h:6
Definition soem_od_entry.h:7
uint16_t get_device_id() const override
Get the ID (absolute position) of the EtherCAT slave in the EtherCAT chain.
Definition soem_slave.cc:122
void send_pdos(const uint8_t *process_data) override
Definition soem_slave.cc:1143
void initialize()
Initializes the slave based on its current EtherCAT state.
Definition soem_slave.cc:1033
bool is_operational() const override
Request the current slave state.
Definition soem_slave.cc:1018
bool has_pdos() override
Check if PDO mapping is available.
Definition soem_slave.cc:1031
std::variant< MotionMasterError, std::list< std::string > > get_file_list() override
Get the list of available files on the device.
Definition soem_slave.cc:502
std::variant< MotionMasterError, std::vector< uint8_t > > get_file_content(const std::string &file_name)
Definition soem_slave.cc:1161
MotionMasterError do_remove_file(const std::string &file_name)
Definition soem_slave.cc:1310
std::variant< MotionMasterError, std::vector< uint8_t > > read_file(const std::string &file_name) override
Return the raw content (bytes) of the requested file from the flash memory.
Definition soem_slave.cc:549
bool has_virtual_parameters() override
Definition soem_slave.cc:488
State get_state(bool force_refresh) const override
Get the slave EtherCAT state.
Definition soem_slave.cc:1067
uint16_t get_hardware_id() const override
Get the hardware ID.
Definition soem_slave.cc:124
MotionMasterError write_sii(const std::vector< uint8_t > &content) override
Definition soem_slave.cc:1101
SoemSlave(const uint16_t position)
Definition soem_slave.cc:38
void receive_pdos(const uint8_t *process_data) override
Definition soem_slave.cc:1123
bool is_supported()
Definition soem_slave.cc:1022
bool write_file_as_parts(const std::string &file_name, const std::vector< uint8_t > &content, std::function< void(uint8_t)> progress_callback)
Definition soem_slave.cc:1264
int32_t set_file_content(const std::string &file_name, const std::vector< uint8_t > &content)
Definition soem_slave.cc:1231
~SoemSlave() override
Definition soem_slave.h:60
std::list< VirtualParameter * > get_all_virtual_parameters() override
Get all configuration parameters from a slave.
Definition soem_slave.cc:480
bool set_state(State state, uint32_t timeout_ms=10000) override
Change the EtherCAT state of the slave.
Definition soem_slave.cc:1079
void update_outputs()
Definition soem_slave.cc:1125
MotionMasterError remove_file(const std::string &file_name) override
Remove a file from the flash memory.
Definition soem_slave.cc:823
VirtualParameter * get_virtual_parameter(uint16_t index, uint8_t subindex) override
Get a configuration parameter by its index/subindex.
Definition soem_slave.cc:490
std::vector< uint8_t > read_sii()
Definition soem_slave.cc:1329
bool has_firmware() override
Check if the slave has a firmware installed.
Definition soem_slave.cc:1016
MotionMasterError write_file(const std::string &file_name, const std::vector< uint8_t > &content, std::function< void(uint8_t)> progress_callback) override
Write raw content (bytes) into a file in the flash memory.
Definition soem_slave.cc:684
void update_inputs()
Definition soem_slave.cc:1145
Type get_device_type() const override
Get the device type.
Definition soem_slave.cc:478
bool request_state_switch(State state) override
Definition soem_slave.cc:1093
Type
Definition virtual_device.h:26
Definition virtual_parameter.h:9
uint16_t index
Definition co_dictionary.h:0