File indexing completed on 2024-05-12 15:23:40

0001 /*  Ekos Internal Guider Class
0002     Copyright (C) 2016 Jasem Mutlaq <mutlaqja@ikarustech.com>.
0003 
0004     Based on lin_guider
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #pragma once
0010 
0011 #include "indi/indicommon.h"
0012 #include "../guideinterface.h"
0013 #include "calibration.h"
0014 
0015 #include <QFile>
0016 #include <QPointer>
0017 #include <QQueue>
0018 #include <QTime>
0019 
0020 #include <memory>
0021 
0022 class QVector3D;
0023 class GuideView;
0024 class Edge;
0025 class GuideLog;
0026 
0027 namespace Ekos
0028 {
0029 class CalibrationProcess
0030 {
0031     public:
0032         enum CalibrationStage
0033         {
0034             CAL_IDLE,
0035             CAL_ERROR,
0036             CAL_CAPTURE_IMAGE,
0037             CAL_SELECT_STAR,
0038             CAL_START,
0039             CAL_RA_INC,
0040             CAL_RA_DEC,
0041             CAL_DEC_INC,
0042             CAL_DEC_DEC,
0043             CAL_BACKLASH
0044         };
0045         enum CalibrationType
0046         {
0047             CAL_NONE,
0048             CAL_RA_AUTO,
0049             CAL_RA_DEC_AUTO
0050         };
0051 
0052         CalibrationProcess(double startX, double startY, bool raOnly);
0053         ~CalibrationProcess() {}
0054 
0055         void useCalibration(Calibration *calibrationPtr);
0056         bool inProgress() const;
0057 
0058         void startup();
0059         void setGuideLog(GuideLog *guideLogPtr);
0060 
0061         void iterate(double x, double y);
0062 
0063         // Return values from each iteration.
0064         void getCalibrationUpdate(
0065             GuideInterface::CalibrationUpdateType *type,
0066             QString *message, double *x, double *y) const;
0067         void getPulse(GuideDirection *dir, int *msecs) const;
0068         QString getLogStatus() const;
0069         Ekos::GuideState getStatus() const;
0070 
0071     private:
0072         void initializeIteration();
0073 
0074         // Methods corresponding to each calibration state.
0075         void startState();
0076         void raOutState(double cur_x, double cur_y);
0077         void raInState(double cur_x, double cur_y);
0078         void decBacklashState(double cur_x, double cur_y);
0079         void decOutState(double cur_x, double cur_y);
0080         void decInState(double cur_x, double cur_y);
0081 
0082         // Setup the return values from each iteration.
0083         void addCalibrationUpdate(GuideInterface::CalibrationUpdateType type,
0084                                   QString message, double x = 0, double y = 0);
0085 
0086         void addPulse(GuideDirection dir, int msecs);
0087         void addLogStatus(const QString &status);
0088         void addStatus(Ekos::GuideState s);
0089 
0090         // calibration parameters
0091         int maximumSteps { 5 };
0092         int turn_back_time { 0 };
0093         int ra_iterations { 0 };
0094         int dec_iterations { 0 };
0095         int backlash_iterations { 0 };
0096         int last_pulse { 0 };
0097         int ra_total_pulse { 0 };
0098         int de_total_pulse { 0 };
0099         uint8_t backlash { 0 };
0100 
0101         // calibration coordinates
0102         double start_x1 { 0 };
0103         double start_y1 { 0 };
0104         double end_x1 { 0 };
0105         double end_y1 { 0 };
0106         double start_x2 { 0 };
0107         double start_y2 { 0 };
0108         double end_x2 { 0 };
0109         double end_y2 { 0 };
0110         double last_x { 0 };
0111         double last_y { 0 };
0112         double ra_distance {0};
0113         double de_distance {0};
0114         double start_backlash_x { 0 };
0115         double start_backlash_y { 0 };
0116 
0117         CalibrationStage calibrationStage { CAL_IDLE };
0118         CalibrationType calibrationType;
0119 
0120         Calibration *calibration = nullptr;
0121         Calibration tempCalibration;
0122         bool raOnly = false;
0123         GuideLog *guideLog = nullptr;
0124 
0125         // Return values from each iteration.
0126         // Most of these result in emits in internalguider.cpp
0127         bool axisCalibrationComplete = false;
0128         QString logString;
0129         GuideInterface::CalibrationUpdateType updateType;
0130         QString calibrationUpdate;
0131         double updateX, updateY;
0132         Ekos::GuideState status;
0133         GuideDirection pulseDirection;
0134         int pulseMsecs = 0;
0135 };
0136 }