nmea_plus 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/gem/lib/nmea_plus.rb +63 -0
  3. data/gem/lib/nmea_plus/ais_message_factory.rb +17 -0
  4. data/gem/lib/nmea_plus/generated_parser/parser.rb +127 -0
  5. data/gem/lib/nmea_plus/generated_parser/tokenizer.rb +100 -0
  6. data/gem/lib/nmea_plus/message/ais/base_ais.rb +20 -0
  7. data/gem/lib/nmea_plus/message/ais/vdm.rb +100 -0
  8. data/gem/lib/nmea_plus/message/ais/vdm_payload/vdm_msg.rb +99 -0
  9. data/gem/lib/nmea_plus/message/ais/vdm_payload/vdm_msg1.rb +65 -0
  10. data/gem/lib/nmea_plus/message/ais/vdm_payload/vdm_msg5.rb +38 -0
  11. data/gem/lib/nmea_plus/message/ais/vdm_payload/vdm_msg8.rb +43 -0
  12. data/gem/lib/nmea_plus/message/base.rb +172 -0
  13. data/gem/lib/nmea_plus/message/nmea/aam.rb +17 -0
  14. data/gem/lib/nmea_plus/message/nmea/alm.rb +25 -0
  15. data/gem/lib/nmea_plus/message/nmea/apa.rb +20 -0
  16. data/gem/lib/nmea_plus/message/nmea/apb.rb +14 -0
  17. data/gem/lib/nmea_plus/message/nmea/base_nmea.rb +36 -0
  18. data/gem/lib/nmea_plus/message/nmea/bod.rb +14 -0
  19. data/gem/lib/nmea_plus/message/nmea/bwc.rb +12 -0
  20. data/gem/lib/nmea_plus/message/nmea/bwr.rb +25 -0
  21. data/gem/lib/nmea_plus/message/nmea/bww.rb +11 -0
  22. data/gem/lib/nmea_plus/message/nmea/dbk.rb +13 -0
  23. data/gem/lib/nmea_plus/message/nmea/dbs.rb +11 -0
  24. data/gem/lib/nmea_plus/message/nmea/dbt.rb +11 -0
  25. data/gem/lib/nmea_plus/message/nmea/dcn.rb +26 -0
  26. data/gem/lib/nmea_plus/message/nmea/dpt.rb +12 -0
  27. data/gem/lib/nmea_plus/message/nmea/dtm.rb +24 -0
  28. data/gem/lib/nmea_plus/message/nmea/fsi.rb +14 -0
  29. data/gem/lib/nmea_plus/message/nmea/gbs.rb +18 -0
  30. data/gem/lib/nmea_plus/message/nmea/gga.rb +32 -0
  31. data/gem/lib/nmea_plus/message/nmea/glc.rb +23 -0
  32. data/gem/lib/nmea_plus/message/nmea/gll.rb +21 -0
  33. data/gem/lib/nmea_plus/message/nmea/gns.rb +28 -0
  34. data/gem/lib/nmea_plus/message/nmea/grs.rb +24 -0
  35. data/gem/lib/nmea_plus/message/nmea/gsa.rb +27 -0
  36. data/gem/lib/nmea_plus/message/nmea/gst.rb +18 -0
  37. data/gem/lib/nmea_plus/message/nmea/gsv.rb +29 -0
  38. data/gem/lib/nmea_plus/message/nmea/gtd.rb +15 -0
  39. data/gem/lib/nmea_plus/message/nmea/gxa.rb +22 -0
  40. data/gem/lib/nmea_plus/message/nmea/hdg.rb +20 -0
  41. data/gem/lib/nmea_plus/message/nmea/hdm.rb +11 -0
  42. data/gem/lib/nmea_plus/message/nmea/hdt.rb +11 -0
  43. data/gem/lib/nmea_plus/message/nmea/hfb.rb +12 -0
  44. data/gem/lib/nmea_plus/message/nmea/hsc.rb +12 -0
  45. data/gem/lib/nmea_plus/message/nmea/its.rb +11 -0
  46. data/gem/lib/nmea_plus/message/nmea/lcd.rb +23 -0
  47. data/gem/lib/nmea_plus/message/nmea/msk.rb +15 -0
  48. data/gem/lib/nmea_plus/message/nmea/mss.rb +15 -0
  49. data/gem/lib/nmea_plus/message/nmea/mtw.rb +12 -0
  50. data/gem/lib/nmea_plus/message/nmea/mwv.rb +15 -0
  51. data/gem/lib/nmea_plus/message/nmea/oln.rb +22 -0
  52. data/gem/lib/nmea_plus/message/nmea/osd.rb +19 -0
  53. data/gem/lib/nmea_plus/message/nmea/pashr.rb +21 -0
  54. data/gem/lib/nmea_plus/message/nmea/r00.rb +11 -0
  55. data/gem/lib/nmea_plus/message/nmea/rma.rb +30 -0
  56. data/gem/lib/nmea_plus/message/nmea/rmb.rb +30 -0
  57. data/gem/lib/nmea_plus/message/nmea/rmc.rb +33 -0
  58. data/gem/lib/nmea_plus/message/nmea/rot.rb +12 -0
  59. data/gem/lib/nmea_plus/message/nmea/rpm.rb +15 -0
  60. data/gem/lib/nmea_plus/message/nmea/rsa.rb +17 -0
  61. data/gem/lib/nmea_plus/message/nmea/rsd.rb +14 -0
  62. data/gem/lib/nmea_plus/message/nmea/rte.rb +16 -0
  63. data/gem/lib/nmea_plus/message/nmea/sfi.rb +18 -0
  64. data/gem/lib/nmea_plus/message/nmea/stn.rb +11 -0
  65. data/gem/lib/nmea_plus/message/nmea/tds.rb +11 -0
  66. data/gem/lib/nmea_plus/message/nmea/tfi.rb +13 -0
  67. data/gem/lib/nmea_plus/message/nmea/tpc.rb +13 -0
  68. data/gem/lib/nmea_plus/message/nmea/tpr.rb +13 -0
  69. data/gem/lib/nmea_plus/message/nmea/tpt.rb +13 -0
  70. data/gem/lib/nmea_plus/message/nmea/trf.rb +28 -0
  71. data/gem/lib/nmea_plus/message/nmea/ttm.rb +22 -0
  72. data/gem/lib/nmea_plus/message/nmea/vbw.rb +16 -0
  73. data/gem/lib/nmea_plus/message/nmea/vdr.rb +13 -0
  74. data/gem/lib/nmea_plus/message/nmea/vhw.rb +14 -0
  75. data/gem/lib/nmea_plus/message/nmea/vlw.rb +12 -0
  76. data/gem/lib/nmea_plus/message/nmea/vpw.rb +12 -0
  77. data/gem/lib/nmea_plus/message/nmea/vtg.rb +41 -0
  78. data/gem/lib/nmea_plus/message/nmea/vwr.rb +15 -0
  79. data/gem/lib/nmea_plus/message/nmea/wcv.rb +12 -0
  80. data/gem/lib/nmea_plus/message/nmea/wnc.rb +14 -0
  81. data/gem/lib/nmea_plus/message/nmea/wpl.rb +19 -0
  82. data/gem/lib/nmea_plus/message/nmea/xdr.rb +14 -0
  83. data/gem/lib/nmea_plus/message/nmea/xte.rb +16 -0
  84. data/gem/lib/nmea_plus/message/nmea/xtr.rb +12 -0
  85. data/gem/lib/nmea_plus/message/nmea/zda.rb +23 -0
  86. data/gem/lib/nmea_plus/message/nmea/zfo.rb +13 -0
  87. data/gem/lib/nmea_plus/message/nmea/ztg.rb +13 -0
  88. data/gem/lib/nmea_plus/message_factory.rb +68 -0
  89. data/gem/lib/nmea_plus/nmea_message_factory.rb +110 -0
  90. data/gem/lib/nmea_plus/version.rb +3 -0
  91. metadata +285 -0
