From nobody Fri Mar 11 21:23:53 2022 X-Original-To: dev-commits-ports-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 464981A0C157; Fri, 11 Mar 2022 21:23:54 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4KFf7Z1PnNz3jw8; Fri, 11 Mar 2022 21:23:54 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1647033834; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=1/091WI59CqyKidcJArtPF+Pu76aiMth0hv9sDMKsh0=; b=xKlP2zwezlYocRJcvoCUlYJ4I3DBJMBt0xCaEODY8PAK2McwvW4WzCvoR35G0E8ACUKlyh kQIK1SxMcL3+q/j973j4JS2cKFkmmfhcFpmJRWSWKq6HuKwWRqRx56LhUoA4/LA+oLTvS9 i/ehCnA+jxD/F0PzrA5JYH09CwPS4JYo+xyj2qcQpTOaTVTNxlJc5EaVAKRmfR6SbVxe29 3CS7Y/5e8esZtpDSbbBdtp+OcN27eiKahVLx8fBqkGvpIPncNZ6KP4oQ81TLyawpH6knHn Bj2EHTYeWS/vv2jGzpnRGUbImdx/B3kcYOI+Q9hshX+d9lrhwjGtM94M0shSzw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 1069920923; Fri, 11 Mar 2022 21:23:54 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 22BLNs1Y075324; Fri, 11 Mar 2022 21:23:54 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 22BLNrJb075323; Fri, 11 Mar 2022 21:23:53 GMT (envelope-from git) Date: Fri, 11 Mar 2022 21:23:53 GMT Message-Id: <202203112123.22BLNrJb075323@gitrepo.freebsd.org> To: ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org From: Adriaan de Groot Subject: git: afae6c72d90c - main - astro/kstars: fix build against newer stellarsolver List-Id: Commits to the main branch of the FreeBSD ports repository List-Archive: https://lists.freebsd.org/archives/dev-commits-ports-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-ports-main@freebsd.org X-BeenThere: dev-commits-ports-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: adridg X-Git-Repository: ports X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: afae6c72d90cf4a923d10973bc8f0a472537d628 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1647033834; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=1/091WI59CqyKidcJArtPF+Pu76aiMth0hv9sDMKsh0=; b=I69F8aW06VEJR81VjVpGJn4UFesnBzzeyXcHMS09ltBg2HaW/sCKcCO7VAtXrIVAbzB7SD kGTmpetykdNzuBtv6oHT1/STYc9FVLVD3cKt8E00naAndrjxMKRu7ufksIxj//bbgipHN2 zWo8Thv5FNEbqUXVw+YFbWfNLBUShOHRWRBsutiNtapRD+cVMhggQMCvzqkRCwaZ+fmMnY htfKWgYipiXt7A8Y3/E/mVu8TXH9vvrFfhN/bCz5dDseiay63IV4cZVC3LVkEciszOyabK RP9x3IR11AKC/gmOjYD2lu4/amxucqS2TcY5QemD8pwxs/2WCMr7OBimHvPwqg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1647033834; a=rsa-sha256; cv=none; b=qXWmsFEHTav05/AMxxMFmgeOrZhe0kdN+jT4AlVjLdnQA2kFyvk08H6aMnlBHHOhfzaypG Qc15xjvP9F1nrtBxQey/h4E/DQW+qXEpB+Fc/KKMg8LSSNNTrJX4Y1EybMTQTAFiZ4MUTl xMiRMEcMofnfw7+N9l6LLSOu5lcutgOT8B/CPWz5wUvGod7B5HtsTQPHaSt5CSN7jLdoPO Dgr1QZiAOPYVLIbEtP+ftcWdeuEZmopakriizFi5BQFas6qlUlT+pLJ9NSc1GaPL3uAjxk OkKb2XLEquhnteqVOd6PR/+mKrvZoi1Y5K8bfzEr68XrRd+7O+nB9txZ7hPltQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by adridg: URL: https://cgit.FreeBSD.org/ports/commit/?id=afae6c72d90cf4a923d10973bc8f0a472537d628 commit afae6c72d90cf4a923d10973bc8f0a472537d628 Author: Adriaan de Groot AuthorDate: 2022-03-11 21:17:13 +0000 Commit: Adriaan de Groot CommitDate: 2022-03-11 21:23:51 +0000 astro/kstars: fix build against newer stellarsolver Patch obtained from upstream KStars 3.5.7 branch. --- astro/kstars/Makefile | 4 +- .../bef3940aaceb1ba574687a4817ef829a04d49dd4.patch | 1237 ++++++++++++++++++++ 2 files changed, 1240 insertions(+), 1 deletion(-) diff --git a/astro/kstars/Makefile b/astro/kstars/Makefile index c2911763e2a8..464d2fbfb73c 100644 --- a/astro/kstars/Makefile +++ b/astro/kstars/Makefile @@ -1,6 +1,6 @@ PORTNAME= kstars DISTVERSION= 3.5.7 -PORTREVISION= 2 +PORTREVISION= 3 PORTEPOCH= 1 CATEGORIES= astro kde MASTER_SITES= KDE/stable/${PORTNAME} @@ -10,6 +10,8 @@ COMMENT= KDE desktop planetarium LICENSE= GPLv2 +EXTRA_PATCHES= ${PATCHDIR}/bef3940aaceb1ba574687a4817ef829a04d49dd4.patch:-p1 + LIB_DEPENDS= libcfitsio.so:astro/cfitsio \ libindidriver.so:devel/indi \ libqt5keychain.so:security/qtkeychain \ diff --git a/astro/kstars/files/bef3940aaceb1ba574687a4817ef829a04d49dd4.patch b/astro/kstars/files/bef3940aaceb1ba574687a4817ef829a04d49dd4.patch new file mode 100644 index 000000000000..5b252c7466dd --- /dev/null +++ b/astro/kstars/files/bef3940aaceb1ba574687a4817ef829a04d49dd4.patch @@ -0,0 +1,1237 @@ +From bef3940aaceb1ba574687a4817ef829a04d49dd4 Mon Sep 17 00:00:00 2001 +From: Jasem Mutlaq +Date: Fri, 4 Mar 2022 12:54:11 +0300 +Subject: [PATCH] Make it work with StellarSolver 2.0 + +--- + CMakeLists.txt | 2 +- + Tests/kstars_ui/test_ekos_align.cpp | 17 +- + .../kstars_ui/test_ekos_meridianflip_base.cpp | 63 ++-- + kstars/auxiliary/ksutils.cpp | 11 + + kstars/ekos/align/align.cpp | 22 +- + kstars/ekos/align/opsalign.ui | 7 +- + kstars/ekos/align/opsprograms.cpp | 30 +- + kstars/ekos/align/opsprograms.ui | 30 +- + .../ekos/auxiliary/stellarsolverprofile.cpp | 50 +-- + .../auxiliary/stellarsolverprofileeditor.cpp | 9 +- + .../auxiliary/stellarsolverprofileeditor.ui | 288 +++++++++++------- + kstars/fitsviewer/fitssepdetector.cpp | 6 +- + kstars/fitsviewer/structuredefinitions.h | 84 +++-- + kstars/kstars.kcfg | 5 + + 14 files changed, 387 insertions(+), 237 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 5e83ddb47..aabba563e 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -215,7 +215,7 @@ MACRO_BOOL_TO_01(INDI_FOUND HAVE_INDI) + set_package_properties(INDI PROPERTIES DESCRIPTION "Astronomical instrumentation control" URL "https://www.indilib.org" TYPE OPTIONAL PURPOSE "Support for controlling astronomical devices on Linux with KStars.") + + if (INDI_FOUND AND NOT ANDROID) +- find_package(StellarSolver REQUIRED) ++ find_package(StellarSolver REQUIRED 2.0) + endif(INDI_FOUND AND NOT ANDROID) + MACRO_BOOL_TO_01(StellarSolver_FOUND HAVE_STELLARSOLVER) + +diff --git a/Tests/kstars_ui/test_ekos_align.cpp b/Tests/kstars_ui/test_ekos_align.cpp +index 4e5a9f482..a04aff562 100644 +--- a/Tests/kstars_ui/test_ekos_align.cpp ++++ b/Tests/kstars_ui/test_ekos_align.cpp +@@ -266,7 +266,7 @@ void TestEkosAlign::prepareTestCase() + // select StellarSolver + Options::setSolverType(SSolver::SOLVER_LOCALASTROMETRY); + // select fast solve profile option +- Options::setSolveOptionsProfile(SSolver::Parameters::FAST_SOLVING); ++ Options::setSolveOptionsProfile(SSolver::Parameters::DEFAULT); + // select the "Slew to Target" mode + KTRY_SET_RADIOBUTTON(ekos->alignModule(), slewR, true); + // reduce the accuracy to avoid testing problems +@@ -305,7 +305,8 @@ void TestEkosAlign::init() + image_count = 0; + } + +-void TestEkosAlign::cleanup() { ++void TestEkosAlign::cleanup() ++{ + Ekos::Manager *ekos = Ekos::Manager::Instance(); + Ekos::Scheduler *scheduler = ekos->schedulerModule(); + // press stop button if running +@@ -440,10 +441,13 @@ bool TestEkosAlign::executeAlignment(SkyObject *targetObject) + bool TestEkosAlign::verifyAlignmentTarget(SkyObject *targetObject) + { + QList alignmentTarget = Ekos::Manager::Instance()->alignModule()->getTargetCoords(); +- KVERIFY2_SUB(std::abs(alignmentTarget[0] - targetObject->ra0().Hours()) < 0.005, // difference small enough to capture JNow/J2000 errors +- QString("RA target J2000 deviation too big: %1 received, %2 expected.").arg(alignmentTarget[0]).arg(targetObject->ra0().Hours()).toLocal8Bit()); ++ KVERIFY2_SUB(std::abs(alignmentTarget[0] - targetObject->ra0().Hours()) < ++ 0.005, // difference small enough to capture JNow/J2000 errors ++ QString("RA target J2000 deviation too big: %1 received, %2 expected.").arg(alignmentTarget[0]).arg( ++ targetObject->ra0().Hours()).toLocal8Bit()); + KVERIFY2_SUB(std::abs(alignmentTarget[1] - targetObject->dec0().Degrees()) < 0.005, +- QString("DEC target J2000 deviation too big: %1 received, %2 expected.").arg(alignmentTarget[1]).arg(targetObject->dec0().Degrees()).toLocal8Bit()); ++ QString("DEC target J2000 deviation too big: %1 received, %2 expected.").arg(alignmentTarget[1]).arg( ++ targetObject->dec0().Degrees()).toLocal8Bit()); + // success + return true; + } +@@ -460,7 +464,8 @@ bool TestEkosAlign::alignWithScheduler(SkyObject *targetObject, QString fitsTarg + const QString sequenceFile = TestEkosSchedulerHelper::getDefaultEsqContent(); + const QString esqFile = testDir->filePath(QString("test.esq")); + // create the scheduler file +- const QString schedulerFile = TestEkosSchedulerHelper::getSchedulerFile(targetObject, startupCondition, 1, {true, false, true, false}, false, false, 30, fitsTarget); ++ const QString schedulerFile = TestEkosSchedulerHelper::getSchedulerFile(targetObject, startupCondition, 1, {true, false, true, false}, ++ false, false, 30, fitsTarget); + const QString eslFile = testDir->filePath(QString("test.esl")); + // write both files to the test directory + KVERIFY_SUB(TestEkosSchedulerHelper::writeSimpleSequenceFiles(schedulerFile, eslFile, sequenceFile, esqFile)); +diff --git a/Tests/kstars_ui/test_ekos_meridianflip_base.cpp b/Tests/kstars_ui/test_ekos_meridianflip_base.cpp +index ea58b07fa..c97486558 100644 +--- a/Tests/kstars_ui/test_ekos_meridianflip_base.cpp ++++ b/Tests/kstars_ui/test_ekos_meridianflip_base.cpp +@@ -23,7 +23,8 @@ + #include "ekos/guide/internalguide/gmath.h" + #include "Options.h" + +-TestEkosMeridianFlipBase::TestEkosMeridianFlipBase(QObject *parent) : TestEkosMeridianFlipBase::TestEkosMeridianFlipBase("Internal", parent){} ++TestEkosMeridianFlipBase::TestEkosMeridianFlipBase(QObject *parent) : ++ TestEkosMeridianFlipBase::TestEkosMeridianFlipBase("Internal", parent) {} + + TestEkosMeridianFlipBase::TestEkosMeridianFlipBase(QString guider, QObject *parent) : QObject(parent) + { +@@ -88,7 +89,7 @@ bool TestEkosMeridianFlipBase::startEkosProfile() + // select StellarSolver + Options::setSolverType(SSolver::SOLVER_LOCALASTROMETRY); + // select fast solve profile option +- Options::setSolveOptionsProfile(SSolver::Parameters::FAST_SOLVING); ++ Options::setSolveOptionsProfile(SSolver::Parameters::DEFAULT); + // select the "Slew to Target" mode + KTRY_SET_RADIOBUTTON_SUB(ekos->alignModule(), slewR, true); + +@@ -245,8 +246,9 @@ void TestEkosMeridianFlipBase::cleanup() + * + * ********************************************************************************* */ + +-void TestEkosMeridianFlipBase::prepareTestData(double exptime, QList locationList, QList culminationList, QList filterList, +- QList focusList, QList autofocusList, QList guideList, QList ditherList) ++void TestEkosMeridianFlipBase::prepareTestData(double exptime, QList locationList, QList culminationList, ++ QList filterList, ++ QList focusList, QList autofocusList, QList guideList, QList ditherList) + { + #if QT_VERSION < QT_VERSION_CHECK(5,9,0) + QSKIP("Bypassing fixture test on old Qt"); +@@ -321,7 +323,7 @@ bool TestEkosMeridianFlipBase::positionMountForMF(int secsToMF, bool fast) + // calculate a feasible declination depending to the location's latitude + // for the upper culmination, we use an azimuth of 45 deg, for the lower culmination half way between pole and horizont + double lat = KStarsData::Instance()->geo()->lat()->Degrees(); +- target = new SkyPoint(range24(meridianRA + delta), culmination ? (lat-45) : (90-lat/2)); ++ target = new SkyPoint(range24(meridianRA + delta), culmination ? (lat - 45) : (90 - lat / 2)); + + if (fast) + { +@@ -414,7 +416,7 @@ bool TestEkosMeridianFlipBase::prepareCaptureTestcase(int secsToMF, bool initial + } + + bool TestEkosMeridianFlipBase::prepareSchedulerTestcase(int secsToMF, bool useFocus, +- SchedulerJob::CompletionCondition completionCondition, int iterations) ++ SchedulerJob::CompletionCondition completionCondition, int iterations) + { + #if QT_VERSION < QT_VERSION_CHECK(5,9,0) + QSKIP("Bypassing fixture test on old Qt"); +@@ -453,18 +455,19 @@ bool TestEkosMeridianFlipBase::prepareSchedulerTestcase(int secsToMF, bool useFo + Options::setStopEkosAfterShutdown(false); + + // set the completion condition +- switch (completionCondition) { +- case SchedulerJob::FINISH_REPEAT: +- // repeat the job for a fixed amount +- KTRY_SET_RADIOBUTTON_SUB(scheduler, repeatCompletionR, true); +- KTRY_SET_SPINBOX_SUB(scheduler, repeatsSpin, iterations); +- break; +- case SchedulerJob::FINISH_LOOP: +- KTRY_SET_RADIOBUTTON_SUB(scheduler, loopCompletionR, true); +- break; +- default: +- QWARN(QString("Unsupported completion condition %1!").arg(completionCondition).toStdString().c_str()); +- return false; ++ switch (completionCondition) ++ { ++ case SchedulerJob::FINISH_REPEAT: ++ // repeat the job for a fixed amount ++ KTRY_SET_RADIOBUTTON_SUB(scheduler, repeatCompletionR, true); ++ KTRY_SET_SPINBOX_SUB(scheduler, repeatsSpin, iterations); ++ break; ++ case SchedulerJob::FINISH_LOOP: ++ KTRY_SET_RADIOBUTTON_SUB(scheduler, loopCompletionR, true); ++ break; ++ default: ++ QWARN(QString("Unsupported completion condition %1!").arg(completionCondition).toStdString().c_str()); ++ return false; + } + // add scheduler job + KTRY_CLICK_SUB(scheduler, addToQueueB); +@@ -511,7 +514,8 @@ bool TestEkosMeridianFlipBase::checkRefocusing() + KVERIFY_EMPTY_QUEUE_WITH_TIMEOUT_SUB(m_CaptureHelper->expectedFocusStates, 30000); + // check if focus completion is reached (successful or not) + if (refocus_checked || autofocus_checked) +- KTRY_VERIFY_WITH_TIMEOUT_SUB(m_CaptureHelper->getFocusStatus() == Ekos::FOCUS_COMPLETE || m_CaptureHelper->getFocusStatus() == Ekos::FOCUS_FAILED || ++ KTRY_VERIFY_WITH_TIMEOUT_SUB(m_CaptureHelper->getFocusStatus() == Ekos::FOCUS_COMPLETE ++ || m_CaptureHelper->getFocusStatus() == Ekos::FOCUS_FAILED || + m_CaptureHelper->getFocusStatus() == Ekos::FOCUS_ABORTED, 120000); + // focusing might have suspended guiding + if (m_CaptureHelper->use_guiding) +@@ -554,7 +558,8 @@ bool TestEkosMeridianFlipBase::stopAligning() + // stop alignment + KTRY_GADGET_SUB(Ekos::Manager::Instance()->alignModule(), QPushButton, stopB); + KTRY_CLICK_SUB(Ekos::Manager::Instance()->alignModule(), stopB); +- KTRY_VERIFY_WITH_TIMEOUT_SUB(m_CaptureHelper->getAlignStatus() == Ekos::ALIGN_IDLE || m_CaptureHelper->getAlignStatus() == Ekos::ALIGN_ABORTED || ++ KTRY_VERIFY_WITH_TIMEOUT_SUB(m_CaptureHelper->getAlignStatus() == Ekos::ALIGN_IDLE ++ || m_CaptureHelper->getAlignStatus() == Ekos::ALIGN_ABORTED || + m_CaptureHelper->getAlignStatus() == Ekos::ALIGN_FAILED || m_CaptureHelper->getAlignStatus() == Ekos::ALIGN_COMPLETE, 5000); + // all checks succeeded + return true; +@@ -581,8 +586,10 @@ bool TestEkosMeridianFlipBase::startCapturing() + KWRAP_SUB(KTRY_SWITCH_TO_MODULE_WITH_TIMEOUT(Ekos::Manager::Instance()->captureModule(), 1000)); + + // check if capture is in a stopped state +- KWRAP_SUB(QVERIFY(m_CaptureHelper->getCaptureStatus() == Ekos::CAPTURE_IDLE || m_CaptureHelper->getCaptureStatus() == Ekos::CAPTURE_ABORTED +- || m_CaptureHelper->getCaptureStatus() == Ekos::CAPTURE_SUSPENDED|| m_CaptureHelper->getCaptureStatus() == Ekos::CAPTURE_COMPLETE)); ++ KWRAP_SUB(QVERIFY(m_CaptureHelper->getCaptureStatus() == Ekos::CAPTURE_IDLE ++ || m_CaptureHelper->getCaptureStatus() == Ekos::CAPTURE_ABORTED ++ || m_CaptureHelper->getCaptureStatus() == Ekos::CAPTURE_SUSPENDED ++ || m_CaptureHelper->getCaptureStatus() == Ekos::CAPTURE_COMPLETE)); + + // press start + m_CaptureHelper->expectedCaptureStates.enqueue(Ekos::CAPTURE_CAPTURING); +@@ -599,7 +606,8 @@ bool TestEkosMeridianFlipBase::startCapturing() + bool TestEkosMeridianFlipBase::stopCapturing() + { + // check if capture is in a stopped state +- if (m_CaptureHelper->getCaptureStatus() == Ekos::CAPTURE_IDLE || m_CaptureHelper->getCaptureStatus() == Ekos::CAPTURE_ABORTED || ++ if (m_CaptureHelper->getCaptureStatus() == Ekos::CAPTURE_IDLE ++ || m_CaptureHelper->getCaptureStatus() == Ekos::CAPTURE_ABORTED || + m_CaptureHelper->getCaptureStatus() == Ekos::CAPTURE_COMPLETE) + return true; + +@@ -629,7 +637,8 @@ bool TestEkosMeridianFlipBase::startScheduler() + + // switch to the scheduler module and start + KWRAP_SUB(KTRY_SWITCH_TO_MODULE_WITH_TIMEOUT(scheduler, 1000)); +- KVERIFY_SUB(m_CaptureHelper->getSchedulerStatus() == Ekos::SCHEDULER_IDLE || m_CaptureHelper->getSchedulerStatus() == Ekos::SCHEDULER_ABORTED); ++ KVERIFY_SUB(m_CaptureHelper->getSchedulerStatus() == Ekos::SCHEDULER_IDLE ++ || m_CaptureHelper->getSchedulerStatus() == Ekos::SCHEDULER_ABORTED); + KTRY_CLICK_SUB(scheduler, startB); + + // check mount slew and tracking +@@ -648,7 +657,8 @@ bool TestEkosMeridianFlipBase::stopScheduler() + Ekos::Scheduler *scheduler = Ekos::Manager::Instance()->schedulerModule(); + // switch to the capture module + KWRAP_SUB(KTRY_SWITCH_TO_MODULE_WITH_TIMEOUT(scheduler, 1000)); +- if (m_CaptureHelper->getSchedulerStatus() == Ekos::SCHEDULER_RUNNING || m_CaptureHelper->getSchedulerStatus() == Ekos::SCHEDULER_PAUSED) ++ if (m_CaptureHelper->getSchedulerStatus() == Ekos::SCHEDULER_RUNNING ++ || m_CaptureHelper->getSchedulerStatus() == Ekos::SCHEDULER_PAUSED) + KTRY_CLICK_SUB(scheduler, startB); + // all checks succeeded + return true; +@@ -705,7 +715,8 @@ bool TestEkosMeridianFlipBase::stopFocusing() + KTRY_GADGET_SUB(Ekos::Manager::Instance()->focusModule(), QPushButton, stopFocusB); + if (stopFocusB->isEnabled()) + KTRY_CLICK_SUB(Ekos::Manager::Instance()->focusModule(), stopFocusB); +- KTRY_VERIFY_WITH_TIMEOUT_SUB(m_CaptureHelper->getFocusStatus() == Ekos::FOCUS_IDLE || m_CaptureHelper->getFocusStatus() == Ekos::FOCUS_COMPLETE || ++ KTRY_VERIFY_WITH_TIMEOUT_SUB(m_CaptureHelper->getFocusStatus() == Ekos::FOCUS_IDLE ++ || m_CaptureHelper->getFocusStatus() == Ekos::FOCUS_COMPLETE || + m_CaptureHelper->getFocusStatus() == Ekos::FOCUS_ABORTED || m_CaptureHelper->getFocusStatus() == Ekos::FOCUS_FAILED, 15000); + + // all checks succeeded +diff --git a/kstars/auxiliary/ksutils.cpp b/kstars/auxiliary/ksutils.cpp +index 1b9b53f6a..81fd06134 100644 +--- a/kstars/auxiliary/ksutils.cpp ++++ b/kstars/auxiliary/ksutils.cpp +@@ -1165,6 +1165,17 @@ QString getDefaultPath(const QString &option) + #endif + return prefix + "/bin/solve-field"; + } ++ else if (option == "WatneyBinary") ++ { ++ #if defined(ASTROMETRY_PREFIX) ++ return QString(ASTROMETRY_PREFIX "/bin/watney-solver"); ++ #elif defined(Q_OS_OSX) ++ return "/usr/local/bin/watney-solver"; ++ #elif defined(Q_OS_WIN) ++ return "C:/Program Files/watney-solve-win-x64-1/watney-solve.exe"; ++ #endif ++ return prefix + "/bin/watney-solver"; ++ } + else if (option == "SextractorBinary") + { + #if defined(SEXTRACTOR_PREFIX) +diff --git a/kstars/ekos/align/align.cpp b/kstars/ekos/align/align.cpp +index 859ac6b01..2abcbb663 100644 +--- a/kstars/ekos/align/align.cpp ++++ b/kstars/ekos/align/align.cpp +@@ -1867,7 +1867,7 @@ void Align::startSolving() + + if (solverModeButtonGroup->checkedId() == SOLVER_LOCAL) + { +- if(Options::solverType() != SSolver::SOLVER_ASTAP) //You don't need astrometry index files to use ASTAP ++ if(Options::solverType() != SSolver::SOLVER_ASTAP && Options::solverType() != SSolver::SOLVER_WATNEYASTROMETRY) //You don't need astrometry index files to use ASTAP or Watney + { + bool foundAnIndex = false; + for(QString dataDir : astrometryDataDirs) +@@ -1916,16 +1916,20 @@ void Align::startSolving() + m_StellarSolver->setParameters(m_StellarSolverProfiles.at(Options::solveOptionsProfile())); + + const SSolver::SolverType type = static_cast(m_StellarSolver->property("SolverType").toInt()); +- if(type == SSolver::SOLVER_LOCALASTROMETRY || type == SSolver::SOLVER_ASTAP) ++ if(type == SSolver::SOLVER_LOCALASTROMETRY || type == SSolver::SOLVER_ASTAP || type == SSolver::SOLVER_WATNEYASTROMETRY) + { + QString filename = QDir::tempPath() + QString("/solver%1.fits").arg(QUuid::createUuid().toString().remove( + QRegularExpression("[-{}]"))); + alignView->saveImage(filename); + m_StellarSolver->setProperty("FileToProcess", filename); +- m_StellarSolver->setProperty("SextractorBinaryPath", Options::sextractorBinary()); +- m_StellarSolver->setProperty("SolverPath", Options::astrometrySolverBinary()); +- m_StellarSolver->setProperty("ASTAPBinaryPath", Options::aSTAPExecutable()); +- m_StellarSolver->setProperty("WCSPath", Options::astrometryWCSInfo()); ++ ExternalProgramPaths externalPaths; ++ externalPaths.sextractorBinaryPath = Options::sextractorBinary(); ++ externalPaths.solverPath = Options::astrometrySolverBinary(); ++ externalPaths.astapBinaryPath = Options::aSTAPExecutable(); ++ externalPaths.watneyBinaryPath = Options::watneyBinary(); ++ externalPaths.wcsPath = Options::astrometryWCSInfo(); ++ m_StellarSolver->setExternalFilePaths(externalPaths); ++ + + //No need for a conf file this way. + m_StellarSolver->setProperty("AutoGenerateAstroConfig", true); +@@ -2011,10 +2015,6 @@ void Align::startSolving() + m_StellarSolver->setSSLogLevel(SSolver::LOG_OFF); + } + +- //Unless we decide to load the WCS Coord, let's turn it off. +- //Be sure to set this to true instead if we want WCS from the solve. +- m_StellarSolver->setLoadWCS(false); +- + // Start solving process + m_StellarSolver->start(); + } +@@ -2047,7 +2047,7 @@ void Align::solverComplete() + { + FITSImage::Solution solution = m_StellarSolver->getSolution(); + // Would be better if parity was a bool field instead of a QString with "pos" and "neg" as possible values. +- const bool eastToTheRight = solution.parity == "pos" ? false : true; ++ const bool eastToTheRight = solution.parity == FITSImage::POSITIVE? false : true; + solverFinished(solution.orientation, solution.ra, solution.dec, solution.pixscale, eastToTheRight); + } + } +diff --git a/kstars/ekos/align/opsalign.ui b/kstars/ekos/align/opsalign.ui +index b472917a2..808b05e8c 100644 +--- a/kstars/ekos/align/opsalign.ui ++++ b/kstars/ekos/align/opsalign.ui +@@ -6,7 +6,7 @@ + + 0 + 0 +- 444 ++ 470 + 179 + + +@@ -108,6 +108,11 @@ + Local ASTAP + + ++ ++ ++ Local Watney ++ ++ + + + Online Astrometry +diff --git a/kstars/ekos/align/opsprograms.cpp b/kstars/ekos/align/opsprograms.cpp +index ff76214a5..f0e7e467b 100644 +--- a/kstars/ekos/align/opsprograms.cpp ++++ b/kstars/ekos/align/opsprograms.cpp +@@ -43,37 +43,15 @@ void OpsPrograms::slotApply() + + void OpsPrograms::loadDefaultPaths(int option) + { +- ExternalProgramPaths paths; +- +- switch(option) +- { +- case 0: +- return; +- break; +- case 1: +- paths = StellarSolver::getLinuxDefaultPaths(); +- break; +- case 2: +- paths = StellarSolver::getLinuxInternalPaths(); +- break; +- case 3: +- paths = StellarSolver::getMacHomebrewPaths(); +- break; +- case 4: +- paths = StellarSolver::getWinANSVRPaths(); +- break; +- case 5: +- paths = StellarSolver::getWinCygwinPaths(); +- break; +- default: +- paths = StellarSolver::getLinuxDefaultPaths(); +- break; +- } ++ if(option == 0) ++ return; ++ ExternalProgramPaths paths = StellarSolver::getDefaultExternalPaths((SSolver::ComputerSystemType) (option - 1)); + + kcfg_SextractorBinary->setText(paths.sextractorBinaryPath); + kcfg_AstrometryConfFile->setText(paths.confPath); + kcfg_AstrometrySolverBinary->setText(paths.solverPath); + kcfg_ASTAPExecutable->setText(paths.astapBinaryPath); ++ kcfg_WatneyBinary->setText(paths.watneyBinaryPath); + kcfg_AstrometryWCSInfo->setText(paths.wcsPath); + + defaultPathSelector->setCurrentIndex(0); +diff --git a/kstars/ekos/align/opsprograms.ui b/kstars/ekos/align/opsprograms.ui +index fcf59bcea..032d56af8 100644 +--- a/kstars/ekos/align/opsprograms.ui ++++ b/kstars/ekos/align/opsprograms.ui +@@ -7,7 +7,7 @@ + 0 + 0 + 658 +- 481 ++ 517 + + + +@@ -169,6 +169,32 @@ + + + ++ ++ ++ ++ Watney Solver ++ ++ ++ ++ ++ ++ Watney binary: ++ ++ ++ ++ ++ ++ ++ Astrometry.net solve-field binary ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + +@@ -262,4 +288,4 @@ + + + +- ++ +\ No newline at end of file +diff --git a/kstars/ekos/auxiliary/stellarsolverprofile.cpp b/kstars/ekos/auxiliary/stellarsolverprofile.cpp +index 909ae58ed..7109df6e4 100644 +--- a/kstars/ekos/auxiliary/stellarsolverprofile.cpp ++++ b/kstars/ekos/auxiliary/stellarsolverprofile.cpp +@@ -24,8 +24,8 @@ QList getDefaultFocusOptionsProfiles() + focusDefault.keepNum = 100; + focusDefault.minarea = 20; + focusDefault.maxEllipse = 1.5; +- // JM 2021.10.03: Seems to be a lot more reliable than 2 FWHM +- StellarSolver::createConvFilterFromFWHM(&focusDefault, 1); ++ focusDefault.convFilterType = SSolver::CONV_GAUSSIAN; ++ focusDefault.fwhm = 1; + focusDefault.r_min = 5; + focusDefault.maxSize = 10; + focusDefault.removeBrightest = 10; +@@ -37,7 +37,8 @@ QList getDefaultFocusOptionsProfiles() + stars.listName = "2-AllStars"; + stars.description = i18n("Profile for the source extraction of all the stars in an image."); + stars.maxEllipse = 1.5; +- StellarSolver::createConvFilterFromFWHM(&stars, 1); ++ stars.convFilterType = SSolver::CONV_GAUSSIAN; ++ stars.fwhm = 1; + stars.r_min = 2; + profileList.append(stars); + +@@ -45,7 +46,8 @@ QList getDefaultFocusOptionsProfiles() + smallStars.listName = "3-SmallSizedStars"; + smallStars.description = i18n("Profile optimized for source extraction of smaller stars."); + smallStars.maxEllipse = 1.5; +- StellarSolver::createConvFilterFromFWHM(&smallStars, 1); ++ smallStars.convFilterType = SSolver::CONV_GAUSSIAN; ++ smallStars.fwhm = 1; + smallStars.r_min = 2; + smallStars.maxSize = 5; + smallStars.initialKeep = 500; +@@ -57,7 +59,8 @@ QList getDefaultFocusOptionsProfiles() + mid.description = i18n("Profile optimized for source extraction of medium sized stars."); + mid.maxEllipse = 1.5; + mid.minarea = 20; +- StellarSolver::createConvFilterFromFWHM(&mid, 4); ++ mid.convFilterType = SSolver::CONV_GAUSSIAN; ++ mid.fwhm = 4; + mid.r_min = 5; + mid.removeDimmest = 20; + mid.minSize = 2; +@@ -71,7 +74,8 @@ QList getDefaultFocusOptionsProfiles() + big.description = i18n("Profile optimized for source extraction of larger stars."); + big.maxEllipse = 1.5; + big.minarea = 40; +- StellarSolver::createConvFilterFromFWHM(&big, 8); ++ big.convFilterType = SSolver::CONV_GAUSSIAN; ++ big.fwhm = 8; + big.r_min = 20; + big.minSize = 5; + big.initialKeep = 500; +@@ -101,7 +105,8 @@ QList getDefaultGuideOptionsProfiles() + stars.listName = "2-AllStars"; + stars.description = i18n("Profile for the source extraction of all the stars in an image."); + stars.maxEllipse = 1.5; +- StellarSolver::createConvFilterFromFWHM(&stars, 1); ++ stars.convFilterType = SSolver::CONV_GAUSSIAN; ++ stars.fwhm = 1; + stars.r_min = 2; + profileList.append(stars); + +@@ -109,7 +114,8 @@ QList getDefaultGuideOptionsProfiles() + smallStars.listName = "3-SmallSizedStars"; + smallStars.description = i18n("Profile optimized for source extraction of smaller stars."); + smallStars.maxEllipse = 1.5; +- StellarSolver::createConvFilterFromFWHM(&smallStars, 1); ++ smallStars.convFilterType = SSolver::CONV_GAUSSIAN; ++ smallStars.fwhm = 1; + smallStars.r_min = 2; + smallStars.maxSize = 5; + smallStars.initialKeep = 500; +@@ -121,7 +127,8 @@ QList getDefaultGuideOptionsProfiles() + mid.description = i18n("Profile optimized for source extraction of medium sized stars."); + mid.maxEllipse = 1.5; + mid.minarea = 20; +- StellarSolver::createConvFilterFromFWHM(&mid, 4); ++ mid.convFilterType = SSolver::CONV_GAUSSIAN; ++ mid.fwhm = 4; + mid.r_min = 5; + mid.removeDimmest = 20; + mid.minSize = 2; +@@ -135,7 +142,8 @@ QList getDefaultGuideOptionsProfiles() + big.description = i18n("Profile optimized for source extraction of larger stars."); + big.maxEllipse = 1.5; + big.minarea = 40; +- StellarSolver::createConvFilterFromFWHM(&big, 8); ++ big.convFilterType = SSolver::CONV_GAUSSIAN; ++ big.fwhm = 8; + big.r_min = 20; + big.minSize = 5; + big.initialKeep = 500; +@@ -152,8 +160,8 @@ QList getDefaultAlignOptionsProfiles() + SSolver::Parameters defaultProfile; + defaultProfile.listName = "1-Default"; + defaultProfile.description = i18n("Default profile. Generic and not optimized for any specific purpose."); +- // JM 2021.10.03: Seems to help in cases where solver fails to solve any images. +- StellarSolver::createConvFilterFromFWHM(&defaultProfile, 1); ++ defaultProfile.convFilterType = SSolver::CONV_GAUSSIAN; ++ defaultProfile.fwhm = 1; + profileList.append(defaultProfile); + + SSolver::Parameters fastSolving; +@@ -165,7 +173,8 @@ QList getDefaultAlignOptionsProfiles() + fastSolving.keepNum = 50; + fastSolving.initialKeep = 500; + fastSolving.maxEllipse = 1.5; +- StellarSolver::createConvFilterFromFWHM(&fastSolving, 4); ++ fastSolving.convFilterType = SSolver::CONV_GAUSSIAN; ++ fastSolving.fwhm = 4; + profileList.append(fastSolving); + + SSolver::Parameters parLargeSolving; +@@ -176,7 +185,8 @@ QList getDefaultAlignOptionsProfiles() + parLargeSolving.keepNum = 50; + parLargeSolving.initialKeep = 500; + parLargeSolving.maxEllipse = 1.5; +- StellarSolver::createConvFilterFromFWHM(&parLargeSolving, 4); ++ parLargeSolving.convFilterType = SSolver::CONV_GAUSSIAN; ++ parLargeSolving.fwhm = 4; + profileList.append(parLargeSolving); + + SSolver::Parameters fastSmallSolving; +@@ -187,7 +197,8 @@ QList getDefaultAlignOptionsProfiles() + fastSmallSolving.keepNum = 50; + fastSmallSolving.initialKeep = 500; + fastSmallSolving.maxEllipse = 1.5; +- StellarSolver::createConvFilterFromFWHM(&fastSmallSolving, 4); ++ fastSmallSolving.convFilterType = SSolver::CONV_GAUSSIAN; ++ fastSmallSolving.fwhm = 4; + profileList.append(fastSmallSolving); + + return profileList; +@@ -205,7 +216,8 @@ QList getDefaultHFROptionsProfiles() + + hfrDefault.minarea = 20; + hfrDefault.maxEllipse = 1.5; +- StellarSolver::createConvFilterFromFWHM(&hfrDefault, 2); ++ hfrDefault.convFilterType = SSolver::CONV_GAUSSIAN; ++ hfrDefault.fwhm = 2; + hfrDefault.r_min = 5; + hfrDefault.maxSize = 10; + +@@ -224,7 +236,8 @@ QList getDefaultHFROptionsProfiles() + + big.minarea = 40; + big.maxEllipse = 1.5; +- StellarSolver::createConvFilterFromFWHM(&big, 8); ++ big.convFilterType = SSolver::CONV_GAUSSIAN; ++ big.fwhm = 8; + big.r_min = 20; + big.maxSize = 0; + +@@ -242,7 +255,8 @@ QList getDefaultHFROptionsProfiles() + + most.minarea = 10; + most.maxEllipse = 0; +- StellarSolver::createConvFilterFromFWHM(&most, 1); ++ most.convFilterType = SSolver::CONV_GAUSSIAN; ++ most.fwhm = 1; + most.r_min = 3.5; + most.minSize = 0; + most.maxSize = 0; +diff --git a/kstars/ekos/auxiliary/stellarsolverprofileeditor.cpp b/kstars/ekos/auxiliary/stellarsolverprofileeditor.cpp +index c80b7725a..e33c1da30 100644 +--- a/kstars/ekos/auxiliary/stellarsolverprofileeditor.cpp ++++ b/kstars/ekos/auxiliary/stellarsolverprofileeditor.cpp +@@ -241,14 +241,16 @@ SSolver::Parameters StellarSolverProfileEditor::getSettingsFromUI() + params.kron_fact = kron_fact->text().toDouble(); + params.subpix = subpix->text().toInt() ; + params.r_min = r_min->text().toFloat(); +- //params.inflags + params.magzero = magzero->text().toFloat(); ++ params.threshold_bg_multiple = threshMultiple->text().toFloat(); ++ params.threshold_offset = threshOffset->text().toFloat(); + params.minarea = minarea->text().toFloat(); + params.deblend_thresh = deblend_thresh->text().toInt(); + params.deblend_contrast = deblend_contrast->text().toFloat(); + params.clean = (cleanCheckBox->isChecked()) ? 1 : 0; + params.clean_param = clean_param->text().toDouble(); +- StellarSolver::createConvFilterFromFWHM(¶ms, fwhm->value()); ++ params.convFilterType = (SSolver::ConvFilterType) convFilter->currentIndex(); ++ params.fwhm = fwhm->value(); + + //Star Filter Settings + params.resort = resort->isChecked(); +@@ -289,11 +291,14 @@ void StellarSolverProfileEditor::sendSettingsToUI(SSolver::Parameters a) + r_min->setText(QString::number(a.r_min)); + + magzero->setText(QString::number(a.magzero)); ++ threshMultiple->setText(QString::number(a.threshold_bg_multiple)); ++ threshOffset->setText(QString::number(a.threshold_offset)); + minarea->setText(QString::number(a.minarea)); + deblend_thresh->setText(QString::number(a.deblend_thresh)); + deblend_contrast->setText(QString::number(a.deblend_contrast)); + cleanCheckBox->setChecked(a.clean == 1); + clean_param->setText(QString::number(a.clean_param)); ++ convFilter->setCurrentIndex(a.convFilterType); + fwhm->setValue(a.fwhm); + + //Star Filter Settings +diff --git a/kstars/ekos/auxiliary/stellarsolverprofileeditor.ui b/kstars/ekos/auxiliary/stellarsolverprofileeditor.ui +index 54e475cbd..c5d6ea85f 100644 +--- a/kstars/ekos/auxiliary/stellarsolverprofileeditor.ui ++++ b/kstars/ekos/auxiliary/stellarsolverprofileeditor.ui +@@ -347,7 +347,7 @@ + + 3 + +- ++ + + + The minimum radius for stars for flux calculations. +@@ -357,43 +357,47 @@ + + + +- +- +- +- +- 0 +- 0 +- ++ ++ ++ ++ A variable to store the fwhm in pixels used to generate the convolution filter for star detection. + +- +- <a href = "https://sep.readthedocs.io/en/v1.0.x/api/sep.extract.html" >Extraction Params</a> ++ ++ 1 + +- +- true ++ ++ 10 + + + +- +- +- +- <a href="https://sep.readthedocs.io/en/v1.0.x/api/sep.extract.html">Deblending Params</a> ++ ++ ++ ++ This is the 'zero' magnitude used for setting the magnitude scale for the stars in the image during sextraction. + +- +- true ++ ++ 20 + + + +- +- ++ ++ + +- This is the 'zero' magnitude used for setting the magnitude scale for the stars in the image during sextraction. ++ The percentage of flux a separate peak must have to be considered a separate object. + + +- 20 ++ 1 ++ ++ ++ ++ ++ ++ ++ Min Cont. + + + +- ++ + + + This sets the Kron Factor for use with the kron radius for flux calculations. +@@ -403,47 +407,131 @@ + + + +- +- ++ ++ + +- Min Area ++ Kron Factor + + + +- +- +- +- Attempts to 'clean' the image to remove artifacts caused by bright objects ++ ++ ++ ++ Conv FWHM + ++ ++ ++ ++ + +- Clean? ++ magzero + +- +- true ++ ++ ++ ++ ++ ++ Whether to use the SEP_SUM_ELLIPSE method or the SEP_SUM_CIRCLE method or automatically choose. NOTE: Circle is usually better at the moment + ++ ++ 0 ++ ++ ++ ++ Default ++ ++ ++ ++ ++ Custom ++ ++ ++ ++ ++ Gaussian ++ ++ ++ ++ ++ Mexican Hat ++ ++ ++ ++ ++ Top Hat ++ ++ + + +- +- ++ ++ + +- This is the minimum area in pixels for a star detection, smaller stars are ignored. ++ The number of thresholds the intensity range is divided up into. + + +- 5 ++ 32 + + + +- +- ++ ++ ++ ++ ++ 0 ++ 0 ++ ++ ++ ++ <a href = "https://sep.readthedocs.io/en/v1.0.x/api/sep.extract.html" >Extraction Params</a> ++ ++ ++ true ++ ++ ++ ++ ++ ++ ++ r_min ++ ++ ++ ++ ++ + +- The subpixel sampling factor for star extraction ++ Whether to use the SEP_SUM_ELLIPSE method or the SEP_SUM_CIRCLE method or automatically choose. NOTE: Circle is usually better at the moment ++ ++ ++ 1 + ++ ++ ++ Auto ++ ++ ++ ++ ++ Circle ++ ++ ++ ++ ++ Ellipse ++ ++ ++ ++ ++ ++ + +- 5 ++ <a href="https://sep.readthedocs.io/en/v1.0.x/api/sep.extract.html">Deblending Params</a> ++ ++ ++ true + + + +- ++ + + + Thresh +@@ -466,38 +554,34 @@ + + + +- +- ++ ++ + +- Sub Pix ++ Conv Filter + + + +- +- +- +- The number of thresholds the intensity range is divided up into. +- ++ ++ + +- 32 ++ Shape + + + +- +- +- +- Kron Factor ++ ++ ++ ++ Attempts to 'clean' the image to remove artifacts caused by bright objects + +- +- +- +- + +- magzero ++ Clean? ++ ++ ++ true + + + +- ++ + + + The cleaning parameter +@@ -507,79 +591,71 @@ + *** 295 LINES SKIPPED ***