33 ui->treeWidget->setColumnCount(8);
34 QTreeWidgetItem* head =
ui->treeWidget->headerItem();
39 head->setText(
idxAct,
"Act");
40 head->setText(
idxReq,
"Req");
41 head->setText(
idxType,
"Target Type");
42 head->setText(
idxVal,
"Target Value");
46 "The control device's name (green: ok, red: missmatch between requested and active "
47 "mode, orange: active/requested device not found in the displayed list)");
48 head->setToolTip(
idxTags,
"The control device's tags");
49 head->setToolTip(
idxMode,
"The control device's control mode");
50 head->setToolTip(
idxHWMode,
"The control device's hardware control mode");
52 "Whether the control mode is active (green: ok, red: missmatch between "
53 "requested and active mode)");
55 "Whether the control mode is requested (green: ok, red: missmatch between "
56 "requested and active mode)");
57 head->setToolTip(
idxType,
"The control mode's target type");
58 head->setToolTip(
idxVal,
"The control mode's target value");
60 ui->treeWidget->setColumnWidth(
idxName, 150);
61 ui->treeWidget->setColumnWidth(
idxTags, 100);
62 ui->treeWidget->setColumnWidth(
idxMode, 225);
64 ui->treeWidget->setColumnWidth(
idxAct, 40);
65 ui->treeWidget->setColumnWidth(
idxReq, 40);
66 ui->treeWidget->setColumnWidth(
idxType, 350);
67 ui->treeWidget->header()->setResizeMode(
idxAct, QHeaderView::Fixed);
68 ui->treeWidget->header()->setResizeMode(
idxReq, QHeaderView::Fixed);
79 std::unique_lock<std::recursive_timed_mutex> guard{
mutex, std::defer_lock};
80 if (!guard.try_lock_for(std::chrono::microseconds(100)))
84 for (
const auto&
status : allStatus)
86 if (statusUpdates[
status.deviceName].timestampUSec <
status.timestampUSec)
91 QMetaObject::invokeMethod(
this,
"updateContent", Qt::QueuedConnection);
101 statusUpdates.clear();
108 for (
const auto& pair : statusUpdates)
112 statusUpdates.clear();
118 auto temp =
robotUnit->getControlDeviceDescriptions();
120 std::unique_lock<std::recursive_timed_mutex> guard{
mutex};
121 resetData = std::move(temp);
128 if (resetData.empty())
132 add(resetData.back());
133 resetData.pop_back();
138 ControlDevicesWidget::add(
const ControlDeviceDescription& desc)
140 std::unique_lock<std::recursive_timed_mutex> guard{
mutex};
141 if (entries.count(desc.deviceName))
145 entries[desc.deviceName] =
new ControlDevicesWidgetEntry(*
this, *(
ui->treeWidget), desc);
149 ControlDevicesWidget::update(
const ControlDeviceStatus&
status)
151 std::unique_lock<std::recursive_timed_mutex> guard{
mutex};
156 if (!entries.count(
status.deviceName))
164 QTreeWidget& treeWidget,
165 const ControlDeviceDescription& desc) :
168 header =
new QTreeWidgetItem;
169 treeWidget.addTopLevelItem(header);
173 QCheckBox* boxTags =
new QCheckBox{QString::number(desc.tags.size()) +
" Tags"};
176 boxTags->setChecked(
false);
177 connect(boxTags, SIGNAL(clicked(
bool)),
this, SLOT(hideTagList(
bool)));
178 for (
const auto& tag : desc.tags)
180 QTreeWidgetItem* child =
new QTreeWidgetItem{{QString::fromStdString(tag)}};
181 treeWidget.addTopLevelItem(child);
182 tags.emplace_back(child);
185 for (
const auto& nameToType : desc.contolModeToTargetType)
187 ControllerEntry& subEntry = subEntries[nameToType.first];
188 subEntry.child =
new QTreeWidgetItem;
189 header->addChild(subEntry.child);
191 QString::fromStdString(nameToType.first));
193 QString::fromStdString(nameToType.second.hardwareControlMode));
197 QString::fromStdString(nameToType.second.targetType));
198 subEntry.value =
new VariantWidget;
207 bool newDevsNotFound =
false;
208 if (activeMode !=
status.activeControlMode)
210 if (subEntries.count(activeMode))
213 subEntries.at(activeMode)
216 activeMode =
status.activeControlMode;
217 if (subEntries.count(activeMode))
219 newDevsNotFound =
true;
223 if (requestedMode !=
status.requestedControlMode)
225 if (subEntries.count(requestedMode))
228 subEntries.at(requestedMode)
231 requestedMode =
status.requestedControlMode;
232 if (subEntries.count(requestedMode))
234 newDevsNotFound =
true;
241 if (subEntries.count(requestedMode))
243 subEntries.at(requestedMode)
246 if (subEntries.count(activeMode))
248 subEntries.at(activeMode)
252 newDevsNotFound ?
orange() : colorNew);
254 for (
const auto& pair :
status.controlTargetValues)
256 if (subEntries.count(pair.first))
258 subEntries.at(pair.first).value->update(pair.second);
259 subEntries.at(pair.first).value->layout()->setContentsMargins(0, 0, 0, 0);
273 for (
const auto& tagit : tags)
283 std::set<QTreeWidgetItem*>
286 std::set<QTreeWidgetItem*> hits;
287 for (
const auto& pair : subEntries)
290 .contains(mode, Qt::CaseInsensitive))
292 hits.emplace(pair.second.child);
298 std::set<QTreeWidgetItem*>
301 std::set<QTreeWidgetItem*> hits;
302 for (
const auto& pair : subEntries)
305 .contains(state, Qt::CaseInsensitive))
307 hits.emplace(pair.second.child);
313 std::set<QTreeWidgetItem*>
316 std::set<QTreeWidgetItem*> hits;
317 for (
const auto& pair : subEntries)
320 .contains(state, Qt::CaseInsensitive))
322 hits.emplace(pair.second.child);
328 std::set<QTreeWidgetItem*>
331 std::set<QTreeWidgetItem*> hits;
332 for (
const auto& pair : subEntries)
335 .contains(type, Qt::CaseInsensitive))
337 hits.emplace(pair.second.child);
350 header->setHidden(!vis);
356 for (
const auto& pair : subEntries)
358 if (children.count(pair.second.child))
360 pair.second.child->setHidden(!vis);
364 pair.second.child->setHidden(vis);
370 ControlDevicesWidgetEntry::hideTagList(
bool hide)
372 for (QTreeWidgetItem* tag : tags)
374 tag->setHidden(hide);