Skip to content
Snippets Groups Projects

Fix rogue emergency stop button

Merged Christian Dreher requested to merge fix/emergency_stop_button into master
2 files
+ 39
44
Compare changes
  • Side-by-side
  • Inline
Files
2
@@ -36,6 +36,7 @@ namespace armarx
mainWindow(mainWindow),
iconNormal(QPixmap::fromImage(QImage(QString::fromUtf8(":/icons/emergency-stop.png")))),
iconDark(QPixmap::fromImage(QImage(QString::fromUtf8(":/icons/emergency-stop-dark.png")))),
lastKnownEmergencyStopState(EmergencyStopState::eEmergencyStopInactive),
timer(new QTimer(this))
{
qRegisterMetaType<EmergencyStopState>("EmergencyStopState");
@@ -61,6 +62,8 @@ namespace armarx
"EmergencyStop is active. Shortcut: Pause Key"));
button->setVisible(false);
QGridLayout* l = new QGridLayout(this->getWidget());
l->setMargin(0);
l->setContentsMargins(0, 0, 0, 0);
this->getWidget()->setLayout(l);
this->getWidget()->layout()->addWidget(button);
@@ -174,57 +177,43 @@ namespace armarx
EmergencyStopState::eEmergencyStopInactive);
}
}
else
{
button->setChecked(true);
}
}
void
EmergencyStopWidget::clicked(bool checked)
{
if (emergencyStopMasterPrx)
if (!emergencyStopMasterPrx)
{
EmergencyStopState const state = emergencyStopMasterPrx->getEmergencyStopState();
bool success = true;
switch (state)
{
case EmergencyStopState::eEmergencyStopActive:
if (clock_t::now() > timeLastActivated + deactivationWaitPeriod)
{
if (emergencyStopMasterPrx)
{
// Only release SS2 if the state we received still is "Active". Fail
// otherwise.
bool const success =
emergencyStopMasterPrx->checkAndSetEmergencyStopState(
EmergencyStopState::eEmergencyStopInactive, state);
if (not success)
{
ARMARX_WARNING << "Toggling SS2 failed since it probably has "
"already been activated from another session. "
"This mechanism is to prevent two simultanous "
"toggles of the SS2 to cancel out.";
}
}
}
else
{
button->setChecked(true);
}
break;
case EmergencyStopState::eEmergencyStopInactive:
if (emergencyStopMasterPrx)
return;
}
EmergencyStopState const state = emergencyStopMasterPrx->getEmergencyStopState();
switch (state)
{
case EmergencyStopState::eEmergencyStopActive:
if (clock_t::now() > timeLastActivated + deactivationWaitPeriod)
{
// Only release SS2 if the state we received still is "Active". Fail
// otherwise.
bool const success = emergencyStopMasterPrx->checkAndSetEmergencyStopState(
EmergencyStopState::eEmergencyStopInactive, state);
if (not success)
{
// Always enable SS2 without checking.
enableSS2();
ARMARX_WARNING << "Toggling SS2 failed since it probably has "
"already been activated from another session. "
"This mechanism is to prevent two simultanous "
"toggles of the SS2 to cancel out.";
}
break;
}
if (not success)
{
ARMARX_WARNING << "Releasing SS2 failed.";
}
}
else
{
button->setChecked(true);
}
break;
case EmergencyStopState::eEmergencyStopInactive:
// Always enable SS2 without checking.
enableSS2();
break;
}
}
@@ -243,14 +232,19 @@ namespace armarx
{
case EmergencyStopState::eEmergencyStopActive:
button->setChecked(true);
if (lastKnownEmergencyStopState != EmergencyStopState::eEmergencyStopActive)
{
timeLastActivated = clock_t::now();
}
break;
case EmergencyStopState::eEmergencyStopInactive:
button->setChecked(false);
timeLastActivated = clock_t::now();
break;
default:
button->setChecked(false);
}
lastKnownEmergencyStopState = state;
}
void
Loading