diff --git a/kstars/ekos/focus/focus.h b/kstars/ekos/focus/focus.h --- a/kstars/ekos/focus/focus.h +++ b/kstars/ekos/focus/focus.h @@ -624,6 +624,7 @@ // Experimental linear focuser. std::unique_ptr linearFocuser; int focuserAdditionalMovement { 0 }; + int linearRequestedPosition { 0 }; bool hasDeviation { false }; }; diff --git a/kstars/ekos/focus/focus.cpp b/kstars/ekos/focus/focus.cpp --- a/kstars/ekos/focus/focus.cpp +++ b/kstars/ekos/focus/focus.cpp @@ -691,7 +691,8 @@ maxTravelIN->value(), stepIN->value(), position, absMotionMin, absMotionMax, MAXIMUM_ABS_ITERATIONS, toleranceIN->value() / 100.0, filter()); linearFocuser.reset(MakeLinearFocuser(params)); - const int newPosition = adjustLinearPosition(position, linearFocuser->initialPosition()); + linearRequestedPosition = linearFocuser->initialPosition(); + const int newPosition = adjustLinearPosition(position, linearRequestedPosition); if (newPosition != position) { if (!changeFocus(newPosition - position)) @@ -1721,6 +1722,18 @@ if (!autoFocusChecks()) return; + if (!canAbsMove && !canRelMove && canTimerMove) + { + const bool kFixPosition = true; + if (kFixPosition && (linearRequestedPosition != static_cast(currentPosition))) + { + qCDebug(KSTARS_EKOS_FOCUS) << "Linear: warning, changing position " << currentPosition << " to " + << linearRequestedPosition; + + currentPosition = linearRequestedPosition; + } + } + hfr_position.append(currentPosition); hfr_value.append(currentHFR); @@ -1760,10 +1773,9 @@ } } - const int nextPosition = adjustLinearPosition( - static_cast(currentPosition), - linearFocuser->newMeasurement(currentPosition, currentHFR)); - if (nextPosition == -1) + linearRequestedPosition = linearFocuser->newMeasurement(currentPosition, currentHFR); + const int nextPosition = adjustLinearPosition(static_cast(currentPosition), linearRequestedPosition); + if (linearRequestedPosition == -1) { if (linearFocuser->isDone() && linearFocuser->solution() != -1) { @@ -2275,6 +2287,9 @@ void Focus::processFocusNumber(INumberVectorProperty *nvp) { + qCDebug(KSTARS_EKOS_FOCUS) << QString("processFocusNumber %1 %2") + .arg(nvp->name).arg(nvp->s == IPS_OK ? "OK" : "ERROR"); + // Return if it is not our current focuser if (strcmp(nvp->device, currentFocuser->getDeviceName())) return; @@ -2291,6 +2306,7 @@ if (pos) { currentPosition = pos->value; + qCDebug(KSTARS_EKOS_FOCUS) << QString("Abs Focuser position changed to %1").arg(currentPosition); absTicksLabel->setText(QString::number(static_cast(currentPosition))); emit absolutePositionChanged(currentPosition); } @@ -2363,6 +2379,9 @@ if (pos && nvp->s == IPS_OK) { currentPosition += pos->value * (lastFocusDirection == FOCUS_IN ? -1 : 1); + qCDebug(KSTARS_EKOS_FOCUS) + << QString("Rel Focuser position changed by %1 to %2") + .arg(pos->value).arg(currentPosition); absTicksLabel->setText(QString::number(static_cast(currentPosition))); emit absolutePositionChanged(currentPosition); } @@ -2409,7 +2428,12 @@ // Used by the linear focus algorithm. Ignored if that's not in use for the timer-focuser. INumber *pos = IUFindNumber(nvp, "FOCUS_TIMER_VALUE"); if (pos) + { currentPosition += pos->value * (lastFocusDirection == FOCUS_IN ? -1 : 1); + qCDebug(KSTARS_EKOS_FOCUS) + << QString("Timer Focuser position changed by %1 to %2") + .arg(pos->value).arg(currentPosition); + } autoFocusProcessPositionChange(nvp->s); } else if (nvp->s == IPS_ALERT) diff --git a/kstars/ekos/focus/focus.ui b/kstars/ekos/focus/focus.ui --- a/kstars/ekos/focus/focus.ui +++ b/kstars/ekos/focus/focus.ui @@ -1201,7 +1201,7 @@ - Linear (Experimental v3) + Linear (Experimental v3.1) diff --git a/kstars/ekos/focus/focusalgorithms.cpp b/kstars/ekos/focus/focusalgorithms.cpp --- a/kstars/ekos/focus/focusalgorithms.cpp +++ b/kstars/ekos/focus/focusalgorithms.cpp @@ -125,7 +125,7 @@ secondPassStartIndex = -1; qCDebug(KSTARS_EKOS_FOCUS) - << QString("Linear: v3. 1st pass. Travel %1 initStep %2 pos %3 min %4 max %5 maxIters %6 tolerance %7 minlimit %8 maxlimit %9") + << QString("Linear: v3.1. 1st pass. Travel %1 initStep %2 pos %3 min %4 max %5 maxIters %6 tolerance %7 minlimit %8 maxlimit %9") .arg(params.maxTravel).arg(params.initialStepSize).arg(params.startPosition).arg(params.minPositionAllowed) .arg(params.maxPositionAllowed).arg(params.maxIterations).arg(params.focusTolerance).arg(minPositionLimit).arg(maxPositionLimit);