[neon/backports-noble/stellarsolver-noble/Neon/release] debian/patches: backport to try and fix linking error

Carlos De Maine null at kde.org
Tue Dec 9 22:03:23 GMT 2025


Git commit c79ac4460f0edf2f145a1c61f64bf52e279bf21f by Carlos De Maine.
Committed on 09/12/2025 at 22:03.
Pushed by carlosdem into branch 'Neon/release'.

backport to try and fix linking error

A  +1838 -0    debian/patches/cae12a5917f7d49d792f71b76019074e944f5527.diff
A  +1    -0    debian/patches/series

https://invent.kde.org/neon/backports-noble/stellarsolver-noble/-/commit/c79ac4460f0edf2f145a1c61f64bf52e279bf21f

diff --git a/debian/patches/cae12a5917f7d49d792f71b76019074e944f5527.diff b/debian/patches/cae12a5917f7d49d792f71b76019074e944f5527.diff
new file mode 100644
index 0000000..8f1f371
--- /dev/null
+++ b/debian/patches/cae12a5917f7d49d792f71b76019074e944f5527.diff
@@ -0,0 +1,1838 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 29b29421..c989e984 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -6,6 +6,10 @@ if(APPLE)
+ endif(APPLE)
+ 
+ #cmake_policy(SET CMP0003 NEW)
++# Hide all symbols by default
++set(CMAKE_CXX_VISIBILITY_PRESET hidden)
++set(CMAKE_VISIBILITY_INLINES_HIDDEN YES)
++add_compile_options(-fvisibility=hidden $<$<COMPILE_LANGUAGE:CXX>:-fvisibility-inlines-hidden>)
+ 
+ # Timestamp build
+ string(TIMESTAMP StellarSolver_BUILD_TS UTC)
+@@ -302,6 +306,7 @@ set(PKGCONFIG_INSTALL_PREFIX "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
+ 
+ install(FILES
+     ${CMAKE_CURRENT_SOURCE_DIR}/stellarsolver/stellarsolver.h
++    ${CMAKE_CURRENT_SOURCE_DIR}/stellarsolver/stellarsolver_export.h
+     ${CMAKE_CURRENT_SOURCE_DIR}/stellarsolver/structuredefinitions.h
+     ${CMAKE_CURRENT_SOURCE_DIR}/stellarsolver/extractorsolver.h
+     ${CMAKE_CURRENT_SOURCE_DIR}/stellarsolver/parameters.h
+diff --git a/package.xml b/package.xml
+new file mode 100644
+index 00000000..fddb0526
+--- /dev/null
++++ b/package.xml
+@@ -0,0 +1,8 @@
++<package format="3">
++    <name>stellarsolver</name>
++    <version>1.0.0</version>
++    <description>StellarSolver built as part of ROS2 workspace</description>
++    <maintainer email="you at example.com">You</maintainer>
++    <license>LGPL-3.0</license>
++    <buildtool_depend>ament_cmake</buildtool_depend>
++</package>
+\ No newline at end of file
+diff --git a/stellarsolver/astrometry/include/astrometry/starutil.h b/stellarsolver/astrometry/include/astrometry/starutil.h
+index fc1b2690..8875a02a 100644
+--- a/stellarsolver/astrometry/include/astrometry/starutil.h
++++ b/stellarsolver/astrometry/include/astrometry/starutil.h
+@@ -7,6 +7,7 @@
+ #define STARUTIL_H
+ 
+ #include <math.h>
++#include "stellarsolver_export.h"
+ #include "astrometry/an-bool.h"
+ #include "astrometry/keywords.h"
+ 
+@@ -124,7 +125,7 @@ double dec2mercy(double dec);
+ //# Modified by Robert Lancaster for the StellarSolver Internal Library
+ // Moved ra2hms to header file for easier Windows compilation
+ // RA in degrees to H:M:S
+-void ra2hms(double ra, int* h, int* m, double* s);
++STELLARSOLVER_API void ra2hms(double ra, int* h, int* m, double* s);
+ /**
+ inline void ra2hms(double ra, int* h, int* m, double* s) {
+     double rem;
+@@ -146,13 +147,13 @@ inline void ra2hms(double ra, int* h, int* m, double* s) {
+ }**/
+ 
+ // Dec in degrees to D:M:S
+-void dec2dms(double dec, int* sign, int* d, int* m, double* s);
++STELLARSOLVER_API void dec2dms(double dec, int* sign, int* d, int* m, double* s);
+ 
+ double hms2ra(int h, int m, double s);
+ double dms2dec(int sgn, int d, int m, double s);
+ 
+-void ra2hmsstring(double ra, char* str);
+-void dec2dmsstring(double dec, char* str);
++STELLARSOLVER_API void ra2hmsstring(double ra, char* str);
++STELLARSOLVER_API void dec2dmsstring(double dec, char* str);
+ 
+ void project_hammer_aitoff_x(double x, double y, double z, double* projx, double* projy);
+ 
+diff --git a/stellarsolver/extractorsolver.h b/stellarsolver/extractorsolver.h
+index e1ccce00..2de5833a 100644
+--- a/stellarsolver/extractorsolver.h
++++ b/stellarsolver/extractorsolver.h
+@@ -14,13 +14,14 @@
+ #include <QVector>
+ 
+ //Project Includes
++#include "stellarsolver_export.h"
+ #include "structuredefinitions.h"
+ #include "parameters.h"
+ #include "wcsdata.h"
+ 
+ using namespace SSolver;
+ 
+-class ExtractorSolver : public QThread
++class STELLARSOLVER_API ExtractorSolver : public QThread
+ {
+         Q_OBJECT
+     public:
+diff --git a/stellarsolver/parameters.h b/stellarsolver/parameters.h
+index 01fce3b7..35ab2e61 100644
+--- a/stellarsolver/parameters.h
++++ b/stellarsolver/parameters.h
+@@ -4,6 +4,7 @@
+ #include <QObject>
+ 
+ //Project Includes
++#include "stellarsolver_export.h"
+ #include "structuredefinitions.h"
+ 
+ namespace SSolver
+@@ -94,7 +95,7 @@ static QString getConvFilterString(SSolver::ConvFilterType type)
+ 
+ //This is a structure to hold the paths to the external programs for solving.
+ //This makes the paths easier to access and set
+-typedef struct
++typedef struct STELLARSOLVER_API ExternalProgramPaths
+ {
+     QString confPath;               //Path to the Astrometry Config File
+     QString sextractorBinaryPath;   //Path to the SExtractor Program binary
+@@ -304,7 +305,7 @@ static QString getLogLevelString(SSolver::logging_level logLevel)
+ //The values here are the defaults unless they get changed.
+ //If you are fine with those defaults, you don't need to set any of them.
+ 
+-class Parameters
++class STELLARSOLVER_API Parameters
+ {
+     public:
+ 
+diff --git a/stellarsolver/stellarsolver.h b/stellarsolver/stellarsolver.h
+index db9e3c4e..568c6853 100644
+--- a/stellarsolver/stellarsolver.h
++++ b/stellarsolver/stellarsolver.h
+@@ -7,783 +7,852 @@
+ */
+ #pragma once
+ 
+-//Includes for this project
++// Includes for this project
+ #include "extractorsolver.h"
++#include "stellarsolver_export.h"
+ #include "structuredefinitions.h"
+ #include "wcsdata.h"
+ 
+ #include "parameters.h"
+ #include "version.h"
+ 
+-//QT Includes
++// QT Includes
+ #include <QDir>
+-#include <QThread>
+ #include <QMap>
++#include <QPointer>
++#include <QRect>
++#include <QThread>
+ #include <QVariant>
+ #include <QVector>
+-#include <QRect>
+-#include <QPointer>
+ 
+ using namespace SSolver;
+ 
+-class StellarSolver : public QObject
++class STELLARSOLVER_API StellarSolver : public QObject
+ {
+-        Q_OBJECT
+-        Q_PROPERTY(QString BasePath MEMBER m_BasePath)
+-        Q_PROPERTY(QString FileToProcess MEMBER m_FileToProcess)
+-        Q_PROPERTY(QString AstrometryAPIKey MEMBER m_AstrometryAPIKey)
+-        Q_PROPERTY(QString AstrometryAPIURL MEMBER m_AstrometryAPIURL)
+-        Q_PROPERTY(QString LogFileName MEMBER m_LogFileName)
+-        Q_PROPERTY(bool UsePosition MEMBER m_UsePosition)
+-        Q_PROPERTY(bool UseScale MEMBER m_UseScale)
+-        Q_PROPERTY(bool AutoGenerateAstroConfig MEMBER m_AutoGenerateAstroConfig)
+-        Q_PROPERTY(bool CleanupTemporaryFiles MEMBER m_CleanupTemporaryFiles)
+-        Q_PROPERTY(bool OnlySendFITSFiles MEMBER m_OnlySendFITSFiles)
+-        Q_PROPERTY(bool LogToFile MEMBER m_LogToFile)
+-        Q_PROPERTY(SolverType SolverType MEMBER m_SolverType)
+-        Q_PROPERTY(ProcessType ProcessType MEMBER m_ProcessType)
+-        Q_PROPERTY(ExtractorType ExtractorType MEMBER m_ExtractorType)
+-
+-    public:
+-        /**
+-         * @brief StellarSolver This constructor makes a StellarSolver without any image or information
+-         * @param parent The parent of this StellarSolver, allows it to be deleted with its parent, defaults to nullptr
+-         */
+-        explicit StellarSolver(QObject *parent = nullptr);
+-
+-         /**
+-         * @brief StellarSolver This constructor makes a StellarSolver with just the image information
+-         * @param imagestats Information about the imagebuffer provided
+-         * @param imageBuffer The imagebuffer to be processed
+-         * @param parent The parent of this StellarSolver, allows it to be deleted with its parent, defaults to nullptr
+-         */
+-        explicit StellarSolver(const FITSImage::Statistic &imagestats,  uint8_t const *imageBuffer, QObject *parent = nullptr);
+-
+-        /**
+-         * @brief StellarSolver This constructor makes a StellarSolver with the ProcessType included
+-         * @param type The type of process you are planning to perform on the image
+-         * @param imagestats Information about the imagebuffer provided
+-         * @param imageBuffer The imagebuffer to be processed
+-         * @param parent The parent of this StellarSolver, allows it to be deleted with its parent, defaults to nullptr
+-         */
+-        explicit StellarSolver(ProcessType type, const FITSImage::Statistic &imagestats, uint8_t const *imageBuffer, QObject *parent = nullptr);
+-
+-        //This deletes the StellarSolver
+-        ~StellarSolver();
+-
+-        /**
+-         * @brief loadNewImageBuffer loads a new image buffer for StellarSolver to process
+-         * @param imagestats Information about the imagebuffer provided
+-         * @param imageBuffer The imagebuffer to be processed
+-         * @return whether or not it succesfully loaded a new image.  It will not be successful if you try to load a null image buffer or if a process is running.
+-         */
+-        bool loadNewImageBuffer(const FITSImage::Statistic &imagestats,  uint8_t const *imageBuffer);
+-
+-        /**
+-         * @brief getDefaultExternalPaths gets the default external program paths appropriate for the selected Computer System
+-         * @param system is the selected system setup
+-         * @return The appropriate ExernalProgramPaths Object
+-         */
+-        static ExternalProgramPaths getDefaultExternalPaths(ComputerSystemType system);
+-
+-        /**
+-         * @brief getDefaultExternalPaths gets the default external program paths appropriate for the current Computer System
+-         * @param system is the selected system setup
+-         * @return The appropriate ExernalProgramPaths Object
+-         */
+-        static ExternalProgramPaths getDefaultExternalPaths();
+-
+-
+-        // Notes for the function below:
+-        // Return the full path to index files to use when solving.
+-        // The input is a list of directory names, and index and healpix constraints.
+-        // If indexToUse and healpixToUse are -1, then return all the .fit or .fits
+-        // files in the directories. If indexToUse >= 0, then constrain the list to
+-        // just those of the correct index. If healpixToUse is also >= 0 then
+-        // further constrain the list to correct healpix. It is assumed the index
+-        // filename format is index-$INDEX.fit or .fits, or index-$INDEX-$HH.fit or
+-        // .fits where $HH is a 2-character healpix number, e.g. index-4205-03.fits.
+-
+-        /**
+-         * @brief getIndexFiles This lets you get a list of paths to index files to pass to astrometry instead of letting it automatically search.
+-         * @param directoryList This is the list of directory names to search for index files
+-         * @param indexToUse If you know which index series should solve it, this lets you constrain the list to that index series.
+-         * @param healpixToUse If you further know which healpix to use, this lets you constrain to just that index file
+-         * @return The list of index files to use
+-         */
+-        static QStringList getIndexFiles(const QStringList &directoryList, int indexToUse = -1, int healpixToUse = -1);
+-  
+-        /**
+-         * @brief getCommandString gets the processType as a string explaining the command StellarSolver is Running
+-         * @return The details of what StellarSolver is doing.
+-         */
+-        QString getCommandString()
+-        {
+-            return SSolver::getCommandString(m_ProcessType, m_ExtractorType, m_SolverType);
+-        }
+-
+-        /**
+-         * @brief getScaleUnitString gets a string for the scale units used in the scale for plate solving
+-         * @return The string for the scale units used.
+-         */
+-        QString getScaleUnitString()
+-        {
+-            return SSolver::getScaleUnitString(m_ScaleUnit);
+-        }
+-
+-        /**
+-         * @brief getShapeString gets a string for the Star Extractor setting for calculating Flux using ellipses or circles
+-         * @return The name of the shape
+-         */
+-        QString getShapeString()
+-        {
+-            return SSolver::getShapeString(params.apertureShape);
+-        }
+-
+-        /**
+-         * @brief getConvFilterString gets a string for the name of the Convolution Filter used in Star Extraction
+-         * @return The name of the Convolution Filter
+-         */
+-        QString getConvFilterString()
+-        {
+-            return SSolver::getConvFilterString(params.convFilterType);
+-        }
+-
+-        /**
+-         * @brief getMultiAlgoString gets a string for which algorithm we are using to solve in parallel threads
+-         * @return The name of the parallel thread solving algorithm
+-         */
+-        QString getMultiAlgoString()
+-        {
+-            return SSolver::getMultiAlgoString(params.multiAlgorithm);
+-        }
+-
+-        /**
+-         * @brief getLogLevelString gets a string for the current Astrometry Logging Level we are using
+-         * @return The name of the current logging level
+-         */
+-        QString getLogLevelString()
+-        {
+-            return SSolver::getLogLevelString(m_AstrometryLogLevel);
+-        }
+-
+-        /**
+-         * @brief getColorChannel Returns which color channel is being used for Star Extraction and Solving in an RGB image
+-         * @return The Color Channel in use
+-         */
+-        FITSImage::ColorChannel getColorChannel()
+-        {
+-            return (FITSImage::ColorChannel) m_ColorChannel;
+-        }
+-
+-        /**
+-         * @brief getVersion gets the StellarSolver Version String
+-         * @return The version string
+-         */
+-        static QString getVersion()
+-        {
+-            return QString("StellarSolver Library Version: %1, build: %2").arg(StellarSolver_VERSION).arg(StellarSolver_BUILD_TS);
+-        }
+-
+-        /**
+-         * @brief getVersionNumber gets the StellarSolver Version Number
+-         * @return The version number
+-         */
+-        static QString getVersionNumber()
+-        {
+-            return StellarSolver_VERSION;
+-        }
+-
+-        //STELLARSOLVER METHODS
+-        //The public methods here are for you to start, stop, setup, and get results from the StellarSolver
+-
+-        //These are the most important methods that you can use for the StellarSolver
+-
+-        /**
+-         * @brief extract Performs Star Extraction on the image.  This is performed synchronously and blocks the calling thread until the finished signal is emitted.
+-         * @param calculateHFR If true, it will also calculated Half-Flux Radius for each detected star. HFR calculations can be very CPU-intensive.
+-         * @param frame If set, it will only extract stars within this rectangular region of the image.
+-         * @return A boolean that reports whether it was successful, true means success.
+-         */
+-        bool extract(bool calculateHFR = false, QRect frame = QRect());
+-
+-        /**
+-         * @brief solve Plate Solves the image.  This is performed synchronously and blocks the calling thread until the finished signal is emitted.
+-         * @return A boolean that reports whether it was successful, true means success.
+-         */
+-        bool solve();
+-
+-        /**
+-         * @brief start Starts a Star Extraction or Plate Solving proccess.  The process is performed asynchronously.  The calling program should then wait for the ready or finished signal.
+-         */
+-        void start();
+-
+-        /**
+-         * @brief abort will abort the Star Extraction or Plate Solving process.  For external programs it runs the kill command.
+-         */
+-        void abort();
+-
+-        /**
+-         * @brief abort will abort the Star Extraction or Plate Solving process and wait synchronously till that is done.
+-         */
+-        void abortAndWait();
+-
+-        /**
+-         * @brief setParameters sets the Parameters for the StellarSolver based on a Parameters object you set up.
+-         * @param parameters The Parameters object
+-         */
+-        void setParameters(const Parameters &parameters)
+-        {
+-            params = parameters;
+-        };
+-
+-        /**
+-         * @brief setParameterProfile sets the Parameters for the StellarSolver based on a selection of a built in parameters profile.
+-         * @param profile The selected built in profile
+-         */
+-        void setParameterProfile(SSolver::Parameters::ParametersProfile profile);
+-
+-        /**
+-         * @brief setExternalFilePaths sets the external file paths for the external programs
+-         * @param paths are the paths to set
+-         */
+-        void setExternalFilePaths(const ExternalProgramPaths &paths)
+-        {
+-            m_ExternalPaths = paths;
+-        }
+-
+-        /**
+-         * @brief setIndexFolderPaths Sets the IndexFolderPaths to automatically search for index files.
+-         * @param indexPaths A QStringList containing the list of folders to search.
+-         */
+-        void setIndexFolderPaths(const QStringList &indexPaths)
+-        {
+-            indexFolderPaths = indexPaths;
+-        };
+-
+-        /**
+-         * @brief setIndexFilePaths Sets the IndexFilePaths variable to a list of index file paths to use.
+-         * @param indexFilePaths A QStringList containing the list of index file paths.
+-         */
+-        void setIndexFilePaths(QStringList indexFilePaths)
+-        {
+-            m_IndexFilePaths = indexFilePaths;
+-        };
+-
+-        /**
+-         * @brief clearIndexFileAndFolderPaths Clears both the Index File paths and Index Folder paths in case they were set before.
+-         */
+-        void clearIndexFileAndFolderPaths()
+-        {
+-            m_IndexFilePaths.clear();
+-            indexFolderPaths.clear();
+-        }
+-
+-        /**
+-         * @brief setSearchScale will set the Search Scale range to speed up the solver based on the ScaleUnits QString
+-         * @param fov_low The low end of the search range in the specified units
+-         * @param fov_high The high end of the search range in the specified units
+-         * @param scaleUnits The specified units for the range.
+-         */
+-        void setSearchScale(double fov_low, double fov_high, const QString &scaleUnits);
+-
+-        /**
+-         * @brief setSearchScale will set the Search Scale range to speed up the solver based on the ScaleUnits enum
+-         * @param fov_low The low end of the search range in the specified units
+-         * @param fov_high The high end of the search range in the specified units
+-         * @param units The specified units for the range.
+-         */
+-        void setSearchScale(double fov_low, double fov_high, ScaleUnits units);
+-
+-        /**
+-         * @brief setSearchPositionRaDec sets the search RA/DEC/Radius to speed up the solver when plate solving
+-         * @param ra The Right Ascension in decimal hours
+-         * @param dec The Declination in decimal degrees
+-         */
+-        void setSearchPositionRaDec(double ra, double dec);
+-
+-        /**
+-         * @brief setSearchPositionInDegrees sets the search RA/DEC/Radius to speed up the solver when plate solving
+-         * @param ra The Right Ascension in decimal degrees
+-         * @param dec The Declination in decimal degrees
+-         */
+-        void setSearchPositionInDegrees(double ra, double dec);
+-
+-        /**
+-         * @brief clearSearchPosition turns off the usage of the Search Position if it was set previously
+-         */
+-        void clearSearchPosition()
+-        {
+-            m_UsePosition = false;
+-        }
+-
+-        /**
+-         * @brief clearSearchScale turns off the usage of the Search Scale if it was set previously
+-         */
+-        void clearSearchScale()
+-        {
+-            m_UseScale = false;
+-        }
+-
+-        /**
+-         * @brief setLogLevel sets the astrometry logging level
+-         * @param level The level of logging
+-         */
+-        void setLogLevel(logging_level level)
+-        {
+-            m_AstrometryLogLevel = level;
+-        };
+-
+-        /**
+-         * @brief setSSLogLevel sets the logging level for StellarSolver
+-         * @param level The level of logging
+-         */
+-        void setSSLogLevel(SSolverLogLevel level)
+-        {
+-            m_SSLogLevel = level;
+-        };
+-
+-        /**
+-         * @brief setConvolutionFilter lets you set up your own custom QVector convolution filter
+-         * @param filter the QVector of float values that is the convolution filter
+-         */
+-        void setConvolutionFilter(const QVector<float> &filter)
+-        {
+-            params.convFilterType = SSolver::CONV_CUSTOM;
+-            convFilter = filter;
+-        }
+-
+-        /**
+-         * @brief generateConvFilter can be used to generate a Convolution Filter based on the selected parameters
+-         * @param filter The selected Convolution Filter type
+-         * @param fwhm The fwhm of the filter in pixels
+-         * @return The QVector of float values that is the Convolution Filter
+-         */
+-        static QVector<float> generateConvFilter(SSolver::ConvFilterType filter, double fwhm);
+-
+-        /**
+-         * @brief getBuiltInProfiles gets the built in Parameter options profiles
+-         * @return The QList of Parameter Options Profiles
+-         */
+-        static QList<Parameters> getBuiltInProfiles();
+-
+-        /**
+-         * @brief loadSavedOptionsProfiles loads saved Parameter Options Profiles from a file on the computer
+-         * @param savedOptionsProfiles The file path where the profiles are saved
+-         * @return The QList full of Parameter Options Profiles
+-         */
+-        static QList<SSolver::Parameters> loadSavedOptionsProfiles(const QString &savedOptionsProfiles);
+-
+-        /**
+-         * @brief getDefaultIndexFolderPaths gets the default astrometry Index folder paths for the Operating System
+-         * @return A QStringList full of folder paths to search for index files
+-         */
+-        static QStringList getDefaultIndexFolderPaths();
+-
+-
+-        //Accessor Method for external classes
+-        /**
+-         * @brief getNumStarsFound gets the number of stars found in the star extraction
+-         * @return The number of stars found
+-         */
+-        int getNumStarsFound() const
+-        {
+-            return numStars;
+-        }
+-        /**
+-         * @brief getStarList gets the list of stars found during star extraction
+-         * @return A QList full of stars and their properties
+-         */
+-        const QList<FITSImage::Star> &getStarList() const
+-        {
+-            return m_ExtractorStars;
+-        }
+-
+-        /**
+-         * @brief getStarListFromSolve gets the list of stars used to plate solve the image
+-         * @return A QList full of stars and their properties
+-         */
+-        const QList<FITSImage::Star> &getStarListFromSolve() const
+-        {
+-            return m_SolverStars;
+-        }
+-
+-        /**
+-         * @brief getBackground gets information about the image background found during star exraction
+-         * @return The background information
+-         */
+-        const FITSImage::Background &getBackground() const
+-        {
+-            return background;
+-        }
+-
+-        /**
+-         * @brief getSolution gets the Solution information from the latest plate solve
+-         * @return The Solution information
+-         */
+-        const FITSImage::Solution &getSolution() const
+-        {
+-            return solution;
+-        }
+-
+-        /**
+-         * @brief getSolutionIndexNumber gets the astrometry index file number used to solve the latest plate solve
+-         * @return The index number
+-         */
+-        short getSolutionIndexNumber()
+-        {
+-            return solutionIndexNumber;
+-        };
+-
+-        /**
+-         * @brief getSolutionHealpix gets the healpix identifying which image in the index series solved the image in the latest plate solve
+-         * @return The healpix number
+-         */
+-        short getSolutionHealpix()
+-        {
+-            return solutionHealpix;
+-        };
+-
+-        /**
+-         * @brief extractionDone Whether or not star extraction has been completed
+-         * @return true means the star extraction is done
+-         */
+-        bool extractionDone() const
+-        {
+-            return m_HasExtracted;
+-        }
+-        /**
+-         * @brief solvingDone Whether or not plate solving has been completed
+-         * @return true means the plate solving is done
+-         */
+-        bool solvingDone() const
+-        {
+-            return m_HasSolved;
+-        }
+-
+-        /**
+-         * @brief failed Whether or not the Star Extraction or Plate Solving has failed
+-         * @return true means that it failed
+-         */
+-        bool failed() const
+-        {
+-            return m_HasFailed;
+-        }
+-
+-        /**
+-         * @brief hasWCSData gets whether or not WCS Data has been retrieved for the image after plate solving
+-         * @return true means we have WCS data
+-         */
+-        bool hasWCSData() const
+-        {
+-            return hasWCS;
+-        };
+-
+-        /**
+-         * @brief getWCSData returns a copy of the WCS Data Object that contains either internal or external WCS data and can perform WCS calculations on Stars and Images
+-         * @return the WCSData Object
+-         */
+-        WCSData getWCSData()
+-        {
+-            return wcsData;
+-        }
+-
+-        /**
+-         * @brief getNumThreads gets the number of ExtractorSolvers used to plate solve the image
+-         * @return the number of solvers
+-         */
+-        int getNumThreads() const
+-        {
+-            if(parallelSolvers.size() == 0) return 1;
+-            else return parallelSolvers.size();
+-        }
+-
+-        /**
+-         * @brief getCurrentParameters gets a Parameters object containing the current Options Profile
+-         * @return The current parameters
+-         */
+-        const Parameters &getCurrentParameters()
+-        {
+-            return params;
+-        }
+-
+-        /**
+-         * @brief isCalculatingHFR returns whether or not the star extraction is also doing HFR
+-         * @return true means HFR is being done too
+-         */
+-        bool isCalculatingHFR()
+-        {
+-            return m_CalculateHFR;
+-        }
+-
+-        /**
+-         * @brief setUseSubframe sets up a subframe for star extraction
+-         * @param frame The QRect that represents the subframe in the image
+-         */
+-        void setUseSubframe(QRect frame);
+-
+-        /**
+-         * @brief clearSubFrame removes the subframe so that star extraction does the whole image.
+-         */
+-        void clearSubFrame()
+-        {
+-            useSubframe = false;
+-            m_Subframe = QRect(0, 0, m_Statistics.width, m_Statistics.height);
+-        };
+-
+-        /**
+-         * @brief setColorChannel allows you to choose which color channel to use for Star Extraction and Solving in an RGB Image
+-         * @param channel The ColorChannel to use
+-         */
+-        void setColorChannel(FITSImage::ColorChannel channel)
+-        {
+-            m_ColorChannel = channel;
+-        };
+-
+-        /**
+-         * @brief setColorChannel allows you to choose which color channel to use for Star Extraction and Solving in an RGB Image
+-         * @param channel The int of the ColorChannel to use
+-         */
+-        void setColorChannel(int channel)
+-        {
+-            m_ColorChannel = (FITSImage::ColorChannel) channel;
+-        };
+-
+-        /**
+-         * @brief isRunning returns whether or not a process is currently running
+-         * @return true means it is running
+-         */
+-        bool isRunning() const;
+-
+-        /**
+-         * @brief raString will generate a nicely formatted QString for the Right Ascension
+-         * @param ra The ra in decimal hours
+-         * @return A QString for the Right Ascension
+-         */
+-        static QString raString(double ra);
+-
+-        /**
+-         * @brief decString will generate a nicely formatted QString for the Declination
+-         * @param dec The dec in decimal degrees
+-         * @return A QString for the Declination
+-         */
+-        static QString decString(double dec);
+-
+-        /**
+-         * @brief pixelToWCS converts the image X, Y Pixel coordinates to RA, DEC sky coordinates using the WCS data
+-         * @param pixelPoint The X, Y coordinate in pixels
+-         * @param skyPoint The RA, DEC coordinates
+-         * @return A boolean to say whether it succeeded, true means it did
+-         */
+-        bool pixelToWCS(const QPointF &pixelPoint, FITSImage::wcs_point &skyPoint);
+-
+-        /**
+-         * @brief wcsToPixel converts the RA, DEC sky coordinates to image X, Y Pixel coordinates using the WCS data
+-         * @param skyPoint The RA, DEC coordinates
+-         * @param pixelPoint The X, Y coordinate in pixels
+-         * @return A boolean to say whether it succeeded, true means it did
+-         */
+-        bool wcsToPixel(const FITSImage::wcs_point &skyPoint, QPointF &pixelPoint);
+-
+-
+-    public slots:
+-        /**
+-         * @brief processFinished slot gets called when a Star Extraction or a Plate Solve finishes.
+-         * @param code Whether the process has failed or not.  0 means success.
+-         */
+-        void processFinished(int code);
+-
+-        /**
+-         * @brief finishParallelSolve slot gets called when a Parallel Plate Solve finishes.
+-         * @param code Whether the process has failed or not.  0 means success.
+-         */
+-        void finishParallelSolve(int success);
+-
+-    private:
+-
+-   // Useful state information for the StellarSolver
+-        bool m_HasExtracted {false};        // This boolean is set when the star extraction is done
+-        bool m_HasSolved {false};           // This boolean is set when the solving is done
+-        bool m_HasFailed {false};           // This boolean is set when a process has failed
+-        bool hasWCS {false};                // This boolean gets set if the StellarSolver has WCS data to retrieve
+-        bool m_isRunning {false};           // Whether or not the StellarSolver is currently running
+-
+-   //StellarSolver Options
+-
+-        // Primary Options for StellarSolver
+-        ProcessType m_ProcessType { EXTRACT };                  // This defines the type of process to perform.
+-        ExtractorType m_ExtractorType { EXTRACTOR_INTERNAL };   // This is the type of star extractor to use.
+-        SolverType m_SolverType {SOLVER_STELLARSOLVER};         // This is the type of solver to use.
+-
+-        // External Process Options
+-        QString m_FileToProcess;                // The file that is being processed.
+-        bool m_CleanupTemporaryFiles {true};    // Whether or not to delete the temp files when finished
+-        bool m_AutoGenerateAstroConfig {true};  // Whether or not to generate the astrometry.cfg file. This is preferred so that it sends all the options requested.
+-        bool m_OnlySendFITSFiles {true};        // This is sometimes needed if the external solvers can't handle other file types
+-        ExternalProgramPaths m_ExternalPaths;   // System File Paths to external programs and files
+-
+-        // Index File Options
+-        QStringList indexFolderPaths;           // This is the list of folder paths that the solver will use to search for index files
+-        QStringList m_IndexFilePaths;           // This is an alternative to the indexFolderPaths variable.  We can just load individual index files instead of searching for them
+-
+-        // Online Options
+-        QString m_AstrometryAPIKey;
+-        QString m_AstrometryAPIURL;
+-
+-        // HFR Options
+-        bool m_CalculateHFR {false};          // Whether or not the HFR of the image should be calculated using sep_flux_radius.  Don't do it unless you need HFR
+-
+-        // Subframing Options
+-        bool useSubframe {false};
+-        QRect m_Subframe;
+-
+-        // This determines which color channel in an RGB image should be used for SEP
+-        // By Default we should use green since most telescopes are best color corrected for Green
+-        int m_ColorChannel = FITSImage::GREEN;
+-
+-        // The currently set parameters for StellarSolver
+-        Parameters params;
+-
+-        // This is the Convolution Filter used by the Source Extractor
+-        QVector<float> convFilter = {1, 2, 1,
+-                                     2, 4, 2,
+-                                     1, 2, 1
+-                                    };
+-
+-        // Astrometry Scale Parameters, These are not saved parameters and change for each image, use the methods to set them
+-        bool m_UseScale {false};                // Whether or not to use the image scale parameters
+-        double m_ScaleLow {0};                  // Lower bound of image scale estimate
+-        double m_ScaleHigh {0};                 // Upper bound of image scale estimate
+-        ScaleUnits m_ScaleUnit {ARCMIN_WIDTH};  // In what units are the lower and upper bounds?
+-
+-        // Astrometry Position Parameters, These are not saved parameters and change for each image, use the methods to set them
+-        bool m_UsePosition = false;             // Whether or not to use initial information about the position
+-        double m_SearchRA = HUGE_VAL;           // RA of field center for search, format: decimal degrees
+-        double m_SearchDE = HUGE_VAL;           // DEC of field center for search, format: decimal degrees
+-
+-    // StellarSolver Variables
+-
+-        FITSImage::Statistic m_Statistics;                  // This is information about the image
+-        const uint8_t *m_ImageBuffer { nullptr };           // The generic data buffer containing the image data
+-        QList<ExtractorSolver*> parallelSolvers;            // This is the list of parallel ExtractorSolvers when solving in parallel
+-        QScopedPointer<ExtractorSolver> m_ExtractorSolver;  // This is the single ExtractorSolver used when not working in parallel
+-        WCSData wcsData;                    // This is the WCS information from the last solve.
+-        int m_ParallelSolversFinishedCount {0};             // This is the number of parallel solvers that are done.
+-
+-    // StellarSolver Results Information
+-
+-        FITSImage::Background background;           // This is a report on the background levels found during star extraction
+-        QList<FITSImage::Star> m_ExtractorStars;    // This is the list of stars that get extracted from the image
+-        QList<FITSImage::Star> m_SolverStars;       // This is the list of stars that were extracted for the last successful solve
+-        int numStars = 0;                           // The number of stars found in the last operation
+-        FITSImage::Solution solution;               // This is the solution that comes back from the Solver
+-        short solutionIndexNumber = -1;             // This is the index number of the index used to solve the image.
+-        short solutionHealpix = -1;                 // This is the healpix of the index used to solve the image.
+-
+-    // Logging Settings for Astrometry
+-        bool m_LogToFile {false};                       //This determines whether or not to save the output from Astrometry.net to a file
+-        QString m_LogFileName;                          //This is the path to the log file that it will save.
+-        logging_level m_AstrometryLogLevel {LOG_NONE};  //This is the level of astrometry logging.  Beware, setting this too high can severely affect performance
+-        SSolverLogLevel m_SSLogLevel {LOG_NORMAL};      //This is the level for the StellarSolver Logging
+-
+-    // These are for creating temporary files
+-        //This is the base name used for all temporary files.  It uses a random name based on the type of solver/star extractor.
+-        QString m_BaseName;
+-        //This is the path used for saving any temporary files.  They are by default saved to the default temp directory, you can change it if you want to.
+-        QString m_BasePath {QDir::tempPath()};
+-
+-    // StellarSolver Private Methods
+-        /**
+-         * @brief registerMetaTypes registers the meta types so they can be used in functions
+-         */
+-        void registerMetaTypes();
+-
+-        /**
+-         * @brief parallelSolversAreRunning returns whether the parallel solvers are currently running
+-         * @return true if they are running
+-         */
+-        bool parallelSolversAreRunning() const;
+-
+-        /**
+-         * @brief whichSolver gets the index of this particular solver in the Parallel Solvers list
+-         * @param solver is which solver to check the index of
+-         * @return an int representing its position
+-         */
+-        int whichSolver(ExtractorSolver *solver);
+-
+-        /**
+-         * @brief snr gets the signal to noise ratio for a star with the specified background
+-         * @param background The specified background object which may have come from star extraction
+-         * @param star The specified star
+-         * @param gain The gain used in the calculation
+-         * @return The snr as a double
+-         */
+-        static double snr(const FITSImage::Background &background,
+-                          const FITSImage::Star &star, double gain = 0.5);
+-
+-        /**
+-         * @brief parallelSolve method gets called to start up a parallel solve.
+-         */
+-        void parallelSolve();
+-
+-        /**
+-         * @brief updateConvolutionFilter This will update the convolution filter when the StellarSolver gets set up
+-         */
+-        void updateConvolutionFilter();
+-
+-        /**
+-         * @brief appendStarsRAandDEC attaches the RA and DEC information to a star list
+-         * @param stars is the star list to process
+-         * @return true if it was successful
+-         */
+-        bool appendStarsRAandDEC(QList<FITSImage::Star> &stars);
+-
+-        /**
+-         * @brief checkParameters checks the current Parameters before starting an operation to make sure they are sound.
+-         * @return true if the parameters are good to continue.
+-         */
+-        bool checkParameters();
+-
+-        /**
+-         * @brief createExtractorSolver is an internal StellarSolver method that creates the ExtractorSolvers that will be used in the operation.
+-         * @return The newly created ExtractorSolver.
+-         */
+-        ExtractorSolver* createExtractorSolver();
+-
+-        /**
+-         * @brief getAvailableRAM finds out the amount of available RAM on the system
+-         * @param availableRAM is the variable that will be set to the available RAM found
+-         * @param totalRAM is the variable that will be set to the total RAM on the system
+-         * @return true if it is successful
+-         */
+-        bool getAvailableRAM(double &availableRAM, double &totalRAM);
+-
+-        /**
+-         * @brief enoughRAMisAvailableFor determines if there is enough RAM for the selected index files so that we don't try to load indexes inParallel unless it can handle it.
+-         * @param indexFolders is the list of index folders we will be searching for index files
+-         * @return true if it is successful
+-         */
+-        bool enoughRAMisAvailableFor(const QStringList &indexFolders);
+-
+-    signals:
+-        /**
+-         * @brief logOutput signals that there is infomation that should be printed to a log file or log window
+-         * @param logText is the QString that should be logged
+-         */
+-        void logOutput(QString logText);
+-
+-        // Ready signal note: StellarSolver might not be shut down yet, especially if doing a parallel solve.
+-        // You can certainly use the results, but it is not recommended to delete a StellarSolver until the parallel threads are all finished.
+-        /**
+-         * @brief ready Extraction and/or solving complete, whether successful or not.  Warning, do not delete StellarSolver yet!
+-         */
+-        void ready();
+-
+-        // Finished Signal note: It should be safe to delete StellarSolver at this time since no parallel threads are running.
+-        /**
+-         * @brief finished Extraction and/or solving complete, whether successful or not, and StellarSolver has shut down.
+-         */
+-        void finished();
+-
++  Q_OBJECT
++  Q_PROPERTY(QString BasePath MEMBER m_BasePath)
++  Q_PROPERTY(QString FileToProcess MEMBER m_FileToProcess)
++  Q_PROPERTY(QString AstrometryAPIKey MEMBER m_AstrometryAPIKey)
++  Q_PROPERTY(QString AstrometryAPIURL MEMBER m_AstrometryAPIURL)
++  Q_PROPERTY(QString LogFileName MEMBER m_LogFileName)
++  Q_PROPERTY(bool UsePosition MEMBER m_UsePosition)
++  Q_PROPERTY(bool UseScale MEMBER m_UseScale)
++  Q_PROPERTY(bool AutoGenerateAstroConfig MEMBER m_AutoGenerateAstroConfig)
++  Q_PROPERTY(bool CleanupTemporaryFiles MEMBER m_CleanupTemporaryFiles)
++  Q_PROPERTY(bool OnlySendFITSFiles MEMBER m_OnlySendFITSFiles)
++  Q_PROPERTY(bool LogToFile MEMBER m_LogToFile)
++  Q_PROPERTY(SolverType SolverType MEMBER m_SolverType)
++  Q_PROPERTY(ProcessType ProcessType MEMBER m_ProcessType)
++  Q_PROPERTY(ExtractorType ExtractorType MEMBER m_ExtractorType)
++
++public:
++  /**
++   * @brief StellarSolver This constructor makes a StellarSolver without any image or information
++   * @param parent The parent of this StellarSolver, allows it to be deleted with its parent,
++   * defaults to nullptr
++   */
++  explicit StellarSolver(QObject * parent = nullptr);
++
++  /**
++   * @brief StellarSolver This constructor makes a StellarSolver with just the image information
++   * @param imagestats Information about the imagebuffer provided
++   * @param imageBuffer The imagebuffer to be processed
++   * @param parent The parent of this StellarSolver, allows it to be deleted with its parent,
++   * defaults to nullptr
++   */
++  explicit StellarSolver(
++    const FITSImage::Statistic & imagestats,
++    uint8_t const * imageBuffer,
++    QObject * parent = nullptr);
++
++  /**
++   * @brief StellarSolver This constructor makes a StellarSolver with the ProcessType included
++   * @param type The type of process you are planning to perform on the image
++   * @param imagestats Information about the imagebuffer provided
++   * @param imageBuffer The imagebuffer to be processed
++   * @param parent The parent of this StellarSolver, allows it to be deleted with its parent,
++   * defaults to nullptr
++   */
++  explicit StellarSolver(
++    ProcessType type,
++    const FITSImage::Statistic & imagestats,
++    uint8_t const * imageBuffer,
++    QObject * parent = nullptr);
++
++  // This deletes the StellarSolver
++  ~StellarSolver();
++
++  /**
++   * @brief loadNewImageBuffer loads a new image buffer for StellarSolver to process
++   * @param imagestats Information about the imagebuffer provided
++   * @param imageBuffer The imagebuffer to be processed
++   * @return whether or not it succesfully loaded a new image.  It will not be successful if you try
++   * to load a null image buffer or if a process is running.
++   */
++  bool loadNewImageBuffer(const FITSImage::Statistic & imagestats, uint8_t const * imageBuffer);
++
++  /**
++   * @brief getDefaultExternalPaths gets the default external program paths appropriate for the
++   * selected Computer System
++   * @param system is the selected system setup
++   * @return The appropriate ExernalProgramPaths Object
++   */
++  static ExternalProgramPaths getDefaultExternalPaths(ComputerSystemType system);
++
++  /**
++   * @brief getDefaultExternalPaths gets the default external program paths appropriate for the
++   * current Computer System
++   * @param system is the selected system setup
++   * @return The appropriate ExernalProgramPaths Object
++   */
++  static ExternalProgramPaths getDefaultExternalPaths();
++
++  // Notes for the function below:
++  // Return the full path to index files to use when solving.
++  // The input is a list of directory names, and index and healpix constraints.
++  // If indexToUse and healpixToUse are -1, then return all the .fit or .fits
++  // files in the directories. If indexToUse >= 0, then constrain the list to
++  // just those of the correct index. If healpixToUse is also >= 0 then
++  // further constrain the list to correct healpix. It is assumed the index
++  // filename format is index-$INDEX.fit or .fits, or index-$INDEX-$HH.fit or
++  // .fits where $HH is a 2-character healpix number, e.g. index-4205-03.fits.
++
++  /**
++   * @brief getIndexFiles This lets you get a list of paths to index files to pass to astrometry
++   * instead of letting it automatically search.
++   * @param directoryList This is the list of directory names to search for index files
++   * @param indexToUse If you know which index series should solve it, this lets you constrain the
++   * list to that index series.
++   * @param healpixToUse If you further know which healpix to use, this lets you constrain to just
++   * that index file
++   * @return The list of index files to use
++   */
++  static QStringList getIndexFiles(
++    const QStringList & directoryList, int indexToUse = -1, int healpixToUse = -1);
++
++  /**
++   * @brief getCommandString gets the processType as a string explaining the command StellarSolver
++   * is Running
++   * @return The details of what StellarSolver is doing.
++   */
++  QString getCommandString()
++  {
++    return SSolver::getCommandString(m_ProcessType, m_ExtractorType, m_SolverType);
++  }
++
++  /**
++   * @brief getScaleUnitString gets a string for the scale units used in the scale for plate solving
++   * @return The string for the scale units used.
++   */
++  QString getScaleUnitString()
++  {
++    return SSolver::getScaleUnitString(m_ScaleUnit);
++  }
++
++  /**
++   * @brief getShapeString gets a string for the Star Extractor setting for calculating Flux using
++   * ellipses or circles
++   * @return The name of the shape
++   */
++  QString getShapeString()
++  {
++    return SSolver::getShapeString(params.apertureShape);
++  }
++
++  /**
++   * @brief getConvFilterString gets a string for the name of the Convolution Filter used in Star
++   * Extraction
++   * @return The name of the Convolution Filter
++   */
++  QString getConvFilterString()
++  {
++    return SSolver::getConvFilterString(params.convFilterType);
++  }
++
++  /**
++   * @brief getMultiAlgoString gets a string for which algorithm we are using to solve in parallel
++   * threads
++   * @return The name of the parallel thread solving algorithm
++   */
++  QString getMultiAlgoString()
++  {
++    return SSolver::getMultiAlgoString(params.multiAlgorithm);
++  }
++
++  /**
++   * @brief getLogLevelString gets a string for the current Astrometry Logging Level we are using
++   * @return The name of the current logging level
++   */
++  QString getLogLevelString()
++  {
++    return SSolver::getLogLevelString(m_AstrometryLogLevel);
++  }
++
++  /**
++   * @brief getColorChannel Returns which color channel is being used for Star Extraction and
++   * Solving in an RGB image
++   * @return The Color Channel in use
++   */
++  FITSImage::ColorChannel getColorChannel()
++  {
++    return (FITSImage::ColorChannel)m_ColorChannel;
++  }
++
++  /**
++   * @brief getVersion gets the StellarSolver Version String
++   * @return The version string
++   */
++  static QString getVersion()
++  {
++    return QString("StellarSolver Library Version: %1, build: %2")
++      .arg(StellarSolver_VERSION)
++      .arg(StellarSolver_BUILD_TS);
++  }
++
++  /**
++   * @brief getVersionNumber gets the StellarSolver Version Number
++   * @return The version number
++   */
++  static QString getVersionNumber()
++  {
++    return StellarSolver_VERSION;
++  }
++
++  // STELLARSOLVER METHODS
++  // The public methods here are for you to start, stop, setup, and get results from the
++  // StellarSolver
++
++  // These are the most important methods that you can use for the StellarSolver
++
++  /**
++   * @brief extract Performs Star Extraction on the image.  This is performed synchronously and
++   * blocks the calling thread until the finished signal is emitted.
++   * @param calculateHFR If true, it will also calculated Half-Flux Radius for each detected star.
++   * HFR calculations can be very CPU-intensive.
++   * @param frame If set, it will only extract stars within this rectangular region of the image.
++   * @return A boolean that reports whether it was successful, true means success.
++   */
++  bool extract(bool calculateHFR = false, QRect frame = QRect());
++
++  /**
++   * @brief solve Plate Solves the image.  This is performed synchronously and blocks the calling
++   * thread until the finished signal is emitted.
++   * @return A boolean that reports whether it was successful, true means success.
++   */
++  bool solve();
++
++  /**
++   * @brief start Starts a Star Extraction or Plate Solving proccess.  The process is performed
++   * asynchronously.  The calling program should then wait for the ready or finished signal.
++   */
++  void start();
++
++  /**
++   * @brief abort will abort the Star Extraction or Plate Solving process.  For external programs it
++   * runs the kill command.
++   */
++  void abort();
++
++  /**
++   * @brief abort will abort the Star Extraction or Plate Solving process and wait synchronously
++   * till that is done.
++   */
++  void abortAndWait();
++
++  /**
++   * @brief setParameters sets the Parameters for the StellarSolver based on a Parameters object you
++   * set up.
++   * @param parameters The Parameters object
++   */
++  void setParameters(const Parameters & parameters)
++  {
++    params = parameters;
++  };
++
++  /**
++   * @brief setParameterProfile sets the Parameters for the StellarSolver based on a selection of a
++   * built in parameters profile.
++   * @param profile The selected built in profile
++   */
++  void setParameterProfile(SSolver::Parameters::ParametersProfile profile);
++
++  /**
++   * @brief setExternalFilePaths sets the external file paths for the external programs
++   * @param paths are the paths to set
++   */
++  void setExternalFilePaths(const ExternalProgramPaths & paths)
++  {
++    m_ExternalPaths = paths;
++  }
++
++  /**
++   * @brief setIndexFolderPaths Sets the IndexFolderPaths to automatically search for index files.
++   * @param indexPaths A QStringList containing the list of folders to search.
++   */
++  void setIndexFolderPaths(const QStringList & indexPaths)
++  {
++    indexFolderPaths = indexPaths;
++  };
++
++  /**
++   * @brief setIndexFilePaths Sets the IndexFilePaths variable to a list of index file paths to use.
++   * @param indexFilePaths A QStringList containing the list of index file paths.
++   */
++  void setIndexFilePaths(QStringList indexFilePaths)
++  {
++    m_IndexFilePaths = indexFilePaths;
++  };
++
++  /**
++   * @brief clearIndexFileAndFolderPaths Clears both the Index File paths and Index Folder paths in
++   * case they were set before.
++   */
++  void clearIndexFileAndFolderPaths()
++  {
++    m_IndexFilePaths.clear();
++    indexFolderPaths.clear();
++  }
++
++  /**
++   * @brief setSearchScale will set the Search Scale range to speed up the solver based on the
++   * ScaleUnits QString
++   * @param fov_low The low end of the search range in the specified units
++   * @param fov_high The high end of the search range in the specified units
++   * @param scaleUnits The specified units for the range.
++   */
++  void setSearchScale(double fov_low, double fov_high, const QString & scaleUnits);
++
++  /**
++   * @brief setSearchScale will set the Search Scale range to speed up the solver based on the
++   * ScaleUnits enum
++   * @param fov_low The low end of the search range in the specified units
++   * @param fov_high The high end of the search range in the specified units
++   * @param units The specified units for the range.
++   */
++  void setSearchScale(double fov_low, double fov_high, ScaleUnits units);
++
++  /**
++   * @brief setSearchPositionRaDec sets the search RA/DEC/Radius to speed up the solver when plate
++   * solving
++   * @param ra The Right Ascension in decimal hours
++   * @param dec The Declination in decimal degrees
++   */
++  void setSearchPositionRaDec(double ra, double dec);
++
++  /**
++   * @brief setSearchPositionInDegrees sets the search RA/DEC/Radius to speed up the solver when
++   * plate solving
++   * @param ra The Right Ascension in decimal degrees
++   * @param dec The Declination in decimal degrees
++   */
++  void setSearchPositionInDegrees(double ra, double dec);
++
++  /**
++   * @brief clearSearchPosition turns off the usage of the Search Position if it was set previously
++   */
++  void clearSearchPosition()
++  {
++    m_UsePosition = false;
++  }
++
++  /**
++   * @brief clearSearchScale turns off the usage of the Search Scale if it was set previously
++   */
++  void clearSearchScale()
++  {
++    m_UseScale = false;
++  }
++
++  /**
++   * @brief setLogLevel sets the astrometry logging level
++   * @param level The level of logging
++   */
++  void setLogLevel(logging_level level)
++  {
++    m_AstrometryLogLevel = level;
++  };
++
++  /**
++   * @brief setSSLogLevel sets the logging level for StellarSolver
++   * @param level The level of logging
++   */
++  void setSSLogLevel(SSolverLogLevel level)
++  {
++    m_SSLogLevel = level;
++  };
++
++  /**
++   * @brief setConvolutionFilter lets you set up your own custom QVector convolution filter
++   * @param filter the QVector of float values that is the convolution filter
++   */
++  void setConvolutionFilter(const QVector<float> & filter)
++  {
++    params.convFilterType = SSolver::CONV_CUSTOM;
++    convFilter = filter;
++  }
++
++  /**
++   * @brief generateConvFilter can be used to generate a Convolution Filter based on the selected
++   * parameters
++   * @param filter The selected Convolution Filter type
++   * @param fwhm The fwhm of the filter in pixels
++   * @return The QVector of float values that is the Convolution Filter
++   */
++  static QVector<float> generateConvFilter(SSolver::ConvFilterType filter, double fwhm);
++
++  /**
++   * @brief getBuiltInProfiles gets the built in Parameter options profiles
++   * @return The QList of Parameter Options Profiles
++   */
++  static QList<Parameters> getBuiltInProfiles();
++
++  /**
++   * @brief loadSavedOptionsProfiles loads saved Parameter Options Profiles from a file on the
++   * computer
++   * @param savedOptionsProfiles The file path where the profiles are saved
++   * @return The QList full of Parameter Options Profiles
++   */
++  static QList<SSolver::Parameters> loadSavedOptionsProfiles(const QString & savedOptionsProfiles);
++
++  /**
++   * @brief getDefaultIndexFolderPaths gets the default astrometry Index folder paths for the
++   * Operating System
++   * @return A QStringList full of folder paths to search for index files
++   */
++  static QStringList getDefaultIndexFolderPaths();
++
++  // Accessor Method for external classes
++  /**
++   * @brief getNumStarsFound gets the number of stars found in the star extraction
++   * @return The number of stars found
++   */
++  int getNumStarsFound() const
++  {
++    return numStars;
++  }
++  /**
++   * @brief getStarList gets the list of stars found during star extraction
++   * @return A QList full of stars and their properties
++   */
++  const QList<FITSImage::Star> & getStarList() const
++  {
++    return m_ExtractorStars;
++  }
++
++  /**
++   * @brief getStarListFromSolve gets the list of stars used to plate solve the image
++   * @return A QList full of stars and their properties
++   */
++  const QList<FITSImage::Star> & getStarListFromSolve() const
++  {
++    return m_SolverStars;
++  }
++
++  /**
++   * @brief getBackground gets information about the image background found during star exraction
++   * @return The background information
++   */
++  const FITSImage::Background & getBackground() const
++  {
++    return background;
++  }
++
++  /**
++   * @brief getSolution gets the Solution information from the latest plate solve
++   * @return The Solution information
++   */
++  const FITSImage::Solution & getSolution() const
++  {
++    return solution;
++  }
++
++  /**
++   * @brief getSolutionIndexNumber gets the astrometry index file number used to solve the latest
++   * plate solve
++   * @return The index number
++   */
++  short getSolutionIndexNumber()
++  {
++    return solutionIndexNumber;
++  };
++
++  /**
++   * @brief getSolutionHealpix gets the healpix identifying which image in the index series solved
++   * the image in the latest plate solve
++   * @return The healpix number
++   */
++  short getSolutionHealpix()
++  {
++    return solutionHealpix;
++  };
++
++  /**
++   * @brief extractionDone Whether or not star extraction has been completed
++   * @return true means the star extraction is done
++   */
++  bool extractionDone() const
++  {
++    return m_HasExtracted;
++  }
++  /**
++   * @brief solvingDone Whether or not plate solving has been completed
++   * @return true means the plate solving is done
++   */
++  bool solvingDone() const
++  {
++    return m_HasSolved;
++  }
++
++  /**
++   * @brief failed Whether or not the Star Extraction or Plate Solving has failed
++   * @return true means that it failed
++   */
++  bool failed() const
++  {
++    return m_HasFailed;
++  }
++
++  /**
++   * @brief hasWCSData gets whether or not WCS Data has been retrieved for the image after plate
++   * solving
++   * @return true means we have WCS data
++   */
++  bool hasWCSData() const
++  {
++    return hasWCS;
++  };
++
++  /**
++   * @brief getWCSData returns a copy of the WCS Data Object that contains either internal or
++   * external WCS data and can perform WCS calculations on Stars and Images
++   * @return the WCSData Object
++   */
++  WCSData getWCSData()
++  {
++    return wcsData;
++  }
++
++  /**
++   * @brief getNumThreads gets the number of ExtractorSolvers used to plate solve the image
++   * @return the number of solvers
++   */
++  int getNumThreads() const
++  {
++    if (parallelSolvers.size() == 0)
++      return 1;
++    else
++      return parallelSolvers.size();
++  }
++
++  /**
++   * @brief getCurrentParameters gets a Parameters object containing the current Options Profile
++   * @return The current parameters
++   */
++  const Parameters & getCurrentParameters()
++  {
++    return params;
++  }
++
++  /**
++   * @brief isCalculatingHFR returns whether or not the star extraction is also doing HFR
++   * @return true means HFR is being done too
++   */
++  bool isCalculatingHFR()
++  {
++    return m_CalculateHFR;
++  }
++
++  /**
++   * @brief setUseSubframe sets up a subframe for star extraction
++   * @param frame The QRect that represents the subframe in the image
++   */
++  void setUseSubframe(QRect frame);
++
++  /**
++   * @brief clearSubFrame removes the subframe so that star extraction does the whole image.
++   */
++  void clearSubFrame()
++  {
++    useSubframe = false;
++    m_Subframe = QRect(0, 0, m_Statistics.width, m_Statistics.height);
++  };
++
++  /**
++   * @brief setColorChannel allows you to choose which color channel to use for Star Extraction and
++   * Solving in an RGB Image
++   * @param channel The ColorChannel to use
++   */
++  void setColorChannel(FITSImage::ColorChannel channel)
++  {
++    m_ColorChannel = channel;
++  };
++
++  /**
++   * @brief setColorChannel allows you to choose which color channel to use for Star Extraction and
++   * Solving in an RGB Image
++   * @param channel The int of the ColorChannel to use
++   */
++  void setColorChannel(int channel)
++  {
++    m_ColorChannel = (FITSImage::ColorChannel)channel;
++  };
++
++  /**
++   * @brief isRunning returns whether or not a process is currently running
++   * @return true means it is running
++   */
++  bool isRunning() const;
++
++  /**
++   * @brief raString will generate a nicely formatted QString for the Right Ascension
++   * @param ra The ra in decimal hours
++   * @return A QString for the Right Ascension
++   */
++  static QString raString(double ra);
++
++  /**
++   * @brief decString will generate a nicely formatted QString for the Declination
++   * @param dec The dec in decimal degrees
++   * @return A QString for the Declination
++   */
++  static QString decString(double dec);
++
++  /**
++   * @brief pixelToWCS converts the image X, Y Pixel coordinates to RA, DEC sky coordinates using
++   * the WCS data
++   * @param pixelPoint The X, Y coordinate in pixels
++   * @param skyPoint The RA, DEC coordinates
++   * @return A boolean to say whether it succeeded, true means it did
++   */
++  bool pixelToWCS(const QPointF & pixelPoint, FITSImage::wcs_point & skyPoint);
++
++  /**
++   * @brief wcsToPixel converts the RA, DEC sky coordinates to image X, Y Pixel coordinates using
++   * the WCS data
++   * @param skyPoint The RA, DEC coordinates
++   * @param pixelPoint The X, Y coordinate in pixels
++   * @return A boolean to say whether it succeeded, true means it did
++   */
++  bool wcsToPixel(const FITSImage::wcs_point & skyPoint, QPointF & pixelPoint);
++
++public slots:
++  /**
++   * @brief processFinished slot gets called when a Star Extraction or a Plate Solve finishes.
++   * @param code Whether the process has failed or not.  0 means success.
++   */
++  void processFinished(int code);
++
++  /**
++   * @brief finishParallelSolve slot gets called when a Parallel Plate Solve finishes.
++   * @param code Whether the process has failed or not.  0 means success.
++   */
++  void finishParallelSolve(int success);
++
++private:
++  // Useful state information for the StellarSolver
++  bool m_HasExtracted{false};  // This boolean is set when the star extraction is done
++  bool m_HasSolved{false};     // This boolean is set when the solving is done
++  bool m_HasFailed{false};     // This boolean is set when a process has failed
++  bool hasWCS{false};       // This boolean gets set if the StellarSolver has WCS data to retrieve
++  bool m_isRunning{false};  // Whether or not the StellarSolver is currently running
++
++  // StellarSolver Options
++
++  // Primary Options for StellarSolver
++  ProcessType m_ProcessType{EXTRACT};  // This defines the type of process to perform.
++  ExtractorType m_ExtractorType{EXTRACTOR_INTERNAL};  // This is the type of star extractor to use.
++  SolverType m_SolverType{SOLVER_STELLARSOLVER};      // This is the type of solver to use.
++
++  // External Process Options
++  QString m_FileToProcess;               // The file that is being processed.
++  bool m_CleanupTemporaryFiles{true};    // Whether or not to delete the temp files when finished
++  bool m_AutoGenerateAstroConfig{true};  // Whether or not to generate the astrometry.cfg file. This
++                                         // is preferred so that it sends all the options requested.
++  bool m_OnlySendFITSFiles{
++    true};  // This is sometimes needed if the external solvers can't handle other file types
++  ExternalProgramPaths m_ExternalPaths;  // System File Paths to external programs and files
++
++  // Index File Options
++  QStringList indexFolderPaths;  // This is the list of folder paths that the solver will use to
++                                 // search for index files
++  QStringList m_IndexFilePaths;  // This is an alternative to the indexFolderPaths variable.  We can
++                                 // just load individual index files instead of searching for them
++
++  // Online Options
++  QString m_AstrometryAPIKey;
++  QString m_AstrometryAPIURL;
++
++  // HFR Options
++  bool m_CalculateHFR{false};  // Whether or not the HFR of the image should be calculated using
++                               // sep_flux_radius.  Don't do it unless you need HFR
++
++  // Subframing Options
++  bool useSubframe{false};
++  QRect m_Subframe;
++
++  // This determines which color channel in an RGB image should be used for SEP
++  // By Default we should use green since most telescopes are best color corrected for Green
++  int m_ColorChannel = FITSImage::GREEN;
++
++  // The currently set parameters for StellarSolver
++  Parameters params;
++
++  // This is the Convolution Filter used by the Source Extractor
++  QVector<float> convFilter = {1, 2, 1, 2, 4, 2, 1, 2, 1};
++
++  // Astrometry Scale Parameters, These are not saved parameters and change for each image, use the
++  // methods to set them
++  bool m_UseScale{false};                // Whether or not to use the image scale parameters
++  double m_ScaleLow{0};                  // Lower bound of image scale estimate
++  double m_ScaleHigh{0};                 // Upper bound of image scale estimate
++  ScaleUnits m_ScaleUnit{ARCMIN_WIDTH};  // In what units are the lower and upper bounds?
++
++  // Astrometry Position Parameters, These are not saved parameters and change for each image, use
++  // the methods to set them
++  bool m_UsePosition = false;    // Whether or not to use initial information about the position
++  double m_SearchRA = HUGE_VAL;  // RA of field center for search, format: decimal degrees
++  double m_SearchDE = HUGE_VAL;  // DEC of field center for search, format: decimal degrees
++
++  // StellarSolver Variables
++
++  FITSImage::Statistic m_Statistics;       // This is information about the image
++  const uint8_t * m_ImageBuffer{nullptr};  // The generic data buffer containing the image data
++  QList<ExtractorSolver *>
++    parallelSolvers;  // This is the list of parallel ExtractorSolvers when solving in parallel
++  QScopedPointer<ExtractorSolver>
++    m_ExtractorSolver;  // This is the single ExtractorSolver used when not working in parallel
++  WCSData wcsData;      // This is the WCS information from the last solve.
++  int m_ParallelSolversFinishedCount{0};  // This is the number of parallel solvers that are done.
++
++  // StellarSolver Results Information
++
++  FITSImage::Background
++    background;  // This is a report on the background levels found during star extraction
++  QList<FITSImage::Star>
++    m_ExtractorStars;  // This is the list of stars that get extracted from the image
++  QList<FITSImage::Star>
++    m_SolverStars;   // This is the list of stars that were extracted for the last successful solve
++  int numStars = 0;  // The number of stars found in the last operation
++  FITSImage::Solution solution;    // This is the solution that comes back from the Solver
++  short solutionIndexNumber = -1;  // This is the index number of the index used to solve the image.
++  short solutionHealpix = -1;      // This is the healpix of the index used to solve the image.
++
++  // Logging Settings for Astrometry
++  bool m_LogToFile{
++    false};  // This determines whether or not to save the output from Astrometry.net to a file
++  QString m_LogFileName;  // This is the path to the log file that it will save.
++  logging_level m_AstrometryLogLevel{
++    LOG_NONE};  // This is the level of astrometry logging.  Beware, setting this too high can
++                // severely affect performance
++  SSolverLogLevel m_SSLogLevel{LOG_NORMAL};  // This is the level for the StellarSolver Logging
++
++  // These are for creating temporary files
++  // This is the base name used for all temporary files.  It uses a random name based on the type of
++  // solver/star extractor.
++  QString m_BaseName;
++  // This is the path used for saving any temporary files.  They are by default saved to the default
++  // temp directory, you can change it if you want to.
++  QString m_BasePath{QDir::tempPath()};
++
++  // StellarSolver Private Methods
++  /**
++   * @brief registerMetaTypes registers the meta types so they can be used in functions
++   */
++  void registerMetaTypes();
++
++  /**
++   * @brief parallelSolversAreRunning returns whether the parallel solvers are currently running
++   * @return true if they are running
++   */
++  bool parallelSolversAreRunning() const;
++
++  /**
++   * @brief whichSolver gets the index of this particular solver in the Parallel Solvers list
++   * @param solver is which solver to check the index of
++   * @return an int representing its position
++   */
++  int whichSolver(ExtractorSolver * solver);
++
++  /**
++   * @brief snr gets the signal to noise ratio for a star with the specified background
++   * @param background The specified background object which may have come from star extraction
++   * @param star The specified star
++   * @param gain The gain used in the calculation
++   * @return The snr as a double
++   */
++  static double snr(
++    const FITSImage::Background & background, const FITSImage::Star & star, double gain = 0.5);
++
++  /**
++   * @brief parallelSolve method gets called to start up a parallel solve.
++   */
++  void parallelSolve();
++
++  /**
++   * @brief updateConvolutionFilter This will update the convolution filter when the StellarSolver
++   * gets set up
++   */
++  void updateConvolutionFilter();
++
++  /**
++   * @brief appendStarsRAandDEC attaches the RA and DEC information to a star list
++   * @param stars is the star list to process
++   * @return true if it was successful
++   */
++  bool appendStarsRAandDEC(QList<FITSImage::Star> & stars);
++
++  /**
++   * @brief checkParameters checks the current Parameters before starting an operation to make sure
++   * they are sound.
++   * @return true if the parameters are good to continue.
++   */
++  bool checkParameters();
++
++  /**
++   * @brief createExtractorSolver is an internal StellarSolver method that creates the
++   * ExtractorSolvers that will be used in the operation.
++   * @return The newly created ExtractorSolver.
++   */
++  ExtractorSolver * createExtractorSolver();
++
++  /**
++   * @brief getAvailableRAM finds out the amount of available RAM on the system
++   * @param availableRAM is the variable that will be set to the available RAM found
++   * @param totalRAM is the variable that will be set to the total RAM on the system
++   * @return true if it is successful
++   */
++  bool getAvailableRAM(double & availableRAM, double & totalRAM);
++
++  /**
++   * @brief enoughRAMisAvailableFor determines if there is enough RAM for the selected index files
++   * so that we don't try to load indexes inParallel unless it can handle it.
++   * @param indexFolders is the list of index folders we will be searching for index files
++   * @return true if it is successful
++   */
++  bool enoughRAMisAvailableFor(const QStringList & indexFolders);
++
++signals:
++  /**
++   * @brief logOutput signals that there is infomation that should be printed to a log file or log
++   * window
++   * @param logText is the QString that should be logged
++   */
++  void logOutput(QString logText);
++
++  // Ready signal note: StellarSolver might not be shut down yet, especially if doing a parallel
++  // solve. You can certainly use the results, but it is not recommended to delete a StellarSolver
++  // until the parallel threads are all finished.
++  /**
++   * @brief ready Extraction and/or solving complete, whether successful or not.  Warning, do not
++   * delete StellarSolver yet!
++   */
++  void ready();
++
++  // Finished Signal note: It should be safe to delete StellarSolver at this time since no parallel
++  // threads are running.
++  /**
++   * @brief finished Extraction and/or solving complete, whether successful or not, and
++   * StellarSolver has shut down.
++   */
++  void finished();
+ };
+-
+diff --git a/stellarsolver/stellarsolver_export.h b/stellarsolver/stellarsolver_export.h
+new file mode 100644
+index 00000000..89cb8d49
+--- /dev/null
++++ b/stellarsolver/stellarsolver_export.h
+@@ -0,0 +1,11 @@
++#pragma once
++
++#if defined(_WIN32) || defined(__CYGWIN__)
++#ifdef stellarsolver_EXPORTS
++#define STELLARSOLVER_API __declspec(dllexport)
++#else
++#define STELLARSOLVER_API __declspec(dllimport)
++#endif
++#else
++#define STELLARSOLVER_API __attribute__((visibility("default")))
++#endif
+diff --git a/stellarsolver/structuredefinitions.h b/stellarsolver/structuredefinitions.h
+index 279e450d..7bd7b4ff 100644
+--- a/stellarsolver/structuredefinitions.h
++++ b/stellarsolver/structuredefinitions.h
+@@ -9,6 +9,8 @@
+ #include <math.h>
+ #include <QString>
+ 
++#include "stellarsolver_export.h"
++
+ namespace FITSImage
+ {
+ 
+@@ -55,7 +57,7 @@ static const QString getColorChannelText(ColorChannel channel){
+ }
+ 
+ // Stats struct to hold statisical data about the FITS data
+-typedef struct Statistic
++typedef struct STELLARSOLVER_API Statistic
+ {
+     double min[3] = {0}, max[3] = {0};  // Minimum and Maximum R, G, B pixel values in the image
+     double mean[3] = {0};               // Average R, G, B value of the pixels in the image
+@@ -74,7 +76,7 @@ typedef struct Statistic
+ 
+ // This structure holds data about sources that are found within
+ // an image.  It is returned by Source Extraction
+-typedef struct Star
++typedef struct STELLARSOLVER_API Star
+ {
+     float x;        // The x position of the star in Pixels
+     float y;        // The y position of the star in Pixels
+@@ -92,7 +94,7 @@ typedef struct Star
+ 
+ // This struct holds data about the background in an image
+ // It is returned by source extraction
+-typedef struct Background
++typedef struct STELLARSOLVER_API Background
+ {
+     int bw, bh;             // single tile width, height
+     float global;           // global mean
+@@ -102,7 +104,7 @@ typedef struct Background
+ 
+ // This struct contains information about the astrometric solution
+ // for an image.
+-typedef struct Solution
++typedef struct STELLARSOLVER_API Solution
+ {
+     double fieldWidth;  // The calculated width of the field in arcminutes
+     double fieldHeight; // The calculated height of the field in arcminutes
+@@ -116,7 +118,7 @@ typedef struct Solution
+ } Solution;
+ 
+ // This is a point in the World Coordinate System with both RA and DEC.
+-typedef struct wcs_point
++typedef struct STELLARSOLVER_API wcs_point
+ {
+     float ra;           // The Right Ascension in degrees
+     float dec;          // The Declination in degrees
+diff --git a/stellarsolver/wcsdata.h b/stellarsolver/wcsdata.h
+index b7342ae8..5a6d3e60 100644
+--- a/stellarsolver/wcsdata.h
++++ b/stellarsolver/wcsdata.h
+@@ -11,9 +11,10 @@ extern "C" {
+ }
+ 
+ //Project Includes
++#include "stellarsolver_export.h"
+ #include "structuredefinitions.h"
+ 
+-class WCSData
++class STELLARSOLVER_API WCSData
+ {
+ public:
+     struct wcsprm *m_wcs; // This is a struct used by wcslib for wcs info loaded from a file
\ No newline at end of file
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..7113969
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1 @@
+cae12a5917f7d49d792f71b76019074e944f5527.diff


More information about the Neon-commits mailing list