class ADSB::CPR::Report

Public Class Methods

new(even, odd) click to toggle source

Create a new compact position report.

Attributes

  • even - The position message of even parity

  • odd - The position message of odd parity

Examples

even = ADSB::Message.new('8D40621D58C382D690C8AC2863A7')
odd = ADSB::Message.new('8D40621D58C382D690C8AC2863A7')
report = ADSB::CPR::Report.new(even, odd)
Calls superclass method
# File lib/adsb/cpr/report.rb, line 17
def initialize even, odd
  @even = even
  @odd = odd
  @parity = even.created_at > odd.created_at ? 0 : 1
  super @parity.eql?(0) ? @even : @odd
end

Public Instance Methods

altitude() click to toggle source

Get the reported altitude in feet.

Examples

even = CPR::Message.new('8D40621D58C382D690C8AC2863A7')
odd = CPR::Message.new('8D40621D58C382D690C8AC2863A7')
report = CPR::Report.new(even, odd)
altitude = report.altitude
# File lib/adsb/cpr/report.rb, line 31
def altitude
  message = @parity.eql?(0) ? @even : @odd
  return message.altitude
end
latitude() click to toggle source

Get the reported latitude in decimal degrees.

Examples

even = CPR::Message.new('8D40621D58C382D690C8AC2863A7')
odd = CPR::Message.new('8D40621D58C382D690C8AC2863A7')
report = CPR::Report.new(even, odd)
latitude = report.latitude
# File lib/adsb/cpr/report.rb, line 43
def latitude
  return @parity.eql?(0) ? even_latitude : odd_latitude
end
longitude() click to toggle source

Get the reported longitude in decimal degrees.

Examples

even = CPR::Message.new('8D40621D58C382D690C8AC2863A7')
odd = CPR::Message.new('8D40621D58C382D690C8AC2863A7')
report = CPR::Report.new(even, odd)
longitude = report.longitude
# File lib/adsb/cpr/report.rb, line 54
def longitude
  ni = n(latitude, @parity)
  m = (@even.longitude * (transition_latitude(latitude) - 1) - @odd.longitude * transition_latitude(latitude) + 0.5).floor
  longitude = @parity.eql?(0) ? 360.0 / ni * (m % ni + @even.longitude) : 360.0 / ni * (m % ni + @odd.longitude)
  return longitude >= 180 ? longitude - 360 : longitude
end

Private Instance Methods

even_latitude() click to toggle source
# File lib/adsb/cpr/report.rb, line 63
def even_latitude
  latitude = (latitude_index % 59) + @even.latitude
  latitude = 360.0 / 60 * latitude
  return latitude >= 270 ? latitude - 360 : latitude
end
latitude_index() click to toggle source
# File lib/adsb/cpr/report.rb, line 69
def latitude_index
  latitude_index = 59 * @even.latitude - 60 * @odd.latitude + 0.5
  return latitude_index.floor
end
n(latitude, parity) click to toggle source
# File lib/adsb/cpr/report.rb, line 80
def n latitude, parity
  transition_latitude = transition_latitude(latitude) - parity
  return transition_latitude > 1 ? transition_latitude : 1
end
odd_latitude() click to toggle source
# File lib/adsb/cpr/report.rb, line 74
def odd_latitude
  latitude = (latitude_index % 59) + @odd.latitude
  latitude = 360.0 / 59 * latitude
  return latitude >= 270 ? latitude - 360 : latitude
end
transition_latitude(latitude) click to toggle source
# File lib/adsb/cpr/report.rb, line 85
def transition_latitude latitude
  a = 1 - Math.cos(Math::PI * 2 / 60)
  b = Math.cos(Math::PI / 180.0 * latitude.abs) ** 2
  transition_latitude = 2 * Math::PI / Math.acos(1 - a / b)
  return transition_latitude.to_i
end