gps_pvt 0.10.0 → 0.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/README.md +6 -5
 - data/ext/gps_pvt/GPS/GPS_wrap.cxx +837 -52
 - data/ext/ninja-scan-light/tool/navigation/GLONASS_Solver.h +11 -3
 - data/ext/ninja-scan-light/tool/navigation/GPS.h +2 -1
 - data/ext/ninja-scan-light/tool/navigation/GPS_Solver.h +20 -16
 - data/ext/ninja-scan-light/tool/navigation/GPS_Solver_Base.h +84 -46
 - data/ext/ninja-scan-light/tool/navigation/GPS_Solver_RAIM.h +2 -1
 - data/ext/ninja-scan-light/tool/navigation/SBAS_Solver.h +10 -2
 - data/ext/ninja-scan-light/tool/swig/GPS.i +76 -5
 - data/ext/ninja-scan-light/tool/swig/spec/GPS_spec.rb +7 -7
 - data/lib/gps_pvt/asn1/asn1.rb +34 -11
 - data/lib/gps_pvt/asn1/asn1.y +112 -63
 - data/lib/gps_pvt/receiver/extension.rb +0 -73
 - data/lib/gps_pvt/receiver.rb +5 -4
 - data/lib/gps_pvt/rtcm3.rb +4 -4
 - data/lib/gps_pvt/supl.rb +3 -3
 - data/lib/gps_pvt/upl/MAP-LCS-DataTypes-V17_4_0-Release17.asn +740 -0
 - data/lib/gps_pvt/upl/RRLP-V17_0_0-Release17.asn +6 -1
 - data/lib/gps_pvt/upl/upl.json.gz +0 -0
 - data/lib/gps_pvt/upl/upl.rb +48 -0
 - data/lib/gps_pvt/version.rb +1 -1
 - metadata +3 -2
 
| 
         @@ -875,10 +875,10 @@ __RINEX_CLK_TEXT__ 
     | 
|
| 
       875 
875 
     | 
    
         
             
                  expect(pvt.vdop).to be_within(1E-2).of(1.87)
         
     | 
| 
       876 
876 
     | 
    
         
             
                  expect(pvt.tdop).to be_within(1E-2).of(1.08)
         
     | 
| 
       877 
877 
     | 
    
         
             
                  expect(pvt.velocity.to_a).to eq([:e, :n, :u].collect{|k| pvt.velocity.send(k)})
         
     | 
