ogn_client-ruby 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +7 -0
- data/exe/ogn2kml +9 -4
- data/lib/ogn_client.rb +1 -0
- data/lib/ogn_client/message.rb +13 -8
- data/lib/ogn_client/messages/receiver_beacon.rb +1 -1
- data/lib/ogn_client/messages/receiver_status.rb +1 -1
- data/lib/ogn_client/messages/sender_beacon.rb +2 -2
- data/lib/ogn_client/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 457a6b32a8d8a124283e05e320f14b6d4d2a1310
|
4
|
+
data.tar.gz: cca65cf62df04c2ae068ba0adeee9fe1805769d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4b1dee00b45b66bdfe7a02070e6c8acb518a5df6f7d9c248aee836dab60ce01907bd84590e3b346c9c9defb9a39b6b8c19eda8cf814a1ee8278d6b64e11f4160
|
7
|
+
data.tar.gz: d6f3e85e414a4d3533376295676019e0f9c78015bec1346743711f9c3859782a80f7578d2d18b42bfe2ae9c3b7f37e4c6e03a9e257fd01ebf44104f4503e6dc3
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -61,6 +61,13 @@ The factory method `OGNClient::Message.parse` will return one an instance of `OG
|
|
61
61
|
|
62
62
|
In production, you may want to rescue from these errors and ignore the message. You should, however, log the offending messages messages, [file a bug](#community-support) and replay them once the bug has been fixed.
|
63
63
|
|
64
|
+
:point_up: Raw APRS messages do not contain the date, but assume the current day. This may cause trouble around midnight, however, the parser deals with such edge cases gracefully. Things are a little different when parsing raw APRS messages recorded in the past e.g. with `ognlogd`. Since the parser has no means to detect the date the APRS messages have been sent, you have to pass it as an option:
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
raw_aprs = File.open('2017-06-24.log', &:gets)
|
68
|
+
OGNClient::Message.parse(raw_aprs, date: '2017-06-24')
|
69
|
+
```
|
70
|
+
|
64
71
|
#### OGNClient::SenderBeacon
|
65
72
|
|
66
73
|
Sender beacons are usually coming from aircraft equipped with [FLARM](https://flarm.com) (anti-collision warning system) or similar devices which broadcast position data as RF beacons.
|
data/exe/ogn2kml
CHANGED
@@ -20,6 +20,7 @@ class Converter
|
|
20
20
|
END
|
21
21
|
o.on('-a', '--about', 'author and license information') { puts 'Written by Sven Schwyn (bitcetera.com) and distributed under MIT license.'; exit }
|
22
22
|
o.on('-c', '--callsign STRING', String, 'aircraft callsign (e.g. FLRAABBCC)') { |v| @callsign = v }
|
23
|
+
o.on('-d', '--date YYYY-MM-DD', String, 'date the APRS messages were recorded (default: today)') { |v| @date = v }
|
23
24
|
o.on('-o', '--outfile FILE', String, 'generated KML file (default: INFILE.kml)') { |v| @outfile = v.sub(/\.kml$/, '') + '.kml' }
|
24
25
|
end.parse!
|
25
26
|
@infile = ARGV.pop
|
@@ -93,12 +94,13 @@ class Converter
|
|
93
94
|
climb_rate['name'] = 'Climb Rate'
|
94
95
|
turn_rate = XML::Node.new(:'gx:SimpleArrayData')
|
95
96
|
turn_rate['name'] = 'Turn Rate'
|
97
|
+
array_data = { when: [], coord: [], angles: [] }
|
96
98
|
lines.each do |line|
|
97
|
-
if (sender = OGNClient::Message.parse(line)).is_a? OGNClient::SenderBeacon
|
99
|
+
if (sender = OGNClient::Message.parse(line, date: @date)).is_a? OGNClient::SenderBeacon
|
98
100
|
if !@callsign || sender.callsign == @callsign
|
99
|
-
|
100
|
-
|
101
|
-
|
101
|
+
array_data[:when] << XML::Node.new(:when, sender.time.xmlschema)
|
102
|
+
array_data[:coord] << XML::Node.new(:'gx:coord', "#{sender.longitude} #{sender.latitude} #{sender.altitude}")
|
103
|
+
array_data[:angles] << XML::Node.new(:'gx:angles', "#{sender.heading} 0 0")
|
102
104
|
time << XML::Node.new(:'gx:value', sender.time.getlocal.strftime('%H:%M:%S'))
|
103
105
|
ground_speed << XML::Node.new(:'gx:value', sender.ground_speed.to_i.to_s)
|
104
106
|
climb_rate << XML::Node.new(:'gx:value', sender.climb_rate.to_i.to_s)
|
@@ -107,6 +109,9 @@ class Converter
|
|
107
109
|
end
|
108
110
|
progressbar.increment
|
109
111
|
end
|
112
|
+
array_data.keys.each do |key|
|
113
|
+
array_data[key].each { |d| track << d }
|
114
|
+
end
|
110
115
|
track << (extended_data = XML::Node.new(:ExtendedData))
|
111
116
|
extended_data << (schema_data = XML::Node.new(:SchemaData))
|
112
117
|
schema_data['schemaUrl'] = '#schema'
|
data/lib/ogn_client.rb
CHANGED
data/lib/ogn_client/message.rb
CHANGED
@@ -42,12 +42,12 @@ module OGNClient
|
|
42
42
|
attr_reader :heading # degrees from 1 to 360
|
43
43
|
attr_reader :ground_speed # kilometers per hour
|
44
44
|
|
45
|
-
def self.parse(raw)
|
45
|
+
def self.parse(raw, date: nil)
|
46
46
|
fail(OGNClient::MessageError, "raw message must be String but is #{raw.class}") unless raw.is_a? String
|
47
47
|
raw = raw.chomp.force_encoding('ASCII-8BIT').encode('UTF-8')
|
48
|
-
OGNClient::SenderBeacon.new.send(:parse, raw) ||
|
49
|
-
OGNClient::ReceiverStatus.new.send(:parse, raw) ||
|
50
|
-
OGNClient::ReceiverBeacon.new.send(:parse, raw) ||
|
48
|
+
OGNClient::SenderBeacon.new.send(:parse, raw, date: date) ||
|
49
|
+
OGNClient::ReceiverStatus.new.send(:parse, raw, date: date) ||
|
50
|
+
OGNClient::ReceiverBeacon.new.send(:parse, raw, date: date) ||
|
51
51
|
OGNClient::Comment.new.send(:parse, raw) ||
|
52
52
|
fail(OGNClient::MessageError, "message payload parsing failed: `#{raw}'")
|
53
53
|
end
|
@@ -58,8 +58,9 @@ module OGNClient
|
|
58
58
|
|
59
59
|
private
|
60
60
|
|
61
|
-
def parse(raw)
|
61
|
+
def parse(raw, date: nil)
|
62
62
|
@raw = raw
|
63
|
+
@date = Date.parse(date) if date
|
63
64
|
raw.match POSITION_PATTERN do |match|
|
64
65
|
%i(callsign receiver time altitude).each do |attr|
|
65
66
|
send("#{attr}=", match[attr]) if match[attr]
|
@@ -82,9 +83,13 @@ module OGNClient
|
|
82
83
|
end
|
83
84
|
|
84
85
|
def time=(raw)
|
85
|
-
|
86
|
-
|
87
|
-
|
86
|
+
if @date
|
87
|
+
time = Time.new(@date.year, @date.month, @date.day, raw[0,2], raw[2,2], raw[4,2], 0)
|
88
|
+
else
|
89
|
+
now = Time.now.utc
|
90
|
+
time = Time.new(now.year, now.month, now.day, raw[0,2], raw[2,2], raw[4,2], 0)
|
91
|
+
time -= 86400 if time > now # adjust date of beacons sent just before midnight
|
92
|
+
end
|
88
93
|
@time = time
|
89
94
|
end
|
90
95
|
|
@@ -63,7 +63,7 @@ module OGNClient
|
|
63
63
|
|
64
64
|
private
|
65
65
|
|
66
|
-
def parse(raw)
|
66
|
+
def parse(raw, date: nil)
|
67
67
|
raw.match RECEIVER_STATUS_PATTERN do |match|
|
68
68
|
super unless @raw
|
69
69
|
%i(version platform cpu_load cpu_temperature ram_free ram_total ntp_offset ntp_correction voltage amperage rf_correction_manual rf_correction_automatic senders visible_senders signal_quality senders_signal_quality senders_messages good_senders_signal_quality good_and_bad_senders good_senders).each do |attr|
|
@@ -3,7 +3,7 @@ module OGNClient
|
|
3
3
|
class SenderBeacon < Message
|
4
4
|
|
5
5
|
SENDER_BEACON_PATTERN = %r(
|
6
|
-
id(?<details>\w{2})(?<id>\w
|
6
|
+
id(?<details>\w{2})(?<id>\w{6})\s?
|
7
7
|
(?:(?<climb_rate>[+-]\d+?)fpm\s)?
|
8
8
|
(?:(?<turn_rate>[+-][\d.]+?)rot\s)?
|
9
9
|
(?:FL(?<flight_level>[\d.]+)\s)?
|
@@ -62,7 +62,7 @@ module OGNClient
|
|
62
62
|
|
63
63
|
private
|
64
64
|
|
65
|
-
def parse(raw)
|
65
|
+
def parse(raw, date: nil)
|
66
66
|
raw.match SENDER_BEACON_PATTERN do |match|
|
67
67
|
super unless @raw
|
68
68
|
%i(details id flight_level climb_rate turn_rate signal_power signal_quality errors frequency_offset gps_accuracy flarm_software_version flarm_hardware_version flarm_id proximity).each do |attr|
|
data/lib/ogn_client/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ogn_client-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sven Schwyn
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-06-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|