diff --git a/MAC/APL/MainCU/src/ObservationControl/ObservationControl.cc b/MAC/APL/MainCU/src/ObservationControl/ObservationControl.cc index b095208b69a19764c49960ddd1b0e7a6a9fd49a0..a431691d834505045411049576910c08b4876a80 100644 --- a/MAC/APL/MainCU/src/ObservationControl/ObservationControl.cc +++ b/MAC/APL/MainCU/src/ObservationControl/ObservationControl.cc @@ -155,7 +155,12 @@ void ObservationControl::sigintHandler(int signum) // Note we can't call TRAN here because the siginthandler does not know our object. if (thisObservationControl) { - thisObservationControl->finish(); + if (signum == SIGABRT) { + thisObservationControl->abortObservation(); + } + else { + thisObservationControl->finish(); + } } } @@ -167,6 +172,20 @@ void ObservationControl::finish() TRAN(ObservationControl::finishing_state); } +// +// abortObservation +// +void ObservationControl::abortObservation() +{ + LOG_WARN("Received manual interrupt to ABORT the observation"); + if (itsState < CTState::RESUME) { + itsQuitReason = CT_RESULT_MANUAL_ABORT; + } + itsTimerPort->cancelTimer(itsStopTimer); // cancel old timer + itsStopTimer = itsTimerPort->setTimer(0.0); // expire immediately + // will result in F_TIMER in ::active_state +} + // // setState(CTstateNr) // @@ -233,6 +252,7 @@ GCFEvent::TResult ObservationControl::starting_state(GCFEvent& event, thisObservationControl = this; signal (SIGINT, ObservationControl::sigintHandler); // ctrl-c signal (SIGTERM, ObservationControl::sigintHandler); // kill + signal (SIGABRT, ObservationControl::sigintHandler); // kill -6 // register what we are doing setState(CTState::CONNECT); diff --git a/MAC/APL/MainCU/src/ObservationControl/ObservationControl.h b/MAC/APL/MainCU/src/ObservationControl/ObservationControl.h index ba24199ae85efaae43e4d0d5d2655c9914275d01..7c768928583bac6fe244d3ac68bf3ac9f7b3fabd 100644 --- a/MAC/APL/MainCU/src/ObservationControl/ObservationControl.h +++ b/MAC/APL/MainCU/src/ObservationControl/ObservationControl.h @@ -82,6 +82,7 @@ public: // Interrupt handler for switching to finishing_state when exiting program. static void sigintHandler (int signum); void finish (); + void abortObservation (); private: // avoid defaultconstruction and copying