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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b87c77fbb3844eb0fd835ef079b8a379708a6fe24e3de4ceeb6934206573f489
4
- data.tar.gz: a280c1aa82bed41319e13069907940a062a073a0b01c95eefa3d3d8c1b32c517
3
+ metadata.gz: 39089e2daa55491ccf086809797c2fef68d1e0268e75e6217ed793f091e748de
4
+ data.tar.gz: cca39a3dbcca26921606019be603526f62766c841a92191ee0a99174f00b54c7
5
5
  SHA512:
6
- metadata.gz: 761d7e99868e04d93adb48fac0345ff71467068657c544efe857ed4f6206ed8d11698871ad7dc73c232f4bd51094cf13c6752d96fc17307caccb4a2eab8dbe03
7
- data.tar.gz: fd70c1d59dbf3885e7a2286726a9c16e0cfbec3097a105bbffde59e3a65ee22eb09f1d0b4032b371faf2d1695b074b0752f37763ef6b5716dd4214fed4566755
6
+ metadata.gz: becc6540b82ff9d3a97b4b6c5e58f2a7b0872f63584abdee2c425860e1c47b07700f778550ab95bccb3fc7b6462f9fb2f6249ca7846d1a9a9319471e96577c55
7
+ data.tar.gz: 67b2b12b88df52a19e84ef68a7773f2ec989dec3858b5d64e0e60961f8f9f4154eda3e36ef1548b61004c8af4cc6b6850ba73c145f15da41832944857c904889
data/Gemfile CHANGED
@@ -4,7 +4,3 @@ source "https://rubygems.org"
4
4
 
5
5
  # Specify your gem's dependencies in gps_pvt.gemspec
6
6
  gemspec
7
-
8
- gem "rake", "~> 13.0"
9
-
10
- gem "rspec", "~> 3.0"
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 by C++, and wrapped by [SWIG](http://www.swig.org/).
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
- Add this line to your application's Gemfile:
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
- Or install it yourself as:
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
- | --rinex_nav=file_or_URI | [RINEX](https://www.igs.org/wg/rinex/#documents-formats) navigation file |
40
- | --rinex_obs=file_or_URI | [RINEX](https://www.igs.org/wg/rinex/#documents-formats) observation file |
41
- | --ubx=file_or_URI | [U-blox](https://www.u-blox.com/) dedicated format |
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 (supported gps_pvt version >= 0.7.0) |
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 | version |
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, automatically load ephemeris which is previously broadcasted from satellite and currently published online | v0.5.0 |
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 developer
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
- alias_method(:run_orig, :run)
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
@@ -59,7 +59,7 @@ options.reject!{|opt|
59
59
  misc_options[opt[0]] = t
60
60
  true
61
61
  when :online_ephemeris
62
- misc_options[opt[0]] = opt[1]
62
+ (misc_options[opt[0]] ||= []) << opt[1]
63
63
  true
64
64
  else
65
65
  false
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, :online_ephemeris, :broadcast_data, :eph_interval
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
- # Add dummy before actual first observation in order to notify time to solver
105
- obs.unshift([obs[0][0] - 1, GPS_PVT::GPS::Measurement::new])
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 SWIGTYPE_p_GPS_TimeT_double_t__leap_second_event_t swig_types[19]
1870
- #define SWIGTYPE_p_GPS_TimeT_double_t__leap_year_prop_res_t swig_types[20]
1871
- #define SWIGTYPE_p_GPS_User_PVTT_double_t swig_types[21]
1872
- #define SWIGTYPE_p_MatrixT_ComplexT_double_t_Array2D_DenseT_ComplexT_double_t_t_MatrixViewBaseT_t_t swig_types[22]
1873
- #define SWIGTYPE_p_MatrixT_double_Array2D_DenseT_double_t_MatrixViewBaseT_t_t swig_types[23]
1874
- #define SWIGTYPE_p_MatrixViewBaseT_t swig_types[24]
1875
- #define SWIGTYPE_p_MatrixViewFilterT_MatrixViewBaseT_t_t swig_types[25]
1876
- #define SWIGTYPE_p_Matrix_FrozenT_double_Array2D_DenseT_double_t_MatrixViewBaseT_t_t swig_types[26]
1877
- #define SWIGTYPE_p_PushableData swig_types[27]
1878
- #define SWIGTYPE_p_RINEX_ClockT_double_t swig_types[28]
1879
- #define SWIGTYPE_p_RINEX_ObservationT_double_t swig_types[29]
1880
- #define SWIGTYPE_p_SBAS_EphemerisT_double_t swig_types[30]
1881
- #define SWIGTYPE_p_SBAS_SolverOptionsT_double_t swig_types[31]
1882
- #define SWIGTYPE_p_SBAS_SpaceNodeT_double_t swig_types[32]
1883
- #define SWIGTYPE_p_SBAS_SpaceNodeT_double_t__SatelliteProperties__Ephemeris swig_types[33]
1884
- #define SWIGTYPE_p_SP3T_double_t swig_types[34]
1885
- #define SWIGTYPE_p_System_ENUT_double_WGS84_t swig_types[35]
1886
- #define SWIGTYPE_p_System_LLHT_double_WGS84_t swig_types[36]
1887
- #define SWIGTYPE_p_System_XYZT_double_WGS84_t swig_types[37]
1888
- #define SWIGTYPE_p_available_satellites_t swig_types[38]
1889
- #define SWIGTYPE_p_char swig_types[39]
1890
- #define SWIGTYPE_p_double swig_types[40]
1891
- #define SWIGTYPE_p_enu_t swig_types[41]
1892
- #define SWIGTYPE_p_eph_t swig_types[42]
1893
- #define SWIGTYPE_p_float_t swig_types[43]
1894
- #define SWIGTYPE_p_gps_space_node_t swig_types[44]
1895
- #define SWIGTYPE_p_gps_time_t swig_types[45]
1896
- #define SWIGTYPE_p_int swig_types[46]
1897
- #define SWIGTYPE_p_int_t swig_types[47]
1898
- #define SWIGTYPE_p_llh_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__detection_t swig_types[49]
1900
- #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[50]
1901
- #define SWIGTYPE_p_p_double swig_types[51]
1902
- #define SWIGTYPE_p_range_correction_list_t swig_types[52]
1903
- #define SWIGTYPE_p_s16_t swig_types[53]
1904
- #define SWIGTYPE_p_s32_t swig_types[54]
1905
- #define SWIGTYPE_p_s8_t swig_types[55]
1906
- #define SWIGTYPE_p_satellites_t swig_types[56]
1907
- #define SWIGTYPE_p_self_t swig_types[57]
1908
- #define SWIGTYPE_p_std__vectorT_std__pairT_int_SBAS_SpaceNodeT_double_t__Satellite_const_p_t_t swig_types[58]
1909
- #define SWIGTYPE_p_super_t swig_types[59]
1910
- #define SWIGTYPE_p_swig__GC_VALUE swig_types[60]
1911
- #define SWIGTYPE_p_u16_t swig_types[61]
1912
- #define SWIGTYPE_p_u32_t swig_types[62]
1913
- #define SWIGTYPE_p_u8_t swig_types[63]
1914
- #define SWIGTYPE_p_uint_t swig_types[64]
1915
- #define SWIGTYPE_p_unsigned_int swig_types[65]
1916
- #define SWIGTYPE_p_xyz_t swig_types[66]
1917
- static swig_type_info *swig_types[68];
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
- _val = SWIG_NewPointerObj(SWIG_as_voidptr(GPS_Time< double >::leap_second_events), SWIGTYPE_p_GPS_TimeT_double_t__leap_second_event_t, 0 );
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
- if (!uri_template) || (uri_template =~ /^\s*$/) then
34
- uri_template = "ftp://gssc.esa.int/gnss/data/daily/%Y/brdc/BRDC00IGS_R_%Y%j0000_01D_MN.rnx.gz"
35
- end
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
- uri = URI::parse(utc.strftime(uri_template))
39
- self.parse_rinex_nav(uri)
40
- uri
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.instance_eval{
27
- open_orig = method(:open)
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
- ((is_uri && (RUBY_VERSION >= "2.5.0")) ? URI : Kernel) \
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
@@ -1,5 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GPS_PVT
4
- VERSION = "0.8.2"
4
+ VERSION = "0.8.4"
5
+
6
+ def GPS_PVT.version_compare(a, b)
7
+ Gem::Version::new(a) <=> Gem::Version::new(b)
8
+ end
5
9
  end
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.2
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-20 00:00:00.000000000 Z
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