Skip to content
Snippets Groups Projects
Commit d8af30c3 authored by Christian Dreher's avatar Christian Dreher
Browse files

feat: Update to disallow toggling

parent 498aa878
No related branches found
No related tags found
1 merge request!99Fix rogue emergency stop button
Pipeline #19696 failed
......@@ -40,6 +40,10 @@ set(HEADERS ArmarXGuiApp.h
Widgets/GuiUseCaseSelector.ui
)
if ( CMAKE_COMPILER_IS_GNUCC )
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=deprecated-enum-enum-conversion")
endif()
find_package(OpenMP)
if (OPENMP_FOUND)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
......
......@@ -35,14 +35,18 @@ namespace armarx
EmergencyStopWidget::EmergencyStopWidget(QWidget* parent, ArmarXMainWindow* mainWindow) :
mainWindow(mainWindow),
iconNormal(QPixmap::fromImage(QImage(QString::fromUtf8(":/icons/emergency-stop.png")))),
iconDark(QPixmap::fromImage(QImage(QString::fromUtf8(":/icons/emergency-stop-dark.png")))), timer(new QTimer(this))
iconDark(QPixmap::fromImage(QImage(QString::fromUtf8(":/icons/emergency-stop-dark.png")))),
timer(new QTimer(this))
{
qRegisterMetaType<EmergencyStopState>("EmergencyStopState");
timer->setInterval(std::chrono::milliseconds(100));
connect(timer, &QTimer::timeout, this, &EmergencyStopWidget::updateEmergencyStopState);
connect(this, &EmergencyStopWidget::startPeriodicStateUpdate, timer, qOverload<>(&QTimer::start));
connect(this,
&EmergencyStopWidget::startPeriodicStateUpdate,
timer,
qOverload<>(&QTimer::start));
connect(this, &EmergencyStopWidget::stopPeriodicStateUpdate, timer, &QTimer::stop);
QIcon icon;
icon.addPixmap(iconNormal, QIcon::Normal, QIcon::Off);
......@@ -60,12 +64,16 @@ namespace armarx
layout->setMargin(0);
layout->setContentsMargins(0, 0, 0, 0);
this->getWidget()->setLayout(gridLayout);
emergencyStopShortcut = new QShortcut(this->getWidget());
emergencyStopShortcut->setContext(Qt::ApplicationShortcut);
emergencyStopShortcut->setKey(Qt::Key_Pause);
connect(emergencyStopShortcut, SIGNAL(activated()), this, SLOT(clicked()));
connect(button, SIGNAL(clicked(bool)), this, SLOT(clicked(bool)));
enableSS2Shortcut = new QShortcut(this->getWidget());
enableSS2Shortcut->setContext(Qt::ApplicationShortcut);
enableSS2Shortcut->setKey(Qt::Key_Pause);
releaseSS2Shortcut = new QShortcut(this->getWidget());
releaseSS2Shortcut->setContext(Qt::ApplicationShortcut);
releaseSS2Shortcut->setKey(Qt::SHIFT | Qt::Key_Pause);
connect(button, &QPushButton::clicked, this, &EmergencyStopWidget::clicked);
std::stringstream str;
str << "After EmergencyStop was activated, you have to wait "
<< deactivationWaitPeriod.count() << " ms before you can deactivate it.";
......@@ -91,6 +99,9 @@ namespace armarx
emergencyStopMasterPrx = getProxy<EmergencyStopMasterInterfacePrx>(EMERGENCY_STOP_PROXY);
QMetaObject::invokeMethod(button, "setVisible", Qt::QueuedConnection, Q_ARG(bool, true));
connect(enableSS2Shortcut, &QShortcut::activated, this, &EmergencyStopWidget::enableSS2);
connect(releaseSS2Shortcut, &QShortcut::activated, this, &EmergencyStopWidget::releaseSS2);
QMetaObject::invokeMethod(
this,
"setChecked",
......@@ -118,32 +129,52 @@ namespace armarx
{
}
// void EmergencyStopWidget::reportEmergencyStopState(EmergencyStopState state, const Ice::Current&)
// {
// QMetaObject::invokeMethod(this, "setChecked", Qt::QueuedConnection, Q_ARG(EmergencyStopState, state));
// }
// void EmergencyStopWidget::reportEmergencyStopState(EmergencyStopState state, const Ice::Current&)
// {
// QMetaObject::invokeMethod(this, "setChecked", Qt::QueuedConnection, Q_ARG(EmergencyStopState, state));
// }
void
EmergencyStopWidget::clicked(bool checked)
EmergencyStopWidget::enableSS2()
{
EmergencyStopState state = emergencyStopMasterPrx->getEmergencyStopState();
switch (state)
if (emergencyStopMasterPrx)
{
case EmergencyStopState::eEmergencyStopActive:
if (clock_t::now() > timeLastActivated + deactivationWaitPeriod)
{
emergencyStopMasterPrx->setEmergencyStopState(
EmergencyStopState::eEmergencyStopInactive);
}
else
{
button->setChecked(true);
}
break;
case EmergencyStopState::eEmergencyStopInactive:
emergencyStopMasterPrx->setEmergencyStopState(EmergencyStopState::eEmergencyStopActive);
}
}
void
EmergencyStopWidget::releaseSS2()
{
if (clock_t::now() > timeLastActivated + deactivationWaitPeriod)
{
if (emergencyStopMasterPrx)
{
emergencyStopMasterPrx->setEmergencyStopState(
EmergencyStopState::eEmergencyStopActive);
break;
EmergencyStopState::eEmergencyStopInactive);
}
}
else
{
button->setChecked(true);
}
}
void
EmergencyStopWidget::clicked(bool checked)
{
if (emergencyStopMasterPrx)
{
EmergencyStopState state = emergencyStopMasterPrx->getEmergencyStopState();
switch (state)
{
case EmergencyStopState::eEmergencyStopActive:
releaseSS2();
break;
case EmergencyStopState::eEmergencyStopInactive:
enableSS2();
break;
}
}
}
......@@ -173,9 +204,18 @@ namespace armarx
void
EmergencyStopWidget::updateEmergencyStopState()
{
if (emergencyStopMasterPrx)
try
{
setChecked(emergencyStopMasterPrx->getEmergencyStopState());
if (emergencyStopMasterPrx)
{
setChecked(emergencyStopMasterPrx->getEmergencyStopState());
}
}
catch (Ice::Exception const& e)
{
ARMARX_ERROR << "Could not query SS2 state." << deactivateSpam(2);
setChecked(EmergencyStopState::eEmergencyStopActive);
}
}
} // namespace armarx
......@@ -42,20 +42,21 @@ namespace armarx
{
class ArmarXMainWindow;
class EmergencyStopWidget :
public ArmarXComponentWidgetControllerTemplate<EmergencyStopWidget>
class EmergencyStopWidget : public ArmarXComponentWidgetControllerTemplate<EmergencyStopWidget>
{
Q_OBJECT
public:
explicit EmergencyStopWidget(QWidget* parent = 0, ArmarXMainWindow* mainWindow = 0);
QWidget* getButtonWidget();
// void reportEmergencyStopState(EmergencyStopState, const Ice::Current&) override;
// void reportEmergencyStopState(EmergencyStopState, const Ice::Current&) override;
signals:
void startPeriodicStateUpdate();
void stopPeriodicStateUpdate();
public slots:
void enableSS2();
void releaseSS2();
void clicked(bool = true);
// ManagedIceObject interface
......@@ -76,7 +77,8 @@ namespace armarx
QPixmap iconDark;
QToolButton* button;
QAction* emergencyStopAction;
QShortcut* emergencyStopShortcut;
QShortcut* enableSS2Shortcut;
QShortcut* releaseSS2Shortcut;
EmergencyStopMasterInterfacePrx emergencyStopMasterPrx;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment