Class: OGNClient::Message

Inherits:
Object
  • Object
show all
Defined in:
lib/ogn_client/message.rb

Overview

Generic OGN flavoured APRS parser

You can pass any raw OGN flavoured APRS message string to the parse class method and receive an instance of the appropriate subclass (+Comment+, Receiver or Sender) or nil if the message string could not be parsed.

Comment example:

raw = "# aprsc 2.0.14-g28c5a6a 29 Jun 2014 07:46:15 GMT GLIDERN1 37.187.40.234:14580"
obj = OGNClient::Message.parse(raw)   # => #<OGNClient::Comment:0x007feaf1012898>
obj.comment   # => "aprsc 2.0.14-g28c5a6a 29 Jun 2014 07:46:15 GMT GLIDERN1 37.187.40.234:14580"

Sender example:

raw = "FLRDF0A52>APRS,qAS,LSTB:/220132h4658.70N/00707.72Ez090/054/A=001424 id06DF0A52 +020fpm +0.0rot 55.2dB 0e -6.2kHz"
obj = OGNClient::Message.parse(raw)   # => #<OGNClient::Sender:0x007feaec1daba8>
obj.id   # => "DF0A52"

Malformed example:

raw = "FOOBAR>not a valid message"
obj = OGNClient::Message.parse(raw)   # => nil

Direct Known Subclasses

Comment, ReceiverBeacon, ReceiverStatus, SenderBeacon

Constant Summary collapse

POSITION_PATTERN =
%r(^
  (?<callsign>.+?)>APRS,(?:.+?,){1,2}
  (?<receiver>.+?):[/>]
  (?<time>\d{6})h
  (?:(?<latitude>\d{4}\.\d{2}[NS]).(?<longitude>\d{5}\.\d{2}[EW]).)?
  (?:(?<heading>\d{3})/(?<ground_speed>\d{3}))?
  (?:/A=(?<altitude>\d{6}))?\s*
  (?:!W((?<latitude_enhancement>\d)(?<longitude_enhancement>\d))!)?
  (?:\s|$)
)x

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#altitude ⇒ Object

WGS84 meters above mean sea level QNH



41
42
43
# File 'lib/ogn_client/message.rb', line 41

def altitude
  @altitude
end

#callsign ⇒ Object

origin callsign



36
37
38
# File 'lib/ogn_client/message.rb', line 36

def callsign
  @callsign
end

#ground_speed ⇒ Object

kilometers per hour



43
44
45
# File 'lib/ogn_client/message.rb', line 43

def ground_speed
  @ground_speed
end

#heading ⇒ Object

degrees from 1 to 360



42
43
44
# File 'lib/ogn_client/message.rb', line 42

def heading
  @heading
end

#latitude ⇒ Object

WGS84 degrees from -90 (S) to 90 (N)



40
41
42
# File 'lib/ogn_client/message.rb', line 40

def latitude
  @latitude
end

#longitude ⇒ Object

WGS84 degrees from -180 (W) to 180 (E)



39
40
41
# File 'lib/ogn_client/message.rb', line 39

def longitude
  @longitude
end

#raw ⇒ Object (readonly)

Returns the value of attribute raw.



35
36
37
# File 'lib/ogn_client/message.rb', line 35

def raw
  @raw
end

#receiver ⇒ Object

receiver callsign



37
38
39
# File 'lib/ogn_client/message.rb', line 37

def receiver
  @receiver
end

#time ⇒ Object

zulu/UTC time with date



38
39
40
# File 'lib/ogn_client/message.rb', line 38

def time
  @time
end

Class Method Details

.parse(raw, date: nil) ⇒ Object



45
46
47
48
49
50
51
52
53
# File 'lib/ogn_client/message.rb', line 45

def self.parse(raw, date: nil)
  fail(OGNClient::MessageError, "raw message must be String but is #{raw.class}") unless raw.is_a? String
  raw = raw.chomp.force_encoding('ASCII-8BIT').encode('UTF-8')
  OGNClient::SenderBeacon.new.send(:parse, raw, date: date) ||
    OGNClient::ReceiverStatus.new.send(:parse, raw, date: date) ||
    OGNClient::ReceiverBeacon.new.send(:parse, raw, date: date) ||
    OGNClient::Comment.new.send(:parse, raw) ||
    fail(OGNClient::MessageError, "message payload parsing failed: `#{raw}'")
end

Instance Method Details

#to_s ⇒ Object



55
56
57
# File 'lib/ogn_client/message.rb', line 55

def to_s
  @raw
end