29 #include <QPushButton>
31 #include <qnamespace.h>
33 #include <qtablewidget.h>
35 #include <SimoxUtility/algorithm/get_map_keys_values.h>
47 for (std::size_t i = 0; i < l.size(); i++)
49 const auto& tag = l.at(i);
52 if (i != l.size() - 1)
69 Qt::QueuedConnection);
74 Qt::QueuedConnection);
76 connect(widget.pushButtonUnrequireAll, SIGNAL(clicked()),
this, SLOT(
unrequireAll()));
78 updateSummaryTimer =
new QTimer(
this);
79 updateSummaryTimer->setInterval(100);
108 armarx::core::time::dto::DateTime now;
110 robotHealthTopicPrx->heartbeat(
getName(), now);
116 std::stringstream ss;
117 ss << std::fixed << std::setprecision(3) <<
value;
122 make_item(
const std::string& text, Qt::AlignmentFlag horAlignment = Qt::AlignLeft)
124 auto* item =
new QTableWidgetItem(QString::fromStdString(text));
125 item->setTextAlignment(horAlignment | Qt::AlignVCenter);
133 if (robotHealthComponentPrx)
138 auto summary = robotHealthComponentPrx->getSummary();
140 const std::size_t nCols = 10;
142 auto& tableWidget = widget.tableHealthState;
143 tableWidget->setRowCount(summary.entries.size());
144 tableWidget->setColumnCount(nCols);
146 const auto summaryVals = simox::alg::get_values(summary.entries);
148 tableWidget->setHorizontalHeaderLabels({
"identifier",
152 "time since\nlast arrival [ms]",
153 "time to\nreference [ms]",
154 "time sync \n+ Ice [ms]",
155 "warning\nthreshold [ms]",
156 "error\nthreshold [ms]",
159 tableWidget->setColumnWidth(0, 250);
160 tableWidget->setColumnWidth(1, 80);
161 tableWidget->setColumnWidth(2, 120);
162 tableWidget->setColumnWidth(3, 180);
163 tableWidget->setColumnWidth(4, 120);
164 tableWidget->setColumnWidth(5, 120);
165 tableWidget->setColumnWidth(6, 120);
166 tableWidget->setColumnWidth(7, 120);
168 for (std::size_t i = 0; i < summary.entries.size(); i++)
170 const auto& entry = summaryVals.at(i);
172 std::string stateRepr;
178 stateColor.setRgb(0, 255, 0);
182 stateColor.setRgb(255, 165, 0);
186 stateColor.setRgb(255, 0, 0);
190 const std::string hostname = entry.lastReferenceTimestamp.hostname;
192 const std::string timeSinceLastArrivalRepr =
194 const std::string timeToLastReferenceRepr =
198 const float syncErrorMilliSeconds =
199 std::abs(entry.timeSinceLastArrival.microSeconds -
200 entry.timeSinceLastUpdateReference.microSeconds) /
203 tableWidget->setItem(
204 i, 0,
new QTableWidgetItem(QString::fromStdString(entry.identifier)));
205 tableWidget->setItem(
206 i, 1,
make_item(entry.required ?
"yes" :
"no", Qt::AlignHCenter));
209 auto* item =
make_item(stateRepr, Qt::AlignHCenter);
210 item->setBackgroundColor(stateColor);
211 tableWidget->setItem(i, 2, item);
214 tableWidget->setItem(
215 i, 3,
new QTableWidgetItem(QString::fromStdString(tagsRepr)));
216 tableWidget->setItem(i, 4,
make_item(timeSinceLastArrivalRepr, Qt::AlignRight));
217 tableWidget->setItem(i, 5,
make_item(timeToLastReferenceRepr, Qt::AlignRight));
223 QColor timeSyncColor;
224 if (syncErrorMilliSeconds > 20.)
226 timeSyncColor.setRgb(255, 0, 0);
230 timeSyncColor.setRgb(0, 255, 0);
232 item->setBackgroundColor(timeSyncColor);
234 tableWidget->setItem(i, 6, item);
237 tableWidget->setItem(
243 tableWidget->setItem(
249 tableWidget->setItem(
250 i, 9,
new QTableWidgetItem(QString::fromStdString(hostname)));
253 std::string tagsText =
"Active tags: [";
255 std::sort(summary.activeTags.begin(), summary.activeTags.end());
262 widget.labelTags->setText(QString::fromStdString(tagsText));
274 if (robotHealthComponentPrx)
278 robotHealthComponentPrx->resetRequiredTags();
290 robotHealthTopicPrx = getTopic<RobotHealthInterfacePrx>(
"RobotHealthTopic");
291 robotHealthComponentPrx = getProxy<RobotHealthComponentInterfacePrx>(
"RobotHealth");
300 updateSummaryTimer->start();
312 updateSummaryTimer->stop();