gps_pvt 0.8.2 → 0.8.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +0 -4
- data/LICENSE +30 -0
- data/README.md +33 -18
- data/exe/gps_pvt +1 -1
- data/exe/to_ubx +31 -3
- data/ext/gps_pvt/GPS/GPS_wrap.cxx +59 -55
- data/ext/ninja-scan-light/tool/swig/GPS.i +10 -0
- data/ext/ninja-scan-light/tool/swig/spec/GPS_spec.rb +4 -0
- data/gps_pvt.gemspec +3 -1
- data/lib/gps_pvt/ntrip.rb +153 -0
- data/lib/gps_pvt/receiver/extension.rb +16 -7
- data/lib/gps_pvt/util.rb +7 -6
- data/lib/gps_pvt/version.rb +5 -1
- metadata +22 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 39089e2daa55491ccf086809797c2fef68d1e0268e75e6217ed793f091e748de
|
4
|
+
data.tar.gz: cca39a3dbcca26921606019be603526f62766c841a92191ee0a99174f00b54c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: becc6540b82ff9d3a97b4b6c5e58f2a7b0872f63584abdee2c425860e1c47b07700f778550ab95bccb3fc7b6462f9fb2f6249ca7846d1a9a9319471e96577c55
|
7
|
+
data.tar.gz: 67b2b12b88df52a19e84ef68a7773f2ec989dec3858b5d64e0e60961f8f9f4154eda3e36ef1548b61004c8af4cc6b6850ba73c145f15da41832944857c904889
|
data/Gemfile
CHANGED
data/LICENSE
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
(The following license is applied to each file in which there is no license statement.)
|
2
|
+
|
3
|
+
BSD 3-Clause License
|
4
|
+
|
5
|
+
Copyright (c) 2022, M.Naruoka (fenrir)
|
6
|
+
|
7
|
+
Redistribution and use in source and binary forms, with or without
|
8
|
+
modification, are permitted provided that the following conditions are met:
|
9
|
+
|
10
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
11
|
+
list of conditions and the following disclaimer.
|
12
|
+
|
13
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
14
|
+
this list of conditions and the following disclaimer in the documentation
|
15
|
+
and/or other materials provided with the distribution.
|
16
|
+
|
17
|
+
3. Neither the name of the copyright holder nor the names of its
|
18
|
+
contributors may be used to endorse or promote products derived from
|
19
|
+
this software without specific prior written permission.
|
20
|
+
|
21
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
22
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
23
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
24
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
25
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
26
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
27
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
28
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
29
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
30
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
CHANGED
@@ -2,14 +2,18 @@
|
|
2
2
|
|
3
3
|
GPS_PVT is a Ruby GPS (Global positioning system) PVT (position, velocity and time) solver. It accepts RINEX NAV and OBS files in addition to u-blox ubx format. Its significant features are easy to use with highly flexibility to customize internal solver behavior such as weight for each available satellite.
|
4
4
|
|
5
|
-
The PVT solution is obtained with a stand alone positioning (i.e. neither differential nor kinematic) with application of least square to each snapshot. Its main internal codes are derived from ones of [ninja-scan-light](https://github.com/fenrir-naru/ninja-scan-light) having capability to calculate tightly-coupled GNSS/INS integrated solution. These codes are written
|
5
|
+
The PVT solution is obtained with a stand alone positioning (i.e. neither differential nor kinematic) with application of least square to each snapshot. Its main internal codes are derived from ones of [ninja-scan-light](https://github.com/fenrir-naru/ninja-scan-light) having capability to calculate tightly-coupled GNSS/INS integrated solution. These codes are written in C++, and wrapped by [SWIG](http://www.swig.org/).
|
6
6
|
|
7
7
|
[![Gem Version](https://badge.fury.io/rb/gps_pvt.svg)](https://badge.fury.io/rb/gps_pvt)
|
8
8
|
[![Ruby](https://github.com/fenrir-naru/gps_pvt/actions/workflows/main.yml/badge.svg)](https://github.com/fenrir-naru/gps_pvt/actions/workflows/main.yml)
|
9
9
|
|
10
10
|
## Installation
|
11
11
|
|
12
|
-
|
12
|
+
Install it yourself as:
|
13
|
+
|
14
|
+
$ gem install gps_pvt
|
15
|
+
|
16
|
+
Or add this line to your Ruby application's Gemfile:
|
13
17
|
|
14
18
|
```ruby
|
15
19
|
gem 'gps_pvt'
|
@@ -19,29 +23,25 @@ And then execute:
|
|
19
23
|
|
20
24
|
$ bundle install
|
21
25
|
|
22
|
-
|
23
|
-
|
24
|
-
$ gem install gps_pvt
|
25
|
-
|
26
|
-
For Windows users, this gem requires Devkit because of native compilation.
|
26
|
+
For Windows users, this gem requires Devkit because of compilation of native shared library.
|
27
27
|
|
28
28
|
## Usage
|
29
29
|
|
30
|
-
### For user who just generate PVT solution
|
30
|
+
### For user who just wants to generate PVT solution
|
31
31
|
An attached executable is useful. After installation, type
|
32
32
|
|
33
33
|
$ gps_pvt file_or_URI(s)
|
34
34
|
|
35
|
-
The format of file is automatically determined with its extension, such as .ubx will be treated as UBX format. A compressed file of .gz or .Z can be specified directly (decompression is internally performed). URI such as http(s)://... and ftp://, and serial port (COMn for Windows and /dev/tty* for *NIX, version >= 0.8.0) are also acceptable. If you want to specify the file format, instead of file_or_URI(s), use the following arguments:
|
35
|
+
The format of file is automatically determined with its extension, such as .ubx will be treated as UBX format. A compressed file of .gz or .Z can be specified directly (decompression is internally performed). URI such as http(s)://... and ftp://, and serial port (COMn for Windows and /dev/tty* for *NIX, version >= 0.8.0) are also acceptable. Moreover, Ntrip URI of ntrip://(username):(password)@(caster_host):(port)/(mount_point), for exmaple, ```ntrip://test%40example.com:none@rtk2go.com:2101/NAIST-UBX``` (%40 is recognized as '@') is supported (version >= 0.8.4). If you want to specify the file format, instead of file_or_URI(s), use the following arguments:
|
36
36
|
|
37
37
|
| specification | recoginized as |
|
38
38
|
----|----
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
| <a name=opt_rinex_nav>--rinex_nav=file_or_URI</a> | [RINEX](https://www.igs.org/wg/rinex/#documents-formats) navigation file |
|
40
|
+
| <a name=opt_rinex_obs>--rinex_obs=file_or_URI</a> | [RINEX](https://www.igs.org/wg/rinex/#documents-formats) observation file |
|
41
|
+
| <a name=opt_ubx>--ubx=file_or_URI</a> | [U-blox](https://www.u-blox.com/) dedicated format |
|
42
42
|
| --sp3=file_or_URI | [Standard Product 3 Orbit Format](https://files.igs.org/pub/data/format/sp3c.txt) (supported gps_pvt version >= 0.6.0) |
|
43
43
|
| --antex=file_or_URI | [Antenna Exchange Format](https://igs.org/wg/antenna#files) (supported gps_pvt version >= 0.6.0) |
|
44
|
-
| --rinex_clk=file_or_URI | [RINEX clock](https://files.igs.org/pub/data/format/rinex_clock304.txt) file
|
44
|
+
| --rinex_clk=file_or_URI | [RINEX clock](https://files.igs.org/pub/data/format/rinex_clock304.txt) file (supported gps_pvt version >= 0.7.0) |
|
45
45
|
|
46
46
|
Since version 0.2.0, SBAS and QZSS are supported in addition to GPS. Since version 0.4.0, GLONASS is also available. QZSS ranging is activated in default, however, SBAS is just utilized for ionospheric correction. GLONASS is also turned off by default. If you want to activate SBAS or GLONASS ranging, "--with=(system or PRN)" options are used with gps_pvt executable like
|
47
47
|
|
@@ -49,15 +49,15 @@ Since version 0.2.0, SBAS and QZSS are supported in addition to GPS. Since versi
|
|
49
49
|
|
50
50
|
Additionally, the following command options *--key=value* are available.
|
51
51
|
|
52
|
-
| key | value | comment |
|
52
|
+
| key | value | comment | since |
|
53
53
|
----|----|----|----
|
54
54
|
| base_station | 3 \* (numeric+coordinate) | base position used for relative ENU position calculation. XYZ, NEU formats are acceptable. *ex1) --base_station=0X,0Y,0Z*, *ex2) --base_station=12.34N,56.789E,0U* | v0.1.7 |
|
55
55
|
| elevation_mask_deg | numeric | satellite elevation mask specified in degrees. *ex) --elevation_mask_deg=10* | v0.3.0 |
|
56
56
|
| start_time | time string | start time to perform solution. GPS, UTC and other formats are supported. *ex1) --start_time=1234:5678* represents 5678 seconds in 1234 GPS week, *ex2) --start_time="2000-01-01 00:00:00 UTC"* is in UTC format. | v0.3.3 |
|
57
57
|
| end_time | time string | end time to perform solution. Its format is the same as start_time. | v0.3.3 |
|
58
|
-
| online_ephemeris | | based on observation,
|
58
|
+
| <a name=opt_online_ephemeris>online_ephemeris</a> | URL string | based on observation, ephemeris which is previously broadcasted from satellite and currently published online will automatically be loaded. If value is not given, the default source "ftp://gssc.esa.int/gnss/data/daily/%Y/brdc/BRDC00IGS_R_%Y%j0000_01D_MN.rnx.gz" is used. The value string is converted with [strftime](https://docs.ruby-lang.org/en/master/strftime_formatting_rdoc.html) before actual use. | v0.8.1 |
|
59
59
|
|
60
|
-
### For
|
60
|
+
### For advanced user
|
61
61
|
|
62
62
|
This library will be used like:
|
63
63
|
|
@@ -136,18 +136,33 @@ receiver.solver.correction = { # provide by using a Hash
|
|
136
136
|
|
137
137
|
# Dynamic customization of weight for each epoch
|
138
138
|
(class << receiver; self; end).instance_eval{ # do before parse_XXX
|
139
|
-
|
139
|
+
run_orig = instance_method(:run)
|
140
140
|
define_method(:run){|meas, t_meas, &b|
|
141
141
|
meas # observation, same as the 2nd argument of parse_XXX
|
142
142
|
receiver.solver.hooks[:relative_property] = proc{|prn, rel_prop, meas, rcv_e, t_arv, usr_pos, usr_vel|
|
143
143
|
# Do something based on meas, t_meas.
|
144
144
|
rel_prop
|
145
145
|
}
|
146
|
-
run_orig(meas, t_meas, &b)
|
146
|
+
run_orig.bind(self).call(meas, t_meas, &b)
|
147
147
|
}
|
148
148
|
}
|
149
149
|
```
|
150
150
|
|
151
|
+
## Additional utilities
|
152
|
+
|
153
|
+
### [to_ubx](exe/to_ubx)
|
154
|
+
|
155
|
+
Utility to convert observation into u-blox ubx format and dump standard input. After installation of gps_pvt, to type
|
156
|
+
|
157
|
+
$ to_ubx file_or_URI(s) (options) > out.ubx
|
158
|
+
|
159
|
+
saves resultant into out.ubx by using redirection. The shared options with gps_pvt executable are [rinex_obs](#opt_rinex_obs), [rinex_nav](#opt_rinex_nav), [ubx](#opt_ubx), and [online_ephemeris](#opt_online_ephemeris). In addition, the following options are available.
|
160
|
+
|
161
|
+
| key | value | comment | since |
|
162
|
+
----|----|----|----
|
163
|
+
| ubx_rawx | | Change output packet types to UBX-RAWX from its default UBX-RAW. | v0.8.1 |
|
164
|
+
| broadcast_data | | In addition to observation, ephemeris is inserted by using UBX-SFRB packets. If ubx_rawx option is specified, UBX-SFRBX is used instead of UBX-SFRB. | v0.8.1 |
|
165
|
+
|
151
166
|
## Development
|
152
167
|
|
153
168
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake` to build library and run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/exe/gps_pvt
CHANGED
data/exe/to_ubx
CHANGED
@@ -40,6 +40,7 @@ files.collect!{|fname, ftype|
|
|
40
40
|
ftype ||= case fname
|
41
41
|
when /\.\d{2}[nhqg](?:\.gz)?$/; :rinex_nav
|
42
42
|
when /\.\d{2}o(?:\.gz)?$/; :rinex_obs
|
43
|
+
when /\.ubx$/; :ubx
|
43
44
|
else
|
44
45
|
raise "Format cannot be guessed, use --(format, ex. rinex_obs)=#{fname}"
|
45
46
|
end
|
@@ -55,9 +56,12 @@ files.collect!{|fname, ftype|
|
|
55
56
|
|
56
57
|
options.reject!{|opt|
|
57
58
|
case opt[0]
|
58
|
-
when :ubx_rawx, :
|
59
|
+
when :ubx_rawx, :broadcast_data, :eph_interval
|
59
60
|
misc_options[opt[0]] = opt[1]
|
60
61
|
true
|
62
|
+
when :online_ephemeris
|
63
|
+
(misc_options[opt[0]] ||= []) << opt[1]
|
64
|
+
true
|
61
65
|
else
|
62
66
|
false
|
63
67
|
end
|
@@ -95,14 +99,37 @@ files.each{|fname, ftype|
|
|
95
99
|
# other files
|
96
100
|
files.each{|fname, ftype|
|
97
101
|
case ftype
|
102
|
+
when :ubx; rcv.parse_ubx(fname){}
|
98
103
|
when :rinex_obs; rcv.parse_rinex_obs(fname){}
|
99
104
|
end
|
100
105
|
}
|
101
106
|
|
102
107
|
obs.sort!{|a, b| a[0] <=> b[0]} # Sort by measurement time
|
103
108
|
|
104
|
-
#
|
105
|
-
|
109
|
+
# Time packet for solution of leap seconds
|
110
|
+
gen_gpstime = proc{
|
111
|
+
tmpl = [0xB5, 0x62, 0x01, 0x20, 16, 0]
|
112
|
+
gpst = GPS_PVT::GPS::Time
|
113
|
+
t_next = gpst::new(*gpst::leap_second_events.find{|wn, sec, leap| leap == 1}[0..1])
|
114
|
+
proc{|t_meas, meas|
|
115
|
+
next nil if t_meas < t_next
|
116
|
+
t_next = t_meas + 60 # 1 min. interval
|
117
|
+
ubx = tmpl.clone
|
118
|
+
t_sec = t_meas.seconds
|
119
|
+
t_msec = (t_sec * 1E3).round
|
120
|
+
t_nsec = ((t_sec * 1E3 - t_msec) * 1E6).round
|
121
|
+
leap = rcv.leap_seconds(t_meas)
|
122
|
+
ubx += [
|
123
|
+
t_msec, # ITOW ms GPS Millisecond time of Week
|
124
|
+
t_nsec, # Frac ns Nanoseconds remainder of rounded ms above, range -500000 .. 500000
|
125
|
+
t_meas.week, # week - GPS week (GPS time)
|
126
|
+
leap || 0, # LeapS s Leap Seconds (GPS-UTC)
|
127
|
+
leap ? 0x07 : 0x03, # validity bit field (0x01=ToW, 0x02=WN, 0x04=UTC)
|
128
|
+
10000, # TAcc ns Time Accuracy Estimate
|
129
|
+
].pack("Vl<vcCV").unpack("C*")
|
130
|
+
GPS_PVT::UBX::update(ubx + [0, 0]).pack("C*")
|
131
|
+
}
|
132
|
+
}.call
|
106
133
|
|
107
134
|
gen_sfrb, gen_sfrbx = proc{
|
108
135
|
cache = {}
|
@@ -335,6 +362,7 @@ gen_rawx = proc{|t_meas, meas| # Convert to RXM-RAWX(0x15)
|
|
335
362
|
}
|
336
363
|
|
337
364
|
gen_list = []
|
365
|
+
gen_list << gen_gpstime unless misc_options[:ubx_rawx]
|
338
366
|
gen_list << (misc_options[:ubx_rawx] ? gen_sfrbx : gen_sfrb) if misc_options[:broadcast_data]
|
339
367
|
gen_list << (misc_options[:ubx_rawx] ? gen_rawx : gen_raw)
|
340
368
|
STDOUT.binmode
|
@@ -1866,56 +1866,55 @@ int SWIG_Ruby_arity( VALUE proc, int minimal )
|
|
1866
1866
|
#define SWIGTYPE_p_GPS_SpaceNodeT_double_t__Ionospheric_UTC_Parameters swig_types[16]
|
1867
1867
|
#define SWIGTYPE_p_GPS_SpaceNodeT_double_t__SatelliteProperties__Ephemeris swig_types[17]
|
1868
1868
|
#define SWIGTYPE_p_GPS_TimeT_double_t swig_types[18]
|
1869
|
-
#define
|
1870
|
-
#define
|
1871
|
-
#define
|
1872
|
-
#define
|
1873
|
-
#define
|
1874
|
-
#define
|
1875
|
-
#define
|
1876
|
-
#define
|
1877
|
-
#define
|
1878
|
-
#define
|
1879
|
-
#define
|
1880
|
-
#define
|
1881
|
-
#define
|
1882
|
-
#define
|
1883
|
-
#define
|
1884
|
-
#define
|
1885
|
-
#define
|
1886
|
-
#define
|
1887
|
-
#define
|
1888
|
-
#define
|
1889
|
-
#define
|
1890
|
-
#define
|
1891
|
-
#define
|
1892
|
-
#define
|
1893
|
-
#define
|
1894
|
-
#define
|
1895
|
-
#define
|
1896
|
-
#define
|
1897
|
-
#define
|
1898
|
-
#define
|
1899
|
-
#define
|
1900
|
-
#define
|
1901
|
-
#define
|
1902
|
-
#define
|
1903
|
-
#define
|
1904
|
-
#define
|
1905
|
-
#define
|
1906
|
-
#define
|
1907
|
-
#define
|
1908
|
-
#define
|
1909
|
-
#define
|
1910
|
-
#define
|
1911
|
-
#define
|
1912
|
-
#define
|
1913
|
-
#define
|
1914
|
-
#define
|
1915
|
-
#define
|
1916
|
-
|
1917
|
-
static
|
1918
|
-
static swig_module_info swig_module = {swig_types, 67, 0, 0, 0, 0};
|
1869
|
+
#define SWIGTYPE_p_GPS_TimeT_double_t__leap_year_prop_res_t swig_types[19]
|
1870
|
+
#define SWIGTYPE_p_GPS_User_PVTT_double_t swig_types[20]
|
1871
|
+
#define SWIGTYPE_p_MatrixT_ComplexT_double_t_Array2D_DenseT_ComplexT_double_t_t_MatrixViewBaseT_t_t swig_types[21]
|
1872
|
+
#define SWIGTYPE_p_MatrixT_double_Array2D_DenseT_double_t_MatrixViewBaseT_t_t swig_types[22]
|
1873
|
+
#define SWIGTYPE_p_MatrixViewBaseT_t swig_types[23]
|
1874
|
+
#define SWIGTYPE_p_MatrixViewFilterT_MatrixViewBaseT_t_t swig_types[24]
|
1875
|
+
#define SWIGTYPE_p_Matrix_FrozenT_double_Array2D_DenseT_double_t_MatrixViewBaseT_t_t swig_types[25]
|
1876
|
+
#define SWIGTYPE_p_PushableData swig_types[26]
|
1877
|
+
#define SWIGTYPE_p_RINEX_ClockT_double_t swig_types[27]
|
1878
|
+
#define SWIGTYPE_p_RINEX_ObservationT_double_t swig_types[28]
|
1879
|
+
#define SWIGTYPE_p_SBAS_EphemerisT_double_t swig_types[29]
|
1880
|
+
#define SWIGTYPE_p_SBAS_SolverOptionsT_double_t swig_types[30]
|
1881
|
+
#define SWIGTYPE_p_SBAS_SpaceNodeT_double_t swig_types[31]
|
1882
|
+
#define SWIGTYPE_p_SBAS_SpaceNodeT_double_t__SatelliteProperties__Ephemeris swig_types[32]
|
1883
|
+
#define SWIGTYPE_p_SP3T_double_t swig_types[33]
|
1884
|
+
#define SWIGTYPE_p_System_ENUT_double_WGS84_t swig_types[34]
|
1885
|
+
#define SWIGTYPE_p_System_LLHT_double_WGS84_t swig_types[35]
|
1886
|
+
#define SWIGTYPE_p_System_XYZT_double_WGS84_t swig_types[36]
|
1887
|
+
#define SWIGTYPE_p_available_satellites_t swig_types[37]
|
1888
|
+
#define SWIGTYPE_p_char swig_types[38]
|
1889
|
+
#define SWIGTYPE_p_double swig_types[39]
|
1890
|
+
#define SWIGTYPE_p_enu_t swig_types[40]
|
1891
|
+
#define SWIGTYPE_p_eph_t swig_types[41]
|
1892
|
+
#define SWIGTYPE_p_float_t swig_types[42]
|
1893
|
+
#define SWIGTYPE_p_gps_space_node_t swig_types[43]
|
1894
|
+
#define SWIGTYPE_p_gps_time_t swig_types[44]
|
1895
|
+
#define SWIGTYPE_p_int swig_types[45]
|
1896
|
+
#define SWIGTYPE_p_int_t swig_types[46]
|
1897
|
+
#define SWIGTYPE_p_llh_t swig_types[47]
|
1898
|
+
#define SWIGTYPE_p_p_GPS_Solver_RAIM_LSRT_double_GPS_Solver_Base_DebugT_double_GPS_Solver_BaseT_double_t_t_t__user_pvt_t__detection_t swig_types[48]
|
1899
|
+
#define SWIGTYPE_p_p_GPS_Solver_RAIM_LSRT_double_GPS_Solver_Base_DebugT_double_GPS_Solver_BaseT_double_t_t_t__user_pvt_t__exclusion_t swig_types[49]
|
1900
|
+
#define SWIGTYPE_p_p_double swig_types[50]
|
1901
|
+
#define SWIGTYPE_p_range_correction_list_t swig_types[51]
|
1902
|
+
#define SWIGTYPE_p_s16_t swig_types[52]
|
1903
|
+
#define SWIGTYPE_p_s32_t swig_types[53]
|
1904
|
+
#define SWIGTYPE_p_s8_t swig_types[54]
|
1905
|
+
#define SWIGTYPE_p_satellites_t swig_types[55]
|
1906
|
+
#define SWIGTYPE_p_self_t swig_types[56]
|
1907
|
+
#define SWIGTYPE_p_std__vectorT_std__pairT_int_SBAS_SpaceNodeT_double_t__Satellite_const_p_t_t swig_types[57]
|
1908
|
+
#define SWIGTYPE_p_super_t swig_types[58]
|
1909
|
+
#define SWIGTYPE_p_swig__GC_VALUE swig_types[59]
|
1910
|
+
#define SWIGTYPE_p_u16_t swig_types[60]
|
1911
|
+
#define SWIGTYPE_p_u32_t swig_types[61]
|
1912
|
+
#define SWIGTYPE_p_u8_t swig_types[62]
|
1913
|
+
#define SWIGTYPE_p_uint_t swig_types[63]
|
1914
|
+
#define SWIGTYPE_p_unsigned_int swig_types[64]
|
1915
|
+
#define SWIGTYPE_p_xyz_t swig_types[65]
|
1916
|
+
static swig_type_info *swig_types[67];
|
1917
|
+
static swig_module_info swig_module = {swig_types, 66, 0, 0, 0, 0};
|
1919
1918
|
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
|
1920
1919
|
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
|
1921
1920
|
|
@@ -6654,7 +6653,16 @@ SWIGINTERN VALUE
|
|
6654
6653
|
_wrap_Time_leap_second_events_get(VALUE self) {
|
6655
6654
|
VALUE _val;
|
6656
6655
|
|
6657
|
-
|
6656
|
+
{
|
6657
|
+
_val = rb_ary_new2(sizeof(GPS_Time< double >::leap_second_events) / sizeof(GPS_Time< double >::leap_second_events[0]));
|
6658
|
+
for(std::size_t i(0); i < sizeof(GPS_Time< double >::leap_second_events) / sizeof(GPS_Time< double >::leap_second_events[0]); ++i){
|
6659
|
+
rb_ary_push(_val,
|
6660
|
+
rb_ary_new3(3,
|
6661
|
+
SWIG_From_int (GPS_Time< double >::leap_second_events[i].corrected.week),
|
6662
|
+
swig::from(GPS_Time< double >::leap_second_events[i].corrected.seconds),
|
6663
|
+
SWIG_From_int (GPS_Time< double >::leap_second_events[i].leap_seconds)));
|
6664
|
+
}
|
6665
|
+
}
|
6658
6666
|
return _val;
|
6659
6667
|
}
|
6660
6668
|
|
@@ -27470,7 +27478,6 @@ static swig_type_info _swigt__p_GPS_SpaceNodeT_double_t = {"_p_GPS_SpaceNodeT_do
|
|
27470
27478
|
static swig_type_info _swigt__p_GPS_SpaceNodeT_double_t__Ionospheric_UTC_Parameters = {"_p_GPS_SpaceNodeT_double_t__Ionospheric_UTC_Parameters", "GPS_SpaceNode< double >::Ionospheric_UTC_Parameters *", 0, 0, (void*)0, 0};
|
27471
27479
|
static swig_type_info _swigt__p_GPS_SpaceNodeT_double_t__SatelliteProperties__Ephemeris = {"_p_GPS_SpaceNodeT_double_t__SatelliteProperties__Ephemeris", "GPS_SpaceNode< double >::SatelliteProperties::Ephemeris *", 0, 0, (void*)0, 0};
|
27472
27480
|
static swig_type_info _swigt__p_GPS_TimeT_double_t = {"_p_GPS_TimeT_double_t", "GPS_SpaceNode< double >::gps_time_t *|SBAS_SpaceNode< double >::gps_time_t *|GPS_Time< GLONASS_SpaceNode< double >::float_t > *|GPS_Time< GPS_Time< double >::float_t > *|GPS_Time< double > *", 0, 0, (void*)0, 0};
|
27473
|
-
static swig_type_info _swigt__p_GPS_TimeT_double_t__leap_second_event_t = {"_p_GPS_TimeT_double_t__leap_second_event_t", "GPS_Time< double >::leap_second_event_t *", 0, 0, (void*)0, 0};
|
27474
27481
|
static swig_type_info _swigt__p_GPS_TimeT_double_t__leap_year_prop_res_t = {"_p_GPS_TimeT_double_t__leap_year_prop_res_t", "GPS_Time< double >::leap_year_prop_res_t *", 0, 0, (void*)0, 0};
|
27475
27482
|
static swig_type_info _swigt__p_GPS_User_PVTT_double_t = {"_p_GPS_User_PVTT_double_t", "GPS_User_PVT< double > *", 0, 0, (void*)0, 0};
|
27476
27483
|
static swig_type_info _swigt__p_MatrixT_ComplexT_double_t_Array2D_DenseT_ComplexT_double_t_t_MatrixViewBaseT_t_t = {"_p_MatrixT_ComplexT_double_t_Array2D_DenseT_ComplexT_double_t_t_MatrixViewBaseT_t_t", "Matrix< Complex< double >,Array2D_Dense< Complex< double > > > *|Matrix< Complex< double >,Array2D_Dense< Complex< double > >,MatrixViewBase< > > *", 0, 0, (void*)0, 0};
|
@@ -27539,7 +27546,6 @@ static swig_type_info *swig_type_initial[] = {
|
|
27539
27546
|
&_swigt__p_GPS_SpaceNodeT_double_t__Ionospheric_UTC_Parameters,
|
27540
27547
|
&_swigt__p_GPS_SpaceNodeT_double_t__SatelliteProperties__Ephemeris,
|
27541
27548
|
&_swigt__p_GPS_TimeT_double_t,
|
27542
|
-
&_swigt__p_GPS_TimeT_double_t__leap_second_event_t,
|
27543
27549
|
&_swigt__p_GPS_TimeT_double_t__leap_year_prop_res_t,
|
27544
27550
|
&_swigt__p_GPS_User_PVTT_double_t,
|
27545
27551
|
&_swigt__p_MatrixT_ComplexT_double_t_Array2D_DenseT_ComplexT_double_t_t_MatrixViewBaseT_t_t,
|
@@ -27608,7 +27614,6 @@ static swig_cast_info _swigc__p_GPS_SpaceNodeT_double_t[] = { {&_swigt__p_GPS_S
|
|
27608
27614
|
static swig_cast_info _swigc__p_GPS_SpaceNodeT_double_t__Ionospheric_UTC_Parameters[] = { {&_swigt__p_GPS_Ionospheric_UTC_ParametersT_double_t, _p_GPS_Ionospheric_UTC_ParametersT_double_tTo_p_GPS_SpaceNodeT_double_t__Ionospheric_UTC_Parameters, 0, 0}, {&_swigt__p_GPS_SpaceNodeT_double_t__Ionospheric_UTC_Parameters, 0, 0, 0},{0, 0, 0, 0}};
|
27609
27615
|
static swig_cast_info _swigc__p_GPS_SpaceNodeT_double_t__SatelliteProperties__Ephemeris[] = { {&_swigt__p_GPS_SpaceNodeT_double_t__SatelliteProperties__Ephemeris, 0, 0, 0}, {&_swigt__p_GPS_EphemerisT_double_t, _p_GPS_EphemerisT_double_tTo_p_GPS_SpaceNodeT_double_t__SatelliteProperties__Ephemeris, 0, 0},{0, 0, 0, 0}};
|
27610
27616
|
static swig_cast_info _swigc__p_GPS_TimeT_double_t[] = { {&_swigt__p_GPS_TimeT_double_t, 0, 0, 0},{0, 0, 0, 0}};
|
27611
|
-
static swig_cast_info _swigc__p_GPS_TimeT_double_t__leap_second_event_t[] = { {&_swigt__p_GPS_TimeT_double_t__leap_second_event_t, 0, 0, 0},{0, 0, 0, 0}};
|
27612
27617
|
static swig_cast_info _swigc__p_GPS_TimeT_double_t__leap_year_prop_res_t[] = { {&_swigt__p_GPS_TimeT_double_t__leap_year_prop_res_t, 0, 0, 0},{0, 0, 0, 0}};
|
27613
27618
|
static swig_cast_info _swigc__p_GPS_User_PVTT_double_t[] = { {&_swigt__p_GPS_User_PVTT_double_t, 0, 0, 0},{0, 0, 0, 0}};
|
27614
27619
|
static swig_cast_info _swigc__p_MatrixT_ComplexT_double_t_Array2D_DenseT_ComplexT_double_t_t_MatrixViewBaseT_t_t[] = { {&_swigt__p_MatrixT_ComplexT_double_t_Array2D_DenseT_ComplexT_double_t_t_MatrixViewBaseT_t_t, 0, 0, 0},{0, 0, 0, 0}};
|
@@ -27677,7 +27682,6 @@ static swig_cast_info *swig_cast_initial[] = {
|
|
27677
27682
|
_swigc__p_GPS_SpaceNodeT_double_t__Ionospheric_UTC_Parameters,
|
27678
27683
|
_swigc__p_GPS_SpaceNodeT_double_t__SatelliteProperties__Ephemeris,
|
27679
27684
|
_swigc__p_GPS_TimeT_double_t,
|
27680
|
-
_swigc__p_GPS_TimeT_double_t__leap_second_event_t,
|
27681
27685
|
_swigc__p_GPS_TimeT_double_t__leap_year_prop_res_t,
|
27682
27686
|
_swigc__p_GPS_User_PVTT_double_t,
|
27683
27687
|
_swigc__p_MatrixT_ComplexT_double_t_Array2D_DenseT_ComplexT_double_t_t_MatrixViewBaseT_t_t,
|
@@ -158,6 +158,16 @@ static std::string inspect_str(const VALUE &v){
|
|
158
158
|
%typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) const std::tm & {
|
159
159
|
$1 = (TYPE($input) == T_ARRAY) ? 1 : 0;
|
160
160
|
}
|
161
|
+
%typemap(varout,fragment="SWIG_Traits_frag(FloatT)") leap_second_event_t [] {
|
162
|
+
$result = rb_ary_new2(sizeof($1) / sizeof($1[0]));
|
163
|
+
for(std::size_t i(0); i < sizeof($1) / sizeof($1[0]); ++i){
|
164
|
+
rb_ary_push($result,
|
165
|
+
rb_ary_new3(3,
|
166
|
+
SWIG_From(int)($1[i].corrected.week),
|
167
|
+
swig::from($1[i].corrected.seconds),
|
168
|
+
SWIG_From(int)($1[i].leap_seconds)));
|
169
|
+
}
|
170
|
+
}
|
161
171
|
#endif
|
162
172
|
%ignore canonicalize();
|
163
173
|
%ignore GPS_Time(const int &_week, const float_t &_seconds);
|
@@ -759,6 +759,10 @@ __RINEX_CLK_TEXT__
|
|
759
759
|
puts "Measurement time: #{t_meas.to_a} (a.k.a #{"%d/%d/%d %02d:%02d:%02d UTC"%[*t_meas.c_tm]})"
|
760
760
|
expect(t_meas.c_tm).to eq([2015, 6, 15, 23, 53, 33])
|
761
761
|
expect(GPS::Time::new(0, t_meas.serialize)).to eq(t_meas)
|
762
|
+
expect(t_meas.leap_seconds).to eq(sn.iono_utc.delta_t_LS)
|
763
|
+
expect(GPS::Time::leap_second_events.select{|wn, sec, leap|
|
764
|
+
t_meas >= GPS::Time::new(wn, sec)
|
765
|
+
}[0][2]).to eq(sn.iono_utc.delta_t_LS)
|
762
766
|
|
763
767
|
sn.update_all_ephemeris(t_meas)
|
764
768
|
|
data/gps_pvt.gemspec
CHANGED
@@ -59,8 +59,10 @@ Gem::Specification.new do |spec|
|
|
59
59
|
# Uncomment to register a new dependency of your gem
|
60
60
|
# spec.add_dependency "example-gem", "~> 1.0"
|
61
61
|
spec.add_dependency "rubyserial"
|
62
|
-
spec.add_development_dependency "rake"
|
62
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
63
63
|
spec.add_development_dependency "rake-compiler"
|
64
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
65
|
+
spec.add_development_dependency "matrix" if GPS_PVT::version_compare(RUBY_VERSION, "3.1") >= 0
|
64
66
|
|
65
67
|
# For more information and examples about making a new gem, checkout our
|
66
68
|
# guide at: https://bundler.io/guides/creating_gem.html
|
@@ -0,0 +1,153 @@
|
|
1
|
+
# Ntrip (Networked Transport of RTCM via Internet Protocol)
|
2
|
+
|
3
|
+
require 'net/http'
|
4
|
+
require 'uri'
|
5
|
+
require_relative 'version'
|
6
|
+
|
7
|
+
module GPS_PVT
|
8
|
+
class Ntrip < Net::HTTP
|
9
|
+
Net::HTTPResponse.class_eval{
|
10
|
+
orig = singleton_method(:read_new)
|
11
|
+
define_singleton_method(:read_new){|sock|
|
12
|
+
# handle Ntrip(rev1), which does not comply with HTTP
|
13
|
+
unless sock.respond_to?(:ntrip) then
|
14
|
+
orig.call(sock)
|
15
|
+
else
|
16
|
+
str = sock.readline
|
17
|
+
case str
|
18
|
+
when /\A(?:(?:HTTP(?:\/(\d+\.\d+))?|([^\d\s]+))\s+)?(\d\d\d)(?:\s+(.*))?\z/in
|
19
|
+
res = response_class($3).new($1 || '1.1', $3, $2 || $4)
|
20
|
+
each_response_header(sock){|k,v|
|
21
|
+
res.add_field k, v
|
22
|
+
} unless res.message == 'ICY' # or 'SOURCETABLE' for Ntrip(rev1)
|
23
|
+
res
|
24
|
+
else
|
25
|
+
raise Net::HTTPBadResponse, "wrong status line: #{str.dump}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
}
|
29
|
+
}
|
30
|
+
def on_connect
|
31
|
+
super
|
32
|
+
@socket.define_singleton_method(:ntrip){true}
|
33
|
+
end
|
34
|
+
|
35
|
+
SOURCE_TBL_ITEMS = {
|
36
|
+
:STR => [
|
37
|
+
:type, :mountpoint, :identifier, :format, :format_details,
|
38
|
+
:carrier, :nav_system, :network, :country, :latitude, :longitude,
|
39
|
+
:nmea, :solution, :generator, :compression, :authentication, :fee, :bitrate],
|
40
|
+
:CAS => [
|
41
|
+
:type, :host, :port, :identifier, :operator,
|
42
|
+
:nmea, :country, :latitude, :longitude, :fallback_host, :fallback_ip],
|
43
|
+
:NET => [
|
44
|
+
:type, :identifier, :operator, :authentication, :fee,
|
45
|
+
:web_net, :web_str, :web_reg],
|
46
|
+
}
|
47
|
+
def Ntrip.parse_source_table(str)
|
48
|
+
res = {}
|
49
|
+
str.lines.each{|line|
|
50
|
+
values = line.chomp.split(/\s*;\s*/)
|
51
|
+
type = values[0].to_sym
|
52
|
+
next unless keys = SOURCE_TBL_ITEMS[type]
|
53
|
+
next unless (values.size >= keys.size)
|
54
|
+
entry = Hash[*(keys.zip(values).flatten(1))]
|
55
|
+
entry[:misc] = values[(keys.size)..-1] if values.size > keys.size
|
56
|
+
(res[type] ||= []) << entry
|
57
|
+
}
|
58
|
+
res.define_singleton_method(:mount_points){
|
59
|
+
Hash[*((self[:STR] || []).collect{|entry|
|
60
|
+
[entry[:mountpoint], entry]
|
61
|
+
}.flatten(1))]
|
62
|
+
}
|
63
|
+
res
|
64
|
+
end
|
65
|
+
def generate_request(path, header)
|
66
|
+
req = Net::HTTP::Get.new(path, {
|
67
|
+
'User-Agent' => "GPS_PVT NTRIP client/#{GPS_PVT::VERSION}",
|
68
|
+
'Accept' => '*/*',
|
69
|
+
'Ntrip-Version' => 'Ntrip/2.0',
|
70
|
+
}.merge(header.select{|k, v| k.kind_of?(String)}))
|
71
|
+
header.each{|k, v|
|
72
|
+
next unless k.kind_of?(Symbol)
|
73
|
+
req.send(k, *v)
|
74
|
+
}
|
75
|
+
req
|
76
|
+
end
|
77
|
+
def get_source_table(header = {})
|
78
|
+
Ntrip.parse_source_table(request(generate_request('/', header)).read_body)
|
79
|
+
end
|
80
|
+
def get_data(mount_point, header = {}, &b)
|
81
|
+
request(generate_request("/#{mount_point}", header)){|res|
|
82
|
+
res.read_body(&b)
|
83
|
+
}
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
require 'open-uri'
|
89
|
+
|
90
|
+
OpenURI.class_eval{
|
91
|
+
check_options_orig = singleton_method(:check_options)
|
92
|
+
define_singleton_method(:check_options){|options|
|
93
|
+
uri = options.delete(:uri)
|
94
|
+
case uri
|
95
|
+
when URI::Ntrip
|
96
|
+
options[:basic_auth] ||=
|
97
|
+
options.delete(:http_basic_authentication) ||
|
98
|
+
([:user, :password].collect{|k|
|
99
|
+
URI::decode_www_form_component(uri.send(k))
|
100
|
+
} rescue nil)
|
101
|
+
options['Ntrip-Version'] ||= "Ntrip/%3.1f"%[options.delete(:version)] if options[:version]
|
102
|
+
options['User-Agent'] ||= options[:user_agent]
|
103
|
+
options.select!{|k, v| v} #compact! Ruby >= 2.4.0
|
104
|
+
true
|
105
|
+
else
|
106
|
+
check_options_orig.call(options)
|
107
|
+
end
|
108
|
+
}
|
109
|
+
open_uri_orig = singleton_method(:open_uri)
|
110
|
+
define_singleton_method(:open_uri){|name, *rest, &b|
|
111
|
+
uri = URI::Generic === name ? name : URI.parse(name)
|
112
|
+
(rest[-1].kind_of?(Hash) ? rest : (rest << {}))[-1][:uri] = uri
|
113
|
+
open_uri_orig.call(uri, *rest, &b)
|
114
|
+
}
|
115
|
+
def OpenURI.open_ntrip(buf, target, proxy, options) # :nodoc:
|
116
|
+
GPS_PVT::Ntrip.start(target.host, target.port){|ntrip|
|
117
|
+
# get source table
|
118
|
+
tbl = ntrip.get_source_table(options)
|
119
|
+
|
120
|
+
# check mount point
|
121
|
+
mnt_pt = target.path.sub(%r|^/|, '')
|
122
|
+
prop = tbl.mount_points[mnt_pt]
|
123
|
+
raise Net::ProtocolError::new("Mount point(#{mnt_pt}) not found") unless prop
|
124
|
+
|
125
|
+
# set stream
|
126
|
+
buf.instance_eval{
|
127
|
+
@io, w = IO::pipe
|
128
|
+
@io.define_singleton_method(:property){prop}
|
129
|
+
Thread::new{
|
130
|
+
begin
|
131
|
+
ntrip.get_data(mnt_pt, options){|data| w << data}
|
132
|
+
rescue Errno::EPIPE;
|
133
|
+
rescue; raise
|
134
|
+
ensure; w.close
|
135
|
+
end
|
136
|
+
}
|
137
|
+
}
|
138
|
+
}
|
139
|
+
end
|
140
|
+
}
|
141
|
+
module URI
|
142
|
+
class Ntrip < HTTP
|
143
|
+
def buffer_open(buf, proxy, options)
|
144
|
+
OpenURI.open_ntrip(buf, self, proxy, options)
|
145
|
+
end
|
146
|
+
include OpenURI::OpenRead
|
147
|
+
end
|
148
|
+
if respond_to?(:register_scheme) then
|
149
|
+
register_scheme('NTRIP', Ntrip)
|
150
|
+
else
|
151
|
+
@@schemes['NTRIP'] = Ntrip
|
152
|
+
end
|
153
|
+
end
|
@@ -29,15 +29,24 @@ class Receiver
|
|
29
29
|
return (eph.valid?(t) ? eph : nil)
|
30
30
|
end
|
31
31
|
|
32
|
-
def attach_online_ephemeris(uri_template = nil)
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
def attach_online_ephemeris(uri_template = [nil])
|
33
|
+
uri_template = uri_template.collect{|v|
|
34
|
+
if (!v) || (v =~ /^\s*$/) then
|
35
|
+
"ftp://gssc.esa.int/gnss/data/daily/%Y/brdc/BRDC00IGS_R_%Y%j0000_01D_MN.rnx.gz"
|
36
|
+
else
|
37
|
+
v
|
38
|
+
end
|
39
|
+
}.uniq
|
36
40
|
loader = proc{|t_meas|
|
37
41
|
utc = Time::utc(*t_meas.c_tm)
|
38
|
-
|
39
|
-
|
40
|
-
|
42
|
+
uri_template.each{|v|
|
43
|
+
uri = URI::parse(utc.strftime(v))
|
44
|
+
begin
|
45
|
+
self.parse_rinex_nav(uri)
|
46
|
+
rescue Net::FTPError, Net::HTTPExceptions => e
|
47
|
+
$stderr.puts "Skip to read due to %s (%s)"%[e.inspect.gsub(/[\r\n]/, ' '), uri]
|
48
|
+
end
|
49
|
+
}
|
41
50
|
}
|
42
51
|
run_orig = self.method(:run)
|
43
52
|
eph_list = {}
|
data/lib/gps_pvt/util.rb
CHANGED
@@ -23,16 +23,18 @@ proc{
|
|
23
23
|
}
|
24
24
|
def eof?; false; end
|
25
25
|
}
|
26
|
-
Kernel
|
27
|
-
open_orig =
|
26
|
+
module Kernel
|
27
|
+
open_orig = instance_method(:open)
|
28
28
|
define_method(:open){|*args, &b|
|
29
|
-
return open_orig.call(*args, &b) unless Serial::SPEC =~ args[0]
|
29
|
+
return open_orig.bind(self).call(*args, &b) unless Serial::SPEC =~ args[0]
|
30
30
|
Serial::new($1, $2 ? $2.to_i : 115200)
|
31
31
|
}
|
32
|
-
|
32
|
+
module_function(:open)
|
33
|
+
end
|
33
34
|
}.call if require 'rubyserial'
|
34
35
|
|
35
36
|
require 'open-uri'
|
37
|
+
require_relative 'ntrip'
|
36
38
|
|
37
39
|
module GPS_PVT
|
38
40
|
module Util
|
@@ -53,8 +55,7 @@ module Util
|
|
53
55
|
end
|
54
56
|
def get_txt(fname_or_uri)
|
55
57
|
is_uri = fname_or_uri.kind_of?(URI)
|
56
|
-
(
|
57
|
-
.send(:open, fname_or_uri){|src|
|
58
|
+
(is_uri ? URI : Kernel).send(:open, fname_or_uri){|src|
|
58
59
|
compressed = proc{
|
59
60
|
case src.content_type
|
60
61
|
when /gzip/; next :gz
|
data/lib/gps_pvt/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gps_pvt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- fenrir(M.Naruoka)
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-12-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyserial
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
33
|
+
version: '13.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
40
|
+
version: '13.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake-compiler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
55
69
|
description: This module calculate PVT by using raw observation obtained from a GPS
|
56
70
|
receiver
|
57
71
|
email:
|
@@ -67,6 +81,7 @@ files:
|
|
67
81
|
- CHANGELOG.md
|
68
82
|
- CODE_OF_CONDUCT.md
|
69
83
|
- Gemfile
|
84
|
+
- LICENSE
|
70
85
|
- README.md
|
71
86
|
- Rakefile
|
72
87
|
- bin/console
|
@@ -117,6 +132,7 @@ files:
|
|
117
132
|
- gps_pvt.gemspec
|
118
133
|
- gps_pvt.rbs
|
119
134
|
- lib/gps_pvt.rb
|
135
|
+
- lib/gps_pvt/ntrip.rb
|
120
136
|
- lib/gps_pvt/receiver.rb
|
121
137
|
- lib/gps_pvt/receiver/extension.rb
|
122
138
|
- lib/gps_pvt/ubx.rb
|