gps_pvt 0.9.4 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Binary file
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'json'
4
+ require 'zlib'
5
+ require_relative '../asn1/asn1'
6
+
7
+ ASN1 = GPS_PVT::ASN1
8
+
9
+ upl = ASN1::resolve_tree(JSON::parse(
10
+ Zlib::GzipReader::open(File::join(File::dirname(__FILE__), 'upl.json.gz')).read,
11
+ {:symbolize_names => true}))
12
+
13
+ # RRLP payload conversion
14
+ ASN1::dig(upl, :ULP, :"ULP-PDU", :message, :msSUPLPOS, :posPayLoad, :rrlpPayload)[:type][1].merge!({
15
+ :hook_encode => proc{|data|
16
+ next data unless data.kind_of?(Hash)
17
+ ASN1::encode_per(upl[:"RRLP-Messages"][:PDU], data).scan(/.{1,8}/).tap{|buf|
18
+ buf[-1] += "0" * (8 - buf[-1].length)
19
+ }.collect{|str| str.to_i(2)}
20
+ },
21
+ :hook_decode => proc{|data|
22
+ data.define_singleton_method(:decode){
23
+ ASN1::decode_per(upl[:"RRLP-Messages"][:PDU], self.collect{|v| "%08b" % [v]}.join)
24
+ }
25
+ data
26
+ },
27
+ })
28
+
29
+ # LPP payload conversion
30
+ ASN1::dig(upl, :ULP, :"ULP-PDU", :message, :msSUPLPOS, :posPayLoad, :"ver2-PosPayLoad-extension", :lPPPayload)[:type][1].merge!({
31
+ :hook_encode => proc{|data|
32
+ next data unless data.kind_of?(Hash)
33
+ ASN1::encode_per(upl[:"LPP-PDU-Definitions"][:"LPP-Message"], data).scan(/.{1,8}/).tap{|buf|
34
+ buf[-1] += "0" * (8 - buf[-1].length)
35
+ }.collect{|str| str.to_i(2)}.scan(/.{1,60000}/)
36
+ },
37
+ :hook_decode => proc{|data|
38
+ data.define_singleton_method(:decode){
39
+ ASN1::decode_per(upl[:"LPP-PDU-Definitions"][:"LPP-Message"], self.flatten.collect{|v| "%08b" % [v]}.join)
40
+ }
41
+ data
42
+ },
43
+ })
44
+
45
+ # BCD String
46
+ [:msisdn, :mdn, :imsi, :"ver2-imei"].each{|k|
47
+ elm = ASN1::dig(upl, :ULP, :"ULP-PDU", :sessionID, :setSessionID, :setId, k)
48
+ next unless elm
49
+ elm[:type][1].merge!({
50
+ :hook_encode => proc{|data|
51
+ next data unless data.kind_of?(String)
52
+ (("0" * (16 - data.size)) + data).scan(/\d{2}/).collect{|v| v.to_i(16)}
53
+ },
54
+ :hook_decode => proc{|data|
55
+ data.collect{|v| "%02X"%[v]}.join
56
+ },
57
+ })
58
+ }
59
+
60
+ =begin
61
+ UPL: User Plane Location
62
+ ULP: UserPlane Location Protocol
63
+ =end
64
+
65
+ GPS_PVT::UPL = Module::new{
66
+ define_method(:generate_skeleton){|k_cmd, *args|
67
+ opts = args[0] || {}
68
+ ver = case [2, 0xFF, 0xFF].zip([opts[:version]].flatten || []) \
69
+ .inject(0){|sum, (v1, v2)| (sum * 0x100) + (v2 || v1)}
70
+ when 0x020006..0x02FFFF; [2, 0, 6]
71
+ #when 0x020000..0x02FFFF; [2, 0, 0]
72
+ else; raise
73
+ end
74
+ res = ASN1::generate_skeleton(upl[:ULP][:"ULP-PDU"])
75
+ [:maj, :min, :servind].zip(ver).each{|k, v|
76
+ res[:version][k] = v
77
+ }
78
+ res[:message].reject!{|k, v|
79
+ "ms#{k_cmd}".to_sym != k
80
+ }
81
+ res.define_singleton_method(:all_keys){
82
+ (iter = proc{|hash|
83
+ hash.collect{|k, v|
84
+ v.kind_of?(Hash) ? {k => iter.call(v)} : k
85
+ }
86
+ }).call(self)
87
+ }
88
+ res
89
+ }
90
+ define_method(:encode){|cmd|
91
+ buf = ASN1::encode_per(upl[:ULP][:"ULP-PDU"], cmd).scan(/.{1,8}/)
92
+ buf[-1] += "0" * (8 - buf[-1].length)
93
+ (buf.length.divmod(1 << 8) + buf[2..-1].collect{|str| str.to_i(2)}).pack("C*")
94
+ }
95
+ define_method(:decode){|str|
96
+ ASN1::decode_per(upl[:ULP][:"ULP-PDU"], str.unpack("C*").collect{|v| "%08b" % [v]}.join)
97
+ }
98
+ module_function(:generate_skeleton, :encode, :decode)
99
+ }
data/lib/gps_pvt/util.rb CHANGED
@@ -27,6 +27,7 @@ proc{
27
27
 
28
28
  require 'open-uri'
29
29
  require_relative 'ntrip'
30
+ require_relative 'supl'
30
31
 
31
32
  class URI::Ntrip
32
33
  def read_format(options = {})
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GPS_PVT
4
- VERSION = "0.9.4"
4
+ VERSION = "0.10.0"
5
5
 
6
6
  def GPS_PVT.version_compare(a, b)
7
7
  Gem::Version::new(a) <=> Gem::Version::new(b)
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.9.4
4
+ version: 0.10.0
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: 2023-07-06 00:00:00.000000000 Z
11
+ date: 2024-03-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyserial
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: racc
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: github_changelog_generator
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -148,12 +162,22 @@ files:
148
162
  - gps_pvt.gemspec
149
163
  - gps_pvt.rbs
150
164
  - lib/gps_pvt.rb
165
+ - lib/gps_pvt/asn1/asn1.rb
166
+ - lib/gps_pvt/asn1/asn1.y
167
+ - lib/gps_pvt/asn1/per.rb
151
168
  - lib/gps_pvt/ntrip.rb
152
169
  - lib/gps_pvt/receiver.rb
170
+ - lib/gps_pvt/receiver/agps.rb
153
171
  - lib/gps_pvt/receiver/extension.rb
154
172
  - lib/gps_pvt/receiver/rtcm3.rb
155
173
  - lib/gps_pvt/rtcm3.rb
174
+ - lib/gps_pvt/supl.rb
156
175
  - lib/gps_pvt/ubx.rb
176
+ - lib/gps_pvt/upl/LPP-V17_5_0-Release17.asn
177
+ - lib/gps_pvt/upl/RRLP-V17_0_0-Release17.asn
178
+ - lib/gps_pvt/upl/ULP-V2_0_6-20200720-D.asn
179
+ - lib/gps_pvt/upl/upl.json.gz
180
+ - lib/gps_pvt/upl/upl.rb
157
181
  - lib/gps_pvt/util.rb
158
182
  - lib/gps_pvt/version.rb
159
183
  homepage: https://github.com/fenrir-naru/gps_pvt