13#include "indi/indicommon.h"
20#include <QElapsedTimer>
24#include "guidestars.h"
25#include "calibration.h"
33class HysteresisGuider;
36#define SMART_THRESHOLD 0
37#define SEP_THRESHOLD 1
38#define CENTROID_THRESHOLD 2
39#define AUTO_THRESHOLD 3
41#define SEP_MULTISTAR 5
54 bool enabled[CHANNEL_CNT];
55 bool enabled_axis1[CHANNEL_CNT];
56 bool enabled_axis2[CHANNEL_CNT];
58 double proportional_gain[CHANNEL_CNT];
59 double integral_gain[CHANNEL_CNT];
60 int max_pulse_arcsec[CHANNEL_CNT];
61 double min_pulse_arcsec[CHANNEL_CNT];
72 GuideDirection pulse_dir[2];
80 double fov_wd, fov_ht;
81 double focal, aperture;
93 bool setVideoParameters(
int vid_wd,
int vid_ht,
int binX,
int binY);
94 bool setGuiderParameters(
double guider_aperture);
96 bool setTargetPosition(
double x,
double y);
97 bool getTargetPosition(
double *x,
double *y)
const;
99 void setStarDetectionAlgorithmIndex(
int algorithmIndex);
100 bool usingSEPMultiStar()
const;
106 const cproc_out_params *getOutputParameters()
const
116 void suspend(
bool mode);
117 bool isSuspended()
const;
120 void getStarScreenPosition(
double *dx,
double *dy)
const;
121 GuiderUtils::Vector findLocalStarPosition(QSharedPointer<FITSData> &imageData,
122 QSharedPointer<GuideView> &guideView,
bool firstFrame);
123 bool isStarLost()
const;
124 void setLostStar(
bool is_lost);
127 void performProcessing(Ekos::GuideState state,
128 QSharedPointer<FITSData> &imageData,
129 QSharedPointer<GuideView> &guideView,
130 const std::pair<Seconds, Seconds> &timeStep,
131 GuideLog *logger =
nullptr);
133 void performDarkGuiding(Ekos::GuideState state,
const std::pair<Seconds, Seconds> &timeStep);
135 bool calibrate1D(
double start_x,
double start_y,
double end_x,
double end_y,
int RATotalPulse);
136 bool calibrate2D(
double start_ra_x,
double start_ra_y,
double end_ra_x,
double end_ra_y,
137 double start_dec_x,
double start_dec_y,
double end_dec_x,
double end_dec_y,
138 bool *swap_dec,
int RATotalPulse,
int DETotalPulse);
140 const Calibration &getCalibration()
144 Calibration *getMutableCalibration()
148 QVector3D selectGuideStar(
const QSharedPointer<FITSData> &imageData);
149 double getGuideStarSNR();
151 const GuideStars &getGuideStars()
157 void newAxisDelta(
double delta_ra,
double delta_dec);
158 void newStarPosition(QVector3D,
bool);
161 void guideStats(
double raError,
double decError,
int raPulse,
int decPulse,
162 double snr,
double skyBg,
int numStars);
166 template <
typename T>
167 GuiderUtils::Vector findLocalStarPosition(
void)
const;
169 void updateCircularBuffers(
void);
170 GuiderUtils::Vector point2arcsec(
const GuiderUtils::Vector &p)
const;
171 void calculatePulses(Ekos::GuideState state,
const std::pair<Seconds, Seconds> &timeStep);
172 void calculateRmsError(
void);
175 void createGuideLog();
180 uint32_t iterationCounter { 0 };
183 int video_width { -1 };
185 int video_height { -1 };
186 double aperture { 0 };
187 bool suspended {
false };
188 bool lost_star {
false };
191 int m_StarDetectionAlgorithm { SMART_THRESHOLD };
195 GuiderUtils::Vector starPosition;
196 GuiderUtils::Vector targetPosition;
202 static constexpr int CIRCULAR_BUFFER_SIZE = 100;
204 uint32_t driftUpto[2];
206 double drift_integral[2];
209 cproc_in_params in_params;
210 cproc_out_params out_params;
213 bool do_statistics {
true };
216 QElapsedTimer logTime;
218 GuideStars guideStars;
220 std::unique_ptr<GPG> gpg;
221 std::unique_ptr<LinearGuider> m_RALinearGuider;
222 std::unique_ptr<LinearGuider> m_DECLinearGuider;
223 std::unique_ptr<HysteresisGuider> m_RAHysteresisGuider;
224 std::unique_ptr<HysteresisGuider> m_DECHysteresisGuider;
226 Calibration calibration;
227 bool configureInParams(Ekos::GuideState state);
228 void updateOutParams(
int k,
const double arcsecDrift,
int pulseLength, GuideDirection pulseDirection);
229 void outputGuideLog();
230 void processAxis(
const int k,
const bool dithering,
const bool darkGuiding,
const Seconds &timeStep,
const QString &label);