1 /*
2     SPDX-FileCopyrightText: 2017 Jasem Mutlaq <mutlaqja@ikarustech.com>
3 
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #include "ekos.h"
8 
9 #include <gsl/gsl_fit.h>
10 #include <gsl/gsl_vector.h>
11 #include <gsl/gsl_matrix.h>
12 #include <gsl/gsl_multifit.h>
13 
14 #include <QDebug>
15 
16 namespace Ekos
17 {
getGuideStatusString(GuideState state)18 const QString &getGuideStatusString(GuideState state)
19 {
20     return guideStates[state];
21 }
getCaptureStatusString(CaptureState state)22 const QString &getCaptureStatusString(CaptureState state)
23 {
24     return captureStates[state];
25 }
getFocusStatusString(FocusState state)26 const QString &getFocusStatusString(FocusState state)
27 {
28     return focusStates[state];
29 }
getAlignStatusString(AlignState state)30 const QString &getAlignStatusString(AlignState state)
31 {
32     return alignStates[state];
33 }
getFilterStatusString(FilterState state)34 const QString &getFilterStatusString(FilterState state)
35 {
36     return filterStates[state];
37 }
getSchedulerStatusString(FilterState state)38 const QString &getSchedulerStatusString(FilterState state)
39 {
40     return schedulerStates[state];
41 }
42 
43 /* Taken from https://codereview.stackexchange.com/questions/71300/wrapper-function-to-do-polynomial-fits-with-gsl */
gsl_polynomial_fit(const double * const data_x,const double * const data_y,const int n,const int order,double & chisq)44 std::vector<double> gsl_polynomial_fit(const double *const data_x, const double *const data_y, const int n,
45                                        const int order, double &chisq)
46 {
47     int status = 0;
48     std::vector<double> vc;
49     gsl_vector *y, *c;
50     gsl_matrix *X, *cov;
51     y   = gsl_vector_alloc(n);
52     c   = gsl_vector_alloc(order + 1);
53     X   = gsl_matrix_alloc(n, order + 1);
54     cov = gsl_matrix_alloc(order + 1, order + 1);
55 
56     for (int i = 0; i < n; i++)
57     {
58         for (int j = 0; j < order + 1; j++)
59         {
60             gsl_matrix_set(X, i, j, pow(data_x[i], j));
61         }
62         gsl_vector_set(y, i, data_y[i]);
63     }
64 
65     // Must turn off error handler or it aborts on error
66     gsl_set_error_handler_off();
67 
68     gsl_multifit_linear_workspace *work = gsl_multifit_linear_alloc(n, order + 1);
69     status                              = gsl_multifit_linear(X, y, c, cov, &chisq, work);
70 
71     if (status != GSL_SUCCESS)
72     {
73         qDebug() << "GSL multifit error:" << gsl_strerror(status);
74         return vc;
75     }
76 
77     gsl_multifit_linear_free(work);
78 
79     for (int i = 0; i < order + 1; i++)
80     {
81         vc.push_back(gsl_vector_get(c, i));
82     }
83 
84     gsl_vector_free(y);
85     gsl_vector_free(c);
86     gsl_matrix_free(X);
87     gsl_matrix_free(cov);
88 
89     return vc;
90 }
91 }
92 
operator <<(QDBusArgument & argument,const Ekos::CommunicationStatus & source)93 QDBusArgument &operator<<(QDBusArgument &argument, const Ekos::CommunicationStatus& source)
94 {
95     argument.beginStructure();
96     argument << static_cast<int>(source);
97     argument.endStructure();
98     return argument;
99 }
100 
operator >>(const QDBusArgument & argument,Ekos::CommunicationStatus & dest)101 const QDBusArgument &operator>>(const QDBusArgument &argument, Ekos::CommunicationStatus &dest)
102 {
103     int a;
104     argument.beginStructure();
105     argument >> a;
106     argument.endStructure();
107     dest = static_cast<Ekos::CommunicationStatus>(a);
108     return argument;
109 }
110 
operator <<(QDBusArgument & argument,const Ekos::CaptureState & source)111 QDBusArgument &operator<<(QDBusArgument &argument, const Ekos::CaptureState& source)
112 {
113     argument.beginStructure();
114     argument << static_cast<int>(source);
115     argument.endStructure();
116     return argument;
117 }
118 
operator >>(const QDBusArgument & argument,Ekos::CaptureState & dest)119 const QDBusArgument &operator>>(const QDBusArgument &argument, Ekos::CaptureState &dest)
120 {
121     int a;
122     argument.beginStructure();
123     argument >> a;
124     argument.endStructure();
125     dest = static_cast<Ekos::CaptureState>(a);
126     return argument;
127 }
128 
operator <<(QDBusArgument & argument,const Ekos::FocusState & source)129 QDBusArgument &operator<<(QDBusArgument &argument, const Ekos::FocusState& source)
130 {
131     argument.beginStructure();
132     argument << static_cast<int>(source);
133     argument.endStructure();
134     return argument;
135 }
136 
operator >>(const QDBusArgument & argument,Ekos::FocusState & dest)137 const QDBusArgument &operator>>(const QDBusArgument &argument, Ekos::FocusState &dest)
138 {
139     int a;
140     argument.beginStructure();
141     argument >> a;
142     argument.endStructure();
143     dest = static_cast<Ekos::FocusState>(a);
144     return argument;
145 }
146 
operator <<(QDBusArgument & argument,const Ekos::GuideState & source)147 QDBusArgument &operator<<(QDBusArgument &argument, const Ekos::GuideState& source)
148 {
149     argument.beginStructure();
150     argument << static_cast<int>(source);
151     argument.endStructure();
152     return argument;
153 }
154 
operator >>(const QDBusArgument & argument,Ekos::GuideState & dest)155 const QDBusArgument &operator>>(const QDBusArgument &argument, Ekos::GuideState &dest)
156 {
157     int a;
158     argument.beginStructure();
159     argument >> a;
160     argument.endStructure();
161     dest = static_cast<Ekos::GuideState>(a);
162     return argument;
163 }
164 
operator <<(QDBusArgument & argument,const Ekos::AlignState & source)165 QDBusArgument &operator<<(QDBusArgument &argument, const Ekos::AlignState& source)
166 {
167     argument.beginStructure();
168     argument << static_cast<int>(source);
169     argument.endStructure();
170     return argument;
171 }
172 
operator >>(const QDBusArgument & argument,Ekos::AlignState & dest)173 const QDBusArgument &operator>>(const QDBusArgument &argument, Ekos::AlignState &dest)
174 {
175     int a;
176     argument.beginStructure();
177     argument >> a;
178     argument.endStructure();
179     dest = static_cast<Ekos::AlignState>(a);
180     return argument;
181 }
182 
operator <<(QDBusArgument & argument,const Ekos::SchedulerState & source)183 QDBusArgument &operator<<(QDBusArgument &argument, const Ekos::SchedulerState& source)
184 {
185     argument.beginStructure();
186     argument << static_cast<int>(source);
187     argument.endStructure();
188     return argument;
189 }
190 
operator >>(const QDBusArgument & argument,Ekos::SchedulerState & dest)191 const QDBusArgument &operator>>(const QDBusArgument &argument, Ekos::SchedulerState &dest)
192 {
193     int a;
194     argument.beginStructure();
195     argument >> a;
196     argument.endStructure();
197     dest = static_cast<Ekos::SchedulerState>(a);
198     return argument;
199 }
200