Class: GPS_PVT::UBX
- Inherits:
-
Object
- Object
- GPS_PVT::UBX
- Defined in:
- lib/gps_pvt/ubx.rb
Constant Summary collapse
- GNSS_ID =
{ :GPS => 0, :SBAS => 1, :Galileo => 2, :BeiDou => 3, :QZSS => 5, :GLONASS => 6, }
- SIGNAL_ID =
{ :GPS => {:L1CA => 0, :L2CL => 3, :L2CM => 4}, :SBAS => {:L1CA => 0}, :Galileo => {:E1C => 0, :E1B => 1, :E5_bI => 5, :E5_bQ => 6}, :BeiDou => {:B1I_D1 => 0, :B1I_D2 => 1, :B2I_D1 => 2, :B2I_D2 => 3}, :QZSS => {:L1CA => 0, :L2CL => 4, :L2CM => 5}, :GLONASS => {:L1OF => 0, :L2OF => 2}, }
Class Method Summary collapse
- .checksum(packet, range = 2..-3)) ⇒ Object
- .gnss_svid(svid_legacy) ⇒ Object
- .svid(id, gnss = :GPS) ⇒ Object
- .update(packet) ⇒ Object
- .update_checksum(packet) ⇒ Object
- .update_size(packet, size = nil) ⇒ Object
Instance Method Summary collapse
- #each_packet(&b) ⇒ Object
-
#initialize(io) ⇒ UBX
constructor
A new instance of UBX.
- #read_packet ⇒ Object
- #read_packets ⇒ Object
Constructor Details
#initialize(io) ⇒ UBX
Returns a new instance of UBX.
34 35 36 37 |
# File 'lib/gps_pvt/ubx.rb', line 34 def initialize(io) @io = io @buf = [] end |
Class Method Details
.checksum(packet, range = 2..-3)) ⇒ Object
38 39 40 41 42 43 44 45 46 47 |
# File 'lib/gps_pvt/ubx.rb', line 38 def UBX.checksum(packet, range = 2..-3) ck_a, ck_b = [0, 0] packet[range].each{|b| ck_a += b ck_b += ck_a } ck_a &= 0xFF ck_b &= 0xFF [ck_a, ck_b] end |
.gnss_svid(svid_legacy) ⇒ Object
148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
# File 'lib/gps_pvt/ubx.rb', line 148 def UBX.gnss_svid(svid_legacy) case svid_legacy when 1..32; [:GPS, svid_legacy] when 120..158; [:SBAS, svid_legacy] when 211..246; [:Galileo, svid_legacy - 210] when 159..163; [:Beido, svid_legacy - 158] when 33..64; [:Beido, svid_legacy - 27] #when 173..182 # IMES when 193..197; [:QZSS, svid_legacy - 192] when 65..96; [:GLONASS, svid_legacy - 64] when 255; [:GLONASS, nil] else; nil end end |
.svid(id, gnss = :GPS) ⇒ Object
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
# File 'lib/gps_pvt/ubx.rb', line 130 def UBX.svid(id, gnss = :GPS) gnss = GNSS_ID[gnss] if gnss.kind_of?(Symbol) case gnss when GNSS_ID[:GPS], GNSS_ID[:SBAS] id when GNSS_ID[:Galileo] id + 210 when GNSS_ID[:Beido] (id < 6) ? (id + 158) : (id + 27) when GNSS_ID[:QZSS] id + 192 when GNSS_ID[:GLONASS] id + 64 else nil end end |
.update(packet) ⇒ Object
59 60 61 62 63 |
# File 'lib/gps_pvt/ubx.rb', line 59 def UBX.update(packet) [:update_size, :update_checksum].inject(packet){|arg, f| UBX.send(f, arg) } end |
.update_checksum(packet) ⇒ Object
48 49 50 51 |
# File 'lib/gps_pvt/ubx.rb', line 48 def UBX.update_checksum(packet) packet[-2..-1] = checksum(packet) packet end |
.update_size(packet, size = nil) ⇒ Object
52 53 54 55 56 57 58 |
# File 'lib/gps_pvt/ubx.rb', line 52 def UBX.update_size(packet, size = nil) size ||= packet.size - 8 size = size.divmod(0x100) packet[4] = size[1] packet[5] = size[0] packet end |
Instance Method Details
#each_packet(&b) ⇒ Object
99 100 101 102 103 104 105 106 |
# File 'lib/gps_pvt/ubx.rb', line 99 def each_packet(&b) res = Enumerator::new{|y| while packet = read_packet y << packet end } b ? res.each(&b) : res end |
#read_packet ⇒ Object
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/gps_pvt/ubx.rb', line 64 def read_packet while !@io.eof? if @buf.size < 8 then @buf += @io.read(8 - @buf.size).unpack('C*') return nil if @buf.size < 8 end if @buf[0] != 0xB5 then @buf.shift next elsif @buf[1] != 0x62 then @buf = @buf[2..-1] next end len = (@buf[5] << 8) + @buf[4] if @buf.size < len + 8 then @buf += @io.read(len + 8 - @buf.size).unpack('C*') return nil if @buf.size < len + 8 end ck_a, ck_b = UBX::checksum(@buf, 2..(len + 5)) if (@buf[len + 6] != ck_a) || (@buf[len + 7] != ck_b) then @buf = @buf[2..-1] next end packet = @buf[0..(len + 7)] @buf = @buf[(len + 8)..-1] return packet end return nil end |
#read_packets ⇒ Object
108 109 110 |
# File 'lib/gps_pvt/ubx.rb', line 108 def read_packets each_packet.to_a end |