| 
       878 
     | 
    
         
            -
                  expect(pvt.velocity.north).to be_within(1E-2).of(-0. 
     | 
| 
       879 
     | 
    
         
            -
                  expect(pvt.velocity.east) .to be_within(1E-2).of(- 
     | 
| 
       880 
     | 
    
         
            -
                  expect(pvt.velocity.down) .to be_within(1E-2).of( 
     | 
| 
       881 
     | 
    
         
            -
                  expect(pvt.receiver_error_rate).to be_within(1E-2).of(- 
     | 
| 
      
 878 
     | 
    
         
            +
                  expect(pvt.velocity.north).to be_within(1E-2).of(-0.68) # north
         
     | 
| 
      
 879 
     | 
    
         
            +
                  expect(pvt.velocity.east) .to be_within(1E-2).of(-0.90) # east
         
     | 
| 
      
 880 
     | 
    
         
            +
                  expect(pvt.velocity.down) .to be_within(1E-2).of(0.26) # down
         
     | 
| 
      
 881 
     | 
    
         
            +
                  expect(pvt.receiver_error_rate).to be_within(1E-2).of(-1062.14)
         
     | 
| 
       882 
882 
     | 
    
         
             
                  expect(pvt.G.rows).to eq(6)
         
     | 
| 
       883 
883 
     | 
    
         
             
                  expect(pvt.W.rows).to eq(6)
         
     | 
| 
       884 
884 
     | 
    
         
             
                  expect(pvt.delta_r.rows).to eq(6)
         
     | 
| 
         @@ -942,9 +942,9 @@ __RINEX_CLK_TEXT__ 
     | 
|
| 
       942 
942 
     | 
    
         
             
                    expect(t_arv).to be_a_kind_of(GPS::Time)
         
     | 
| 
       943 
943 
     | 
    
         
             
                    expect(usr_pos).to be_a_kind_of(Coordinate::XYZ)
         
     | 
| 
       944 
944 
     | 
    
         
             
                    expect(usr_vel).to be_a_kind_of(Coordinate::XYZ)
         
     | 
| 
       945 
     | 
    
         
            -
                     
     | 
| 
       946 
     | 
    
         
            -
                     
     | 
| 
       947 
     | 
    
         
            -
                    [ 
     | 
| 
      
 945 
     | 
    
         
            +
                    weight_range, range_c, range_r, weight_rate, rate_rel_neg, *los_neg = rel_prop
         
     | 
| 
      
 946 
     | 
    
         
            +
                    weight_range = 1
         
     | 
| 
      
 947 
     | 
    
         
            +
                    [weight_range, range_c, range_r, weight_rate, rate_rel_neg] + los_neg
         
     | 
| 
       948 
948 
     | 
    
         
             
                  }
         
     | 
| 
       949 
949 
     | 
    
         
             
                  solver.hooks[:update_position_solution] = proc{|mat_G, mat_W, mat_delta_r, temp_pvt|
         
     | 
| 
       950 
950 
     | 
    
         
             
                    expect(temp_pvt).to be_a_kind_of(GPS::PVT)
         
     | 
    
        data/lib/gps_pvt/asn1/asn1.rb
    CHANGED
    
    | 
         @@ -1,3 +1,5 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'set'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            module GPS_PVT
         
     | 
| 
       2 
4 
     | 
    
         
             
            end
         
     | 
| 
       3 
5 
     | 
    
         | 
| 
         @@ -261,10 +263,10 @@ resolve_tree = proc{|root| 
     | 
|
| 
       261 
263 
     | 
    
         
             
                res
         
     | 
| 
       262 
264 
     | 
    
         
             
              }
         
     | 
| 
       263 
265 
     | 
    
         | 
| 
       264 
     | 
    
         
            -
              # This proc is  
     | 
| 
       265 
     | 
    
         
            -
              # does not require to re-order based on manual tags or class numbers
         
     | 
| 
      
 266 
     | 
    
         
            +
              # This proc is used to re-order for non-automatic tagging transformation
         
     | 
| 
       266 
267 
     | 
    
         
             
              # @see https://stackoverflow.com/a/31450137
         
     | 
| 
       267 
268 
     | 
    
         
             
              get_universal_class_number = proc{|type|
         
     | 
| 
      
 269 
     | 
    
         
            +
                # TODO where is CHOICE class number definition?
         
     | 
| 
       268 
270 
     | 
    
         
             
                next get_universal_class_number.call(type[1][:root][0][:type]) if type[0] == :CHOICE
         
     | 
| 
       269 
271 
     | 
    
         
             
                { # @see Table.1 unless any comment
         
     | 
| 
       270 
272 
     | 
    
         
             
                  :BOOLEAN => 1,
         
     | 
| 
         @@ -274,6 +276,9 @@ resolve_tree = proc{|root| 
     | 
|
| 
       274 
276 
     | 
    
         
             
                  :NULL => 5,
         
     | 
| 
       275 
277 
     | 
    
         
             
                  :ENUMERATED => 10,
         
     | 
| 
       276 
278 
     | 
    
         
             
                  :SEQUENCE => 16,
         
     | 
| 
      
 279 
     | 
    
         
            +
                  :SEQUENCE_OF => 16,
         
     | 
| 
      
 280 
     | 
    
         
            +
                  :SET => 17,
         
     | 
| 
      
 281 
     | 
    
         
            +
                  :SET_OF => 17,
         
     | 
| 
       277 
282 
     | 
    
         
             
                  :NumericString => 18, # @see Table.6
         
     | 
| 
       278 
283 
     | 
    
         
             
                  :PrintableString => 19, # @see Table.6
         
     | 
| 
       279 
284 
     | 
    
         
             
                  :IA5String => 22, # @see Table.6
         
     | 
| 
         @@ -281,6 +286,23 @@ resolve_tree = proc{|root| 
     | 
|
| 
       281 
286 
     | 
    
         
             
                  :UTCTime => 23, # @see 43.3
         
     | 
| 
       282 
287 
     | 
    
         
             
                }[type[0]]
         
     | 
| 
       283 
288 
     | 
    
         
             
              }
         
     | 
| 
      
 289 
     | 
    
         
            +
             
     | 
| 
      
 290 
     | 
    
         
            +
              reorder_children = proc{|type_opts|
         
     | 
| 
      
 291 
     | 
    
         
            +
                # reordering when automatic tagging transformation is not selected
         
     | 
| 
      
 292 
     | 
    
         
            +
                tags = Set[]
         
     | 
| 
      
 293 
     | 
    
         
            +
                [type_opts[:root], type_opts[:extension]].compact.each{|items|
         
     | 
| 
      
 294 
     | 
    
         
            +
                  items.collect!{|v|
         
     | 
| 
      
 295 
     | 
    
         
            +
                    tag = v[:type][1][:tag]
         
     | 
| 
      
 296 
     | 
    
         
            +
                    tag_class_num = case tag
         
     | 
| 
      
 297 
     | 
    
         
            +
                    when Array; [{"APPLICATION" => 1, "PRIVATE" => 3}[tag[0]], tag[1]]
         
     | 
| 
      
 298 
     | 
    
         
            +
                    when Integer; [2, tag] # (Context-specific) 
         
     | 
| 
      
 299 
     | 
    
         
            +
                    else; [0, get_universal_class_number.call(v[:type])] # UNIVERSAL
         
     | 
| 
      
 300 
     | 
    
         
            +
                    end
         
     | 
| 
      
 301 
     | 
    
         
            +
                    raise unless tags.add?(tag_class_num) # Identical tag is already existed!
         
     | 
| 
      
 302 
     | 
    
         
            +
                    [v, tag_class_num]
         
     | 
| 
      
 303 
     | 
    
         
            +
                  }.sort!{|a, b| a[1] <=> b[1]}.collect!{|v| v[0]}
         
     | 
| 
      
 304 
     | 
    
         
            +
                }
         
     | 
| 
      
 305 
     | 
    
         
            +
              }
         
     | 
| 
       284 
306 
     | 
    
         | 
| 
       285 
307 
     | 
    
         
             
              prepare_coding = proc{|tree|
         
     | 
| 
       286 
308 
     | 
    
         
             
                next tree.each{|k, v|
         
     | 
| 
         @@ -313,7 +335,8 @@ resolve_tree = proc{|root| 
     | 
|
| 
       313 
335 
     | 
    
         
             
                  }
         
     | 
| 
       314 
336 
     | 
    
         
             
                when :BIT_STRING, :OCTET_STRING
         
     | 
| 
       315 
337 
     | 
    
         
             
                  opts[:size_range] = find_range.call(opts, :size)
         
     | 
| 
       316 
     | 
    
         
            -
                when :SEQUENCE
         
     | 
| 
      
 338 
     | 
    
         
            +
                when :SEQUENCE, :SET
         
     | 
| 
      
 339 
     | 
    
         
            +
                  reorder_children.call(opts) if (opts[:automatic_tagging] == false) # only for SET
         
     | 
| 
       317 
340 
     | 
    
         
             
                  (opts[:root] + (opts[:extension] || [])).each.with_index{|v, i|
         
     | 
| 
       318 
341 
     | 
    
         
             
                    v[:name] = v[:name] ? v[:name].to_sym : i
         
     | 
| 
       319 
342 
     | 
    
         
             
                    v[:type][1][:typename] ||= v[:name] if v[:name].kind_of?(Symbol) && v[:type] # for debugger
         
     | 
| 
         @@ -325,11 +348,11 @@ resolve_tree = proc{|root| 
     | 
|
| 
       325 
348 
     | 
    
         
             
                      v2[:name]
         
     | 
| 
       326 
349 
     | 
    
         
             
                    } if v[:group]
         
     | 
| 
       327 
350 
     | 
    
         
             
                  }
         
     | 
| 
       328 
     | 
    
         
            -
                when :SEQUENCE_OF
         
     | 
| 
      
 351 
     | 
    
         
            +
                when :SEQUENCE_OF, :SET_OF
         
     | 
| 
       329 
352 
     | 
    
         
             
                  opts[:size_range] = find_range.call(opts, :size)
         
     | 
| 
       330 
353 
     | 
    
         
             
                  prepare_coding.call(opts)
         
     | 
| 
       331 
354 
     | 
    
         
             
                when :CHOICE
         
     | 
| 
       332 
     | 
    
         
            -
                   
     | 
| 
      
 355 
     | 
    
         
            +
                  reorder_children.call(opts) if (opts[:automatic_tagging] == false)
         
     | 
| 
       333 
356 
     | 
    
         
             
                  opts[:extension] = opts[:extension].collect{|v|
         
     | 
| 
       334 
357 
     | 
    
         
             
                    v[:group] || [v] # 22. Note says "Version brackets have no effect"
         
     | 
| 
       335 
358 
     | 
    
         
             
                  }.flatten(1) if opts[:extension]
         
     | 
| 
         @@ -372,7 +395,7 @@ generate_skeleton = proc{|tree, data| 
     | 
|
| 
       372 
395 
     | 
    
         
             
                when :BIT_STRING, :OCTET_STRING
         
     | 
| 
       373 
396 
     | 
    
         
             
                  data || ({:BIT_STRING => [0], :OCTET_STRING => [0xFF]}[type] \
         
     | 
| 
       374 
397 
     | 
    
         
             
                      * (opts[:size_range][:root].first rescue 0))
         
     | 
| 
       375 
     | 
    
         
            -
                when :SEQUENCE
         
     | 
| 
      
 398 
     | 
    
         
            +
                when :SEQUENCE, :SET
         
     | 
| 
       376 
399 
     | 
    
         
             
                  data ||= {}
         
     | 
| 
       377 
400 
     | 
    
         
             
                  Hash[*((opts[:root] + (opts[:extension] || [])).collect{|v|
         
     | 
| 
       378 
401 
     | 
    
         
             
                    if v[:group] then
         
     | 
| 
         @@ -386,7 +409,7 @@ generate_skeleton = proc{|tree, data| 
     | 
|
| 
       386 
409 
     | 
    
         
             
                      end
         
     | 
| 
       387 
410 
     | 
    
         
             
                    end
         
     | 
| 
       388 
411 
     | 
    
         
             
                  }.compact.flatten(2))]
         
     | 
| 
       389 
     | 
    
         
            -
                when :SEQUENCE_OF
         
     | 
| 
      
 412 
     | 
    
         
            +
                when :SEQUENCE_OF, :SET_OF
         
     | 
| 
       390 
413 
     | 
    
         
             
                  next data.collect{|v| generate_skeleton.call(opts, v)} if data
         
     | 
| 
       391 
414 
     | 
    
         
             
                  v = Marshal::dump(generate_skeleton.call(opts))
         
     | 
| 
       392 
415 
     | 
    
         
             
                  (opts[:size_range][:root].first rescue 0).times.collect{
         
     | 
| 
         @@ -488,7 +511,7 @@ encode = proc{|tree, data| 
     | 
|
| 
       488 
511 
     | 
    
         
             
                    end
         
     | 
| 
       489 
512 
     | 
    
         
             
                  end
         
     | 
| 
       490 
513 
     | 
    
         
             
                  res += data.collect{|v| "%0#{bits}b"%[v]}.join
         
     | 
| 
       491 
     | 
    
         
            -
                when :SEQUENCE
         
     | 
| 
      
 514 
     | 
    
         
            +
                when :SEQUENCE, :SET
         
     | 
| 
       492 
515 
     | 
    
         
             
                  opt_def_flags, root_encoded = opts[:root].collect{|v| # 18.2
         
     | 
| 
       493 
516 
     | 
    
         
             
                    has_elm = data.include?(v[:name])
         
     | 
| 
       494 
517 
     | 
    
         
             
                    elm = data[v[:name]]
         
     | 
| 
         @@ -532,7 +555,7 @@ encode = proc{|tree, data| 
     | 
|
| 
       532 
555 
     | 
    
         
             
                  end
         
     | 
| 
       533 
556 
     | 
    
         | 
| 
       534 
557 
     | 
    
         
             
                  "#{ext_bit}#{opt_def_flags.join}#{root_encoded.join}#{ext_encoded}"
         
     | 
| 
       535 
     | 
    
         
            -
                when :SEQUENCE_OF
         
     | 
| 
      
 558 
     | 
    
         
            +
                when :SEQUENCE_OF, :SET_OF
         
     | 
| 
       536 
559 
     | 
    
         
             
                  ext_bit, len_enc = case (cat = opts[:size_range].belong_to(data.size))
         
     | 
| 
       537 
560 
     | 
    
         
             
                  when :additional
         
     | 
| 
       538 
561 
     | 
    
         
             
                    # 19.4 -> 10.9.4.2(semi_constrained_whole_number)
         
     | 
| 
         @@ -691,7 +714,7 @@ decode = proc{|tree, str| 
     | 
|
| 
       691 
714 
     | 
    
         
             
                    end
         
     | 
| 
       692 
715 
     | 
    
         
             
                  end
         
     | 
| 
       693 
716 
     | 
    
         
             
                  str.slice!(0, bits * len).scan(/.{#{bits}}/).collect{|chunk| chunk.to_i(2)}
         
     | 
| 
       694 
     | 
    
         
            -
                when :SEQUENCE
         
     | 
| 
      
 717 
     | 
    
         
            +
                when :SEQUENCE, :SET
         
     | 
| 
       695 
718 
     | 
    
         
             
                  has_extension = (opts[:extension] && (str.slice!(0) == '1'))
         
     | 
| 
       696 
719 
     | 
    
         
             
                  data = Hash[*(
         
     | 
| 
       697 
720 
     | 
    
         
             
                    opts[:root].collect{|v| [v[:name], v[:default]] if v[:default]}.compact.flatten(1)
         
     | 
| 
         @@ -709,7 +732,7 @@ decode = proc{|tree, str| 
     | 
|
| 
       709 
732 
     | 
    
         
             
                        v[:group] ? decoded.to_a : [[v[:name], decoded]]
         
     | 
| 
       710 
733 
     | 
    
         
             
                      }.compact.flatten(2))]) if has_extension
         
     | 
| 
       711 
734 
     | 
    
         
             
                  data
         
     | 
| 
       712 
     | 
    
         
            -
                when :SEQUENCE_OF
         
     | 
| 
      
 735 
     | 
    
         
            +
                when :SEQUENCE_OF, :SET_OF
         
     | 
| 
       713 
736 
     | 
    
         
             
                  len_dec = if opts[:size_range][:additional] && (str.slice!(0) == '1') then
         
     | 
| 
       714 
737 
     | 
    
         
             
                    # 19.4 -> 10.9.4.2(semi_constrained_whole_number)
         
     | 
| 
       715 
738 
     | 
    
         
             
                    :length_otherwise
         
     | 
    
        data/lib/gps_pvt/asn1/asn1.y
    CHANGED
    
    | 
         @@ -46,10 +46,10 @@ rule 
     | 
|
| 
       46 
46 
     | 
    
         
             
              DefinitiveNameAndNumberForm : identifier LCBRACE DefinitiveNumberForm RCBRACE
         
     | 
| 
       47 
47 
     | 
    
         | 
| 
       48 
48 
     | 
    
         
             
              TagDefault :
         
     | 
| 
       49 
     | 
    
         
            -
                  EXPLICIT TAGS { 
     | 
| 
       50 
     | 
    
         
            -
                  | IMPLICIT TAGS { 
     | 
| 
       51 
     | 
    
         
            -
                  | AUTOMATIC TAGS
         
     | 
| 
       52 
     | 
    
         
            -
                  | { 
     | 
| 
      
 49 
     | 
    
         
            +
                  EXPLICIT TAGS {@tags = val[0]}
         
     | 
| 
      
 50 
     | 
    
         
            +
                  | IMPLICIT TAGS {@tags = val[0]}
         
     | 
| 
      
 51 
     | 
    
         
            +
                  | AUTOMATIC TAGS {@tags = val[0]} # 12.3
         
     | 
| 
      
 52 
     | 
    
         
            +
                  | {@tags = :EXPLICIT} # 12.2
         
     | 
| 
       53 
53 
     | 
    
         | 
| 
       54 
54 
     | 
    
         
             
              ExtensionDefault :
         
     | 
| 
       55 
55 
     | 
    
         
             
                  EXTENSIBILITY IMPLIED
         
     | 
| 
         @@ -179,8 +179,8 @@ rule 
     | 
|
| 
       179 
179 
     | 
    
         
             
                  #| RelativeOIDType
         
     | 
| 
       180 
180 
     | 
    
         
             
                  | SequenceType
         
     | 
| 
       181 
181 
     | 
    
         
             
                  | SequenceOfType
         
     | 
| 
       182 
     | 
    
         
            -
                   
     | 
| 
       183 
     | 
    
         
            -
                   
     | 
| 
      
 182 
     | 
    
         
            +
                  | SetType
         
     | 
| 
      
 183 
     | 
    
         
            +
                  | SetOfType
         
     | 
| 
       184 
184 
     | 
    
         
             
                  | TaggedType
         
     | 
| 
       185 
185 
     | 
    
         
             
                  | UTCTime # 43. Universal time
         
     | 
| 
       186 
186 
     | 
    
         | 
| 
         @@ -199,32 +199,34 @@ rule 
     | 
|
| 
       199 
199 
     | 
    
         
             
                  | ObjectClassFieldValue
         
     | 
| 
       200 
200 
     | 
    
         | 
| 
       201 
201 
     | 
    
         
             
              BuiltinValue : # 16.9
         
     | 
| 
       202 
     | 
    
         
            -
                  BitStringValue
         
     | 
| 
       203 
     | 
    
         
            -
                  | BooleanValue
         
     | 
| 
       204 
     | 
    
         
            -
                  | CharacterStringValue
         
     | 
| 
       205 
     | 
    
         
            -
                  | ChoiceValue
         
     | 
| 
      
 202 
     | 
    
         
            +
                  BitStringValue # String, Array, Hash (possible returned value, same below)
         
     | 
| 
      
 203 
     | 
    
         
            +
                  | BooleanValue # true/false
         
     | 
| 
      
 204 
     | 
    
         
            +
                  | CharacterStringValue # String, Array, Hash
         
     | 
| 
      
 205 
     | 
    
         
            +
                  | ChoiceValue # Hash
         
     | 
| 
       206 
206 
     | 
    
         
             
                  #| EmbeddedPDVValue
         
     | 
| 
       207 
     | 
    
         
            -
                  | EnumeratedValue
         
     | 
| 
      
 207 
     | 
    
         
            +
                  | EnumeratedValue # String
         
     | 
| 
       208 
208 
     | 
    
         
             
                  #| ExternalValue
         
     | 
| 
       209 
209 
     | 
    
         
             
                  #| InstanceOfValue
         
     | 
| 
       210 
     | 
    
         
            -
                  | IntegerValue
         
     | 
| 
       211 
     | 
    
         
            -
                  | NullValue
         
     | 
| 
       212 
     | 
    
         
            -
                  | ObjectIdentifierValue
         
     | 
| 
       213 
     | 
    
         
            -
                  | OctetStringValue
         
     | 
| 
       214 
     | 
    
         
            -
                  | RealValue
         
     | 
| 
      
 210 
     | 
    
         
            +
                  | IntegerValue # Number, String
         
     | 
| 
      
 211 
     | 
    
         
            +
                  | NullValue # nil
         
     | 
| 
      
 212 
     | 
    
         
            +
                  | ObjectIdentifierValue # Array
         
     | 
| 
      
 213 
     | 
    
         
            +
                  | OctetStringValue # String, Hash
         
     | 
| 
      
 214 
     | 
    
         
            +
                  | RealValue # Number, Hash(M * B^E), String([PLUS|MINUS]_INFINITY)
         
     | 
| 
       215 
215 
     | 
    
         
             
                  #| RelativeOIDValue
         
     | 
| 
       216 
     | 
    
         
            -
                  | SequenceValue
         
     | 
| 
       217 
     | 
    
         
            -
                  | SequenceOfValue
         
     | 
| 
       218 
     | 
    
         
            -
                   
     | 
| 
       219 
     | 
    
         
            -
                   
     | 
| 
      
 216 
     | 
    
         
            +
                  | SequenceValue # Hash
         
     | 
| 
      
 217 
     | 
    
         
            +
                  | SequenceOfValue # Array, Hash
         
     | 
| 
      
 218 
     | 
    
         
            +
                  | SetValue # Hash
         
     | 
| 
      
 219 
     | 
    
         
            +
                  | SetOfValue # Array, Hash
         
     | 
| 
       220 
220 
     | 
    
         
             
                  #| TaggedValue
         
     | 
| 
       221 
221 
     | 
    
         | 
| 
       222 
222 
     | 
    
         
             
              #ReferencedValue : DefinedValue | ValueFromObject # 16.11
         
     | 
| 
       223 
223 
     | 
    
         
             
              #ReferencedValue : identifier
         
     | 
| 
       224 
224 
     | 
    
         | 
| 
      
 225 
     | 
    
         
            +
              NamedValue : identifier Value {result = {val[0] => val[1]}} # 16.13
         
     | 
| 
      
 226 
     | 
    
         
            +
              
         
     | 
| 
       225 
227 
     | 
    
         
             
              # 17. Notation for the boolean type
         
     | 
| 
       226 
228 
     | 
    
         
             
              BooleanType : BOOLEAN
         
     | 
| 
       227 
     | 
    
         
            -
              BooleanValue : TRUE | FALSE
         
     | 
| 
      
 229 
     | 
    
         
            +
              BooleanValue : TRUE {result = true} | FALSE {result = false}
         
     | 
| 
       228 
230 
     | 
    
         | 
| 
       229 
231 
     | 
    
         
             
              # 18. Notation for the integer type
         
     | 
| 
       230 
232 
     | 
    
         
             
              IntegerType :
         
     | 
| 
         @@ -240,7 +242,7 @@ rule 
     | 
|
| 
       240 
242 
     | 
    
         
             
                  number
         
     | 
| 
       241 
243 
     | 
    
         
             
                  | MINUS number {result = -val[1]}
         
     | 
| 
       242 
244 
     | 
    
         | 
| 
       243 
     | 
    
         
            -
              IntegerValue :
         
     | 
| 
      
 245 
     | 
    
         
            +
              IntegerValue : # returning Number or String
         
     | 
| 
       244 
246 
     | 
    
         
             
                  SignedNumber
         
     | 
| 
       245 
247 
     | 
    
         
             
                  | identifier
         
     | 
| 
       246 
248 
     | 
    
         | 
| 
         @@ -299,13 +301,13 @@ rule 
     | 
|
| 
       299 
301 
     | 
    
         
             
              # 20. Notation for the real type
         
     | 
| 
       300 
302 
     | 
    
         
             
              RealType : REAL
         
     | 
| 
       301 
303 
     | 
    
         | 
| 
       302 
     | 
    
         
            -
              RealValue :
         
     | 
| 
      
 304 
     | 
    
         
            +
              RealValue : # returning Number, Hash (M * B^E) or String ([PLUS|MINUS]_INFINITY)
         
     | 
| 
       303 
305 
     | 
    
         
             
                  NumericRealValue
         
     | 
| 
       304 
306 
     | 
    
         
             
                  | SpecialRealValue
         
     | 
| 
       305 
307 
     | 
    
         
             
              NumericRealValue :
         
     | 
| 
       306 
308 
     | 
    
         
             
                  realnumber 
         
     | 
| 
       307 
     | 
    
         
            -
                  | MINUS realnumber
         
     | 
| 
       308 
     | 
    
         
            -
                  | SequenceValue
         
     | 
| 
      
 309 
     | 
    
         
            +
                  | MINUS realnumber {result = -val[1]}
         
     | 
| 
      
 310 
     | 
    
         
            +
                  | SequenceValue # 20.3 in M * B^E format
         
     | 
| 
       309 
311 
     | 
    
         
             
              SpecialRealValue : PLUS_INFINITY | MINUS_INFINITY
         
     | 
| 
       310 
312 
     | 
    
         | 
| 
       311 
313 
     | 
    
         
             
              # 21. Notation for the bitstring
         
     | 
| 
         @@ -319,22 +321,22 @@ rule 
     | 
|
| 
       319 
321 
     | 
    
         
             
                  identifier LCBRACE number RCBRACE {result = {val[0] => val[2]}}
         
     | 
| 
       320 
322 
     | 
    
         
             
                  | identifier LCBRACE DefinedValue RCBRACE {result = {val[0] => val[2]}}
         
     | 
| 
       321 
323 
     | 
    
         | 
| 
       322 
     | 
    
         
            -
              BitStringValue :
         
     | 
| 
      
 324 
     | 
    
         
            +
              BitStringValue : # returning String, Array or Hash
         
     | 
| 
       323 
325 
     | 
    
         
             
                  bstring
         
     | 
| 
       324 
326 
     | 
    
         
             
                  | hstring
         
     | 
| 
       325 
     | 
    
         
            -
                  | LBRACE IdentifierList RBRACE
         
     | 
| 
       326 
     | 
    
         
            -
                  | LBRACE RBRACE
         
     | 
| 
       327 
     | 
    
         
            -
                  | CONTAINING Value
         
     | 
| 
      
 327 
     | 
    
         
            +
                  | LBRACE IdentifierList RBRACE {result = val[1]}
         
     | 
| 
      
 328 
     | 
    
         
            +
                  | LBRACE RBRACE {result = []}
         
     | 
| 
      
 329 
     | 
    
         
            +
                  | CONTAINING Value {result = {:containing => val[1]}}
         
     | 
| 
       328 
330 
     | 
    
         
             
              IdentifierList :
         
     | 
| 
       329 
     | 
    
         
            -
                  identifier
         
     | 
| 
       330 
     | 
    
         
            -
                  | IdentifierList COMMA identifier
         
     | 
| 
      
 331 
     | 
    
         
            +
                  identifier {result = [val[0]]}
         
     | 
| 
      
 332 
     | 
    
         
            +
                  | IdentifierList COMMA identifier  {result << val[2]}
         
     | 
| 
       331 
333 
     | 
    
         | 
| 
       332 
334 
     | 
    
         
             
              # 22. Notation for the octetstring type
         
     | 
| 
       333 
335 
     | 
    
         
             
              OctetStringType : OCTET STRING {result = {:type => :OCTET_STRING}}
         
     | 
| 
       334 
     | 
    
         
            -
              OctetStringValue :
         
     | 
| 
      
 336 
     | 
    
         
            +
              OctetStringValue : # returning String or Hash
         
     | 
| 
       335 
337 
     | 
    
         
             
                  bstring
         
     | 
| 
       336 
338 
     | 
    
         
             
                  | hstring
         
     | 
| 
       337 
     | 
    
         
            -
                  | CONTAINING Value
         
     | 
| 
      
 339 
     | 
    
         
            +
                  | CONTAINING Value {result = {:containing => val[1]}}
         
     | 
| 
       338 
340 
     | 
    
         | 
| 
       339 
341 
     | 
    
         
             
              # 23. Notation for the null type
         
     | 
| 
       340 
342 
     | 
    
         
             
              NullType : NULL
         
     | 
| 
         @@ -409,12 +411,12 @@ rule 
     | 
|
| 
       409 
411 
     | 
    
         
             
                  | NamedType DEFAULT Value {result = val[0].merge({:default => val[2]})}
         
     | 
| 
       410 
412 
     | 
    
         
             
                  | COMPONENTS OF Type {result = val[2]; raise} /* TODO 24.4 says only root components of SEQUENCE are included */
         
     | 
| 
       411 
413 
     | 
    
         | 
| 
       412 
     | 
    
         
            -
              SequenceValue :
         
     | 
| 
       413 
     | 
    
         
            -
                  LBRACE ComponentValueList RBRACE
         
     | 
| 
       414 
     | 
    
         
            -
                  | LBRACE RBRACE
         
     | 
| 
      
 414 
     | 
    
         
            +
              SequenceValue : # returning Hash
         
     | 
| 
      
 415 
     | 
    
         
            +
                  LBRACE ComponentValueList RBRACE {result = val[1]}
         
     | 
| 
      
 416 
     | 
    
         
            +
                  | LBRACE RBRACE {result = {}}
         
     | 
| 
       415 
417 
     | 
    
         
             
              ComponentValueList :
         
     | 
| 
       416 
     | 
    
         
            -
                  NamedValue
         
     | 
| 
       417 
     | 
    
         
            -
                  | ComponentValueList COMMA NamedValue
         
     | 
| 
      
 418 
     | 
    
         
            +
                  NamedValue {result = val[0]}
         
     | 
| 
      
 419 
     | 
    
         
            +
                  | ComponentValueList COMMA NamedValue {result = val[0].merge(val[2])}
         
     | 
| 
       418 
420 
     | 
    
         | 
| 
       419 
421 
     | 
    
         
             
              # 25 Notation for sequence-of types
         
     | 
| 
       420 
422 
     | 
    
         
             
              SequenceOfType :
         
     | 
| 
         @@ -423,19 +425,50 @@ rule 
     | 
|
| 
       423 
425 
     | 
    
         
             
                  }
         
     | 
| 
       424 
426 
     | 
    
         
             
              SequenceOfType_t : Type | NamedType
         
     | 
| 
       425 
427 
     | 
    
         | 
| 
       426 
     | 
    
         
            -
              SequenceOfValue :
         
     | 
| 
       427 
     | 
    
         
            -
                  LBRACE ValueList RBRACE 
         
     | 
| 
       428 
     | 
    
         
            -
                  | LBRACE NamedValueList RBRACE
         
     | 
| 
       429 
     | 
    
         
            -
                  | LBRACE RBRACE
         
     | 
| 
      
 428 
     | 
    
         
            +
              SequenceOfValue : # returning Array or Hash
         
     | 
| 
      
 429 
     | 
    
         
            +
                  LBRACE ValueList RBRACE {result = val[1]}
         
     | 
| 
      
 430 
     | 
    
         
            +
                  | LBRACE NamedValueList RBRACE {result = val[1]}
         
     | 
| 
      
 431 
     | 
    
         
            +
                  | LBRACE RBRACE {result = {}}
         
     | 
| 
       430 
432 
     | 
    
         
             
              ValueList :
         
     | 
| 
       431 
     | 
    
         
            -
                  Value 
         
     | 
| 
       432 
     | 
    
         
            -
                  | ValueList COMMA Value
         
     | 
| 
      
 433 
     | 
    
         
            +
                  Value {result = [val[0]]}
         
     | 
| 
      
 434 
     | 
    
         
            +
                  | ValueList COMMA Value {result << val[2]}
         
     | 
| 
       433 
435 
     | 
    
         
             
              NamedValueList :
         
     | 
| 
       434 
     | 
    
         
            -
                  NamedValue
         
     | 
| 
       435 
     | 
    
         
            -
                  | NamedValueList COMMA NamedValue
         
     | 
| 
      
 436 
     | 
    
         
            +
                  NamedValue {result = val[0]}
         
     | 
| 
      
 437 
     | 
    
         
            +
                  | NamedValueList COMMA NamedValue {result = val[0].merge(val[2])}
         
     | 
| 
      
 438 
     | 
    
         
            +
             
     | 
| 
      
 439 
     | 
    
         
            +
              # 26. Notation for set types
         
     | 
| 
      
 440 
     | 
    
         
            +
              SetType :
         
     | 
| 
      
 441 
     | 
    
         
            +
                  /*SET LBRACE RBRACE
         
     | 
| 
      
 442 
     | 
    
         
            +
                  | SET LBRACE ExtensionAndException OptionalExtensionMarker RBRACE
         
     | 
| 
      
 443 
     | 
    
         
            +
                  |*/ SET LBRACE ComponentTypeLists RBRACE {
         
     | 
| 
      
 444 
     | 
    
         
            +
                    # 26.3
         
     | 
| 
      
 445 
     | 
    
         
            +
                    val[2].merge!({:automatic_tagging => false}) \
         
     | 
| 
      
 446 
     | 
    
         
            +
                        if (@tags != :AUTOMATIC) \
         
     | 
| 
      
 447 
     | 
    
         
            +
                          || (val[2][:root] + (val[2][:extension] || [])).any?{|v|
         
     | 
| 
      
 448 
     | 
    
         
            +
                            v[:type][1][:tag] rescue false
         
     | 
| 
      
 449 
     | 
    
         
            +
                          }
         
     | 
| 
      
 450 
     | 
    
         
            +
                    result = {:type => [val[0], val[2]]}
         
     | 
| 
      
 451 
     | 
    
         
            +
                  }
         
     | 
| 
      
 452 
     | 
    
         
            +
             
     | 
| 
      
 453 
     | 
    
         
            +
              SetValue : SequenceValue # returning Hash
         
     | 
| 
      
 454 
     | 
    
         
            +
             
     | 
| 
      
 455 
     | 
    
         
            +
              # 27. Notation for set-of types
         
     | 
| 
      
 456 
     | 
    
         
            +
              SetOfType :
         
     | 
| 
      
 457 
     | 
    
         
            +
                  SET OF SetOfType_t {
         
     | 
| 
      
 458 
     | 
    
         
            +
                    result = {:type => ["#{val[0]}_#{val[1]}".to_sym, val[2]]}
         
     | 
| 
      
 459 
     | 
    
         
            +
                  }
         
     | 
| 
      
 460 
     | 
    
         
            +
              SetOfType_t : Type | NamedType
         
     | 
| 
      
 461 
     | 
    
         
            +
              
         
     | 
| 
      
 462 
     | 
    
         
            +
              SetOfValue : SequenceOfValue # returning Array or Hash
         
     | 
| 
       436 
463 
     | 
    
         | 
| 
       437 
464 
     | 
    
         
             
              # 28. Notation for choice types
         
     | 
| 
       438 
465 
     | 
    
         
             
              ChoiceType : CHOICE LBRACE AlternativeTypeLists RBRACE {
         
     | 
| 
      
 466 
     | 
    
         
            +
                # 28.2
         
     | 
| 
      
 467 
     | 
    
         
            +
                val[2].merge!({:automatic_tagging => false}) \
         
     | 
| 
      
 468 
     | 
    
         
            +
                    if (@tags != :AUTOMATIC) \
         
     | 
| 
      
 469 
     | 
    
         
            +
                      || (val[2][:root] + (val[2][:extension] || [])).any?{|v|
         
     | 
| 
      
 470 
     | 
    
         
            +
                        v[:type][1][:tag] rescue false
         
     | 
| 
      
 471 
     | 
    
         
            +
                      }
         
     | 
| 
       439 
472 
     | 
    
         
             
                result = {:type => [val[0], val[2]]}
         
     | 
| 
       440 
473 
     | 
    
         
             
              }
         
     | 
| 
       441 
474 
     | 
    
         
             
              /*
         
     | 
| 
         @@ -472,14 +505,30 @@ rule 
     | 
|
| 
       472 
505 
     | 
    
         
             
                  NamedType {result = [val[0]]}
         
     | 
| 
       473 
506 
     | 
    
         
             
                  | AlternativeTypeList COMMA NamedType {result << val[2]}
         
     | 
| 
       474 
507 
     | 
    
         | 
| 
       475 
     | 
    
         
            -
              ChoiceValue :  
     | 
| 
      
 508 
     | 
    
         
            +
              ChoiceValue : # returning Hash
         
     | 
| 
      
 509 
     | 
    
         
            +
                  identifier COLON Value {result = {val[0] => val[2]}}
         
     | 
| 
       476 
510 
     | 
    
         | 
| 
       477 
511 
     | 
    
         
             
              # 30. Notation for tagged types
         
     | 
| 
       478 
     | 
    
         
            -
              TaggedType :
         
     | 
| 
      
 512 
     | 
    
         
            +
              /*TaggedType :
         
     | 
| 
       479 
513 
     | 
    
         
             
                  Tag Type
         
     | 
| 
       480 
514 
     | 
    
         
             
                  | Tag IMPLICIT Type
         
     | 
| 
       481 
     | 
    
         
            -
                  | Tag EXPLICIT Type
         
     | 
| 
       482 
     | 
    
         
            -
               
     | 
| 
      
 515 
     | 
    
         
            +
                  | Tag EXPLICIT Type*/
         
     | 
| 
      
 516 
     | 
    
         
            +
              TaggedType :
         
     | 
| 
      
 517 
     | 
    
         
            +
                  Tag TaggingConstruction Type {
         
     | 
| 
      
 518 
     | 
    
         
            +
                    result = val[2] # => {} having :type or :typeref keys
         
     | 
| 
      
 519 
     | 
    
         
            +
                    result[:type] = [result[:type]].flatten(1)
         
     | 
| 
      
 520 
     | 
    
         
            +
                    (result[:type][1] ||= {}).merge!({:tag => val[0]})
         
     | 
| 
      
 521 
     | 
    
         
            +
                    # TODO 30.6 c) to check whether Type is an untagged CHOICE after extraction of ReferencedType 
         
     | 
| 
      
 522 
     | 
    
         
            +
                    result[:type][1].merge!({:tag_cnstr => val[1]}) if val[1]
         
     | 
| 
      
 523 
     | 
    
         
            +
                  }
         
     | 
| 
      
 524 
     | 
    
         
            +
              TaggingConstruction :
         
     | 
| 
      
 525 
     | 
    
         
            +
                  IMPLICIT {result = nil}
         
     | 
| 
      
 526 
     | 
    
         
            +
                  | EXPLICIT # 30.6 a)
         
     | 
| 
      
 527 
     | 
    
         
            +
                  | {result = :EXPLICIT if @tags == :EXPLICIT} # 30.6 b)
         
     | 
| 
      
 528 
     | 
    
         
            +
              Tag : 
         
     | 
| 
      
 529 
     | 
    
         
            +
                  LBRACKET Class ClassNumber RBRACKET
         
     | 
| 
      
 530 
     | 
    
         
            +
                      {result = val[1] ? val[1..2] : val[2]}
         
     | 
| 
      
 531 
     | 
    
         
            +
                      # if class specified, array is returned; otherwise, integer.
         
     | 
| 
       483 
532 
     | 
    
         
             
              ClassNumber :
         
     | 
| 
       484 
533 
     | 
    
         
             
                  number
         
     | 
| 
       485 
534 
     | 
    
         
             
                  | DefinedValue
         
     | 
| 
         @@ -494,12 +543,12 @@ rule 
     | 
|
| 
       494 
543 
     | 
    
         
             
              # 31. Notation for the object identifier type
         
     | 
| 
       495 
544 
     | 
    
         
             
              ObjectIdentifierType : OBJECT IDENTIFIER
         
     | 
| 
       496 
545 
     | 
    
         | 
| 
       497 
     | 
    
         
            -
              ObjectIdentifierValue :
         
     | 
| 
       498 
     | 
    
         
            -
                  LBRACE ObjIdComponentsList RBRACE
         
     | 
| 
       499 
     | 
    
         
            -
                  | LBRACKET DefinedValue ObjIdComponentsList RBRACKET
         
     | 
| 
      
 546 
     | 
    
         
            +
              ObjectIdentifierValue : # returning Array
         
     | 
| 
      
 547 
     | 
    
         
            +
                  LBRACE ObjIdComponentsList RBRACE {result = val[1]}
         
     | 
| 
      
 548 
     | 
    
         
            +
                  | LBRACKET DefinedValue ObjIdComponentsList RBRACKET {result = [val[1]] + val[2]}
         
     | 
| 
       500 
549 
     | 
    
         
             
              ObjIdComponentsList :
         
     | 
| 
       501 
     | 
    
         
            -
                  ObjIdComponents
         
     | 
| 
       502 
     | 
    
         
            -
                  | ObjIdComponentsList ObjIdComponents
         
     | 
| 
      
 550 
     | 
    
         
            +
                  ObjIdComponents {result = [val[0]]}
         
     | 
| 
      
 551 
     | 
    
         
            +
                  | ObjIdComponentsList ObjIdComponents {result << val[1]}
         
     | 
| 
       503 
552 
     | 
    
         
             
              ObjIdComponents :
         
     | 
| 
       504 
553 
     | 
    
         
             
                  NameForm
         
     | 
| 
       505 
554 
     | 
    
         
             
                  | NumberForm
         
     | 
| 
         @@ -509,13 +558,13 @@ rule 
     | 
|
| 
       509 
558 
     | 
    
         
             
              NumberForm :
         
     | 
| 
       510 
559 
     | 
    
         
             
                  number
         
     | 
| 
       511 
560 
     | 
    
         
             
                  | DefinedValue
         
     | 
| 
       512 
     | 
    
         
            -
              NameAndNumberForm : identifier LCBRACE NumberForm RCBRACE
         
     | 
| 
      
 561 
     | 
    
         
            +
              NameAndNumberForm : identifier LCBRACE NumberForm RCBRACE {result = val.values_at(0, 2)}
         
     | 
| 
       513 
562 
     | 
    
         | 
| 
       514 
563 
     | 
    
         
             
              # 36. Notation for character string types
         
     | 
| 
       515 
564 
     | 
    
         
             
              CharacterStringType :
         
     | 
| 
       516 
565 
     | 
    
         
             
                  RestrictedCharacterStringType
         
     | 
| 
       517 
566 
     | 
    
         
             
                  | UnrestrictedCharacterStringType
         
     | 
| 
       518 
     | 
    
         
            -
              CharacterStringValue :
         
     | 
| 
      
 567 
     | 
    
         
            +
              CharacterStringValue : # returning String, Array or Hash
         
     | 
| 
       519 
568 
     | 
    
         
             
                  RestrictedCharacterStringValue
         
     | 
| 
       520 
569 
     | 
    
         
             
                  | UnrestrictedCharacterStringValue
         
     | 
| 
       521 
570 
     | 
    
         | 
| 
         @@ -535,26 +584,26 @@ rule 
     | 
|
| 
       535 
584 
     | 
    
         
             
                  | VideotexString*/
         
     | 
| 
       536 
585 
     | 
    
         
             
                  | VisibleString
         
     | 
| 
       537 
586 
     | 
    
         | 
| 
       538 
     | 
    
         
            -
              RestrictedCharacterStringValue :
         
     | 
| 
      
 587 
     | 
    
         
            +
              RestrictedCharacterStringValue : # returning String or Array
         
     | 
| 
       539 
588 
     | 
    
         
             
                  cstring
         
     | 
| 
       540 
589 
     | 
    
         
             
                  | CharacterStringList
         
     | 
| 
       541 
590 
     | 
    
         
             
                  | Quadruple
         
     | 
| 
       542 
591 
     | 
    
         
             
                  | Tuple
         
     | 
| 
       543 
     | 
    
         
            -
              CharacterStringList : LBRACE CharSyms RBRACE
         
     | 
| 
      
 592 
     | 
    
         
            +
              CharacterStringList : LBRACE CharSyms RBRACE {result = val[1]}
         
     | 
| 
       544 
593 
     | 
    
         
             
              CharSyms :
         
     | 
| 
       545 
     | 
    
         
            -
                  CharsDefn
         
     | 
| 
       546 
     | 
    
         
            -
                  | CharSyms COMMA CharsDefn
         
     | 
| 
      
 594 
     | 
    
         
            +
                  CharsDefn {result = [val[0]]}
         
     | 
| 
      
 595 
     | 
    
         
            +
                  | CharSyms COMMA CharsDefn {result << val[2]}
         
     | 
| 
       547 
596 
     | 
    
         
             
              CharsDefn :
         
     | 
| 
       548 
597 
     | 
    
         
             
                  cstring
         
     | 
| 
       549 
598 
     | 
    
         
             
                  | Quadruple
         
     | 
| 
       550 
599 
     | 
    
         
             
                  | Tuple
         
     | 
| 
       551 
600 
     | 
    
         
             
                  | DefinedValue
         
     | 
| 
       552 
     | 
    
         
            -
              Quadruple : LBRACE Group COMMA Plane COMMA Row COMMA Cell RBRACE
         
     | 
| 
      
 601 
     | 
    
         
            +
              Quadruple : LBRACE Group COMMA Plane COMMA Row COMMA Cell RBRACE {result = val.values_at(1, 3, 5, 7)}
         
     | 
| 
       553 
602 
     | 
    
         
             
              Group : number
         
     | 
| 
       554 
603 
     | 
    
         
             
              Plane : number
         
     | 
| 
       555 
604 
     | 
    
         
             
              Row : number
         
     | 
| 
       556 
605 
     | 
    
         
             
              Cell : number
         
     | 
| 
       557 
     | 
    
         
            -
              Tuple : LBRACE TableColumn COMMA TableRow RBRACE
         
     | 
| 
      
 606 
     | 
    
         
            +
              Tuple : LBRACE TableColumn COMMA TableRow RBRACE {result = val.values_at(1, 3)}
         
     | 
| 
       558 
607 
     | 
    
         
             
              TableColumn : number
         
     | 
| 
       559 
608 
     | 
    
         
             
              TableRow : number
         
     | 
| 
       560 
609 
     | 
    
         | 
| 
         @@ -60,79 +60,6 @@ end 
     | 
|
| 
       60 
60 
     | 
    
         | 
| 
       61 
61 
     | 
    
         
             
            module GPS
         
     | 
| 
       62 
62 
     | 
    
         | 
| 
       63 
     | 
    
         
            -
            # These ephemeris helper functions will be removed
         
     | 
| 
       64 
     | 
    
         
            -
            # when native functions are available in GPS.i
         
     | 
| 
       65 
     | 
    
         
            -
            class Ephemeris
         
     | 
| 
       66 
     | 
    
         
            -
              URA_TABLE = [
         
     | 
| 
       67 
     | 
    
         
            -
                  2.40, 3.40, 4.85, 6.85, 9.65, 13.65, 24.00, 48.00,
         
     | 
| 
       68 
     | 
    
         
            -
                  96.00, 192.00, 384.00, 768.00, 1536.00, 3072.00, 6144.00]
         
     | 
| 
       69 
     | 
    
         
            -
              def URA_index=(idx)
         
     | 
| 
       70 
     | 
    
         
            -
                send(:URA=, (idx >= URA_TABLE.size) ? (URA_TABLE[-1] * 2) : (idx < 0 ? -1 : URA_TABLE[idx]))
         
     | 
| 
       71 
     | 
    
         
            -
              end
         
     | 
| 
       72 
     | 
    
         
            -
              def URA_index
         
     | 
| 
       73 
     | 
    
         
            -
                ura = send(:URA)
         
     | 
| 
       74 
     | 
    
         
            -
                (ura < 0) ? -1 : URA_TABLE.find_index{|v| ura <= v}
         
     | 
| 
       75 
     | 
    
         
            -
              end
         
     | 
| 
       76 
     | 
    
         
            -
              proc{
         
     | 
| 
       77 
     | 
    
         
            -
                orig = instance_method(:fit_interval=)
         
     | 
| 
       78 
     | 
    
         
            -
                define_method(:fit_interval=){|args|
         
     | 
| 
       79 
     | 
    
         
            -
                  args = case args
         
     | 
| 
       80 
     | 
    
         
            -
                  when Array
         
     | 
| 
       81 
     | 
    
         
            -
                    flag, iodc, sys = args
         
     | 
| 
       82 
     | 
    
         
            -
                    hr = case (sys ||= :GPS)
         
     | 
| 
       83 
     | 
    
         
            -
                    when :GPS, :gps
         
     | 
| 
       84 
     | 
    
         
            -
                      (flag == 0) ? 4 : case iodc 
         
     | 
| 
       85 
     | 
    
         
            -
                      when 240..247; 8
         
     | 
| 
       86 
     | 
    
         
            -
                      when 248..255, 496; 14
         
     | 
| 
       87 
     | 
    
         
            -
                      when 497..503; 26
         
     | 
| 
       88 
     | 
    
         
            -
                      when 504..510; 50
         
     | 
| 
       89 
     | 
    
         
            -
                      when 511, 752..756; 74
         
     | 
| 
       90 
     | 
    
         
            -
                      when 757..763; 98
         
     | 
| 
       91 
     | 
    
         
            -
                      when 764..767, 1088..1010; 122
         
     | 
| 
       92 
     | 
    
         
            -
                      when 1011..1020; 146
         
     | 
| 
       93 
     | 
    
         
            -
                      else; 6
         
     | 
| 
       94 
     | 
    
         
            -
                      end
         
     | 
| 
       95 
     | 
    
         
            -
                    when :QZSS, :qzss
         
     | 
| 
       96 
     | 
    
         
            -
                      raise unless flag == 0 # TODO how to treat fit_interval > 2 hrs
         
     | 
| 
       97 
     | 
    
         
            -
                      2
         
     | 
| 
       98 
     | 
    
         
            -
                    else; raise
         
     | 
| 
       99 
     | 
    
         
            -
                    end
         
     | 
| 
       100 
     | 
    
         
            -
                    hr * 60 * 60
         
     | 
| 
       101 
     | 
    
         
            -
                  else
         
     | 
| 
       102 
     | 
    
         
            -
                    args
         
     | 
| 
       103 
     | 
    
         
            -
                  end
         
     | 
| 
       104 
     | 
    
         
            -
                  orig.bind(self).call(args)
         
     | 
| 
       105 
     | 
    
         
            -
                }
         
     | 
| 
       106 
     | 
    
         
            -
              }.call
         
     | 
| 
       107 
     | 
    
         
            -
            end
         
     | 
| 
       108 
     | 
    
         
            -
            class Ephemeris_SBAS
         
     | 
| 
       109 
     | 
    
         
            -
              URA_TABLE = [ # Table 2-3 in DO-229E
         
     | 
| 
       110 
     | 
    
         
            -
                  2.0, 2.8, 4.0, 5.7, 8.0, 11.3, 16.0, 32.0,
         
     | 
| 
       111 
     | 
    
         
            -
                  64.0, 128.0, 256.0, 512.0, 1024.0, 2048.0, 4096.0]
         
     | 
| 
       112 
     | 
    
         
            -
              def URA_index=(idx)
         
     | 
| 
       113 
     | 
    
         
            -
                send(:URA=, (idx >= URA_TABLE.size) ? (URA_TABLE[-1] * 2) : (idx < 0 ? -1 : URA_TABLE[idx]))
         
     | 
| 
       114 
     | 
    
         
            -
              end
         
     | 
| 
       115 
     | 
    
         
            -
              def URA_index
         
     | 
| 
       116 
     | 
    
         
            -
                ura = send(:URA)
         
     | 
| 
       117 
     | 
    
         
            -
                (ura < 0) ? -1 : URA_TABLE.find_index{|v| ura <= v}
         
     | 
| 
       118 
     | 
    
         
            -
              end
         
     | 
| 
       119 
     | 
    
         
            -
            end
         
     | 
| 
       120 
     | 
    
         
            -
            class Ephemeris_GLONASS
         
     | 
| 
       121 
     | 
    
         
            -
              F_T_TABLE = [ # Table 4.4 in ICD 5.1
         
     | 
| 
       122 
     | 
    
         
            -
                  1, 2, 2.5, 4, 5, 7, 10, 12, 14, 16, 32, 64, 128, 256, 512, 1024]
         
     | 
| 
       123 
     | 
    
         
            -
              def F_T_index=(idx)
         
     | 
| 
       124 
     | 
    
         
            -
                send(:F_T=, (idx >= F_T_TABLE.size) ? (F_T_TABLE[-1] * 2) : (idx < 0 ? -1 : F_T_TABLE[idx]))
         
     | 
| 
       125 
     | 
    
         
            -
              end
         
     | 
| 
       126 
     | 
    
         
            -
              def F_T_index
         
     | 
| 
       127 
     | 
    
         
            -
                f_t = send(:F_T)
         
     | 
| 
       128 
     | 
    
         
            -
                (f_t < 0) ? -1 : F_T_TABLE.find_index{|v| f_t <= v}
         
     | 
| 
       129 
     | 
    
         
            -
              end
         
     | 
| 
       130 
     | 
    
         
            -
              def NA
         
     | 
| 
       131 
     | 
    
         
            -
                # based on TimeProperties::date2raw
         
     | 
| 
       132 
     | 
    
         
            -
                self.day_of_year + [1, 367, 732, 1097][(self.year - 1996) % 4]
         
     | 
| 
       133 
     | 
    
         
            -
              end
         
     | 
| 
       134 
     | 
    
         
            -
            end
         
     | 
| 
       135 
     | 
    
         
            -
             
     | 
| 
       136 
63 
     | 
    
         
             
            [
         
     | 
| 
       137 
64 
     | 
    
         
             
              Ionospheric_UTC_Parameters,
         
     | 
| 
       138 
65 
     | 
    
         
             
              Ephemeris, Ephemeris_SBAS, Ephemeris_GLONASS,
         
     | 
    
        data/lib/gps_pvt/receiver.rb
    CHANGED
    
    | 
         @@ -38,20 +38,21 @@ class Receiver 
     | 
|
| 
       38 
38 
     | 
    
         
             
                    ] + (pvt.rel_ENU.to_a rescue [nil] * 3)
         
     | 
| 
       39 
39 
     | 
    
         
             
                  } 
         
     | 
| 
       40 
40 
     | 
    
         
             
                ]] + [proc{
         
     | 
| 
       41 
     | 
    
         
            -
                  labels = [:g, :p, :h, :v, :t].collect{|k| "#{k}dop".to_sym}
         
     | 
| 
      
 41 
     | 
    
         
            +
                  labels = [:g, :p, :h, :v, :t].collect{|k| "#{k}dop".to_sym} \
         
     | 
| 
      
 42 
     | 
    
         
            +
                      + [:h, :v, :t].collect{|k| "#{k}sigma".to_sym}
         
     | 
| 
       42 
43 
     | 
    
         
             
                  [
         
     | 
| 
       43 
44 
     | 
    
         
             
                    labels,
         
     | 
| 
       44 
45 
     | 
    
         
             
                    proc{|pvt|
         
     | 
| 
       45 
     | 
    
         
            -
                      next [nil] *  
     | 
| 
      
 46 
     | 
    
         
            +
                      next [nil] * 8 unless pvt.position_solved?
         
     | 
| 
       46 
47 
     | 
    
         
             
                      labels.collect{|k| pvt.send(k)}
         
     | 
| 
       47 
48 
     | 
    
         
             
                    }
         
     | 
| 
       48 
49 
     | 
    
         
             
                  ]
         
     | 
| 
       49 
50 
     | 
    
         
             
                }.call] + [[
         
     | 
| 
       50 
     | 
    
         
            -
                  [:v_north, :v_east, :v_down, :receiver_clock_error_dot_ms],
         
     | 
| 
      
 51 
     | 
    
         
            +
                  [:v_north, :v_east, :v_down, :receiver_clock_error_dot_ms, :vel_sigma],
         
     | 
| 
       51 
52 
     | 
    
         
             
                  proc{|pvt|
         
     | 
| 
       52 
53 
     | 
    
         
             
                    next [nil] * 4 unless pvt.velocity_solved?
         
     | 
| 
       53 
54 
     | 
    
         
             
                    [:north, :east, :down].collect{|k| pvt.velocity.send(k)} \
         
     | 
| 
       54 
     | 
    
         
            -
                        + [pvt.receiver_error_rate] 
         
     | 
| 
      
 55 
     | 
    
         
            +
                        + [pvt.receiver_error_rate, pvt.vel_sigma] 
         
     | 
| 
       55 
56 
     | 
    
         
             
                  }
         
     | 
| 
       56 
57 
     | 
    
         
             
                ]] + [
         
     | 
| 
       57 
58 
     | 
    
         
             
                  [:used_satellites, proc{|pvt| pvt.used_satellites}],
         
     | 
    
        data/lib/gps_pvt/rtcm3.rb
    CHANGED
    
    | 
         @@ -132,7 +132,7 @@ class RTCM3 
     | 
|
| 
       132 
132 
     | 
    
         
             
                    103 => 1,
         
     | 
| 
       133 
133 
     | 
    
         
             
                    104 => 1,
         
     | 
| 
       134 
134 
     | 
    
         
             
                    105 => 1,
         
     | 
| 
       135 
     | 
    
         
            -
                    106 =>  
     | 
| 
      
 135 
     | 
    
         
            +
                    106 => 2,
         
     | 
| 
       136 
136 
     | 
    
         
             
                    107 => [12, proc{|v|
         
     | 
| 
       137 
137 
     | 
    
         
             
                      hh, mm, ss = [v >> 7, (v & 0x7E) >> 1, (v & 0x1) > 0 ? 30 : 0]
         
     | 
| 
       138 
138 
     | 
    
         
             
                      hh * 3600 + mm * 60 + ss # [sec]
         
     | 
| 
         @@ -314,7 +314,7 @@ class RTCM3 
     | 
|
| 
       314 
314 
     | 
    
         
             
                  def params
         
     | 
| 
       315 
315 
     | 
    
         
             
                    # TODO WN is truncated to 0-1023
         
     | 
| 
       316 
316 
     | 
    
         
             
                    res = Hash[*(KEY2IDX.collect{|k, i| [k, self[i][0]]}.flatten(1))]
         
     | 
| 
       317 
     | 
    
         
            -
                    res[:fit_interval] =  
     | 
| 
      
 317 
     | 
    
         
            +
                    res[:fit_interval] = (self[29][0] != 0)
         
     | 
| 
       318 
318 
     | 
    
         
             
                    res
         
     | 
| 
       319 
319 
     | 
    
         
             
                  end
         
     | 
| 
       320 
320 
     | 
    
         
             
                end
         
     | 
| 
         @@ -334,7 +334,7 @@ class RTCM3 
     | 
|
| 
       334 
334 
     | 
    
         
             
                    # TODO insufficient: :n => ?(String4); extra: :P3
         
     | 
| 
       335 
335 
     | 
    
         
             
                    # TODO generate time with t_b, N_T, NA, N_4
         
     | 
| 
       336 
336 
     | 
    
         
             
                    # TODO GPS.i is required to modify to generate EPhemeris_with_GPS_Time
         
     | 
| 
       337 
     | 
    
         
            -
                    k_i =  {:svid => 1, :freq_ch => 2, : 
     | 
| 
      
 337 
     | 
    
         
            +
                    k_i =  {:svid => 1, :freq_ch => 2, :P1_index => 5, :t_k => 6, :B_n => 7, :P2 => 8, :t_b => 9,
         
     | 
| 
       338 
338 
     | 
    
         
             
                        :xn_dot => 10, :xn => 11, :xn_ddot => 12,
         
     | 
| 
       339 
339 
     | 
    
         
             
                        :yn_dot => 13, :yn => 14, :yn_ddot => 15,
         
     | 
| 
       340 
340 
     | 
    
         
             
                        :zn_dot => 16, :zn => 17, :zn_ddot => 18,
         
     | 
| 
         @@ -362,7 +362,7 @@ class RTCM3 
     | 
|
| 
       362 
362 
     | 
    
         
             
                  def params
         
     | 
| 
       363 
363 
     | 
    
         
             
                    # TODO PRN = svid + 192, WN is truncated to 0-1023
         
     | 
| 
       364 
364 
     | 
    
         
             
                    res = Hash[*(KEY2IDX.collect{|k, i| [k, self[i][0]]}.flatten(1))]
         
     | 
| 
       365 
     | 
    
         
            -
                    res[:fit_interval] =  
     | 
| 
      
 365 
     | 
    
         
            +
                    res[:fit_interval] = (self[29][0] != 0)
         
     | 
| 
       366 
366 
     | 
    
         
             
                    res
         
     | 
| 
       367 
367 
     | 
    
         
             
                  end
         
     | 
| 
       368 
368 
     | 
    
         
             
                end
         
     | 
    
        data/lib/gps_pvt/supl.rb
    CHANGED
    
    | 
         @@ -353,7 +353,7 @@ class SUPL_Client 
     | 
|
| 
       353 
353 
     | 
    
         
             
                      eph.WN -= 1
         
     | 
| 
       354 
354 
     | 
    
         
             
                    end
         
     | 
| 
       355 
355 
     | 
    
         
             
                    eph.iode = eph.iodc & 0xFF
         
     | 
| 
       356 
     | 
    
         
            -
                    eph.fit_interval =  
     | 
| 
      
 356 
     | 
    
         
            +
                    eph.fit_interval = (eph_src[:ephemFitFlag] != 0)
         
     | 
| 
       357 
357 
     | 
    
         
             
                    eph
         
     | 
| 
       358 
358 
     | 
    
         
             
                  }
         
     | 
| 
       359 
359 
     | 
    
         
             
                }
         
     | 
| 
         @@ -403,7 +403,7 @@ class SUPL_Client 
     | 
|
| 
       403 
403 
     | 
    
         
             
                :zn => [:Z, Rational(1000, 1 << 11)], :zn_dot => [:Zdot, Rational(1000, 1 << 20)], :zn_ddot => [:Zdotdot, Rational(1000, 1 << 30)],
         
     | 
| 
       404 
404 
     | 
    
         
             
                :tau_n => [:Tau, Rational(1, 1 << 30)],
         
     | 
| 
       405 
405 
     | 
    
         
             
                :gamma_n => [:Gamma, Rational(1, 1 << 40)],
         
     | 
| 
       406 
     | 
    
         
            -
                :M => :M, : 
     | 
| 
      
 406 
     | 
    
         
            +
                :M => :M, :P1_index => :P1, :P2 => :P2, :E_n => :En,
         
     | 
| 
       407 
407 
     | 
    
         
             
              }.collect{|dst_k, (src_k, sf)|
         
     | 
| 
       408 
408 
     | 
    
         
             
                ["#{dst_k}=".to_sym, ["glo#{src_k}".to_sym, sf || 1]]
         
     | 
| 
       409 
409 
     | 
    
         
             
              }.flatten(1))]
         
     | 
| 
         @@ -480,7 +480,7 @@ class SUPL_Client 
     | 
|
| 
       480 
480 
     | 
    
         
             
                    elsif delta_sec < -GPS::Time::Seconds_week / 2 then
         
     | 
| 
       481 
481 
     | 
    
         
             
                      eph.WN -= 1
         
     | 
| 
       482 
482 
     | 
    
         
             
                    end
         
     | 
| 
       483 
     | 
    
         
            -
                    eph.fit_interval =  
     | 
| 
      
 483 
     | 
    
         
            +
                    eph.fit_interval = (eph_src[:navFitFlag] != 0)
         
     | 
| 
       484 
484 
     | 
    
         
             
                    eph
         
     | 
| 
       485 
485 
     | 
    
         
             
                  }
         
     | 
| 
       486 
486 
     | 
    
         
             
                }
         
     |