gps_pvt 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +10 -0
- data/README.md +86 -0
- data/Rakefile +86 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/ext/gps_pvt/Coordinate/Coordinate_wrap.cxx +6613 -0
- data/ext/gps_pvt/GPS/GPS_wrap.cxx +16019 -0
- data/ext/gps_pvt/SylphideMath/SylphideMath_wrap.cxx +21050 -0
- data/ext/gps_pvt/extconf.rb +70 -0
- data/ext/ninja-scan-light/tool/navigation/EGM.h +2971 -0
- data/ext/ninja-scan-light/tool/navigation/GPS.h +2432 -0
- data/ext/ninja-scan-light/tool/navigation/GPS_Solver.h +479 -0
- data/ext/ninja-scan-light/tool/navigation/GPS_Solver_Base.h +1081 -0
- data/ext/ninja-scan-light/tool/navigation/GPS_Solver_MultiFrequency.h +199 -0
- data/ext/ninja-scan-light/tool/navigation/GPS_Solver_RAIM.h +210 -0
- data/ext/ninja-scan-light/tool/navigation/MagneticField.h +928 -0
- data/ext/ninja-scan-light/tool/navigation/NTCM.h +211 -0
- data/ext/ninja-scan-light/tool/navigation/RINEX.h +1781 -0
- data/ext/ninja-scan-light/tool/navigation/WGS84.h +186 -0
- data/ext/ninja-scan-light/tool/navigation/coordinate.h +406 -0
- data/ext/ninja-scan-light/tool/param/bit_array.h +145 -0
- data/ext/ninja-scan-light/tool/param/complex.h +558 -0
- data/ext/ninja-scan-light/tool/param/matrix.h +4049 -0
- data/ext/ninja-scan-light/tool/param/matrix_fixed.h +665 -0
- data/ext/ninja-scan-light/tool/param/matrix_special.h +562 -0
- data/ext/ninja-scan-light/tool/param/quaternion.h +765 -0
- data/ext/ninja-scan-light/tool/param/vector3.h +651 -0
- data/ext/ninja-scan-light/tool/swig/Coordinate.i +177 -0
- data/ext/ninja-scan-light/tool/swig/GPS.i +1102 -0
- data/ext/ninja-scan-light/tool/swig/SylphideMath.i +1234 -0
- data/ext/ninja-scan-light/tool/swig/extconf.rb +5 -0
- data/ext/ninja-scan-light/tool/swig/makefile +53 -0
- data/ext/ninja-scan-light/tool/swig/spec/GPS_spec.rb +417 -0
- data/ext/ninja-scan-light/tool/swig/spec/SylphideMath_spec.rb +489 -0
- data/gps_pvt.gemspec +57 -0
- data/lib/gps_pvt/receiver.rb +375 -0
- data/lib/gps_pvt/ubx.rb +148 -0
- data/lib/gps_pvt/version.rb +5 -0
- data/lib/gps_pvt.rb +9 -0
- data/sig/gps_pvt.rbs +4 -0
- metadata +117 -0
@@ -0,0 +1,1102 @@
|
|
1
|
+
/**
|
2
|
+
* @file SWIG interface file for GPS related classes
|
3
|
+
*
|
4
|
+
*/
|
5
|
+
|
6
|
+
%module GPS
|
7
|
+
|
8
|
+
%{
|
9
|
+
#if defined(SWIGRUBY)
|
10
|
+
#undef isfinite
|
11
|
+
#endif
|
12
|
+
|
13
|
+
#include <string>
|
14
|
+
#include <vector>
|
15
|
+
#include <iostream>
|
16
|
+
#include <fstream>
|
17
|
+
#include <exception>
|
18
|
+
|
19
|
+
#include "navigation/GPS.h"
|
20
|
+
#include "navigation/RINEX.h"
|
21
|
+
|
22
|
+
#include "navigation/GPS_Solver_Base.h"
|
23
|
+
#include "navigation/GPS_Solver.h"
|
24
|
+
#include "navigation/GPS_Solver_RAIM.h"
|
25
|
+
%}
|
26
|
+
|
27
|
+
%include typemaps.i
|
28
|
+
%include std_common.i
|
29
|
+
%include std_string.i
|
30
|
+
%include exception.i
|
31
|
+
|
32
|
+
#if !defined(SWIGIMPORTED)
|
33
|
+
%header {
|
34
|
+
struct native_exception : public std::exception {
|
35
|
+
#if defined(SWIGRUBY)
|
36
|
+
int state;
|
37
|
+
native_exception(const int &state_) : std::exception(), state(state_) {}
|
38
|
+
void regenerate() const {rb_jump_tag(state);}
|
39
|
+
#else
|
40
|
+
void regenerate() const {}
|
41
|
+
#endif
|
42
|
+
};
|
43
|
+
}
|
44
|
+
%exception {
|
45
|
+
try {
|
46
|
+
$action
|
47
|
+
} catch (const native_exception &e) {
|
48
|
+
e.regenerate();
|
49
|
+
SWIG_fail;
|
50
|
+
} catch (const std::exception& e) {
|
51
|
+
SWIG_exception_fail(SWIG_RuntimeError, e.what());
|
52
|
+
}
|
53
|
+
}
|
54
|
+
#endif
|
55
|
+
|
56
|
+
#ifdef SWIGRUBY
|
57
|
+
%header {
|
58
|
+
static VALUE yield_throw_if_error(const int &argc, const VALUE *argv) {
|
59
|
+
struct yield_t {
|
60
|
+
const int &argc;
|
61
|
+
const VALUE *argv;
|
62
|
+
static VALUE run(VALUE v){
|
63
|
+
yield_t *arg(reinterpret_cast<yield_t *>(v));
|
64
|
+
return rb_yield_values2(arg->argc, arg->argv);
|
65
|
+
}
|
66
|
+
} arg = {argc, argv};
|
67
|
+
int state;
|
68
|
+
VALUE res(rb_protect(yield_t::run, reinterpret_cast<VALUE>(&arg), &state));
|
69
|
+
if(state != 0){throw native_exception(state);}
|
70
|
+
return res;
|
71
|
+
}
|
72
|
+
static VALUE proc_call_throw_if_error(
|
73
|
+
const VALUE &arg0, const int &argc, const VALUE *argv) {
|
74
|
+
struct proc_call_t {
|
75
|
+
const VALUE &arg0;
|
76
|
+
const int &argc;
|
77
|
+
const VALUE *argv;
|
78
|
+
static VALUE run(VALUE v){
|
79
|
+
proc_call_t *arg(reinterpret_cast<proc_call_t *>(v));
|
80
|
+
return rb_proc_call_with_block(arg->arg0, arg->argc, arg->argv, Qnil);
|
81
|
+
}
|
82
|
+
} arg = {arg0, argc, argv};
|
83
|
+
int state;
|
84
|
+
VALUE res(rb_protect(proc_call_t::run, reinterpret_cast<VALUE>(&arg), &state));
|
85
|
+
if(state != 0){throw native_exception(state);}
|
86
|
+
return res;
|
87
|
+
}
|
88
|
+
static std::string inspect_str(const VALUE &v){
|
89
|
+
VALUE v_inspect(rb_inspect(v));
|
90
|
+
return std::string(RSTRING_PTR(v_inspect), RSTRING_LEN(v_inspect));
|
91
|
+
}
|
92
|
+
}
|
93
|
+
#endif
|
94
|
+
|
95
|
+
%feature("autodoc", "1");
|
96
|
+
|
97
|
+
%import "SylphideMath.i"
|
98
|
+
%import "Coordinate.i"
|
99
|
+
|
100
|
+
%extend GPS_Time {
|
101
|
+
%typemap(out) std::tm {
|
102
|
+
%append_output(SWIG_From(int)($1.tm_year + 1900));
|
103
|
+
%append_output(SWIG_From(int)($1.tm_mon + 1));
|
104
|
+
%append_output(SWIG_From(int)($1.tm_mday));
|
105
|
+
%append_output(SWIG_From(int)($1.tm_hour));
|
106
|
+
%append_output(SWIG_From(int)($1.tm_min));
|
107
|
+
%append_output(SWIG_From(int)($1.tm_sec));
|
108
|
+
}
|
109
|
+
#if defined(SWIGRUBY)
|
110
|
+
%typemap(in) const std::tm & (std::tm temp = {0}) {
|
111
|
+
$1 = &temp;
|
112
|
+
int *dst[] = {
|
113
|
+
&(temp.tm_year),
|
114
|
+
&(temp.tm_mon),
|
115
|
+
&(temp.tm_mday),
|
116
|
+
&(temp.tm_hour),
|
117
|
+
&(temp.tm_min),
|
118
|
+
&(temp.tm_sec),
|
119
|
+
};
|
120
|
+
int i_max(sizeof(dst) / sizeof(dst[0]));
|
121
|
+
if(i_max > RARRAY_LEN($input)){i_max = RARRAY_LEN($input);}
|
122
|
+
for(int i(0); i < i_max; ++i){
|
123
|
+
SWIG_Object obj = rb_ary_entry($input, i);
|
124
|
+
int v;
|
125
|
+
if(SWIG_IsOK(SWIG_AsVal(int)(obj, &v))){
|
126
|
+
if(dst[i] == &(temp.tm_year)){
|
127
|
+
*dst[i] = v - 1900;
|
128
|
+
}else if(dst[i] == &(temp.tm_mon)){
|
129
|
+
*dst[i] = v - 1;
|
130
|
+
}else{
|
131
|
+
*dst[i] = v;
|
132
|
+
}
|
133
|
+
}else{
|
134
|
+
SWIG_exception(SWIG_TypeError, "int is expected");
|
135
|
+
}
|
136
|
+
}
|
137
|
+
}
|
138
|
+
%typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) const std::tm & {
|
139
|
+
$1 = (TYPE($input) == T_ARRAY) ? 1 : 0;
|
140
|
+
}
|
141
|
+
#endif
|
142
|
+
%apply int *OUTPUT { int *week };
|
143
|
+
%apply FloatT *OUTPUT { FloatT *seconds };
|
144
|
+
void to_a(int *week, FloatT *seconds) const {
|
145
|
+
*week = self->week;
|
146
|
+
*seconds = self->seconds;
|
147
|
+
}
|
148
|
+
}
|
149
|
+
|
150
|
+
%define MAKE_ACCESSOR(name, type)
|
151
|
+
%rename(%str(name ## =)) set_ ## name;
|
152
|
+
type set_ ## name (const type &v) {
|
153
|
+
return self->name = v;
|
154
|
+
}
|
155
|
+
%rename(%str(name)) get_ ## name;
|
156
|
+
const type &get_ ## name () const {
|
157
|
+
return self->name;
|
158
|
+
}
|
159
|
+
%enddef
|
160
|
+
|
161
|
+
%define MAKE_VECTOR2ARRAY(type)
|
162
|
+
%typemap(out) std::vector<type> {
|
163
|
+
#if defined(SWIGRUBY)
|
164
|
+
$result = rb_ary_new();
|
165
|
+
#endif
|
166
|
+
for($1_type::const_iterator it($1.begin()), it_end($1.end());
|
167
|
+
it != it_end; ++it){
|
168
|
+
%append_output(SWIG_From(type)(*it));
|
169
|
+
}
|
170
|
+
}
|
171
|
+
%enddef
|
172
|
+
|
173
|
+
%inline %{
|
174
|
+
template <class FloatT>
|
175
|
+
struct GPS_Ionospheric_UTC_Parameters : public GPS_SpaceNode<FloatT>::Ionospheric_UTC_Parameters {};
|
176
|
+
%}
|
177
|
+
%extend GPS_Ionospheric_UTC_Parameters {
|
178
|
+
%fragment(SWIG_Traits_frag(FloatT));
|
179
|
+
%typemap(in,numinputs=0) FloatT values[4] (FloatT temp[4]) %{
|
180
|
+
$1 = temp;
|
181
|
+
%}
|
182
|
+
%typemap(argout) FloatT values[4] {
|
183
|
+
for(int i(0); i < 4; ++i){
|
184
|
+
%append_output(swig::from($1[i]));
|
185
|
+
}
|
186
|
+
}
|
187
|
+
%typemap(in) const FloatT values[4] (FloatT temp[4]) {
|
188
|
+
#ifdef SWIGRUBY
|
189
|
+
if(!(RB_TYPE_P($input, T_ARRAY) && (RARRAY_LEN($input) == 4))){
|
190
|
+
SWIG_exception(SWIG_TypeError, "array[4] is expected");
|
191
|
+
}
|
192
|
+
for(int i(0); i < 4; ++i){
|
193
|
+
SWIG_Object obj(RARRAY_AREF($input, i));
|
194
|
+
if(!SWIG_IsOK(swig::asval(obj, &temp[i]))){
|
195
|
+
SWIG_exception(SWIG_TypeError, "$*1_ltype is expected");
|
196
|
+
}
|
197
|
+
}
|
198
|
+
#endif
|
199
|
+
$1 = temp;
|
200
|
+
}
|
201
|
+
%typemap(in) const unsigned int *buf (unsigned int temp[10]) {
|
202
|
+
#ifdef SWIGRUBY
|
203
|
+
if((!RB_TYPE_P($input, T_ARRAY))
|
204
|
+
|| (RARRAY_LEN($input) < sizeof(temp) / sizeof(temp[0]))){
|
205
|
+
SWIG_exception(SWIG_TypeError, "array is expected, or too short array");
|
206
|
+
}
|
207
|
+
$1 = temp;
|
208
|
+
for(int i(0); i < sizeof(temp) / sizeof(temp[0]); ++i){
|
209
|
+
if(!SWIG_IsOK(SWIG_AsVal(unsigned int)(RARRAY_AREF($input, i), &($1[i])))){
|
210
|
+
SWIG_exception(SWIG_TypeError, "$*1_ltype is expected");
|
211
|
+
}
|
212
|
+
}
|
213
|
+
#endif
|
214
|
+
}
|
215
|
+
%rename("alpha=") set_alpha;
|
216
|
+
void set_alpha(const FloatT values[4]){
|
217
|
+
for(int i(0); i < 4; ++i){
|
218
|
+
self->alpha[i] = values[i];
|
219
|
+
}
|
220
|
+
}
|
221
|
+
%rename("alpha") get_alpha;
|
222
|
+
void get_alpha(FloatT values[4]) const {
|
223
|
+
for(int i(0); i < 4; ++i){
|
224
|
+
values[i] = self->alpha[i];
|
225
|
+
}
|
226
|
+
}
|
227
|
+
%rename("beta=") set_beta;
|
228
|
+
void set_beta(const FloatT values[4]){
|
229
|
+
for(int i(0); i < 4; ++i){
|
230
|
+
self->beta[i] = values[i];
|
231
|
+
}
|
232
|
+
}
|
233
|
+
%rename("beta") get_beta;
|
234
|
+
void get_beta(FloatT values[4]) const {
|
235
|
+
for(int i(0); i < 4; ++i){
|
236
|
+
values[i] = self->beta[i];
|
237
|
+
}
|
238
|
+
}
|
239
|
+
MAKE_ACCESSOR(A1, FloatT);
|
240
|
+
MAKE_ACCESSOR(A0, FloatT);
|
241
|
+
MAKE_ACCESSOR(t_ot, unsigned int);
|
242
|
+
MAKE_ACCESSOR(WN_t, unsigned int);
|
243
|
+
MAKE_ACCESSOR(delta_t_LS, int);
|
244
|
+
MAKE_ACCESSOR(WN_LSF, unsigned int);
|
245
|
+
MAKE_ACCESSOR(DN, unsigned int);
|
246
|
+
MAKE_ACCESSOR(delta_t_LSF, int);
|
247
|
+
static GPS_Ionospheric_UTC_Parameters<FloatT> parse(const unsigned int *buf){
|
248
|
+
typedef typename GPS_SpaceNode<FloatT>
|
249
|
+
::template BroadcastedMessage<unsigned int, 30> parser_t;
|
250
|
+
if((parser_t::subframe_id(buf) != 4) || (parser_t::sv_page_id(buf) != 56)){
|
251
|
+
throw std::runtime_error("Not valid data");
|
252
|
+
}
|
253
|
+
typename GPS_SpaceNode<FloatT>::Ionospheric_UTC_Parameters::raw_t raw;
|
254
|
+
raw.template update<2, 0>(buf);
|
255
|
+
GPS_Ionospheric_UTC_Parameters<FloatT> res;
|
256
|
+
(typename GPS_SpaceNode<FloatT>::Ionospheric_UTC_Parameters &)res = raw;
|
257
|
+
return res;
|
258
|
+
}
|
259
|
+
}
|
260
|
+
|
261
|
+
%inline %{
|
262
|
+
template <class FloatT>
|
263
|
+
struct GPS_Ephemeris : public GPS_SpaceNode<FloatT>::SatelliteProperties::Ephemeris {
|
264
|
+
int iode_subframe3;
|
265
|
+
void invalidate() {
|
266
|
+
this->iodc = this->iode = iode_subframe3 = -1;
|
267
|
+
}
|
268
|
+
bool is_consistent() const {
|
269
|
+
return !((this->iodc < 0)
|
270
|
+
|| (this->iode != this->iode_subframe3)
|
271
|
+
|| ((this->iodc & 0xFF) != this->iode));
|
272
|
+
}
|
273
|
+
GPS_Ephemeris() : GPS_SpaceNode<FloatT>::SatelliteProperties::Ephemeris() {
|
274
|
+
invalidate();
|
275
|
+
}
|
276
|
+
GPS_Ephemeris(const typename GPS_SpaceNode<FloatT>::SatelliteProperties::Ephemeris &eph)
|
277
|
+
: GPS_SpaceNode<FloatT>::SatelliteProperties::Ephemeris(eph),
|
278
|
+
iode_subframe3(eph.iode) {}
|
279
|
+
};
|
280
|
+
%}
|
281
|
+
%extend GPS_Ephemeris {
|
282
|
+
MAKE_ACCESSOR(svid, unsigned int);
|
283
|
+
|
284
|
+
MAKE_ACCESSOR(WN, unsigned int);
|
285
|
+
MAKE_ACCESSOR(URA, int);
|
286
|
+
MAKE_ACCESSOR(SV_health, unsigned int);
|
287
|
+
MAKE_ACCESSOR(iodc, int);
|
288
|
+
MAKE_ACCESSOR(t_GD, FloatT);
|
289
|
+
MAKE_ACCESSOR(t_oc, FloatT);
|
290
|
+
MAKE_ACCESSOR(a_f2, FloatT);
|
291
|
+
MAKE_ACCESSOR(a_f1, FloatT);
|
292
|
+
MAKE_ACCESSOR(a_f0, FloatT);
|
293
|
+
|
294
|
+
MAKE_ACCESSOR(iode, int);
|
295
|
+
MAKE_ACCESSOR(c_rs, FloatT);
|
296
|
+
MAKE_ACCESSOR(delta_n, FloatT);
|
297
|
+
MAKE_ACCESSOR(M0, FloatT);
|
298
|
+
MAKE_ACCESSOR(c_uc, FloatT);
|
299
|
+
MAKE_ACCESSOR(e, FloatT);
|
300
|
+
MAKE_ACCESSOR(c_us, FloatT);
|
301
|
+
MAKE_ACCESSOR(sqrt_A, FloatT);
|
302
|
+
MAKE_ACCESSOR(t_oe, FloatT);
|
303
|
+
MAKE_ACCESSOR(fit_interval, FloatT);
|
304
|
+
|
305
|
+
MAKE_ACCESSOR(c_ic, FloatT);
|
306
|
+
MAKE_ACCESSOR(Omega0, FloatT);
|
307
|
+
MAKE_ACCESSOR(c_is, FloatT);
|
308
|
+
MAKE_ACCESSOR(i0, FloatT);
|
309
|
+
MAKE_ACCESSOR(c_rc, FloatT);
|
310
|
+
MAKE_ACCESSOR(omega, FloatT);
|
311
|
+
MAKE_ACCESSOR(dot_Omega0, FloatT);
|
312
|
+
MAKE_ACCESSOR(dot_i0, FloatT);
|
313
|
+
%typemap(in) const unsigned int *buf (unsigned int temp[10]) {
|
314
|
+
#ifdef SWIGRUBY
|
315
|
+
if((!RB_TYPE_P($input, T_ARRAY))
|
316
|
+
|| (RARRAY_LEN($input) < sizeof(temp) / sizeof(temp[0]))){
|
317
|
+
SWIG_exception(SWIG_TypeError, "array is expected, or too short array");
|
318
|
+
}
|
319
|
+
$1 = temp;
|
320
|
+
for(int i(0); i < sizeof(temp) / sizeof(temp[0]); ++i){
|
321
|
+
if(!SWIG_IsOK(SWIG_AsVal(unsigned int)(RARRAY_AREF($input, i), &($1[i])))){
|
322
|
+
SWIG_exception(SWIG_TypeError, "$*1_ltype is expected");
|
323
|
+
}
|
324
|
+
}
|
325
|
+
#endif
|
326
|
+
}
|
327
|
+
%apply int *OUTPUT { int *subframe_no, int *iodc_or_iode };
|
328
|
+
void parse(const unsigned int *buf, int *subframe_no, int *iodc_or_iode){
|
329
|
+
typedef typename GPS_SpaceNode<FloatT>::SatelliteProperties::Ephemeris eph_t;
|
330
|
+
typename eph_t::raw_t raw;
|
331
|
+
eph_t eph;
|
332
|
+
*subframe_no = GPS_SpaceNode<FloatT>
|
333
|
+
::template BroadcastedMessage<unsigned int, 30>
|
334
|
+
::subframe_id(buf);
|
335
|
+
*iodc_or_iode = -1;
|
336
|
+
switch(*subframe_no){
|
337
|
+
case 1:
|
338
|
+
*iodc_or_iode = raw.template update_subframe1<2, 0>(buf);
|
339
|
+
eph = raw;
|
340
|
+
self->WN = eph.WN;
|
341
|
+
self->URA = eph.URA;
|
342
|
+
self->SV_health = eph.SV_health;
|
343
|
+
self->iodc = eph.iodc;
|
344
|
+
self->t_GD = eph.t_GD;
|
345
|
+
self->t_oc = eph.t_oc;
|
346
|
+
self->a_f2 = eph.a_f2;
|
347
|
+
self->a_f1 = eph.a_f1;
|
348
|
+
self->a_f0 = eph.a_f0;
|
349
|
+
break;
|
350
|
+
case 2:
|
351
|
+
*iodc_or_iode = raw.template update_subframe2<2, 0>(buf);
|
352
|
+
eph = raw;
|
353
|
+
self->iode = eph.iode;
|
354
|
+
self->c_rs = eph.c_rs;
|
355
|
+
self->delta_n = eph.delta_n;
|
356
|
+
self->M0 = eph.M0;
|
357
|
+
self->c_uc = eph.c_uc;
|
358
|
+
self->e = eph.e;
|
359
|
+
self->c_us = eph.c_us;
|
360
|
+
self->sqrt_A = eph.sqrt_A;
|
361
|
+
self->t_oe = eph.t_oe;
|
362
|
+
self->fit_interval = eph_t::raw_t::fit_interval(raw.fit_interval_flag, self->iodc);
|
363
|
+
break;
|
364
|
+
case 3:
|
365
|
+
*iodc_or_iode = self->iode_subframe3 = raw.template update_subframe3<2, 0>(buf);
|
366
|
+
eph = raw;
|
367
|
+
self->c_ic = eph.c_ic;
|
368
|
+
self->Omega0 = eph.Omega0;
|
369
|
+
self->c_is = eph.c_is;
|
370
|
+
self->i0 = eph.i0;
|
371
|
+
self->c_rc = eph.c_rc;
|
372
|
+
self->omega = eph.omega;
|
373
|
+
self->dot_Omega0 = eph.dot_Omega0;
|
374
|
+
self->dot_i0 = eph.dot_i0;
|
375
|
+
break;
|
376
|
+
}
|
377
|
+
}
|
378
|
+
%typemap(in,numinputs=0) System_XYZ<FloatT, WGS84> & (System_XYZ<FloatT, WGS84> temp) %{
|
379
|
+
$1 = &temp;
|
380
|
+
%}
|
381
|
+
%typemap(argout) System_XYZ<FloatT, WGS84> & {
|
382
|
+
%append_output(SWIG_NewPointerObj((new $*1_ltype(*$1)), $1_descriptor, SWIG_POINTER_OWN));
|
383
|
+
}
|
384
|
+
void constellation(
|
385
|
+
System_XYZ<FloatT, WGS84> &position, System_XYZ<FloatT, WGS84> &velocity,
|
386
|
+
const GPS_Time<FloatT> &t, const FloatT &pseudo_range = 0,
|
387
|
+
const bool &with_velocity = true) const {
|
388
|
+
typename GPS_SpaceNode<FloatT>::SatelliteProperties::constellation_t res(
|
389
|
+
self->constellation(t, pseudo_range, with_velocity));
|
390
|
+
position = res.position;
|
391
|
+
velocity = res.velocity;
|
392
|
+
}
|
393
|
+
#if defined(SWIGRUBY)
|
394
|
+
%rename("consistent?") is_consistent;
|
395
|
+
#endif
|
396
|
+
}
|
397
|
+
|
398
|
+
%extend GPS_SpaceNode {
|
399
|
+
%fragment(SWIG_Traits_frag(FloatT));
|
400
|
+
%typemap(out) const Ionospheric_UTC_Parameters & {
|
401
|
+
%set_output(SWIG_NewPointerObj(
|
402
|
+
%reinterpret_cast($1, GPS_Ionospheric_UTC_Parameters<FloatT> *),
|
403
|
+
$descriptor(GPS_Ionospheric_UTC_Parameters<FloatT> *), 0));
|
404
|
+
}
|
405
|
+
%ignore satellites() const;
|
406
|
+
%ignore satellite(const int &);
|
407
|
+
void register_ephemeris(
|
408
|
+
const int &prn, const GPS_Ephemeris<FloatT> &eph,
|
409
|
+
const int &priority_delta = 1){
|
410
|
+
self->satellite(prn).register_ephemeris(eph, priority_delta);
|
411
|
+
}
|
412
|
+
GPS_Ephemeris<FloatT> ephemeris(const int &prn) const {
|
413
|
+
return GPS_Ephemeris<FloatT>(
|
414
|
+
%const_cast(self, GPS_SpaceNode<FloatT> *)->satellite(prn).ephemeris());
|
415
|
+
}
|
416
|
+
%typemap(out) pierce_point_res_t {
|
417
|
+
%append_output(swig::from($1.latitude));
|
418
|
+
%append_output(swig::from($1.longitude));
|
419
|
+
}
|
420
|
+
%ignore iono_correction() const;
|
421
|
+
%ignore tropo_correction() const;
|
422
|
+
int read(const char *fname) {
|
423
|
+
std::fstream fin(fname, std::ios::in | std::ios::binary);
|
424
|
+
return RINEX_NAV_Reader<FloatT>::read_all(fin, *self);
|
425
|
+
}
|
426
|
+
}
|
427
|
+
|
428
|
+
%include navigation/GPS.h
|
429
|
+
|
430
|
+
%extend GPS_User_PVT {
|
431
|
+
%ignore solver_t;
|
432
|
+
%ignore base_t;
|
433
|
+
%ignore proxy_t;
|
434
|
+
%ignore linear_solver;
|
435
|
+
%ignore GPS_User_PVT(const base_t &);
|
436
|
+
MAKE_VECTOR2ARRAY(int);
|
437
|
+
#ifdef SWIGRUBY
|
438
|
+
%rename("position_solved?") position_solved;
|
439
|
+
%rename("velocity_solved?") velocity_solved;
|
440
|
+
#endif
|
441
|
+
%fragment(SWIG_Traits_frag(FloatT));
|
442
|
+
%typemap(in, numinputs=0) const typename base_t::detection_t ** (typename base_t::detection_t *temp) {
|
443
|
+
$1 = &temp;
|
444
|
+
}
|
445
|
+
%typemap(argout) const typename base_t::detection_t ** {
|
446
|
+
if((*$1)->valid){
|
447
|
+
%append_output(swig::from((*$1)->wssr));
|
448
|
+
%append_output(swig::from((*$1)->wssr_sf));
|
449
|
+
%append_output(swig::from((*$1)->weight_max));
|
450
|
+
%append_output(swig::from((*$1)->slope_HV[0].max));
|
451
|
+
%append_output(SWIG_From(int)(((*$1)->slope_HV[0].prn)));
|
452
|
+
%append_output(swig::from((*$1)->slope_HV[1].max));
|
453
|
+
%append_output(SWIG_From(int)(((*$1)->slope_HV[1].prn)));
|
454
|
+
}
|
455
|
+
}
|
456
|
+
%typemap(in, numinputs=0) const typename base_t::exclusion_t ** (typename base_t::exclusion_t *temp) {
|
457
|
+
$1 = &temp;
|
458
|
+
}
|
459
|
+
%typemap(argout) const typename base_t::exclusion_t ** {
|
460
|
+
if((*$1)->valid){
|
461
|
+
%append_output(SWIG_From(int)(((*$1)->excluded)));
|
462
|
+
%append_output(SWIG_NewPointerObj(
|
463
|
+
(new System_XYZ<FloatT, WGS84>((*$1)->user_position.xyz)),
|
464
|
+
$descriptor(System_XYZ<FloatT, WGS84>), SWIG_POINTER_OWN));
|
465
|
+
%append_output(SWIG_NewPointerObj(
|
466
|
+
(new System_LLH<FloatT, WGS84>((*$1)->user_position.llh)),
|
467
|
+
$descriptor(System_LLH<FloatT, WGS84>), SWIG_POINTER_OWN));
|
468
|
+
}
|
469
|
+
}
|
470
|
+
}
|
471
|
+
%inline %{
|
472
|
+
template <class FloatT>
|
473
|
+
struct GPS_User_PVT
|
474
|
+
: protected GPS_Solver_RAIM_LSR<FloatT,
|
475
|
+
GPS_Solver_Base_Debug<FloatT, GPS_Solver_Base<FloatT> > >::user_pvt_t {
|
476
|
+
typedef GPS_Solver_RAIM_LSR<FloatT,
|
477
|
+
GPS_Solver_Base_Debug<FloatT, GPS_Solver_Base<FloatT> > > solver_t;
|
478
|
+
typedef typename solver_t::user_pvt_t base_t;
|
479
|
+
GPS_User_PVT() : base_t() {}
|
480
|
+
GPS_User_PVT(const base_t &base) : base_t(base) {}
|
481
|
+
enum {
|
482
|
+
ERROR_NO = 0,
|
483
|
+
ERROR_UNSOLVED,
|
484
|
+
ERROR_INVALID_IONO_MODEL,
|
485
|
+
ERROR_INSUFFICIENT_SATELLITES,
|
486
|
+
ERROR_POSITION_LS,
|
487
|
+
ERROR_POSITION_NOT_CONVERGED,
|
488
|
+
ERROR_DOP,
|
489
|
+
ERROR_VELOCITY_SKIPPED,
|
490
|
+
ERROR_VELOCITY_INSUFFICIENT_SATELLITES,
|
491
|
+
ERROR_VELOCITY_LS,
|
492
|
+
};
|
493
|
+
int error_code() const {return (int)(base_t::error_code);}
|
494
|
+
const GPS_Time<FloatT> &receiver_time() const {return base_t::receiver_time;}
|
495
|
+
const System_XYZ<FloatT, WGS84> &xyz() const {return base_t::user_position.xyz;}
|
496
|
+
const System_LLH<FloatT, WGS84> &llh() const {return base_t::user_position.llh;}
|
497
|
+
const FloatT &receiver_error() const {return base_t::receiver_error;}
|
498
|
+
const System_ENU<FloatT, WGS84> &velocity() const {return base_t::user_velocity_enu;}
|
499
|
+
const FloatT &receiver_error_rate() const {return base_t::receiver_error_rate;}
|
500
|
+
const FloatT &gdop() const {return base_t::dop.g;}
|
501
|
+
const FloatT &pdop() const {return base_t::dop.p;}
|
502
|
+
const FloatT &hdop() const {return base_t::dop.h;}
|
503
|
+
const FloatT &vdop() const {return base_t::dop.v;}
|
504
|
+
const FloatT &tdop() const {return base_t::dop.t;}
|
505
|
+
const unsigned int &used_satellites() const {return base_t::used_satellites;}
|
506
|
+
std::vector<int> used_satellite_list() const {return base_t::used_satellite_mask.indices_one();}
|
507
|
+
bool position_solved() const {return base_t::position_solved();}
|
508
|
+
bool velocity_solved() const {return base_t::velocity_solved();}
|
509
|
+
|
510
|
+
const Matrix_Frozen<FloatT, Array2D_Dense<FloatT> > &G() const {return base_t::G;}
|
511
|
+
const Matrix_Frozen<FloatT, Array2D_Dense<FloatT> > &W() const {return base_t::W;}
|
512
|
+
const Matrix_Frozen<FloatT, Array2D_Dense<FloatT> > &delta_r() const {return base_t::delta_r;}
|
513
|
+
struct proxy_t : public solver_t {
|
514
|
+
typedef typename solver_t
|
515
|
+
::template linear_solver_t<Matrix<FloatT, Array2D_Dense<FloatT> > >
|
516
|
+
linear_solver_t;
|
517
|
+
};
|
518
|
+
Matrix<FloatT, Array2D_Dense<FloatT> > G_enu() const {
|
519
|
+
return proxy_t::linear_solver_t::rotate_G(base_t::G, base_t::user_position.ecef2enu());
|
520
|
+
}
|
521
|
+
typename proxy_t::linear_solver_t linear_solver() const {
|
522
|
+
return typename proxy_t::linear_solver_t(base_t::G, base_t::W, base_t::delta_r);
|
523
|
+
}
|
524
|
+
Matrix<FloatT, Array2D_Dense<FloatT> > C() const {
|
525
|
+
return linear_solver().C();
|
526
|
+
}
|
527
|
+
Matrix<FloatT, Array2D_Dense<FloatT> > C_enu() const {
|
528
|
+
return proxy_t::linear_solver_t::rotate_C(C(), base_t::user_position.ecef2enu());
|
529
|
+
}
|
530
|
+
Matrix<FloatT, Array2D_Dense<FloatT> > S() const {
|
531
|
+
Matrix<FloatT, Array2D_Dense<FloatT> > res;
|
532
|
+
linear_solver().least_square(res);
|
533
|
+
return res;
|
534
|
+
}
|
535
|
+
Matrix<FloatT, Array2D_Dense<FloatT> > S_enu() const {
|
536
|
+
return proxy_t::linear_solver_t::rotate_S(S(), base_t::user_position.ecef2enu());
|
537
|
+
}
|
538
|
+
Matrix<FloatT, Array2D_Dense<FloatT> > slope_HV() const {
|
539
|
+
return linear_solver().slope_HV(S());
|
540
|
+
}
|
541
|
+
Matrix<FloatT, Array2D_Dense<FloatT> > slope_HV_enu() const {
|
542
|
+
return linear_solver().slope_HV(S(), base_t::user_position.ecef2enu());
|
543
|
+
}
|
544
|
+
|
545
|
+
void fd(const typename base_t::detection_t **out) const {*out = &(base_t::FD);}
|
546
|
+
void fde_min(
|
547
|
+
const typename base_t::detection_t **out0,
|
548
|
+
const typename base_t::exclusion_t **out1) const {
|
549
|
+
*out0 = *out1 = &(base_t::FDE_min);
|
550
|
+
}
|
551
|
+
void fde_2nd(
|
552
|
+
const typename base_t::detection_t **out0,
|
553
|
+
const typename base_t::exclusion_t **out1) const {
|
554
|
+
*out0 = *out1 = &(base_t::FDE_2nd);
|
555
|
+
}
|
556
|
+
};
|
557
|
+
%}
|
558
|
+
|
559
|
+
%extend GPS_Measurement {
|
560
|
+
%ignore items_t;
|
561
|
+
%ignore items;
|
562
|
+
%exception each {
|
563
|
+
#ifdef SWIGRUBY
|
564
|
+
if(!rb_block_given_p()){
|
565
|
+
return rb_enumeratorize(self, ID2SYM(rb_intern("each")), argc, argv);
|
566
|
+
}
|
567
|
+
#endif
|
568
|
+
try {
|
569
|
+
$action
|
570
|
+
} catch (const native_exception &e) {
|
571
|
+
e.regenerate();
|
572
|
+
SWIG_fail;
|
573
|
+
} catch (const std::exception& e) {
|
574
|
+
SWIG_exception_fail(SWIG_RuntimeError, e.what());
|
575
|
+
}
|
576
|
+
}
|
577
|
+
%fragment(SWIG_Traits_frag(FloatT));
|
578
|
+
void each() const {
|
579
|
+
for(typename GPS_Measurement<FloatT>::items_t::const_iterator
|
580
|
+
it(self->items.begin()), it_end(self->items.end());
|
581
|
+
it != it_end; ++it){
|
582
|
+
for(typename GPS_Measurement<FloatT>::items_t::mapped_type::const_iterator
|
583
|
+
it2(it->second.begin()), it2_end(it->second.end());
|
584
|
+
it2 != it2_end; ++it2){
|
585
|
+
#ifdef SWIGRUBY
|
586
|
+
VALUE values[] = {
|
587
|
+
SWIG_From(int)(it->first),
|
588
|
+
SWIG_From(int)(it2->first),
|
589
|
+
swig::from(it2->second)
|
590
|
+
};
|
591
|
+
yield_throw_if_error(3, values);
|
592
|
+
#endif
|
593
|
+
}
|
594
|
+
}
|
595
|
+
}
|
596
|
+
#ifdef SWIGRUBY
|
597
|
+
VALUE to_hash() const {
|
598
|
+
VALUE res(rb_hash_new());
|
599
|
+
for(typename GPS_Measurement<FloatT>::items_t::const_iterator
|
600
|
+
it(self->items.begin()), it_end(self->items.end());
|
601
|
+
it != it_end; ++it){
|
602
|
+
VALUE per_sat(rb_hash_new());
|
603
|
+
rb_hash_aset(res, SWIG_From(int)(it->first), per_sat);
|
604
|
+
for(typename GPS_Measurement<FloatT>::items_t::mapped_type::const_iterator
|
605
|
+
it2(it->second.begin()), it2_end(it->second.end());
|
606
|
+
it2 != it2_end; ++it2){
|
607
|
+
rb_hash_aset(per_sat, SWIG_From(int)(it2->first), swig::from(it2->second));
|
608
|
+
}
|
609
|
+
}
|
610
|
+
return res;
|
611
|
+
}
|
612
|
+
#endif
|
613
|
+
%fragment(SWIG_Traits_frag(GPS_Measurement<FloatT>), "header",
|
614
|
+
fragment=SWIG_Traits_frag(FloatT)){
|
615
|
+
namespace swig {
|
616
|
+
template <>
|
617
|
+
bool check<GPS_Measurement<FloatT> >(SWIG_Object obj) {
|
618
|
+
#ifdef SWIGRUBY
|
619
|
+
return RB_TYPE_P(obj, T_ARRAY) || RB_TYPE_P(obj, T_HASH);
|
620
|
+
#else
|
621
|
+
return false;
|
622
|
+
#endif
|
623
|
+
}
|
624
|
+
template <>
|
625
|
+
int asval(SWIG_Object obj, GPS_Measurement<FloatT> *val) {
|
626
|
+
#ifdef SWIGRUBY
|
627
|
+
if(RB_TYPE_P(obj, T_ARRAY)){
|
628
|
+
int i(0), i_end(RARRAY_LEN(obj));
|
629
|
+
VALUE values;
|
630
|
+
for(; i < i_end; ++i){
|
631
|
+
values = RARRAY_AREF(obj, i);
|
632
|
+
if((!RB_TYPE_P(values, T_ARRAY)) || (RARRAY_LEN(values) < 3)){
|
633
|
+
break;
|
634
|
+
}
|
635
|
+
int prn, key;
|
636
|
+
FloatT v;
|
637
|
+
if((!SWIG_IsOK(SWIG_AsVal(int)(RARRAY_AREF(values, 0), &prn)))
|
638
|
+
|| (!SWIG_IsOK(SWIG_AsVal(int)(RARRAY_AREF(values, 1), &key)))
|
639
|
+
|| (!SWIG_IsOK(swig::asval(RARRAY_AREF(values, 2), &v)))){
|
640
|
+
break;
|
641
|
+
}
|
642
|
+
val->add(prn, key, v);
|
643
|
+
}
|
644
|
+
if(i < i_end){
|
645
|
+
SWIG_exception(SWIG_TypeError,
|
646
|
+
std::string("Unexpected input [").append(std::to_string(i)).append("]: ")
|
647
|
+
.append(inspect_str(values)).c_str());
|
648
|
+
}
|
649
|
+
return SWIG_OK;
|
650
|
+
}else if(RB_TYPE_P(obj, T_HASH)){
|
651
|
+
struct arg_t {
|
652
|
+
GPS_Measurement<FloatT> *meas;
|
653
|
+
int prn;
|
654
|
+
static int iter2(VALUE v_k, VALUE v_v, VALUE v_arg){
|
655
|
+
int k;
|
656
|
+
FloatT v;
|
657
|
+
arg_t *arg(reinterpret_cast<arg_t *>(v_arg));
|
658
|
+
if((!SWIG_IsOK(SWIG_AsVal(int)(v_k, &k)))
|
659
|
+
|| (!SWIG_IsOK(swig::asval(v_v, &v)))){
|
660
|
+
SWIG_exception(SWIG_TypeError,
|
661
|
+
std::string("Unexpected input @ PRN").append(std::to_string(arg->prn)).append(": [")
|
662
|
+
.append(inspect_str(v_k)).append(", ")
|
663
|
+
.append(inspect_str(v_v)).append("]").c_str());
|
664
|
+
}
|
665
|
+
arg->meas->add(arg->prn, k, v);
|
666
|
+
return ST_CONTINUE;
|
667
|
+
}
|
668
|
+
static int iter1(VALUE v_prn, VALUE v_key_value, VALUE v_arg){
|
669
|
+
arg_t *arg(reinterpret_cast<arg_t *>(v_arg));
|
670
|
+
if((!RB_TYPE_P(v_key_value, T_HASH))
|
671
|
+
|| (!SWIG_IsOK(SWIG_AsVal(int)(v_prn, &(arg->prn))))){
|
672
|
+
SWIG_exception(SWIG_TypeError,
|
673
|
+
std::string("Unexpected input @ {")
|
674
|
+
.append(inspect_str(v_prn)).append(" => ")
|
675
|
+
.append(inspect_str(v_key_value)).append("}").c_str());
|
676
|
+
}
|
677
|
+
rb_hash_foreach(v_key_value,
|
678
|
+
#if RUBY_API_VERSION < 20700
|
679
|
+
// @see https://docs.ruby-lang.org/ja/latest/doc/news=2f2_7_0.html
|
680
|
+
(int (*)(ANYARGS))
|
681
|
+
#endif
|
682
|
+
arg_t::iter2, v_arg);
|
683
|
+
return ST_CONTINUE;
|
684
|
+
}
|
685
|
+
} arg = {val};
|
686
|
+
rb_hash_foreach(obj,
|
687
|
+
#if RUBY_API_VERSION < 20700
|
688
|
+
(int (*)(ANYARGS))
|
689
|
+
#endif
|
690
|
+
arg_t::iter1, reinterpret_cast<VALUE>(&arg));
|
691
|
+
return SWIG_OK;
|
692
|
+
}
|
693
|
+
#endif
|
694
|
+
return SWIG_ERROR;
|
695
|
+
}
|
696
|
+
}
|
697
|
+
}
|
698
|
+
%fragment(SWIG_Traits_frag(GPS_Measurement<FloatT>));
|
699
|
+
%typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER) const GPS_Measurement<FloatT> & {
|
700
|
+
$1 = SWIG_CheckState(SWIG_ConvertPtr($input, (void **)0, $1_descriptor, 0))
|
701
|
+
|| swig::check<GPS_Measurement<FloatT> >($input);
|
702
|
+
}
|
703
|
+
%typemap(in) const GPS_Measurement<FloatT> & (GPS_Measurement<FloatT> temp) {
|
704
|
+
if((!SWIG_IsOK(SWIG_ConvertPtr($input, (void **)&$1, $1_descriptor, 0)))
|
705
|
+
&& (!SWIG_IsOK(swig::asval($input, ($1 = &temp))))){
|
706
|
+
SWIG_exception(SWIG_TypeError, "in method '$symname', expecting type $*1_ltype");
|
707
|
+
}
|
708
|
+
}
|
709
|
+
}
|
710
|
+
%copyctor GPS_Measurement;
|
711
|
+
#ifdef SWIGRUBY
|
712
|
+
%mixin GPS_Measurement "Enumerable";
|
713
|
+
#endif
|
714
|
+
%inline {
|
715
|
+
template <class FloatT>
|
716
|
+
struct GPS_Measurement {
|
717
|
+
typedef std::map<int, std::map<int, FloatT> > items_t;
|
718
|
+
items_t items;
|
719
|
+
enum {
|
720
|
+
L1_PSEUDORANGE,
|
721
|
+
L1_DOPPLER,
|
722
|
+
L1_CARRIER_PHASE,
|
723
|
+
L1_RANGE_RATE,
|
724
|
+
L1_PSEUDORANGE_SIGMA,
|
725
|
+
L1_DOPPLER_SIGMA,
|
726
|
+
L1_CARRIER_PHASE_SIGMA,
|
727
|
+
L1_RANGE_RATE_SIGMA,
|
728
|
+
L1_SIGNAL_STRENGTH_dBHz,
|
729
|
+
L1_LOCK_SEC,
|
730
|
+
ITEMS_PREDEFINED,
|
731
|
+
};
|
732
|
+
void add(const int &prn, const int &key, const FloatT &value){
|
733
|
+
items[prn][key] = value;
|
734
|
+
}
|
735
|
+
};
|
736
|
+
}
|
737
|
+
|
738
|
+
%extend GPS_SolverOptions {
|
739
|
+
%ignore base_t;
|
740
|
+
MAKE_ACCESSOR(elevation_mask, FloatT);
|
741
|
+
MAKE_ACCESSOR(residual_mask, FloatT);
|
742
|
+
MAKE_ACCESSOR(f_10_7, FloatT);
|
743
|
+
MAKE_VECTOR2ARRAY(int);
|
744
|
+
#ifdef SWIGRUBY
|
745
|
+
%rename("ionospheric_models=") set_ionospheric_models;
|
746
|
+
%rename("ionospheric_models") get_ionospheric_models;
|
747
|
+
#endif
|
748
|
+
%typemap(in) const std::vector<int> &models (std::vector<int> temp) {
|
749
|
+
$1 = &temp;
|
750
|
+
#ifdef SWIGRUBY
|
751
|
+
if(RB_TYPE_P($input, T_ARRAY)){
|
752
|
+
for(int i(0), i_max(RARRAY_LEN($input)); i < i_max; ++i){
|
753
|
+
SWIG_Object obj(RARRAY_AREF($input, i));
|
754
|
+
int v;
|
755
|
+
if(SWIG_IsOK(SWIG_AsVal(int)(obj, &v))){
|
756
|
+
temp.push_back(v);
|
757
|
+
}else{
|
758
|
+
SWIG_exception(SWIG_TypeError, "$*1_ltype is expected");
|
759
|
+
}
|
760
|
+
}
|
761
|
+
}
|
762
|
+
#endif
|
763
|
+
}
|
764
|
+
}
|
765
|
+
%inline %{
|
766
|
+
template <class FloatT>
|
767
|
+
struct GPS_SolverOptions : public GPS_SinglePositioning<FloatT>::options_t {
|
768
|
+
typedef typename GPS_SinglePositioning<FloatT>::options_t base_t;
|
769
|
+
void exclude(const int &prn){base_t::exclude_prn.set(prn);}
|
770
|
+
void include(const int &prn){base_t::exclude_prn.reset(prn);}
|
771
|
+
std::vector<int> excluded() const {return base_t::exclude_prn.excluded();}
|
772
|
+
enum {
|
773
|
+
IONOSPHERIC_KLOBUCHAR,
|
774
|
+
IONOSPHERIC_NTCM_GL,
|
775
|
+
IONOSPHERIC_NONE, // which allows no correction
|
776
|
+
IONOSPHERIC_MODELS,
|
777
|
+
IONOSPHERIC_SKIP = IONOSPHERIC_MODELS, // which means delegating the next slot
|
778
|
+
};
|
779
|
+
std::vector<int> get_ionospheric_models() const {
|
780
|
+
std::vector<int> res;
|
781
|
+
for(int i(0); i < base_t::IONOSPHERIC_MODELS; ++i){
|
782
|
+
int v((int)(base_t::ionospheric_models[i]));
|
783
|
+
if(v == base_t::IONOSPHERIC_SKIP){break;}
|
784
|
+
res.push_back(v);
|
785
|
+
}
|
786
|
+
return res;
|
787
|
+
}
|
788
|
+
std::vector<int> set_ionospheric_models(const std::vector<int> &models){
|
789
|
+
typedef typename base_t::ionospheric_model_t model_t;
|
790
|
+
for(int i(0), j(0), j_max(models.size()); i < model_t::IONOSPHERIC_MODELS; ++i){
|
791
|
+
model_t v(model_t::IONOSPHERIC_SKIP);
|
792
|
+
if(j < j_max){
|
793
|
+
if((models[j] >= 0) && (models[j] < model_t::IONOSPHERIC_SKIP)){
|
794
|
+
v = (model_t)models[j];
|
795
|
+
}
|
796
|
+
++j;
|
797
|
+
}
|
798
|
+
base_t::ionospheric_models[i] = v;
|
799
|
+
}
|
800
|
+
return get_ionospheric_models();
|
801
|
+
}
|
802
|
+
};
|
803
|
+
%}
|
804
|
+
|
805
|
+
%extend GPS_Solver {
|
806
|
+
%ignore super_t;
|
807
|
+
%ignore base_t;
|
808
|
+
%ignore gps_t;
|
809
|
+
%ignore gps;
|
810
|
+
%ignore select_solver;
|
811
|
+
%ignore relative_property;
|
812
|
+
%ignore satellite_position;
|
813
|
+
%ignore update_position_solution;
|
814
|
+
%immutable hooks;
|
815
|
+
%ignore mark;
|
816
|
+
%fragment("hook"{GPS_Solver<FloatT>}, "header",
|
817
|
+
fragment=SWIG_From_frag(int),
|
818
|
+
fragment=SWIG_Traits_frag(FloatT)){
|
819
|
+
template <>
|
820
|
+
typename GPS_Solver<FloatT>::base_t::relative_property_t
|
821
|
+
GPS_Solver<FloatT>::relative_property(
|
822
|
+
const typename GPS_Solver<FloatT>::base_t::prn_t &prn,
|
823
|
+
const typename GPS_Solver<FloatT>::base_t::measurement_t::mapped_type &measurement,
|
824
|
+
const typename GPS_Solver<FloatT>::base_t::float_t &receiver_error,
|
825
|
+
const typename GPS_Solver<FloatT>::base_t::gps_time_t &time_arrival,
|
826
|
+
const typename GPS_Solver<FloatT>::base_t::pos_t &usr_pos,
|
827
|
+
const typename GPS_Solver<FloatT>::base_t::xyz_t &usr_vel) const {
|
828
|
+
union {
|
829
|
+
typename base_t::relative_property_t prop;
|
830
|
+
FloatT values[7];
|
831
|
+
} res = {
|
832
|
+
select_solver(prn).relative_property(
|
833
|
+
prn, measurement, receiver_error, time_arrival,
|
834
|
+
usr_pos, usr_vel)};
|
835
|
+
#ifdef SWIGRUBY
|
836
|
+
do{
|
837
|
+
static const VALUE key(ID2SYM(rb_intern("relative_property")));
|
838
|
+
static const int prop_items(sizeof(res.values) / sizeof(res.values[0]));
|
839
|
+
VALUE hook(rb_hash_lookup(hooks, key));
|
840
|
+
if(NIL_P(hook)){break;}
|
841
|
+
VALUE values[] = {
|
842
|
+
SWIG_From(int)(prn), // prn
|
843
|
+
rb_ary_new_from_args(prop_items, // relative_property
|
844
|
+
swig::from(res.prop.weight),
|
845
|
+
swig::from(res.prop.range_corrected),
|
846
|
+
swig::from(res.prop.range_residual),
|
847
|
+
swig::from(res.prop.rate_relative_neg),
|
848
|
+
swig::from(res.prop.los_neg[0]),
|
849
|
+
swig::from(res.prop.los_neg[1]),
|
850
|
+
swig::from(res.prop.los_neg[2])),
|
851
|
+
swig::from(receiver_error), // receiver_error
|
852
|
+
SWIG_NewPointerObj( // time_arrival
|
853
|
+
new base_t::gps_time_t(time_arrival), $descriptor(GPS_Time<FloatT> *), SWIG_POINTER_OWN),
|
854
|
+
SWIG_NewPointerObj( // usr_pos.xyz
|
855
|
+
new base_t::xyz_t(usr_pos.xyz), $descriptor(System_XYZ<FloatT, WGS84> *), SWIG_POINTER_OWN),
|
856
|
+
SWIG_NewPointerObj( // usr_vel
|
857
|
+
new base_t::xyz_t(usr_vel), $descriptor(System_XYZ<FloatT, WGS84> *), SWIG_POINTER_OWN)};
|
858
|
+
VALUE res_hook(proc_call_throw_if_error(hook, sizeof(values) / sizeof(values[0]), values));
|
859
|
+
if((!RB_TYPE_P(res_hook, T_ARRAY))
|
860
|
+
|| (RARRAY_LEN(res_hook) != prop_items)){
|
861
|
+
throw std::runtime_error(
|
862
|
+
std::string("[d * ").append(std::to_string(prop_items))
|
863
|
+
.append("] is expected (d: " %str(FloatT) "), however ")
|
864
|
+
.append(inspect_str(res_hook)));
|
865
|
+
}
|
866
|
+
for(int i(0); i < prop_items; ++i){
|
867
|
+
VALUE v(RARRAY_AREF(res_hook, i));
|
868
|
+
if(!SWIG_IsOK(swig::asval(v, &res.values[i]))){
|
869
|
+
throw std::runtime_error(
|
870
|
+
std::string(%str(FloatT) " is exepcted, however ")
|
871
|
+
.append(inspect_str(v))
|
872
|
+
.append(" @ [").append(std::to_string(i)).append("]"));
|
873
|
+
}
|
874
|
+
}
|
875
|
+
}while(false);
|
876
|
+
#endif
|
877
|
+
return res.prop;
|
878
|
+
}
|
879
|
+
template <>
|
880
|
+
bool GPS_Solver<FloatT>::update_position_solution(
|
881
|
+
const typename GPS_Solver<FloatT>::base_t::geometric_matrices_t &geomat,
|
882
|
+
typename GPS_Solver<FloatT>::base_t::user_pvt_t &res) const {
|
883
|
+
#ifdef SWIGRUBY
|
884
|
+
do{
|
885
|
+
static const VALUE key(ID2SYM(rb_intern("update_position_solution")));
|
886
|
+
VALUE hook(rb_hash_lookup(hooks, key));
|
887
|
+
if(NIL_P(hook)){break;}
|
888
|
+
typename base_t::geometric_matrices_t &geomat_(
|
889
|
+
%const_cast(geomat, typename base_t::geometric_matrices_t &));
|
890
|
+
VALUE values[] = {
|
891
|
+
SWIG_NewPointerObj(&geomat_.G,
|
892
|
+
$descriptor(Matrix<FloatT, Array2D_Dense<FloatT>, MatrixViewBase<> > *), 0),
|
893
|
+
SWIG_NewPointerObj(&geomat_.W,
|
894
|
+
$descriptor(Matrix<FloatT, Array2D_Dense<FloatT>, MatrixViewBase<> > *), 0),
|
895
|
+
SWIG_NewPointerObj(&geomat_.delta_r,
|
896
|
+
$descriptor(Matrix<FloatT, Array2D_Dense<FloatT>, MatrixViewBase<> > *), 0)};
|
897
|
+
proc_call_throw_if_error(hook, sizeof(values) / sizeof(values[0]), values);
|
898
|
+
}while(false);
|
899
|
+
#endif
|
900
|
+
return super_t::update_position_solution(geomat, res);
|
901
|
+
}
|
902
|
+
}
|
903
|
+
%fragment("hook"{GPS_Solver<FloatT>});
|
904
|
+
}
|
905
|
+
%inline {
|
906
|
+
template <class FloatT>
|
907
|
+
struct GPS_Solver
|
908
|
+
: public GPS_Solver_RAIM_LSR<FloatT,
|
909
|
+
GPS_Solver_Base_Debug<FloatT, GPS_Solver_Base<FloatT> > > {
|
910
|
+
typedef GPS_Solver_RAIM_LSR<FloatT,
|
911
|
+
GPS_Solver_Base_Debug<FloatT, GPS_Solver_Base<FloatT> > > super_t;
|
912
|
+
typedef GPS_Solver_Base<FloatT> base_t;
|
913
|
+
struct gps_t {
|
914
|
+
GPS_SpaceNode<FloatT> space_node;
|
915
|
+
GPS_SolverOptions<FloatT> options;
|
916
|
+
GPS_SinglePositioning<FloatT> solver;
|
917
|
+
gps_t() : space_node(), options(), solver(space_node) {}
|
918
|
+
} gps;
|
919
|
+
SWIG_Object hooks;
|
920
|
+
#ifdef SWIGRUBY
|
921
|
+
static void mark(void *ptr){
|
922
|
+
GPS_Solver<FloatT> *solver = (GPS_Solver<FloatT> *)ptr;
|
923
|
+
if(solver->hooks == Qnil){return;}
|
924
|
+
rb_gc_mark(solver->hooks);
|
925
|
+
}
|
926
|
+
#endif
|
927
|
+
GPS_Solver() : super_t(), gps(), hooks() {
|
928
|
+
#ifdef SWIGRUBY
|
929
|
+
hooks = rb_hash_new();
|
930
|
+
#endif
|
931
|
+
}
|
932
|
+
GPS_SpaceNode<FloatT> &gps_space_node() {return gps.space_node;}
|
933
|
+
GPS_SolverOptions<FloatT> &gps_options() {return gps.options;}
|
934
|
+
const base_t &select_solver(
|
935
|
+
const typename base_t::prn_t &prn) const {
|
936
|
+
if(prn > 0 && prn <= 32){return gps.solver;}
|
937
|
+
return *this;
|
938
|
+
}
|
939
|
+
virtual typename base_t::relative_property_t relative_property(
|
940
|
+
const typename base_t::prn_t &prn,
|
941
|
+
const typename base_t::measurement_t::mapped_type &measurement,
|
942
|
+
const typename base_t::float_t &receiver_error,
|
943
|
+
const typename base_t::gps_time_t &time_arrival,
|
944
|
+
const typename base_t::pos_t &usr_pos,
|
945
|
+
const typename base_t::xyz_t &usr_vel) const;
|
946
|
+
virtual typename base_t::xyz_t *satellite_position(
|
947
|
+
const typename base_t::prn_t &prn,
|
948
|
+
const typename base_t::gps_time_t &time,
|
949
|
+
typename base_t::xyz_t &res) const {
|
950
|
+
return select_solver(prn).satellite_position(prn, time, res);
|
951
|
+
}
|
952
|
+
virtual bool update_position_solution(
|
953
|
+
const typename base_t::geometric_matrices_t &geomat,
|
954
|
+
typename base_t::user_pvt_t &res) const;
|
955
|
+
GPS_User_PVT<FloatT> solve(
|
956
|
+
const GPS_Measurement<FloatT> &measurement,
|
957
|
+
const GPS_Time<FloatT> &receiver_time) const {
|
958
|
+
const_cast<gps_t &>(gps).space_node.update_all_ephemeris(receiver_time);
|
959
|
+
const_cast<gps_t &>(gps).solver.update_options(gps.options);
|
960
|
+
return super_t::solve().user_pvt(measurement.items, receiver_time);
|
961
|
+
}
|
962
|
+
};
|
963
|
+
}
|
964
|
+
|
965
|
+
%fragment(SWIG_From_frag(int));
|
966
|
+
%fragment(SWIG_From_frag(bool));
|
967
|
+
%fragment(SWIG_From_frag(char));
|
968
|
+
|
969
|
+
%extend RINEX_Observation {
|
970
|
+
%exception read {
|
971
|
+
#ifdef SWIGRUBY
|
972
|
+
if(!rb_block_given_p()){
|
973
|
+
return rb_enumeratorize(self, ID2SYM(rb_intern("read")), argc, argv);
|
974
|
+
}
|
975
|
+
#endif
|
976
|
+
try {
|
977
|
+
$action
|
978
|
+
} catch (const native_exception &e) {
|
979
|
+
e.regenerate();
|
980
|
+
SWIG_fail;
|
981
|
+
} catch (const std::exception& e) {
|
982
|
+
SWIG_exception_fail(SWIG_RuntimeError, e.what());
|
983
|
+
}
|
984
|
+
}
|
985
|
+
%fragment(SWIG_Traits_frag(FloatT));
|
986
|
+
static void read(const char *fname) {
|
987
|
+
std::fstream fin(fname, std::ios::in | std::ios::binary);
|
988
|
+
struct reader_t : public RINEX_OBS_Reader<FloatT> {
|
989
|
+
typedef RINEX_OBS_Reader<FloatT> super_t;
|
990
|
+
SWIG_Object header;
|
991
|
+
SWIG_Object obs_types;
|
992
|
+
reader_t(std::istream &in) : RINEX_OBS_Reader<FloatT>(in) {
|
993
|
+
#ifdef SWIGRUBY
|
994
|
+
{ // header
|
995
|
+
header = rb_hash_new();
|
996
|
+
typedef typename super_t::header_t header_t;
|
997
|
+
for(typename header_t::const_iterator
|
998
|
+
it(super_t::header().begin()), it_end(super_t::header().end());
|
999
|
+
it != it_end; ++it){
|
1000
|
+
SWIG_Object types_per_key(rb_ary_new_capa(it->second.size()));
|
1001
|
+
for(typename header_t::mapped_type::const_iterator
|
1002
|
+
it2(it->second.begin()), it2_end(it->second.end());
|
1003
|
+
it2 != it2_end; ++it2){
|
1004
|
+
rb_ary_push(types_per_key, rb_str_new_cstr(it2->c_str()));
|
1005
|
+
}
|
1006
|
+
rb_hash_aset(header, rb_str_new_cstr(it->first.c_str()), types_per_key);
|
1007
|
+
}
|
1008
|
+
}
|
1009
|
+
{ // observation types
|
1010
|
+
obs_types = rb_hash_new();
|
1011
|
+
typedef typename super_t::obs_types_t types_t;
|
1012
|
+
for(typename types_t::const_iterator
|
1013
|
+
it(super_t::obs_types.begin()), it_end(super_t::obs_types.end());
|
1014
|
+
it != it_end; ++it){
|
1015
|
+
SWIG_Object types_per_sys(rb_ary_new_capa(it->second.size()));
|
1016
|
+
for(typename types_t::mapped_type::const_iterator
|
1017
|
+
it2(it->second.begin()), it2_end(it->second.end());
|
1018
|
+
it2 != it2_end; ++it2){
|
1019
|
+
rb_ary_push(types_per_sys, rb_str_new_cstr(it2->c_str()));
|
1020
|
+
}
|
1021
|
+
rb_hash_aset(obs_types, SWIG_From(char)(it->first), types_per_sys);
|
1022
|
+
}
|
1023
|
+
}
|
1024
|
+
#endif
|
1025
|
+
}
|
1026
|
+
} reader(fin);
|
1027
|
+
while(reader.has_next()){
|
1028
|
+
typedef typename reader_t::observation_t obs_t;
|
1029
|
+
obs_t obs(reader.next());
|
1030
|
+
#ifdef SWIGRUBY
|
1031
|
+
SWIG_Object res(rb_hash_new());
|
1032
|
+
static const SWIG_Object
|
1033
|
+
sym_header(ID2SYM(rb_intern("header"))),
|
1034
|
+
sym_t(ID2SYM(rb_intern("time"))),
|
1035
|
+
sym_clke(ID2SYM(rb_intern("rcv_clock_error"))),
|
1036
|
+
sym_meas(ID2SYM(rb_intern("meas"))),
|
1037
|
+
sym_meas_types(ID2SYM(rb_intern("meas_types")));
|
1038
|
+
rb_hash_aset(res, sym_header, reader.header);
|
1039
|
+
rb_hash_aset(res, sym_t,
|
1040
|
+
SWIG_NewPointerObj(
|
1041
|
+
new GPS_Time<FloatT>(obs.t_epoch),
|
1042
|
+
$descriptor(GPS_Time<FloatT> *), SWIG_POINTER_OWN));
|
1043
|
+
rb_hash_aset(res, sym_clke, swig::from(obs.receiver_clock_error));
|
1044
|
+
SWIG_Object meas(rb_hash_new());
|
1045
|
+
for(typename obs_t::per_satellite_t::const_iterator
|
1046
|
+
it(obs.per_satellite.begin()), it_end(obs.per_satellite.end());
|
1047
|
+
it != it_end; ++it){
|
1048
|
+
SWIG_Object meas_per_sat(rb_ary_new_capa(it->second.size()));
|
1049
|
+
int i(0);
|
1050
|
+
for(typename obs_t::per_satellite_t::mapped_type::const_iterator
|
1051
|
+
it2(it->second.begin()), it2_end(it->second.end());
|
1052
|
+
it2 != it2_end; ++it2, ++i){
|
1053
|
+
if(!it2->valid){continue;}
|
1054
|
+
rb_ary_store(meas_per_sat, i,
|
1055
|
+
rb_ary_new_from_args(3,
|
1056
|
+
swig::from(it2->value),
|
1057
|
+
SWIG_From(int)(it2->lli),
|
1058
|
+
SWIG_From(int)(it2->ss)));
|
1059
|
+
}
|
1060
|
+
int offset;
|
1061
|
+
char sys_c(reader_t::serial2sys(it->first, offset));
|
1062
|
+
rb_hash_aset(meas,
|
1063
|
+
rb_ary_new_from_args(2,
|
1064
|
+
SWIG_From(char)(sys_c),
|
1065
|
+
SWIG_From(int)(offset)),
|
1066
|
+
meas_per_sat);
|
1067
|
+
}
|
1068
|
+
rb_hash_aset(res, sym_meas, meas);
|
1069
|
+
rb_hash_aset(res, sym_meas_types, reader.obs_types);
|
1070
|
+
yield_throw_if_error(1, &res);
|
1071
|
+
#endif
|
1072
|
+
}
|
1073
|
+
}
|
1074
|
+
}
|
1075
|
+
|
1076
|
+
%inline {
|
1077
|
+
template <class FloatT>
|
1078
|
+
struct RINEX_Observation {};
|
1079
|
+
}
|
1080
|
+
|
1081
|
+
#undef MAKE_ACCESSOR
|
1082
|
+
#undef MAKE_VECTOR2ARRAY
|
1083
|
+
|
1084
|
+
%define CONCRETIZE(type)
|
1085
|
+
%template(Time) GPS_Time<type>;
|
1086
|
+
%template(SpaceNode) GPS_SpaceNode<type>;
|
1087
|
+
%template(Ionospheric_UTC_Parameters) GPS_Ionospheric_UTC_Parameters<type>;
|
1088
|
+
%template(Ephemeris) GPS_Ephemeris<type>;
|
1089
|
+
%template(PVT) GPS_User_PVT<type>;
|
1090
|
+
%template(Measurement) GPS_Measurement<type>;
|
1091
|
+
%template(SolverOptions) GPS_SolverOptions<type>;
|
1092
|
+
#if defined(SWIGRUBY)
|
1093
|
+
%markfunc GPS_Solver<type> "GPS_Solver<type>::mark";
|
1094
|
+
#endif
|
1095
|
+
%template(Solver) GPS_Solver<type>;
|
1096
|
+
|
1097
|
+
%template(RINEX_Observation) RINEX_Observation<type>;
|
1098
|
+
%enddef
|
1099
|
+
|
1100
|
+
CONCRETIZE(double);
|
1101
|
+
|
1102
|
+
#undef CONCRETIZE
|