From f2a1647226637f85ae6f306e61d668a30b6be9de Mon Sep 17 00:00:00 2001 From: Adrian Knobloch <adrian.knobloch@student.kit.edu> Date: Fri, 9 Sep 2016 01:22:26 +0200 Subject: [PATCH] Highlight current field The field gets highlighted if it is zero for 1/10s and the joint is enabled. --- .../KinematicUnitGuiPlugin.cpp | 70 ++++++++++++++++++- .../KinematicUnitGuiPlugin.h | 5 +- 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp index 171172182..a847c5f16 100644 --- a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp +++ b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp @@ -76,6 +76,7 @@ KinematicUnitGuiPlugin::KinematicUnitGuiPlugin() KinematicUnitWidgetController::KinematicUnitWidgetController() : kinematicUnitNode(nullptr), enableValueValidator(true), + historyTime(100000), // 1/10 s selectedControlMode(ePositionControl) { rootVisu = NULL; @@ -1087,6 +1088,7 @@ void KinematicUnitWidgetController::updateJointCurrentsTable() } std::vector< RobotNodePtr > rn = robotNodeSet->getAllRobotNodes(); QTableWidgetItem* newItem; + NameValueMap reportedJointCurrents = jointCurrentHistory.back().second; NameValueMap::const_iterator it; for (unsigned int i = 0; i < rn.size(); i++) @@ -1102,6 +1104,8 @@ void KinematicUnitWidgetController::updateJointCurrentsTable() newItem = new QTableWidgetItem(QString::number(cutJitter(currentValue))); ui.tableJointList->setItem(i, eTabelColumnCurrent, newItem); } + + highlightCriticalValues(); } void KinematicUnitWidgetController::reportJointAngles(const NameValueMap& jointAngles, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) @@ -1164,13 +1168,17 @@ void KinematicUnitWidgetController::reportControlModeChanged(const NameControlMo void KinematicUnitWidgetController::reportJointCurrents(const NameValueMap& jointCurrents, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) { - if (!aValueChanged && reportedJointCurrents.size() > 0) + if (!aValueChanged && jointCurrents.size() > 0) { return; } boost::recursive_mutex::scoped_lock lock(mutexNodeSet); - reportedJointCurrents = jointCurrents; + jointCurrentHistory.push_back(std::pair<Ice::Long, NameValueMap>(timestamp, jointCurrents)); + if (jointCurrentHistory.back().first - jointCurrentHistory.front().first > historyTime) + { + jointCurrentHistory.pop_front(); + } emit jointCurrentsReported(); } @@ -1225,6 +1233,64 @@ void KinematicUnitWidgetController::updateModel() robot->setJointValues(usedNodes, jv); } +void KinematicUnitWidgetController::highlightCriticalValues() +{ + if (!enableValueValidator) + { + return; + } + + boost::recursive_mutex::scoped_lock lock(mutexNodeSet); + + // show error on current value + std::vector< RobotNodePtr > rn = robotNodeSet->getAllRobotNodes(); + static std::vector<QBrush> standardColors; + if (standardColors.size() == 0) + { + for (unsigned int i = 0; i < rn.size(); i++) + { + // all cells of a row have the same color + standardColors.push_back(ui.tableJointList->item(i, eTabelColumnCurrent)->background()); + } + } + + for (unsigned int i = 0; i < rn.size(); i++) + { + bool isZero = true; + for (auto historyIt = jointCurrentHistory.begin(); historyIt != jointCurrentHistory.end(); historyIt++) + { + NameValueMap reportedJointCurrents = historyIt->second; + NameValueMap::const_iterator it = reportedJointCurrents.find(rn[i]->getName()); + + if (it == reportedJointCurrents.end()) + { + continue; + } + + const float currentValue = it->second; + + if (currentValue != 0) + { + isZero = false; + break; + } + } + + NameStatusMap::const_iterator it; + it = reportedJointStatuses.find(rn[i]->getName()); + JointStatus currentStatus = it->second; + + if (isZero && currentStatus.enabled) + { + ui.tableJointList->item(i, eTabelColumnCurrent)->setBackground(Qt::red); + } + else + { + ui.tableJointList->item(i, eTabelColumnCurrent)->setBackground(standardColors[i]); + } + } +} + void KinematicUnitWidgetController::setMutex3D(boost::shared_ptr<boost::recursive_mutex> mutex3D) { //ARMARX_IMPORTANT << "KinematicUnitWidgetController controller " << getInstanceName() << ": set mutex " << mutex3D.get(); diff --git a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.h b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.h index eb86d8ba1..048fd4c1e 100644 --- a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.h +++ b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.h @@ -255,6 +255,8 @@ namespace armarx void updateModel(); + void highlightCriticalValues(); + protected slots: void showVisuLayers(bool show); private: @@ -268,12 +270,13 @@ namespace armarx bool initGUIJointListTable(VirtualRobot::RobotNodeSetPtr robotNodeSet); bool enableValueValidator; + Ice::Long historyTime; NameValueMap reportedJointAngles; NameValueMap reportedJointVelocities; NameControlModeMap reportedJointControlModes; NameValueMap reportedJointTorques; - NameValueMap reportedJointCurrents; + std::deque<std::pair<Ice::Long, NameValueMap>> jointCurrentHistory; NameStatusMap reportedJointStatuses; std::vector<float> dirty_squaresum_old; -- GitLab