@@ -0,0 +1,11 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class STN < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :talker_id, 1, :_float
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class TDS < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :door_spread_distance_meters, 1, :_float
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class TFI < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :catch_sensor1, 1, :_integer
8
+ field_reader :catch_sensor2, 2, :_integer
9
+ field_reader :catch_sensor3, 3, :_integer
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class TPC < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :distance_abeam_meters, 1, :_float
8
+ field_reader :distance_abaft_meters, 3, :_float
9
+ field_reader :depth_meters, 5, :_float
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class TPR < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :range_meters, 1, :_float
8
+ field_reader :bearing_degrees, 3, :_float
9
+ field_reader :depth_meters, 5, :_float
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class TPT < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :range_meters, 1, :_float
8
+ field_reader :bearing_true_degrees, 3, :_float
9
+ field_reader :depth_meters, 5, :_float
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,28 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class TRF < NMEAPlus::Message::NMEA::NMEAMessage
7
+ def utc_time
8
+ _utc_date_time(@fields[2], @fields[1])
9
+ end
10
+
11
+ def latitude
12
+ _degrees_minutes_to_decimal(@fields[3], @fields[4])
13
+ end
14
+
15
+ def longitude
16
+ _degrees_minutes_to_decimal(@fields[5], @fields[6])
17
+ end
18
+
19
+ field_reader :elevation_angle, 7, :_float
20
+ field_reader :iterations, 8, :_integer
21
+ field_reader :doppler_intervals, 9, :_integer
22
+ field_reader :update_distance_nautical_miles, 10, :_float
23
+ field_reader :satellite, 11, :_integer
24
+ field_reader :valid?, 12, :_av_boolean
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,22 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class TTM < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :target_number, 1, :_integer
8
+ field_reader :target_distance, 2, :_float
9
+ field_reader :target_bearing_from_ownship, 3, :_float
10
+ field_reader :target_bearing_units, 4, :_string
11
+ field_reader :target_speed, 5, :_float
12
+ field_reader :target_course, 6, :_float
13
+ field_reader :target_course_units, 7, :_string
14
+ field_reader :closest_approach_point_distance, 8, :_float
15
+ field_reader :closest_approach_point_time, 9, :_float
16
+ field_reader :target_name, 11, :_string
17
+ field_reader :target_status, 12, :_string
18
+ field_reader :reference_target, 13, :_string
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,16 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class VBW < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :longitudinal_water_speed, 1, :_float
8
+ field_reader :transverse_water_speed, 2, :_float
9
+ field_reader :water_speed_valid?, 3, :_av_boolean
10
+ field_reader :longitudinal_ground_speed, 4, :_float
11
+ field_reader :transverse_ground_speed, 5, :_float
12
+ field_reader :ground_speed_valid?, 6, :_av_boolean
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class VDR < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :degrees_true, 1, :_float
8
+ field_reader :degrees_magnetic, 3, :_float
9
+ field_reader :water_current_speed_knots, 5, :_float
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class VHW < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :degrees_true, 1, :_float
8
+ field_reader :degrees_magnetic, 3, :_float
9
+ field_reader :water_speed_knots, 5, :_float
10
+ field_reader :water_speed_kmh, 7, :_float
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class VLW < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :total_distance_nautical_miles, 1, :_float
8
+ field_reader :distance_since_reset_nautical_miles, 3, :_float
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class VPW < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :parallel_wind_speed_knots, 1, :_float
8
+ field_reader :parallel_wind_speed_ms, 3, :_float
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,41 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class VTG < NMEAPlus::Message::NMEA::NMEAMessage
7
+ # whether this is the new format. docs say check field #2 for value "2"
8
+ def new_format?
9
+ 'T' == @fields[2]
10
+ end
11
+
12
+ field_reader :track_degrees_true, 1, :_float
13
+
14
+ def track_degrees_magnetic
15
+ f = new_format? ? 3 : 2
16
+ return nil if @fields[f].nil? || @fields[f].empty?
17
+ @fields[f].to_f
18
+ end
19
+
20
+ def speed_knots
21
+ f = new_format? ? 5 : 3
22
+ return nil if @fields[f].nil? || @fields[f].empty?
23
+ @fields[f].to_f
24
+ end
25
+
26
+ def speed_kmh
27
+ f = new_format? ? 7 : 4
28
+ return nil if @fields[f].nil? || @fields[f].empty?
29
+ @fields[f].to_f
30
+ end
31
+
32
+ def faa_mode
33
+ f = new_format? ? 9 : 100
34
+ return nil if @fields[f].nil? || @fields[f].empty?
35
+ @fields[f]
36
+ end
37
+
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,15 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class VWR < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :wind_direction_degrees, 1, :_float
8
+ field_reader :wind_direction_bow, 2, :_string
9
+ field_reader :speed_knots, 3, :_float
10
+ field_reader :speed_ms, 5, :_float
11
+ field_reader :speed_kmh, 7, :_float
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class WCV < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :velocity_knots, 1, :_float
8
+ field_reader :waypoint_id, 3, :_string
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class WNC < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :distance_nautical_miles, 1, :_float
8
+ field_reader :distance_kilometers, 3, :_float
9
+ field_reader :waypoint_to, 5, :_string
10
+ field_reader :waypoint_from, 6, :_string
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class WPL < NMEAPlus::Message::NMEA::NMEAMessage
7
+ def latitude
8
+ _degrees_minutes_to_decimal(@fields[1], @fields[2])
9
+ end
10
+
11
+ def longitude
12
+ _degrees_minutes_to_decimal(@fields[3], @fields[4])
13
+ end
14
+
15
+ field_reader :name, 5, :_string
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class XDR < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :type, 1, :_string
8
+ field_reader :measurement, 2, :_float
9
+ field_reader :measurement_unit, 3, :_string
10
+ field_reader :name, 4, :_string
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class XTE < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :no_general_warning?, 1, :_av_boolean
8
+ field_reader :no_cyclelock_warning?, 2, :_av_boolean
9
+ field_reader :cross_track_error, 3, :_float
10
+ field_reader :direction_to_steer, 4, :_string
11
+ field_reader :cross_track_units, 5, :_string
12
+ field_reader :faa_mode, 6, :_string
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,12 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class XTR < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :cross_track_error, 1, :_float
8
+ field_reader :direction_to_steer, 2, :_string
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,23 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class ZDA < NMEAPlus::Message::NMEA::NMEAMessage
7
+ def utc_time
8
+
9
+ re_format = /(\d{2})(\d{2})(\d{2}(\.\d+)?)/
10
+ hms = re_format.match(@fields[1])
11
+ begin
12
+ tz_h = @fields[5].to_i
13
+ tz = "%s%0.02d:%0.02d" % [tz_h >= 0 ? '+' : '', tz_h, @fields[6].to_i]
14
+ Time.new(@fields[4].to_i, @fields[3].to_i, @fields[2].to_i,
15
+ hms[1].to_i, hms[2].to_i, hms[3].to_f, tz)
16
+ rescue
17
+ nil
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class ZFO < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :utc_time, 1, :_utctime_hms
8
+ # field_reader :elapsed_time, 2, :_interval_hms
9
+ field_reader :origin_waypoint_id, 3, :_string
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require_relative "base_nmea"
2
+
3
+ module NMEAPlus
4
+ module Message
5
+ module NMEA
6
+ class ZTG < NMEAPlus::Message::NMEA::NMEAMessage
7
+ field_reader :utc_time, 1, :_utctime_hms
8
+ # field_reader :remaining_time, 2, :_interval_hms
9
+ field_reader :destination_waypoint_id, 3, :_string
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,68 @@
1
+
2
+ module NMEAPlus
3
+
4
+ # meant to be extended. Creates message classes with a common prefix and variable suffix
5
+ class MessageFactory
6
+
7
+ # factory class must be extended
8
+ def self.parent_module
9
+ "FIXME_parent_module"
10
+ end
11
+
12
+ # a way to override the data_type (e.g. __AAM) with GPAAM to get a match
13
+ # whatever factory extends this class should override this method
14
+ def self.alternate_data_type(data_type)
15
+ data_type # in basic implementation, there is no alternative.
16
+ end
17
+
18
+ # check whether a given object exists. this will work for all consts but shhhhhhhhh
19
+ def self.message_class_exists?(class_identifier)
20
+ Object::const_get(class_identifier)
21
+ return true
22
+ rescue ::NameError
23
+ return false
24
+ end
25
+
26
+ # shortcut for the full name to a message class
27
+ def self.message_class_name(data_type)
28
+ "NMEAPlus::Message::#{self.parent_module}::#{data_type}"
29
+ end
30
+
31
+ # use the actual type if we have it, else try an alternate (and let it fail there)
32
+ def self.best_match_for_data_type(data_type)
33
+ return data_type if self.message_class_exists?(self.message_class_name(data_type))
34
+ self.alternate_data_type(data_type)
35
+ end
36
+
37
+ # get a message class through reflection
38
+ def self.dynamically_get_message_object(class_identifier)
39
+ Object::const_get(class_identifier).new
40
+ rescue ::NameError => e
41
+ raise ::NameError, "Couldn't instantiate a #{class_identifier} object: #{e}"
42
+ end
43
+
44
+ # Choose what class to create, and create it based on the first of the (unsplitted) fields
45
+ #
46
+ def self.create(message_prefix, fields, checksum)
47
+ # get the data type and adjust it if necessary (e.g. support for NMEA standard sentences like __AAM)
48
+ data_type = fields.split(',', 2)[0].upcase # assumed to be 'GPGGA', etc
49
+ interpreted_type = self.best_match_for_data_type(data_type)
50
+ class_name = self.message_class_name(interpreted_type)
51
+
52
+ # create message and make sure it's the right type
53
+ message = self.dynamically_get_message_object(class_name)
54
+ unless message.is_a? NMEAPlus::Message::Base
55
+ fail ArgumentError, "Undefined message type #{data_type} (classname #{class_name})"
56
+ end
57
+
58
+ # assign its data and return it
59
+ message.checksum = checksum
60
+ message.payload = fields
61
+ message.prefix = message_prefix
62
+ message.interpreted_data_type = interpreted_type
63
+ message
64
+ end
65
+
66
+ end
67
+
68
+ end