1 #ifndef NODE_CANOPEN_PROXY_DRIVER_IMPL_HPP_
2 #define NODE_CANOPEN_PROXY_DRIVER_IMPL_HPP_
9 template <
class NODETYPE>
15 template <
class NODETYPE>
18 RCLCPP_ERROR(this->node_->get_logger(),
"Not init implemented.");
24 nmt_state_publisher = this->node_->create_publisher<std_msgs::msg::String>(
25 std::string(this->node_->get_name()).append(
"/nmt_state").c_str(), 10);
26 tpdo_subscriber = this->node_->create_subscription<canopen_interfaces::msg::COData>(
27 std::string(this->node_->get_name()).append(
"/tpdo").c_str(), 10,
30 rpdo_publisher = this->node_->create_publisher<canopen_interfaces::msg::COData>(
31 std::string(this->node_->get_name()).append(
"/rpdo").c_str(), 10);
33 nmt_state_reset_service = this->node_->create_service<std_srvs::srv::Trigger>(
34 std::string(this->node_->get_name()).append(
"/nmt_reset_node").c_str(),
37 std::placeholders::_2));
39 nmt_state_start_service = this->node_->create_service<std_srvs::srv::Trigger>(
40 std::string(this->node_->get_name()).append(
"/nmt_start_node").c_str(),
43 std::placeholders::_2));
45 sdo_read_service = this->node_->create_service<canopen_interfaces::srv::CORead>(
46 std::string(this->node_->get_name()).append(
"/sdo_read").c_str(),
49 std::placeholders::_2));
51 sdo_write_service = this->node_->create_service<canopen_interfaces::srv::COWrite>(
52 std::string(this->node_->get_name()).append(
"/sdo_write").c_str(),
55 std::placeholders::_2));
61 nmt_state_publisher = this->node_->create_publisher<std_msgs::msg::String>(
62 std::string(this->node_->get_name()).append(
"/nmt_state").c_str(), 10);
63 tpdo_subscriber = this->node_->create_subscription<canopen_interfaces::msg::COData>(
64 std::string(this->node_->get_name()).append(
"/tpdo").c_str(), 10,
67 std::placeholders::_1));
69 rpdo_publisher = this->node_->create_publisher<canopen_interfaces::msg::COData>(
70 std::string(this->node_->get_name()).append(
"/rpdo").c_str(), 10);
72 nmt_state_reset_service = this->node_->create_service<std_srvs::srv::Trigger>(
73 std::string(this->node_->get_name()).append(
"/nmt_reset_node").c_str(),
76 std::placeholders::_1, std::placeholders::_2));
78 nmt_state_start_service = this->node_->create_service<std_srvs::srv::Trigger>(
79 std::string(this->node_->get_name()).append(
"/nmt_start_node").c_str(),
82 std::placeholders::_1, std::placeholders::_2));
84 sdo_read_service = this->node_->create_service<canopen_interfaces::srv::CORead>(
85 std::string(this->node_->get_name()).append(
"/sdo_read").c_str(),
88 std::placeholders::_1, std::placeholders::_2));
90 sdo_write_service = this->node_->create_service<canopen_interfaces::srv::COWrite>(
91 std::string(this->node_->get_name()).append(
"/sdo_write").c_str(),
94 std::placeholders::_1, std::placeholders::_2));
97 template <
class NODETYPE>
100 if (this->activated_.load())
102 auto message = std_msgs::msg::String();
106 case canopen::NmtState::BOOTUP:
107 message.data =
"BOOTUP";
109 case canopen::NmtState::PREOP:
110 message.data =
"PREOP";
112 case canopen::NmtState::RESET_COMM:
113 message.data =
"RESET_COMM";
115 case canopen::NmtState::RESET_NODE:
116 message.data =
"RESET_NODE";
118 case canopen::NmtState::START:
119 message.data =
"START";
121 case canopen::NmtState::STOP:
122 message.data =
"STOP";
124 case canopen::NmtState::TOGGLE:
125 message.data =
"TOGGLE";
128 RCLCPP_ERROR(this->node_->get_logger(),
"Unknown NMT State.");
129 message.data =
"ERROR";
133 this->node_->get_logger(),
"Slave %hhu: Switched NMT state to %s",
134 this->lely_driver_->get_id(), message.data.c_str());
136 nmt_state_publisher->publish(message);
140 template <
class NODETYPE>
144 if (!tpdo_transmit(data))
146 RCLCPP_ERROR(this->node_->get_logger(),
"Could transmit PDO because driver not activated.");
150 template <
class NODETYPE>
153 if (this->activated_.load())
156 this->node_->get_logger(),
"Node ID %hhu: Transmit PDO index %x, subindex %hhu, data %d",
159 this->lely_driver_->tpdo_transmit(data);
165 template <
class NODETYPE>
168 if (this->activated_.load())
173 auto message = canopen_interfaces::msg::COData();
176 message.data = d.
data_;
177 rpdo_publisher->publish(message);
181 template <
class NODETYPE>
183 const std_srvs::srv::Trigger::Request::SharedPtr request,
184 std_srvs::srv::Trigger::Response::SharedPtr response)
186 response->success = reset_node_nmt_command();
189 template <
class NODETYPE>
192 if (this->activated_.load())
194 this->lely_driver_->nmt_command(canopen::NmtCommand::RESET_NODE);
198 this->node_->get_logger(),
"Could not reset device via NMT because driver not activated.");
202 template <
class NODETYPE>
204 const std_srvs::srv::Trigger::Request::SharedPtr request,
205 std_srvs::srv::Trigger::Response::SharedPtr response)
207 response->success = start_node_nmt_command();
210 template <
class NODETYPE>
213 if (this->activated_.load())
215 this->lely_driver_->nmt_command(canopen::NmtCommand::START);
219 this->node_->get_logger(),
"Could not start device via NMT because driver not activated.");
223 template <
class NODETYPE>
225 const canopen_interfaces::srv::CORead::Request::SharedPtr request,
226 canopen_interfaces::srv::CORead::Response::SharedPtr response)
229 response->success = sdo_read(data);
230 response->data = data.
data_;
233 template <
class NODETYPE>
236 if (this->activated_.load())
239 this->node_->get_logger(),
"Slave %hhu: SDO Read Call index=0x%x subindex=%hhu",
243 std::scoped_lock<std::mutex> lk(sdo_mtex);
245 auto f = this->lely_driver_->async_sdo_read(data);
251 data.
data_ = f.get().data_;
253 catch (std::exception & e)
255 RCLCPP_ERROR(this->node_->get_logger(), e.what());
260 RCLCPP_ERROR(this->node_->get_logger(),
"Could not read from SDO because driver not activated.");
264 template <
class NODETYPE>
266 const canopen_interfaces::srv::COWrite::Request::SharedPtr request,
267 canopen_interfaces::srv::COWrite::Response::SharedPtr response)
270 response->success = sdo_write(data);
273 template <
class NODETYPE>
276 if (this->activated_.load())
279 this->node_->get_logger(),
"Slave %hhu: SDO Write Call index=0x%x subindex=%hhu data=%u",
283 std::scoped_lock<std::mutex> lk(sdo_mtex);
286 auto f = this->lely_driver_->async_sdo_write(data);
295 catch (std::exception & e)
297 RCLCPP_ERROR(this->node_->get_logger(), e.what());
302 RCLCPP_ERROR(this->node_->get_logger(),
"Could not write to SDO because driver not activated.");
Definition: node_canopen_base_driver.hpp:19
void init()
Initialise the driver.
Definition: node_canopen_driver.hpp:113
Definition: node_canopen_proxy_driver.hpp:12
void on_sdo_read(const canopen_interfaces::srv::CORead::Request::SharedPtr request, canopen_interfaces::srv::CORead::Response::SharedPtr response)
Definition: node_canopen_proxy_driver_impl.hpp:224
virtual bool sdo_write(COData &data)
Definition: node_canopen_proxy_driver_impl.hpp:274
void on_nmt_state_reset(const std_srvs::srv::Trigger::Request::SharedPtr request, std_srvs::srv::Trigger::Response::SharedPtr response)
Definition: node_canopen_proxy_driver_impl.hpp:182
void on_sdo_write(const canopen_interfaces::srv::COWrite::Request::SharedPtr request, canopen_interfaces::srv::COWrite::Response::SharedPtr response)
Definition: node_canopen_proxy_driver_impl.hpp:265
void on_nmt_state_start(const std_srvs::srv::Trigger::Request::SharedPtr request, std_srvs::srv::Trigger::Response::SharedPtr response)
Definition: node_canopen_proxy_driver_impl.hpp:203
virtual void on_rpdo(COData data) override
Definition: node_canopen_proxy_driver_impl.hpp:166
NodeCanopenProxyDriver(NODETYPE *node)
Definition: node_canopen_proxy_driver_impl.hpp:10
virtual bool reset_node_nmt_command()
Definition: node_canopen_proxy_driver_impl.hpp:190
virtual void on_tpdo(const canopen_interfaces::msg::COData::SharedPtr msg)
Definition: node_canopen_proxy_driver_impl.hpp:141
virtual bool tpdo_transmit(COData &data)
Definition: node_canopen_proxy_driver_impl.hpp:151
virtual bool start_node_nmt_command()
Definition: node_canopen_proxy_driver_impl.hpp:211
virtual void on_nmt(canopen::NmtState nmt_state) override
Definition: node_canopen_proxy_driver_impl.hpp:98
virtual bool sdo_read(COData &data)
Definition: node_canopen_proxy_driver_impl.hpp:234
Definition: node_canopen_driver.hpp:32
Definition: configuration_manager.hpp:28
Definition: exchange.hpp:26
uint32_t data_
Definition: exchange.hpp:30
uint8_t subindex_
Definition: exchange.hpp:29
uint16_t index_
Definition: exchange.hpp:28