10 qRegisterMetaType<QMessageBox::Icon>();
13 setObjectName(
"ModbusTCP");
16 QVBoxLayout *layout(
new QVBoxLayout);
17 QWidget *scroll_widget =
new QWidget;
18 scroll_widget->setLayout(layout);
19 QScrollArea *scroll_area =
new QScrollArea;
20 scroll_area->setWidget(scroll_widget);
21 scroll_area->setWidgetResizable(
true);
22 scroll_area->setFrameShape(QFrame::NoFrame);
23 QVBoxLayout *main_layout =
new QVBoxLayout(
this);
24 main_layout->addWidget(scroll_area);
26 stack_ =
new QStackedWidget;
27 QWidget *tab_base_topic(
new QWidget);
28 QVBoxLayout *tab_base_topic_layout(
new QVBoxLayout(tab_base_topic));
29 QWidget *tab_configure(
new QWidget);
30 QVBoxLayout *tab_configure_layout(
new QVBoxLayout(tab_configure));
31 stack_->addWidget(tab_base_topic);
32 stack_->addWidget(tab_configure);
37 QHBoxLayout *base_topic_layout(
new QHBoxLayout);
38 base_topic_layout->addWidget(
new QLabel(
"Base topic: "));
42 tab_base_topic_layout->addLayout(base_topic_layout);
43 tab_base_topic_layout->addStretch(1);
48 stack_->setCurrentIndex(index);
59 QPushButton *
configure =
new QPushButton(
"Configure");
65 columns.append(
"Time");
66 columns.append(
"Error");
73 tab_configure_layout->addWidget(configure);
74 tab_configure_layout->addStretch(1);
75 tab_configure_layout->addWidget(
new QLabel(
"Errors:"));
85 Q_EMIT
newError(QDateTime::currentDateTime().toString(
"yyyy-MM-dd HH:mm:ss"), QString::fromStdString(msg->data));
94 QLabel *time_label(
new QLabel(time));
95 QLabel *msg_label(
new QLabel(msg));
112 catch (std::runtime_error &e)
116 "The new configuration will not take effect because one of the handler contains an error:",
118 QMessageBox::Icon::Warning);
140 "Could not call service to configure Modbus TCP",
142 QMessageBox::Icon::Critical);
150 "Service call to configure Modbus TCP failed:",
152 QMessageBox::Icon::Warning);
170 industrial_modbus_tcp::ModbusHandler handler;
173 if (!config.
mapGetString(
"handler_" + QString::number(i) +
"_ip_address", &tmp_str))
175 if (tmp_str.isEmpty())
177 handler.ip_address = tmp_str.toStdString();
180 if (!config.
mapGetString(
"handler_" + QString::number(i) +
"_name", &tmp_str))
182 if (tmp_str.isEmpty())
184 handler.name = tmp_str.toStdString();
186 if (config.
mapGetInt(
"handler_" + QString::number(i) +
"_port", &tmp_int))
187 handler.port = tmp_int;
189 if (config.
mapGetInt(
"handler_" + QString::number(i) +
"_recovery_mode", &tmp_int))
190 handler.modbus_error_recovery_mode = tmp_int;
199 industrial_modbus_tcp::Bool
d;
203 QString token(
"handler_" + QString::number(i) +
"_bool_" + QString::number(j) +
"_mask");
208 handler.d_bool.emplace_back(d);
216 industrial_modbus_tcp::Int8
d;
220 QString token(
"handler_" + QString::number(i) +
"_int8_" + QString::number(j) +
"_bit_shift");
223 d.bit_shift = tmp_int;
225 handler.d_int8.emplace_back(d);
231 industrial_modbus_tcp::UInt8
d;
235 QString token(
"handler_" + QString::number(i) +
"_uint8_" + QString::number(j) +
"_bit_shift");
238 d.bit_shift = tmp_int;
240 handler.d_uint8.emplace_back(d);
248 industrial_modbus_tcp::Int16
d;
252 handler.d_int16.emplace_back(d);
258 industrial_modbus_tcp::UInt16
d;
262 handler.d_uint16.emplace_back(d);
270 industrial_modbus_tcp::Int32
d;
274 QString token(
"handler_" + QString::number(i) +
"_int32_" + QString::number(j) +
"_big_endian");
277 d.big_endian = tmp_bool;
279 handler.d_int32.emplace_back(d);
285 industrial_modbus_tcp::UInt32
d;
289 QString token(
"handler_" + QString::number(i) +
"_uint32_" + QString::number(j) +
"_big_endian");
292 d.big_endian = tmp_bool;
294 handler.d_uint32.emplace_back(d);
302 industrial_modbus_tcp::Int64
d;
306 QString token(
"handler_" + QString::number(i) +
"_int64_" + QString::number(j) +
"_big_endian");
309 d.big_endian = tmp_bool;
311 handler.d_int64.emplace_back(d);
317 industrial_modbus_tcp::UInt64
d;
321 QString token(
"handler_" + QString::number(i) +
"_uint64_" + QString::number(j) +
"_big_endian");
324 d.big_endian = tmp_bool;
326 handler.d_uint64.emplace_back(d);
334 industrial_modbus_tcp::Float32
d;
338 QString token(
"handler_" + QString::number(i) +
"_float32_" + QString::number(j) +
"_big_endian");
341 d.big_endian = tmp_bool;
343 handler.d_float32.emplace_back(d);
349 industrial_modbus_tcp::Float64
d;
353 QString token(
"handler_" + QString::number(i) +
"_float64_" + QString::number(j) +
"_big_endian");
356 d.big_endian = tmp_bool;
358 handler.d_float64.emplace_back(d);
376 const std::string name,
377 industrial_modbus_tcp::Register &r)
383 QString token(
"handler_" + QString::number(i) +
"_" + QString::fromStdString(name) +
"_" + QString::number(j) +
"_address");
388 token =
"handler_" + QString::number(i) +
"_" + QString::fromStdString(name) +
"_" + QString::number(j) +
"_topic_name";
391 r.topic_name = tmp_str.toStdString();
393 token =
"handler_" + QString::number(i) +
"_" + QString::fromStdString(name) +
"_" + QString::number(j) +
"_poll_rate_usec";
396 r.poll_rate_usec = tmp_int;
404 const std::string name,
405 const industrial_modbus_tcp::Register &r)
const 407 config.
mapSetValue(
"handler_" + QString::number(i) +
"_" + QString::fromStdString(name) +
"_" + QString::number(j) +
"_address",
409 config.
mapSetValue(
"handler_" + QString::number(i) +
"_" + QString::fromStdString(name) +
"_" + QString::number(j) +
"_topic_name",
410 QString::fromStdString(r.topic_name));
411 config.
mapSetValue(
"handler_" + QString::number(i) +
"_" + QString::fromStdString(name) +
"_" + QString::number(j) +
"_poll_rate_usec",
423 config.
mapSetValue(
"handler_" + QString::number(i) +
426 config.
mapSetValue(
"handler_" + QString::number(i) +
429 config.
mapSetValue(
"handler_" + QString::number(i) +
432 config.
mapSetValue(
"handler_" + QString::number(i) +
439 config.
mapSetValue(
"handler_" + QString::number(i) +
"_bool_" + QString::number(j) +
"_mask",
446 config.
mapSetValue(
"handler_" + QString::number(i) +
"_int8_" + QString::number(j) +
"_bit_shift",
453 config.
mapSetValue(
"handler_" + QString::number(i) +
"_uint8_" + QString::number(j) +
"_bit_shift",
470 config.
mapSetValue(
"handler_" + QString::number(i) +
"_int32_" + QString::number(j) +
"_big_endian",
477 config.
mapSetValue(
"handler_" + QString::number(i) +
"_uint32_" + QString::number(j) +
"_big_endian",
484 config.
mapSetValue(
"handler_" + QString::number(i) +
"_float32_" + QString::number(j) +
"_big_endian",
491 config.
mapSetValue(
"handler_" + QString::number(i) +
"_float64_" + QString::number(j) +
"_big_endian",
507 QMessageBox::Icon::Warning);
521 const QMessageBox::Icon icon)
523 const bool old_state(isEnabled());
526 msg_box.setWindowTitle(title);
527 msg_box.setText(text);
528 msg_box.setInformativeText(info);
529 msg_box.setIcon(icon);
530 msg_box.setStandardButtons(QMessageBox::Ok);
532 setEnabled(old_state);
ServiceClient serviceClient(const std::string &service_name, bool persistent=false, const M_string &header_values=M_string())
void configureButtonHandler()
virtual void load(const rviz::Config &config)
void setStackIndex(const int)
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
QPushButton * change_base_topic_
bool call(MReq &req, MRes &res)
ModbusTCP(QWidget *parent=NULL)
virtual void save(Config config) const
bool mapGetString(const QString &key, QString *value_out) const
void displayMessageBox(const QString, const QString, const QString, const QMessageBox::Icon)
ros::Subscriber errors_sub_
industrial_modbus_tcp::Configure configure_modbus_srv_
void mapSetValue(const QString &key, QVariant value)
QLineEdit * base_topic_line_edit_
virtual void setName(const QString &name)
virtual void save(rviz::Config config) const
bool parseDataReg(const rviz::Config &config, const unsigned i, const unsigned j, const std::string name, industrial_modbus_tcp::Register &r)
void newError(const QString, const QString)
bool waitForExistence(ros::Duration timeout=ros::Duration(-1))
virtual void saveDataReg(rviz::Config &config, const unsigned i, const unsigned j, const std::string name, const industrial_modbus_tcp::Register &r) const
void newErrorHandler(const QString, const QString)
bool mapGetBool(const QString &key, bool *value_out) const
void displayMessageBoxHandler(const QString title, const QString text, const QString info, const QMessageBox::Icon icon)
virtual void load(const Config &config)
ros::ServiceClient configure_modbus_
bool mapGetInt(const QString &key, int *value_out) const
#define PLUGINLIB_EXPORT_CLASS(class_type, base_class_type)
void errorsCallback(const std_msgs::String::ConstPtr &msg)
QTableWidget * errors_log_