module U_blox def string2packet(s) s.split(/ /).collect{|item| item.hex} end def valid_header?(packet) return (packet[0] == 0xB5 and packet[1] == 0x62) end def valid_size?(packet) if packet.size < 6 then return false end size = packet[4] + (packet[5] << 8) + 8 return false if size > packet.size if packet.size > size then packet.slice!(size...packet.size) end return true end def valid_parity?(packet) ck_a = 0 ck_b = 0 packet[2..-3].each{|item| ck_a += item ck_b += ck_a } ck_a %= (1 << 8) ck_b %= (1 << 8) return (packet[-2] == ck_a and packet[-1] == ck_b) end def fetch_ITOW(packet) return (packet[6 + 0] + (packet[6 + 1] << 8) + (packet[6 + 2] << 16) + (packet[6 + 3] << 24)) * 1E-3 end def fetch_longlatheight(packet) if packet[2] != 0x01 or packet[3] != 0x02 then return nil end long = (packet[6 + 4] + (packet[6 + 5] << 8) + (packet[6 + 6] << 16) + (packet[6 + 7] << 24)) * 1E-7 lat = (packet[6 + 8] + (packet[6 + 9] << 8) + (packet[6 + 10] << 16) + (packet[6 + 11] << 24)) * 1E-7 height = (packet[6 + 12] + (packet[6 + 13] << 8) + (packet[6 + 14] << 16) + (packet[6 + 15] << 24)) * 1E-3 return [long, lat, height] end def fetch_pos_acc(packet) if packet[2] != 0x01 or packet[3] != 0x02 then return nil end h_acc = (packet[6 + 20] + (packet[6 + 21] << 8) + (packet[6 + 22] << 16) + (packet[6 + 23] << 24)) * 1E-3 v_acc = (packet[6 + 24] + (packet[6 + 25] << 8) + (packet[6 + 26] << 16) + (packet[6 + 27] << 24)) * 1E-3 return [h_acc, v_acc] end def fetch_velned(packet) if packet[2] != 0x01 or packet[3] != 0x12 then return nil end vel_n = (packet[6 + 4] + (packet[6 + 5] << 8) + (packet[6 + 6] << 16) + ((packet[6 + 7] & 0b01111111) << 24)) vel_n -= (1 << 31) if (packet[6 + 7] & 0b10000000) != 0 vel_e = (packet[6 + 8] + (packet[6 + 9] << 8) + (packet[6 + 10] << 16) + ((packet[6 + 11] & 0b01111111) << 24)) vel_e -= (1 << 31) if (packet[6 + 11] & 0b10000000) != 0 vel_d = (packet[6 + 12] + (packet[6 + 13] << 8) + (packet[6 + 14] << 16) + ((packet[6 + 15] & 0b01111111) << 24)) vel_d -= (1 << 31) if (packet[6 + 15] & 0b10000000) != 0 return [vel_n * 1E-2, vel_e * 1E-2, vel_d * 1E-2] end def fetch_vel_acc(packet) if packet[2] != 0x01 or packet[3] != 0x12 then return nil end return [(packet[6 + 28] + (packet[6 + 29] << 8) + (packet[6 + 30] << 16) + (packet[6 + 31] << 24)) * 1E-2] end instance_methods.each{|method| eval("module_function :#{method}") } end