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