void AMPVwStatusControl::onSettlingTimeFinished() { settlingTimer_.stop(); if(!settlingInProgress_) { // temporary, for settling state testing: qWarning() << "AMPVwStatusControl:" << name() << ": Settling timeout while settlingInProgress is not true. This should never happen; please report this bug."; return; } settlingInProgress_ = false; if(moveInProgress_) { moveInProgress_ = false; // Check if we succeeded... if(inPosition()) { emit moveSucceeded(); } else { emit moveFailed(AMControl::ToleranceFailure); } } else { // temporary, for settling state testing: qWarning() << "AMPVwStatusControl: " << name() << ": Settling time reached while moveInProgress_ == false. This should never happen; please report this bug."; } // possible that a change in settlingInProgress_ caused isMoving() to change. Emit signal if necessary: bool nowMoving = isMoving(); if(nowMoving != wasMoving_) emit movingChanged(wasMoving_ = nowMoving); }
bool REIXSSpectrometer::stop() { if(!canStop()) return false; if(moveInProgress()) { moveAction_->cancel(); /// \todo Actually, have to flag that a stop has started, and also catch when the stop is finished... Motors will take a while to actually receive and decelerate. moveAction_->deleteLater(); moveAction_ = 0; emit moveFailed(AMControl::WasStoppedFailure); AMErrorMon::report(AMErrorReport(this, AMErrorReport::Alert, AMControl::WasStoppedFailure, "Spectrometer Move Stopped.")); } // just in case anything was moving from outside our instructions (ie: commanded from somewhere else in the building) spectrometerRotationDrive_->stop(); detectorTranslation_->stop(); detectorTiltDrive_->stop(); endstationTranslation_->stop(); // hexapod: cannot stop without wrecking init. Don't worry for now... just let it stop over time. Not necessary for it to be not-moving before we re-send it somewhere new. /// \todo Actually, have to flag that a stop has started, and also catch when the stop is finished... Motors will take a while to actually receive and decelerate. return true; }
// This is used to handle the timeout of a move start: void AMPVwStatusControl::onMoveStartTimeout() { moveStartTimer_.stop(); // This is only meaningful if one of our moves is in progress. if(startInProgress_) { // give up on this move: startInProgress_ = false; // The move didn't start within our allowed start period. That counts as a move failed. emit moveFailed(AMControl::TimeoutFailure); } }
// This is used to handle the timeout of a move: void AMPVControl::onCompletionTimeout() { // if we weren't moving, this shouldn't have happened. someone forgot to shutoff the timer? // todo: this is only included for state testing debugging... can remove if never happens if(!moveInProgress_) { return; } // No matter what, this move is over: emit movingChanged(moveInProgress_ = false); completionTimer_.stop(); // Did we make it? if( inPosition() ) { emit moveSucceeded(); } // Didn't make it into position: else { emit moveFailed(AMControl::TimeoutFailure); } }
// This is used to handle the timeout of a move start: void CLSMDriveMotorControl::onMoveStartTimeout() { moveStartTimer_.stop(); // This is only meaningful if one of our moves is in progress. if(startInProgress_) { // give up on this move: startInProgress_ = false; // Special case: only applies if moveTimeoutTolerance_ != 0 AND we've gotten within moveTimeoutTolerance_ of the setpoint. if(moveTimeoutTolerance() != 0.0 && fabs(setpoint() - value()) < moveTimeoutTolerance_) { moveInProgress_ = true; emit moveStarted(); moveInProgress_ = false; emit moveSucceeded(); } else { // The move didn't start within our allowed start period. That counts as a move failed. emit moveFailed(AMControl::TimeoutFailure); } } }
// Re-implemented from AMReadOnlyPVwStatusControl: void AMPVwStatusControl::onMovingChanged(int isMovingValue) { bool nowMoving = (*statusChecker_)(isMovingValue); // according to the hardware. For checking moveSucceeded/moveStarted/moveFailed, use the value delivered in the signal argument, instead of re-checking the PV, in case we respond late and the hardware has already changed again. // In case the hardware is being silly and sending multiple MOVE ACTIVE, MOVE ACTIVE, MOVE ACTIVE states in a row, or MOVE DONE, MOVE DONE, MOVE DONE states in a row: only act on changes. [Edge detection] if(nowMoving == hardwareWasMoving_) return; hardwareWasMoving_ = nowMoving; // moveStarted, moveFailed, moveSucceeded, or transition to settling: /////////////////////////////////////////////////////////////////////// // if we requested one of our moves, and moving just started: if(startInProgress_ && nowMoving) { moveInProgress_ = true; startInProgress_ = false; // This is great... the device started moving within the timeout: // disable the moveStartTimer, we don't need it anymore moveStartTimer_.stop(); emit moveStarted(); } // If one of our moves was running, and we stopped moving: if(moveInProgress_ && !nowMoving) { // Mode 1: No settling: if( settlingTime_ == 0.0) { // That's the end of our move moveInProgress_ = false; // Check if we succeeded... if(inPosition()) { emit moveSucceeded(); } else { emit moveFailed(AMControl::ToleranceFailure); } } // Mode 2: allow settling else { if(!settlingInProgress_) { settlingInProgress_ = true; settlingTimer_.start(int(settlingTime_*1000)); // QTimer uses millisecond time intervals. } } } // "sucessfully" stopped due to a stop() command. if(stopInProgress_ && !nowMoving) { stopInProgress_ = false; // but the move itself has failed, due to a stop() intervention. emit moveFailed(AMControl::WasStoppedFailure); } // Emitting movingChanged(). ///////////////////////////////////// // For external purposes, isMoving() depends on whether the hardware says we're moving, or we're in the settling phase. nowMoving = isMoving(); if(nowMoving != wasMoving_) emit movingChanged(wasMoving_ = nowMoving); }
void AMPIC887EpicsCoordinator::onAllConnected(bool connectedState) { if(connectedState) { if(!controller_->isInValidState()) { qDebug() << "Initialization: Setting Axes status to Error"; xAxisStatus_->move(4); yAxisStatus_->move(4); zAxisStatus_->move(4); uAxisStatus_->move(4); vAxisStatus_->move(4); wAxisStatus_->move(4); } else if (!connectedOnce_) { connectedOnce_ = true; // Initializing x Axis if(!xAxisFeedback_->withinTolerance(controller_->currentPosition(AMGCS2::XAxis))) { qDebug() << "Initialization: Setting x Axis position to " << controller_->currentPosition(AMGCS2::XAxis); xAxisFeedback_->move(controller_->currentPosition(AMGCS2::XAxis)); } if(controller_->movementStatuses().testFlag(AMGCS2::XAxisIsMoving) && !xAxisStatus_->withinTolerance(1)) { qDebug() << "Initialization: Setting x Axis status to moving"; xAxisStatus_->move(1); } else if (!xAxisStatus_->withinTolerance(0)) { qDebug() << "Initialization: Setting x Axis status to move done"; xAxisStatus_->move(0); } // Initializing y Axis if(!yAxisFeedback_->withinTolerance(controller_->currentPosition(AMGCS2::YAxis))) { qDebug() << "Initialzation: Setting y Axis position to " << controller_->currentPosition(AMGCS2::YAxis); yAxisFeedback_->move(controller_->currentPosition(AMGCS2::YAxis)); } if(controller_->movementStatuses().testFlag(AMGCS2::YAxisIsMoving) && !yAxisStatus_->withinTolerance(1)) { qDebug() << "Initialization: Setting y Axis status to moving"; yAxisStatus_->move(1); } else if (!yAxisStatus_->withinTolerance(0)) { qDebug() << "Initialization: Setting y Axis status to move done"; yAxisStatus_->move(0); } // Initializing z Axis if(!zAxisFeedback_->withinTolerance(controller_->currentPosition(AMGCS2::ZAxis))) { qDebug() << "Initialzation: Setting z Axis position to " << controller_->currentPosition(AMGCS2::ZAxis); zAxisFeedback_->move(controller_->currentPosition(AMGCS2::ZAxis)); } if(controller_->movementStatuses().testFlag(AMGCS2::ZAxisIsMoving) && !zAxisStatus_->withinTolerance(1)) { qDebug() << "Initialization: Setting z Axis status to moving"; zAxisStatus_->move(1); } else if (!zAxisStatus_->withinTolerance(0)) { qDebug() << "Initialization: Setting z Axis status to move done"; zAxisStatus_->move(0); } // Initializing u Axis if(!uAxisFeedback_->withinTolerance(controller_->currentPosition(AMGCS2::UAxis))) { qDebug() << "Initialzation: Setting u Axis position to " << controller_->currentPosition(AMGCS2::UAxis); uAxisFeedback_->move(controller_->currentPosition(AMGCS2::UAxis)); } if(controller_->movementStatuses().testFlag(AMGCS2::UAxisIsMoving) && !uAxisStatus_->withinTolerance(1)) { qDebug() << "Initialization: Setting u Axis status to moving"; uAxisStatus_->move(1); } else if (!uAxisStatus_->withinTolerance(0)) { qDebug() << "Initialization: Setting u Axis status to move done"; uAxisStatus_->move(0); } // Initializing v Axis if(!vAxisFeedback_->withinTolerance(controller_->currentPosition(AMGCS2::VAxis))) { qDebug() << "Initialzation: Setting v Axis position to " << controller_->currentPosition(AMGCS2::VAxis); vAxisFeedback_->move(controller_->currentPosition(AMGCS2::VAxis)); } if(controller_->movementStatuses().testFlag(AMGCS2::VAxisIsMoving) && !vAxisStatus_->withinTolerance(1)) { qDebug() << "Initialization: Setting v Axis status to moving"; vAxisStatus_->move(1); } else if (!vAxisStatus_->withinTolerance(0)) { qDebug() << "Initialization: Setting v Axis status to move done"; vAxisStatus_->move(0); } // Initializing w Axis if(!wAxisFeedback_->withinTolerance(controller_->currentPosition(AMGCS2::WAxis))) { qDebug() << "Initialzation: Setting w Axis position to " << controller_->currentPosition(AMGCS2::WAxis); wAxisFeedback_->move(controller_->currentPosition(AMGCS2::WAxis)); } if(controller_->movementStatuses().testFlag(AMGCS2::WAxisIsMoving) && !wAxisStatus_->withinTolerance(1)) { qDebug() << "Initialization: Setting w Axis status to moving"; wAxisStatus_->move(1); } else if (!wAxisStatus_->withinTolerance(0)) { qDebug() << "Initialization: Setting w Axis status to move done"; wAxisStatus_->move(0); } // Initialize system velocity if(!systemVelocityFeedback_->withinTolerance(controller_->systemVelocity())) { qDebug() << "Initialization: Setting system velocity to " << controller_->systemVelocity(); systemVelocityFeedback_->move(controller_->systemVelocity()); } if(!systemVelocitySetpoint_->withinTolerance(controller_->systemVelocity())) { qDebug() << "Initialization: Setting system velocity setpoint to " << controller_->systemVelocity(); systemVelocitySetpoint_->move(controller_->systemVelocity()); } // Initialize the record rate. if(!recordRateFeedback_->withinTolerance(controller_->recordRate())) { qDebug() << "Initialization: Setting record rate to " << controller_->recordRate(); recordRateFeedback_->move(controller_->recordRate()); } if(!recordRateSetpoint_->withinTolerance(controller_->recordRate())) { qDebug() << "Initialization: Setting record rate setpoint to " << controller_->recordRate(); recordRateSetpoint_->move(controller_->recordRate()); } // Initialize data recorder active state double dataRecorderActiveValue = controller_->isDataRecorderActive() ? 1.0 : 0.0; if(dataRecorderActive_->withinTolerance(dataRecorderActiveValue)) { qDebug() << "Initialization: Setting data recorder active status to " << dataRecorderActiveValue; dataRecorderActive_->move(dataRecorderActiveValue); } } connect(systemVelocitySetpoint_, SIGNAL(valueChanged(double)), this, SLOT(onSystemVelocitySetpointChanged(double))); connect(recordRateSetpoint_, SIGNAL(valueChanged(double)), this, SLOT(onRecordRateSetpointPVChanged(double))); connect(dataRecorderActive_, SIGNAL(valueChanged(double)), this, SLOT(onDataRecorderActivePVChanged(double))); connect(stopAll_, SIGNAL(valueChanged(double)), this, SLOT(onStopAll(double))); connect(controller_, SIGNAL(moveStarted(AMGCS2::AxisMovementStatuses)), this, SLOT(onMotionStartedChanged(AMGCS2::AxisMovementStatuses))); connect(controller_, SIGNAL(moveFailed(AMGCS2::AxisMovementStatuses)), this, SLOT(onMotionFailed(AMGCS2::AxisMovementStatuses))); connect(controller_, SIGNAL(moveComplete()), this, SLOT(onMotionCompleted())); connect(controller_, SIGNAL(positionUpdate(AMPIC887AxisMap<double>)), this, SLOT(onPositionUpdate(AMPIC887AxisMap<double>))); connect(controller_, SIGNAL(systemVelocityChanged(double)), this, SLOT(onSystemVelocityChanged(double))); connect(controller_, SIGNAL(recordRateChanged(double)), this, SLOT(onControllerRecordRateChanged(double))); connect(controller_, SIGNAL(dataRecorderActiveStateChanged(bool)), this, SLOT(onControllerDataRecorderActiveChanged(bool))); } }