Bug Summary

File:builds/wireshark/wireshark/epan/dissectors/packet-nmea0183.c
Warning:line 3715, column 5
Value stored to 'offset' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name packet-nmea0183.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -fno-delete-null-pointer-checks -mframe-pointer=all -relaxed-aliasing -fmath-errno -ffp-contract=on -fno-rounding-math -ffloat16-excess-precision=fast -fbfloat16-excess-precision=fast -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/builds/wireshark/wireshark/build -fcoverage-compilation-dir=/builds/wireshark/wireshark/build -resource-dir /usr/lib/llvm-22/lib/clang/22 -isystem /usr/include/glib-2.0 -isystem /usr/lib/x86_64-linux-gnu/glib-2.0/include -isystem /builds/wireshark/wireshark/epan/dissectors -isystem /builds/wireshark/wireshark/build/epan/dissectors -isystem /usr/include/mit-krb5 -isystem /usr/include/libxml2 -isystem /builds/wireshark/wireshark/epan -D CARES_NO_DEPRECATED -D G_DISABLE_DEPRECATED -D G_DISABLE_SINGLE_INCLUDES -D WS_BUILD_DLL -D WS_DEBUG -D WS_DEBUG_UTF_8 -I /builds/wireshark/wireshark/build -I /builds/wireshark/wireshark -I /builds/wireshark/wireshark/include -D _GLIBCXX_ASSERTIONS -internal-isystem /usr/lib/llvm-22/lib/clang/22/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fmacro-prefix-map=/builds/wireshark/wireshark/= -fmacro-prefix-map=/builds/wireshark/wireshark/build/= -fmacro-prefix-map=../= -Wno-format-nonliteral -std=gnu17 -ferror-limit 19 -fvisibility=hidden -fwrapv -fwrapv-pointer -fstrict-flex-arrays=3 -stack-protector 2 -fstack-clash-protection -fcf-protection=full -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fexceptions -fcolor-diagnostics -analyzer-output=html -faddrsig -fdwarf2-cfi-asm -o /builds/wireshark/wireshark/sbout/2026-07-24-100408-3660-1 -x c /builds/wireshark/wireshark/epan/dissectors/packet-nmea0183.c
1/* packet-nmea0183.c
2 * Routines for NMEA 0183 protocol dissection
3 * Copyright 2024 Casper Meijn <casper@meijn.net>
4 *
5 * Wireshark - Network traffic analyzer
6 * By Gerald Combs <gerald@wireshark.org>
7 * Copyright 1998 Gerald Combs
8 *
9 * SPDX-License-Identifier: GPL-2.0-or-later
10 */
11
12#include "config.h"
13#include <epan/packet.h>
14#include <epan/expert.h>
15#include <wsutil/strtoi.h>
16
17
18/*
19 * null-terminated sentence prefix string "UdPbC"
20 */
21#define UDPBC"UdPbC" "UdPbC"
22#define RRUDP"RrUdP" "RrUdP"
23#define RAUDP"RaUdp" "RaUdp"
24#define RPUDP"RpUdP" "RpUdP"
25#define NMEA0183_CRLF0x0d0a 0x0d0a
26
27static int hf_nmea0183_talker_id;
28static int hf_nmea0183_sentence_id;
29static int hf_nmea0183_unknown_field;
30static int hf_nmea0183_checksum;
31static int hf_nmea0183_checksum_calculated;
32
33static int hf_nmea0183_dpt_depth;
34static int hf_nmea0183_dpt_offset;
35static int hf_nmea0183_dpt_max_range;
36
37static int hf_nmea0183_hdt_heading;
38static int hf_nmea0183_hdt_unit;
39
40static int hf_nmea0183_aam_arr_circle_radius;
41static int hf_nmea0183_aam_arr_circle_status;
42static int hf_nmea0183_aam_perp_status;
43static int hf_nmea0183_aam_units_radius;
44static int hf_nmea0183_aam_waypoint;
45
46static int hf_nmea0183_abk_ack_type;
47static int hf_nmea0183_abk_ais_channel;
48static int hf_nmea0183_abk_mmsi;
49static int hf_nmea0183_abk_msg_id;
50static int hf_nmea0183_abk_msg_seq;
51
52static int hf_nmea0183_aca_chan_a;
53static int hf_nmea0183_aca_chan_a_bw;
54static int hf_nmea0183_aca_chan_b;
55static int hf_nmea0183_aca_chan_b_bw;
56static int hf_nmea0183_aca_info_src;
57static int hf_nmea0183_aca_inuse;
58static int hf_nmea0183_aca_inuse_change;
59static int hf_nmea0183_aca_ne_clat;
60static int hf_nmea0183_aca_ne_clong;
61static int hf_nmea0183_aca_power;
62static int hf_nmea0183_aca_seq_num;
63static int hf_nmea0183_aca_sw_clat;
64static int hf_nmea0183_aca_sw_clong;
65static int hf_nmea0183_aca_txrx_mode;
66static int hf_nmea0183_aca_zone_size;
67
68static int hf_nmea0183_ack_alarm_id;
69
70static int hf_nmea0183_acs_day;
71static int hf_nmea0183_acs_mmsi;
72static int hf_nmea0183_acs_month;
73static int hf_nmea0183_acs_seq_num;
74static int hf_nmea0183_acs_utc;
75static int hf_nmea0183_acs_year;
76
77static int hf_nmea0183_air_mmsi_is1;
78static int hf_nmea0183_air_mmsi_is2;
79static int hf_nmea0183_air_msg2_req;
80static int hf_nmea0183_air_msg2_sub;
81static int hf_nmea0183_air_msg_req;
82static int hf_nmea0183_air_msg_req_is2;
83static int hf_nmea0183_air_msg_sub;
84static int hf_nmea0183_air_msg_sub_is2;
85
86static int hf_nmea0183_akd_alarm_type;
87static int hf_nmea0183_akd_inst_num_orig;
88static int hf_nmea0183_akd_inst_num_send;
89static int hf_nmea0183_akd_subsys_indicator_orig;
90static int hf_nmea0183_akd_sybsys_indicator_send;
91static int hf_nmea0183_akd_sys_indicator_orig;
92static int hf_nmea0183_akd_sys_indicator_send;
93static int hf_nmea0183_akd_utc;
94
95static int hf_nmea0183_ala_alarm_ack_state;
96static int hf_nmea0183_ala_alarm_cond;
97static int hf_nmea0183_ala_alarm_text;
98static int hf_nmea0183_ala_alarm_type;
99static int hf_nmea0183_ala_inst_num;
100static int hf_nmea0183_ala_subsys_indicator;
101static int hf_nmea0183_ala_sys_indicator;
102static int hf_nmea0183_ala_time;
103
104static int hf_nmea0183_alm_af0_clock_param;
105static int hf_nmea0183_alm_af1_clock_param;
106static int hf_nmea0183_alm_alm_ref_time;
107static int hf_nmea0183_alm_arg_perigee;
108static int hf_nmea0183_alm_eccent;
109static int hf_nmea0183_alm_gps_week;
110static int hf_nmea0183_alm_incl_angle;
111static int hf_nmea0183_alm_long_asc_node;
112static int hf_nmea0183_alm_mean_anomaly;
113static int hf_nmea0183_alm_rate_right_asc;
114static int hf_nmea0183_alm_root_sm_axis;
115static int hf_nmea0183_alm_sat_prn;
116static int hf_nmea0183_alm_sent_num;
117static int hf_nmea0183_alm_sent_tot;
118static int hf_nmea0183_alm_sv_health;
119
120static int hf_nmea0183_alr_time;
121static int hf_nmea0183_alr_time_hour;
122static int hf_nmea0183_alr_time_minute;
123static int hf_nmea0183_alr_time_second;
124static int hf_nmea0183_alr_alarm_id;
125static int hf_nmea0183_alr_alarm_cond;
126static int hf_nmea0183_alr_alarm_ack_st;
127static int hf_nmea0183_alr_alarm_desc_txt;
128
129static int hf_nmea0183_apb_arr_circle_status;
130static int hf_nmea0183_apb_bearing_origin;
131static int hf_nmea0183_apb_bearing_present;
132static int hf_nmea0183_apb_cycle_lock_warning;
133static int hf_nmea0183_apb_dir_steer;
134static int hf_nmea0183_apb_heading_steer;
135static int hf_nmea0183_apb_mag_xte;
136static int hf_nmea0183_apb_mode;
137static int hf_nmea0183_apb_perp_status;
138static int hf_nmea0183_apb_waypoint_id;
139static int hf_nmea0183_apb_xte_units;
140
141static int hf_nmea0183_bec_bearing_mag;
142static int hf_nmea0183_bec_bearing_true;
143static int hf_nmea0183_bec_distance;
144static int hf_nmea0183_bec_latitude;
145static int hf_nmea0183_bec_longitude;
146static int hf_nmea0183_bec_utc;
147static int hf_nmea0183_bec_waypoint;
148
149static int hf_nmea0183_bod_bearing_mag;
150static int hf_nmea0183_bod_bearing_true;
151static int hf_nmea0183_bod_dest_waypoint;
152static int hf_nmea0183_bod_orig_waypoint;
153
154static int hf_nmea0183_bwc_bearing_mag;
155static int hf_nmea0183_bwc_bearing_true;
156static int hf_nmea0183_bwc_distance;
157static int hf_nmea0183_bwc_latitude;
158static int hf_nmea0183_bwc_longitude;
159static int hf_nmea0183_bwc_mode;
160static int hf_nmea0183_bwc_utc;
161static int hf_nmea0183_bwc_waypoint;
162
163static int hf_nmea0183_bwr_bearing_mag;
164static int hf_nmea0183_bwr_bearing_true;
165static int hf_nmea0183_bwr_distance;
166static int hf_nmea0183_bwr_latitude;
167static int hf_nmea0183_bwr_longitude;
168static int hf_nmea0183_bwr_mode;
169static int hf_nmea0183_bwr_utc;
170static int hf_nmea0183_bwr_waypoint;
171
172static int hf_nmea0183_bww_bearing_mag;
173static int hf_nmea0183_bww_bearing_true;
174static int hf_nmea0183_bww_from_waypoint;
175static int hf_nmea0183_bww_to_waypoint;
176
177static int hf_nmea0183_cbr_hr_chan_a;
178static int hf_nmea0183_cbr_hr_chan_b;
179static int hf_nmea0183_cbr_interv_chan_a;
180static int hf_nmea0183_cbr_interv_chan_b;
181static int hf_nmea0183_cbr_min_chan_a;
182static int hf_nmea0183_cbr_min_chan_b;
183static int hf_nmea0183_cbr_mmsi;
184static int hf_nmea0183_cbr_msd_id_index;
185static int hf_nmea0183_cbr_msg_id;
186static int hf_nmea0183_cbr_setup;
187static int hf_nmea0183_cbr_slot_chan_a;
188static int hf_nmea0183_cbr_slot_chan_b;
189static int hf_nmea0183_cbr_status;
190
191static int hf_nmea0183_cur_data_set;
192static int hf_nmea0183_cur_depth;
193static int hf_nmea0183_cur_direction;
194static int hf_nmea0183_cur_direction_ref;
195static int hf_nmea0183_cur_heading;
196static int hf_nmea0183_cur_heading_ref;
197static int hf_nmea0183_cur_layer;
198static int hf_nmea0183_cur_ref_layer;
199static int hf_nmea0183_cur_speed;
200static int hf_nmea0183_cur_speed_ref;
201static int hf_nmea0183_cur_validity;
202
203static int hf_nmea0183_dbt_fathoms;
204static int hf_nmea0183_dbt_feet;
205static int hf_nmea0183_dbt_meters;
206
207static int hf_nmea0183_dcn_data_basis;
208static int hf_nmea0183_dcn_dc_id;
209static int hf_nmea0183_dcn_glop;
210static int hf_nmea0183_dcn_gnav;
211static int hf_nmea0183_dcn_gstatus;
212static int hf_nmea0183_dcn_gz_id;
213static int hf_nmea0183_dcn_plop;
214static int hf_nmea0183_dcn_pnav;
215static int hf_nmea0183_dcn_pos_uncertainty;
216static int hf_nmea0183_dcn_pstatus;
217static int hf_nmea0183_dcn_pz_id;
218static int hf_nmea0183_dcn_rlop;
219static int hf_nmea0183_dcn_rnav;
220static int hf_nmea0183_dcn_rstatus;
221static int hf_nmea0183_dcn_rz_id;
222
223static int hf_nmea0183_ddc_brightness;
224static int hf_nmea0183_ddc_dimming;
225static int hf_nmea0183_ddc_palette;
226static int hf_nmea0183_ddc_status;
227
228static int hf_nmea0183_dor_door_num;
229static int hf_nmea0183_dor_time;
230static int hf_nmea0183_dor_first_indic;
231static int hf_nmea0183_dor_msg_type;
232static int hf_nmea0183_dor_open_count;
233static int hf_nmea0183_dor_second_indic;
234static int hf_nmea0183_dor_setting;
235static int hf_nmea0183_dor_status;
236static int hf_nmea0183_dor_system_type;
237static int hf_nmea0183_dor_text;
238
239static int hf_nmea0183_dsc_ack;
240static int hf_nmea0183_dsc_address;
241static int hf_nmea0183_dsc_category;
242static int hf_nmea0183_dsc_comm_type;
243static int hf_nmea0183_dsc_expansion;
244static int hf_nmea0183_dsc_first_tcmd;
245static int hf_nmea0183_dsc_format;
246static int hf_nmea0183_dsc_mmsi;
247static int hf_nmea0183_dsc_nature_distress;
248static int hf_nmea0183_dsc_position;
249static int hf_nmea0183_dsc_time;
250
251static int hf_nmea0183_dse_code;
252static int hf_nmea0183_dse_data;
253static int hf_nmea0183_dse_flag;
254static int hf_nmea0183_dse_mmsi;
255static int hf_nmea0183_dse_sentence_number;
256static int hf_nmea0183_dse_total_sentences;
257
258static int hf_nmea0183_dsi_course;
259static int hf_nmea0183_dsi_expansion;
260static int hf_nmea0183_dsi_geo_area;
261static int hf_nmea0183_dsi_info;
262static int hf_nmea0183_dsi_mmsi;
263static int hf_nmea0183_dsi_sentence_number;
264static int hf_nmea0183_dsi_symbol;
265static int hf_nmea0183_dsi_total_sentences;
266static int hf_nmea0183_dsi_type;
267
268static int hf_nmea0183_dsr_expansion;
269static int hf_nmea0183_dsr_info;
270static int hf_nmea0183_dsr_mmsi;
271static int hf_nmea0183_dsr_sentence_number;
272static int hf_nmea0183_dsr_symbol;
273static int hf_nmea0183_dsr_total_sentences;
274
275static int hf_nmea0183_dtm_alt_offset;
276static int hf_nmea0183_dtm_datum;
277static int hf_nmea0183_dtm_datum_subdiv;
278static int hf_nmea0183_dtm_lat_offset;
279static int hf_nmea0183_dtm_lon_offset;
280static int hf_nmea0183_dtm_ref_datum;
281
282static int hf_nmea0183_etl_msg_type;
283static int hf_nmea0183_etl_num_eng_shaft;
284static int hf_nmea0183_etl_opind;
285static int hf_nmea0183_etl_posind_engine;
286static int hf_nmea0183_etl_posind_sub;
287static int hf_nmea0183_etl_time;
288
289static int hf_nmea0183_fsi_mode;
290static int hf_nmea0183_fsi_power;
291static int hf_nmea0183_fsi_recv_freq;
292static int hf_nmea0183_fsi_xmit_freq;
293
294static int hf_nmea0183_gbs_alt_err;
295static int hf_nmea0183_gbs_est_bias;
296static int hf_nmea0183_gbs_lat_err;
297static int hf_nmea0183_gbs_long_err;
298static int hf_nmea0183_gbs_prob_miss;
299static int hf_nmea0183_gbs_sat_id;
300static int hf_nmea0183_gbs_sat_type;
301static int hf_nmea0183_gbs_std_dev;
302static int hf_nmea0183_gbs_utc;
303
304static int hf_nmea0183_gga_time;
305static int hf_nmea0183_gga_time_hour;
306static int hf_nmea0183_gga_time_minute;
307static int hf_nmea0183_gga_time_second;
308static int hf_nmea0183_gga_latitude;
309static int hf_nmea0183_gga_latitude_degree;
310static int hf_nmea0183_gga_latitude_minute;
311static int hf_nmea0183_gga_latitude_direction;
312static int hf_nmea0183_gga_longitude;
313static int hf_nmea0183_gga_longitude_degree;
314static int hf_nmea0183_gga_longitude_minute;
315static int hf_nmea0183_gga_longitude_direction;
316static int hf_nmea0183_gga_quality;
317static int hf_nmea0183_gga_number_satellites;
318static int hf_nmea0183_gga_horizontal_dilution;
319static int hf_nmea0183_gga_altitude;
320static int hf_nmea0183_gga_altitude_unit;
321static int hf_nmea0183_gga_geoidal_separation;
322static int hf_nmea0183_gga_geoidal_separation_unit;
323static int hf_nmea0183_gga_age_dgps;
324static int hf_nmea0183_gga_dgps_station;
325
326static int hf_nmea0183_glc_gri;
327static int hf_nmea0183_glc_master_toa;
328static int hf_nmea0183_glc_sig_status;
329static int hf_nmea0183_glc_td1;
330static int hf_nmea0183_glc_td2;
331static int hf_nmea0183_glc_td3;
332static int hf_nmea0183_glc_td4;
333static int hf_nmea0183_glc_td5;
334
335static int hf_nmea0183_gll_latitude;
336static int hf_nmea0183_gll_latitude_degree;
337static int hf_nmea0183_gll_latitude_minute;
338static int hf_nmea0183_gll_latitude_direction;
339static int hf_nmea0183_gll_longitude;
340static int hf_nmea0183_gll_longitude_degree;
341static int hf_nmea0183_gll_longitude_minute;
342static int hf_nmea0183_gll_longitude_direction;
343static int hf_nmea0183_gll_time;
344static int hf_nmea0183_gll_time_hour;
345static int hf_nmea0183_gll_time_minute;
346static int hf_nmea0183_gll_time_second;
347static int hf_nmea0183_gll_status;
348static int hf_nmea0183_gll_mode;
349
350static int hf_nmea0183_gmp_ant_alt;
351static int hf_nmea0183_gmp_data_age;
352static int hf_nmea0183_gmp_diff_ref_id;
353static int hf_nmea0183_gmp_geoid_sep;
354static int hf_nmea0183_gmp_hdop;
355static int hf_nmea0183_gmp_mode_glonass;
356static int hf_nmea0183_gmp_mode_gps;
357static int hf_nmea0183_gmp_mode_other;
358static int hf_nmea0183_gmp_mode_string;
359static int hf_nmea0183_gmp_projection;
360static int hf_nmea0183_gmp_tot_sats;
361static int hf_nmea0183_gmp_utc;
362static int hf_nmea0183_gmp_x_comp;
363static int hf_nmea0183_gmp_y_comp;
364static int hf_nmea0183_gmp_zone;
365
366static int hf_nmea0183_gns_ant_alt;
367static int hf_nmea0183_gns_data_age;
368static int hf_nmea0183_gns_diff_ref_id;
369static int hf_nmea0183_gns_geoid_sep;
370static int hf_nmea0183_gns_hdop;
371static int hf_nmea0183_gns_latitude;
372static int hf_nmea0183_gns_longitude;
373static int hf_nmea0183_gns_mode_glonass;
374static int hf_nmea0183_gns_mode_gps;
375static int hf_nmea0183_gns_mode_other;
376static int hf_nmea0183_gns_mode_string;
377static int hf_nmea0183_gns_tot_sats;
378static int hf_nmea0183_gns_utc;
379
380static int hf_nmea0183_grs_mode;
381static int hf_nmea0183_grs_range_resid;
382static int hf_nmea0183_grs_utc;
383
384static int hf_nmea0183_gsa_fix_mode;
385static int hf_nmea0183_gsa_hdop;
386static int hf_nmea0183_gsa_op_mode;
387static int hf_nmea0183_gsa_pdop;
388static int hf_nmea0183_gsa_sat_id;
389static int hf_nmea0183_gsa_sat_type;
390static int hf_nmea0183_gsa_vdop;
391
392static int hf_nmea0183_gst_time;
393static int hf_nmea0183_gst_time_hour;
394static int hf_nmea0183_gst_time_minute;
395static int hf_nmea0183_gst_time_second;
396static int hf_nmea0183_gst_rms_total_sd;
397static int hf_nmea0183_gst_ellipse_major_sd;
398static int hf_nmea0183_gst_ellipse_minor_sd;
399static int hf_nmea0183_gst_ellipse_orientation;
400static int hf_nmea0183_gst_latitude_sd;
401static int hf_nmea0183_gst_longitude_sd;
402static int hf_nmea0183_gst_altitude_sd;
403
404static int hf_nmea0183_gsv_azimuth;
405static int hf_nmea0183_gsv_elevation;
406static int hf_nmea0183_gsv_sat_id;
407static int hf_nmea0183_gsv_sat_type;
408static int hf_nmea0183_gsv_sats_in_view;
409static int hf_nmea0183_gsv_sentence_number;
410static int hf_nmea0183_gsv_snr;
411static int hf_nmea0183_gsv_total_sentences;
412
413static int hf_nmea0183_hbt_interval;
414static int hf_nmea0183_hbt_sent_id;
415static int hf_nmea0183_hbt_status;
416
417static int hf_nmea0183_hdg_mag_dev;
418static int hf_nmea0183_hdg_mag_sensor;
419static int hf_nmea0183_hdg_mag_var;
420
421static int hf_nmea0183_hmr_dev_s1;
422static int hf_nmea0183_hmr_dev_s2;
423static int hf_nmea0183_hmr_difflim_setting;
424static int hf_nmea0183_hmr_heading_s1;
425static int hf_nmea0183_hmr_heading_s2;
426static int hf_nmea0183_hmr_heading_sdiff;
427static int hf_nmea0183_hmr_hr_s1;
428static int hf_nmea0183_hmr_hr_s2;
429static int hf_nmea0183_hmr_s1_type;
430static int hf_nmea0183_hmr_s2_type;
431static int hf_nmea0183_hmr_status_s1;
432static int hf_nmea0183_hmr_status_s2;
433static int hf_nmea0183_hmr_variation;
434static int hf_nmea0183_hmr_warning_flag;
435
436static int hf_nmea0183_hms_heading_s1;
437static int hf_nmea0183_hms_heading_s2;
438static int hf_nmea0183_hms_max_diff;
439
440static int hf_nmea0183_hsc_heading_magnetic;
441static int hf_nmea0183_hsc_heading_true;
442
443static int hf_nmea0183_htc_cmd_offhead_lim;
444static int hf_nmea0183_htc_cmd_offtrack;
445static int hf_nmea0183_htc_cmd_radius;
446static int hf_nmea0183_htc_cmd_rate;
447static int hf_nmea0183_htc_cmd_rudder_angle;
448static int hf_nmea0183_htc_cmd_rudder_dir;
449static int hf_nmea0183_htc_cmd_rudder_lim;
450static int hf_nmea0183_htc_cmd_steer;
451static int hf_nmea0183_htc_cmd_track;
452static int hf_nmea0183_htc_heading_ref;
453static int hf_nmea0183_htc_override;
454static int hf_nmea0183_htc_steering_mode;
455static int hf_nmea0183_htc_turn_mode;
456
457static int hf_nmea0183_htd_cmd_offhead_lim;
458static int hf_nmea0183_htd_cmd_offtrack;
459static int hf_nmea0183_htd_cmd_radius;
460static int hf_nmea0183_htd_cmd_rate;
461static int hf_nmea0183_htd_cmd_rudder_angle;
462static int hf_nmea0183_htd_cmd_rudder_dir;
463static int hf_nmea0183_htd_cmd_rudder_lim;
464static int hf_nmea0183_htd_cmd_steer;
465static int hf_nmea0183_htd_cmd_track;
466static int hf_nmea0183_htd_heading_ref;
467static int hf_nmea0183_htd_offhdng_status;
468static int hf_nmea0183_htd_offtrack_status;
469static int hf_nmea0183_htd_override;
470static int hf_nmea0183_htd_rudder_status;
471static int hf_nmea0183_htd_steering_mode;
472static int hf_nmea0183_htd_turn_mode;
473static int hf_nmea0183_htd_vessel_heading;
474
475static int hf_nmea0183_lcd_gri;
476static int hf_nmea0183_lcd_master_ecd;
477static int hf_nmea0183_lcd_master_snr;
478static int hf_nmea0183_lcd_s1_ecd;
479static int hf_nmea0183_lcd_s1_snr;
480static int hf_nmea0183_lcd_s2_ecd;
481static int hf_nmea0183_lcd_s2_snr;
482static int hf_nmea0183_lcd_s3_ecd;
483static int hf_nmea0183_lcd_s3_snr;
484static int hf_nmea0183_lcd_s4_ecd;
485static int hf_nmea0183_lcd_s4_snr;
486static int hf_nmea0183_lcd_s5_ecd;
487static int hf_nmea0183_lcd_s5_snr;
488
489static int hf_nmea0183_loranc_blink_snr_warning;
490
491static int hf_nmea0183_lr1_callsign;
492static int hf_nmea0183_lr1_imo_num;
493static int hf_nmea0183_lr1_req_mmsi;
494static int hf_nmea0183_lr1_resp_mmsi;
495static int hf_nmea0183_lr1_seqnum;
496static int hf_nmea0183_lr1_shipname;
497
498static int hf_nmea0183_lr2_course_ground;
499static int hf_nmea0183_lr2_date;
500static int hf_nmea0183_lr2_latitude;
501static int hf_nmea0183_lr2_longitude;
502static int hf_nmea0183_lr2_resp_mmsi;
503static int hf_nmea0183_lr2_seqnum;
504static int hf_nmea0183_lr2_speed_ground;
505static int hf_nmea0183_lr2_utc;
506
507static int hf_nmea0183_lr3_destination;
508static int hf_nmea0183_lr3_draught;
509static int hf_nmea0183_lr3_eta_date;
510static int hf_nmea0183_lr3_eta_time;
511static int hf_nmea0183_lr3_persons;
512static int hf_nmea0183_lr3_resp_mmsi;
513static int hf_nmea0183_lr3_seqnum;
514static int hf_nmea0183_lr3_ship_breadth;
515static int hf_nmea0183_lr3_ship_cargo;
516static int hf_nmea0183_lr3_ship_length;
517static int hf_nmea0183_lr3_ship_type;
518
519static int hf_nmea0183_lrf_function_rep;
520static int hf_nmea0183_lrf_function_rep_val;
521static int hf_nmea0183_lrf_function_req;
522static int hf_nmea0183_lrf_function_req_val;
523static int hf_nmea0183_lrf_mmsi;
524static int hf_nmea0183_lrf_name;
525static int hf_nmea0183_lrf_seqnum;
526
527static int hf_nmea0183_lri_control;
528static int hf_nmea0183_lri_dest_mmsi;
529static int hf_nmea0183_lri_latitude_ne;
530static int hf_nmea0183_lri_latitude_sw;
531static int hf_nmea0183_lri_longitude_ne;
532static int hf_nmea0183_lri_longitude_sw;
533static int hf_nmea0183_lri_req_mmsi;
534static int hf_nmea0183_lri_seqnum;
535
536static int hf_nmea0183_mla_12lsb_corr_t_scale;
537static int hf_nmea0183_mla_16msb_corr_t_scale;
538static int hf_nmea0183_mla_calday_count;
539static int hf_nmea0183_mla_corr_circling;
540static int hf_nmea0183_mla_corr_incl_angle;
541static int hf_nmea0183_mla_eccentricity;
542static int hf_nmea0183_mla_long_asc_node;
543static int hf_nmea0183_mla_perigee;
544static int hf_nmea0183_mla_roc_circling;
545static int hf_nmea0183_mla_sat_health;
546static int hf_nmea0183_mla_sat_id;
547static int hf_nmea0183_mla_sentence_number;
548static int hf_nmea0183_mla_t_asc_node;
549static int hf_nmea0183_mla_t_scale_shift;
550static int hf_nmea0183_mla_total_sentences;
551
552static int hf_nmea0183_msk_am_bitrate;
553static int hf_nmea0183_msk_am_freq;
554static int hf_nmea0183_msk_beacon_bitrate;
555static int hf_nmea0183_msk_beacon_freq;
556static int hf_nmea0183_msk_channel;
557static int hf_nmea0183_msk_interval;
558
559static int hf_nmea0183_mss_beacon_bitrate;
560static int hf_nmea0183_mss_beacon_freq;
561static int hf_nmea0183_mss_channel;
562static int hf_nmea0183_mss_sig_str;
563static int hf_nmea0183_mss_snr;
564
565static int hf_nmea0183_mtw_temp;
566
567static int hf_nmea0183_mwd_direction_mag;
568static int hf_nmea0183_mwd_direction_true;
569static int hf_nmea0183_mwd_speed_knots;
570static int hf_nmea0183_mwd_speed_ms;
571
572static int hf_nmea0183_mwv_reference;
573static int hf_nmea0183_mwv_speed_units;
574static int hf_nmea0183_mwv_status;
575static int hf_nmea0183_mwv_wind_angle;
576static int hf_nmea0183_mwv_wind_speed;
577
578static int hf_nmea0183_osd_course_ref;
579static int hf_nmea0183_osd_course_true;
580static int hf_nmea0183_osd_drift;
581static int hf_nmea0183_osd_heading_status;
582static int hf_nmea0183_osd_heading_true;
583static int hf_nmea0183_osd_set_true;
584static int hf_nmea0183_osd_speed;
585static int hf_nmea0183_osd_speed_ref;
586static int hf_nmea0183_osd_speed_units;
587
588static int hf_nmea0183_rma_course;
589static int hf_nmea0183_rma_latitude;
590static int hf_nmea0183_rma_longitude;
591static int hf_nmea0183_rma_mag_var;
592static int hf_nmea0183_rma_mode;
593static int hf_nmea0183_rma_speed;
594static int hf_nmea0183_rma_status;
595static int hf_nmea0183_rma_time_diff_a;
596static int hf_nmea0183_rma_time_diff_b;
597
598static int hf_nmea0183_rmb_arrival_status;
599static int hf_nmea0183_rmb_bearing_dest;
600static int hf_nmea0183_rmb_data_status;
601static int hf_nmea0183_rmb_dest_id;
602static int hf_nmea0183_rmb_dest_velocity;
603static int hf_nmea0183_rmb_dest_wp_latitude;
604static int hf_nmea0183_rmb_dest_wp_longitude;
605static int hf_nmea0183_rmb_mode;
606static int hf_nmea0183_rmb_orig_id;
607static int hf_nmea0183_rmb_range_dest;
608static int hf_nmea0183_rmb_steer;
609static int hf_nmea0183_rmb_xte;
610
611static int hf_nmea0183_rmc_course;
612static int hf_nmea0183_rmc_date;
613static int hf_nmea0183_rmc_latitude;
614static int hf_nmea0183_rmc_longitude;
615static int hf_nmea0183_rmc_magnetic;
616static int hf_nmea0183_rmc_mode;
617static int hf_nmea0183_rmc_speed;
618static int hf_nmea0183_rmc_status;
619static int hf_nmea0183_rmc_utc;
620
621static int hf_nmea0183_rot_rate_of_turn;
622static int hf_nmea0183_rot_valid;
623
624static int hf_nmea0183_rpm_number;
625static int hf_nmea0183_rpm_pitch;
626static int hf_nmea0183_rpm_source;
627static int hf_nmea0183_rpm_speed;
628static int hf_nmea0183_rpm_status;
629
630static int hf_nmea0183_rsa_pt_sensor;
631static int hf_nmea0183_rsa_pt_status;
632static int hf_nmea0183_rsa_sb_sensor;
633static int hf_nmea0183_rsa_sb_status;
634
635static int hf_nmea0183_rsd_cursor_bearing;
636static int hf_nmea0183_rsd_cursor_range;
637static int hf_nmea0183_rsd_display;
638static int hf_nmea0183_rsd_ebl1;
639static int hf_nmea0183_rsd_ebl2;
640static int hf_nmea0183_rsd_orig2_range;
641static int hf_nmea0183_rsd_orig_bearing;
642static int hf_nmea0183_rsd_orig_range;
643static int hf_nmea0183_rsd_scale;
644static int hf_nmea0183_rsd_units;
645static int hf_nmea0183_rsd_vrm1;
646static int hf_nmea0183_rsd_vrm2;
647
648static int hf_nmea0183_rte_route;
649static int hf_nmea0183_rte_sentence_mode;
650static int hf_nmea0183_rte_sentence_number;
651static int hf_nmea0183_rte_total_sentences;
652static int hf_nmea0183_rte_waypoint;
653
654static int hf_nmea0183_sfi_frequency;
655static int hf_nmea0183_sfi_mode;
656static int hf_nmea0183_sfi_sentence_number;
657static int hf_nmea0183_sfi_total_sentences;
658
659static int hf_nmea0183_ssd_callsign;
660static int hf_nmea0183_ssd_dte_flag;
661static int hf_nmea0183_ssd_name;
662static int hf_nmea0183_ssd_ref_a;
663static int hf_nmea0183_ssd_ref_b;
664static int hf_nmea0183_ssd_ref_c;
665static int hf_nmea0183_ssd_ref_d;
666static int hf_nmea0183_ssd_source;
667
668static int hf_nmea0183_stn_talker;
669
670static int hf_nmea0183_tlb_label;
671static int hf_nmea0183_tlb_target;
672
673static int hf_nmea0183_tll_ref_tgt;
674static int hf_nmea0183_tll_tgt_latitude;
675static int hf_nmea0183_tll_tgt_longitude;
676static int hf_nmea0183_tll_tgt_name;
677static int hf_nmea0183_tll_utc;
678static int hf_nmea0183_tll_tgt_num;
679static int hf_nmea0183_tll_tgt_status;
680
681static int hf_nmea0183_ttm_acq_type;
682static int hf_nmea0183_ttm_bearing;
683static int hf_nmea0183_ttm_dist_pt_approach;
684static int hf_nmea0183_ttm_ref_tgt;
685static int hf_nmea0183_ttm_tgt_course;
686static int hf_nmea0183_ttm_tgt_dist;
687static int hf_nmea0183_ttm_tgt_name;
688static int hf_nmea0183_ttm_tgt_num;
689static int hf_nmea0183_ttm_tgt_speed;
690static int hf_nmea0183_ttm_tgt_status;
691static int hf_nmea0183_ttm_time_cpa;
692static int hf_nmea0183_ttm_units;
693static int hf_nmea0183_ttm_utc;
694
695static int hf_nmea0183_tut_sentence_num;
696static int hf_nmea0183_tut_seq_msg;
697static int hf_nmea0183_tut_src_id;
698static int hf_nmea0183_tut_text;
699static int hf_nmea0183_tut_total_sentences;
700static int hf_nmea0183_tut_trans_code;
701
702static int hf_nmea0183_txt_num;
703static int hf_nmea0183_txt_sent_num;
704static int hf_nmea0183_txt_id;
705static int hf_nmea0183_txt_msg;
706
707static int hf_nmea0183_vbw_water_speed_longitudinal;
708static int hf_nmea0183_vbw_water_speed_transverse;
709static int hf_nmea0183_vbw_water_speed_valid;
710static int hf_nmea0183_vbw_ground_speed_longitudinal;
711static int hf_nmea0183_vbw_ground_speed_transverse;
712static int hf_nmea0183_vbw_ground_speed_valid;
713static int hf_nmea0183_vbw_stern_water_speed;
714static int hf_nmea0183_vbw_stern_water_speed_valid;
715static int hf_nmea0183_vbw_stern_ground_speed;
716static int hf_nmea0183_vbw_stern_ground_speed_valid;
717
718static int hf_nmea0183_vdr_heading_magnetic;
719static int hf_nmea0183_vdr_heading_true;
720static int hf_nmea0183_vdr_speed;
721
722static int hf_nmea0183_vhw_true_heading;
723static int hf_nmea0183_vhw_true_heading_unit;
724static int hf_nmea0183_vhw_magnetic_heading;
725static int hf_nmea0183_vhw_magnetic_heading_unit;
726static int hf_nmea0183_vhw_water_speed_knot;
727static int hf_nmea0183_vhw_water_speed_knot_unit;
728static int hf_nmea0183_vhw_water_speed_kilometer;
729static int hf_nmea0183_vhw_water_speed_kilometer_unit;
730
731static int hf_nmea0183_vlw_cumulative_water;
732static int hf_nmea0183_vlw_cumulative_water_unit;
733static int hf_nmea0183_vlw_trip_water;
734static int hf_nmea0183_vlw_trip_water_unit;
735static int hf_nmea0183_vlw_cumulative_ground;
736static int hf_nmea0183_vlw_cumulative_ground_unit;
737static int hf_nmea0183_vlw_trip_ground;
738static int hf_nmea0183_vlw_trip_ground_unit;
739
740static int hf_nmea0183_vpw_speed_knots;
741static int hf_nmea0183_vpw_speed_ms;
742
743static int hf_nmea0183_vsd_app_flags;
744static int hf_nmea0183_vsd_day_arrival;
745static int hf_nmea0183_vsd_destination;
746static int hf_nmea0183_vsd_max_draught;
747static int hf_nmea0183_vsd_month_arrival;
748static int hf_nmea0183_vsd_nav_status;
749static int hf_nmea0183_vsd_persons;
750static int hf_nmea0183_vsd_ship_cargo;
751static int hf_nmea0183_vsd_utc_arrival;
752
753static int hf_nmea0183_vtg_true_course;
754static int hf_nmea0183_vtg_true_course_unit;
755static int hf_nmea0183_vtg_magnetic_course;
756static int hf_nmea0183_vtg_magnetic_course_unit;
757static int hf_nmea0183_vtg_ground_speed_knot;
758static int hf_nmea0183_vtg_ground_speed_knot_unit;
759static int hf_nmea0183_vtg_ground_speed_kilometer;
760static int hf_nmea0183_vtg_ground_speed_kilometer_unit;
761static int hf_nmea0183_vtg_mode;
762
763static int hf_nmea0183_wcv_mode;
764static int hf_nmea0183_wcv_velocity;
765static int hf_nmea0183_wcv_waypoint;
766
767static int hf_nmea0183_wnc_dist_km;
768static int hf_nmea0183_wnc_dist_nm;
769static int hf_nmea0183_wnc_from_id;
770static int hf_nmea0183_wnc_to_id;
771
772static int hf_nmea0183_wpl_latitude;
773static int hf_nmea0183_wpl_longitude;
774static int hf_nmea0183_wpl_waypoint;
775
776static int hf_nmea0183_xdr_data;
777static int hf_nmea0183_xdr_id;
778static int hf_nmea0183_xdr_type;
779static int hf_nmea0183_xdr_units;
780
781static int hf_nmea0183_xte_blinksnr_status;
782static int hf_nmea0183_xte_cycle_status;
783static int hf_nmea0183_xte_magnitude;
784static int hf_nmea0183_xte_direction;
785static int hf_nmea0183_xte_mode;
786
787static int hf_nmea0183_xtr_direction;
788static int hf_nmea0183_xtr_magnitude;
789
790static int hf_nmea0183_zda_time;
791static int hf_nmea0183_zda_time_hour;
792static int hf_nmea0183_zda_time_minute;
793static int hf_nmea0183_zda_time_second;
794static int hf_nmea0183_zda_date_day;
795static int hf_nmea0183_zda_date_month;
796static int hf_nmea0183_zda_date_year;
797static int hf_nmea0183_zda_local_zone_hour;
798static int hf_nmea0183_zda_local_zone_minute;
799
800static int hf_nmea0183_zdl_dist;
801static int hf_nmea0183_zdl_time;
802static int hf_nmea0183_zdl_type;
803
804static int hf_nmea0183_zfo_elapsed;
805static int hf_nmea0183_zfo_origin;
806static int hf_nmea0183_zfo_utc;
807
808static int hf_nmea0183_ztg_dest;
809static int hf_nmea0183_ztg_time_left;
810static int hf_nmea0183_ztg_utc;
811
812static int hf_nmea0183_sentence_prefix;
813static int hf_nmea0183_tag_block;
814static int hf_nmea0183_bin_version;
815static int hf_nmea0183_bin_srcid;
816static int hf_nmea0183_bin_dstid;
817static int hf_nmea0183_bin_mtype;
818static int hf_nmea0183_bin_blockid;
819static int hf_nmea0183_bin_seqnum;
820static int hf_nmea0183_bin_max_seqnum;
821static int hf_nmea0183_bin_data;
822static int hf_nmea0183_bin_file_descriptor;
823static int hf_nmea0183_bin_file_descriptor_len;
824static int hf_nmea0183_bin_file_length;
825static int hf_nmea0183_bin_stat_of_acquisition;
826static int hf_nmea0183_bin_device;
827static int hf_nmea0183_bin_channel;
828static int hf_nmea0183_bin_type_len;
829static int hf_nmea0183_bin_data_type;
830static int hf_nmea0183_bin_status_and_info;
831
832static int ett_nmea0183;
833static int ett_nmea0183_checksum;
834static int ett_nmea0183_sentence;
835static int ett_nmea0183_zda_time;
836static int ett_nmea0183_alr_time;
837static int ett_nmea0183_gga_time;
838static int ett_nmea0183_gga_latitude;
839static int ett_nmea0183_gga_longitude;
840static int ett_nmea0183_gll_time;
841static int ett_nmea0183_gll_latitude;
842static int ett_nmea0183_gll_longitude;
843static int ett_nmea0183_gst_time;
844static int ett_nmea0183_tag_block;
845static int ett_nmea0183_fd;
846static int ett_nmea0183_legacy_satellite_info;
847
848static expert_field ei_nmea0183_invalid_first_character;
849static expert_field ei_nmea0183_missing_checksum_character;
850static expert_field ei_nmea0183_invalid_end_of_line;
851static expert_field ei_nmea0183_checksum_incorrect;
852static expert_field ei_nmea0183_sentence_too_long;
853static expert_field ei_nmea0183_field_time_too_short;
854static expert_field ei_nmea0183_field_latitude_too_short;
855static expert_field ei_nmea0183_field_longitude_too_short;
856static expert_field ei_nmea0183_field_missing;
857static expert_field ei_nmea0183_field_uint_invalid;
858static expert_field ei_nmea0183_sat_prn_invalid;
859static expert_field ei_nmea0183_gga_altitude_unit_incorrect;
860static expert_field ei_nmea0183_gga_geoidal_separation_unit_incorrect;
861static expert_field ei_nmea0183_hdt_unit_incorrect;
862static expert_field ei_nmea0183_vhw_true_heading_unit_incorrect;
863static expert_field ei_nmea0183_vhw_magnetic_heading_unit_incorrect;
864static expert_field ei_nmea0183_vhw_water_speed_knot_unit_incorrect;
865static expert_field ei_nmea0183_vhw_water_speed_kilometer_unit_incorrect;
866static expert_field ei_nmea0183_vlw_cumulative_water_unit_incorrect;
867static expert_field ei_nmea0183_vlw_trip_water_unit_incorrect;
868static expert_field ei_nmea0183_vlw_cumulative_ground_unit_incorrect;
869static expert_field ei_nmea0183_vlw_trip_ground_unit_incorrect;
870static expert_field ei_nmea0183_vtg_true_course_unit_incorrect;
871static expert_field ei_nmea0183_vtg_magnetic_course_unit_incorrect;
872static expert_field ei_nmea0183_vtg_ground_speed_knot_unit_incorrect;
873static expert_field ei_nmea0183_vtg_ground_speed_kilometer_unit_incorrect;
874static expert_field ei_nmea0183_legacy_nonstandard;
875static expert_field ei_nmea0183_legacy_empty_response;
876
877static int proto_nmea0183;
878static int proto_nmea0183_bin;
879
880static dissector_handle_t nmea0183_handle;
881
882// List of known Talker IDs (Source: NMEA Revealed by Eric S. Raymond, https://gpsd.gitlab.io/gpsd/NMEA.html, retrieved 2023-01-26)
883static const string_string known_talker_ids[] = {
884 {"AB", "Independent AIS Base Station"},
885 {"AD", "Dependent AIS Base Station"},
886 {"AG", "Autopilot - General"},
887 {"AI", "Mobile AIS Station"},
888 {"AN", "AIS Aid to Navigation"},
889 {"AP", "Autopilot - Magnetic"},
890 {"AR", "AIS Receiving Station"},
891 {"AT", "AIS Transmitting Station"},
892 {"AX", "AIS Simplex Repeater"},
893 {"BD", "BeiDou (China)"},
894 {"BI", "Bilge System"},
895 {"BN", "Bridge navigational watch alarm system"},
896 {"BS", "Base AIS Station"},
897 {"CA", "Central Alarm"},
898 {"CC", "Computer - Programmed Calculator (obsolete)"},
899 {"CD", "Communications - Digital Selective Calling (DSC)"},
900 {"CM", "Computer - Memory Data (obsolete)"},
901 {"CR", "Communications - Data Receiver"},
902 {"CS", "Communications - Satellite"},
903 {"CT", "Communications - Radio-Telephone (MF/HF)"},
904 {"CV", "Communications - Radio-Telephone (VHF)"},
905 {"CX", "Communications - Scanning Receiver"},
906 {"DE", "DECCA Navigation (obsolete)"},
907 {"DF", "Direction Finder"},
908 {"DM", "Velocity Sensor, Speed Log, Water, Magnetic"},
909 {"DP", "Dynamiv Position"},
910 {"DU", "Duplex repeater station"},
911 {"EC", "Electronic Chart System (ECS)"},
912 {"EI", "Electronic Chart Display & Information System (ECDIS)"},
913 {"EP", "Emergency Position Indicating Beacon (EPIRB)"},
914 {"ER", "Engine Room Monitoring Systems"},
915 {"FD", "Fire Door"},
916 {"FE", "Fire Extinguisher System"},
917 {"FR", "Fire Detection System"},
918 {"FS", "Fire Sprinkler"},
919 {"GA", "Galileo Positioning System"},
920 {"GB", "BeiDou (China)"},
921 {"GI", "NavIC, IRNSS (India)"},
922 {"GL", "GLONASS, according to IEIC 61162-1"},
923 {"GN", "Combination of multiple satellite systems (NMEA 1083)"},
924 {"GP", "Global Positioning System receiver"},
925 {"GQ", "QZSS regional GPS augmentation system (Japan)"},
926 {"HC", "Heading - Magnetic Compass"},
927 {"HD", "Hull Door"},
928 {"HE", "Heading - North Seeking Gyro"},
929 {"HF", "Heading - Fluxgate"},
930 {"HN", "Heading - Non North Seeking Gyro"},
931 {"HS", "Hull Stress"},
932 {"II", "Integrated Instrumentation"},
933 {"IN", "Integrated Navigation"},
934 {"JA", "Alarm and Monitoring"},
935 {"JB", "Water Monitoring"},
936 {"JC", "Power Management"},
937 {"JD", "Propulsion Control"},
938 {"JE", "Engine Control"},
939 {"JF", "Propulsion Boiler"},
940 {"JG", "Aux Boiler"},
941 {"JH", "Engine Governor"},
942 {"LA", "Loran A (obsolete)"},
943 {"LC", "Loran C (obsolete)"},
944 {"MP", "Microwave Positioning System (obsolete)"},
945 {"MX", "Multiplexer"},
946 {"NL", "Navigation light controller"},
947 {"NV", "Night Vision"},
948 {"OM", "OMEGA Navigation System (obsolete)"},
949 {"OS", "Distress Alarm System (obsolete)"},
950 {"P ", "Vendor specific"},
951 {"QZ", "QZSS regional GPS augmentation system (Japan)"},
952 {"RA", "RADAR and/or ARPA"},
953 {"RB", "Record Book"},
954 {"RC", "Propulsion Machinery including Remote Control"},
955 {"RI", "Rudder Angle Indicator"},
956 {"SA", "Physical Shore AUS Station"},
957 {"SC", "Steering Control System/Device"},
958 {"SD", "Depth Sounder"},
959 {"SG", "Steering Gear"},
960 {"SN", "Electronic Positioning System, other/general"},
961 {"SS", "Scanning Sounder"},
962 {"ST", "Skytraq debug output"},
963 {"TC", "Track Control"},
964 {"TI", "Turn Rate Indicator"},
965 {"TR", "TRANSIT Navigation System"},
966 {"U0", "User Configured 0"},
967 {"U1", "User Configured 1"},
968 {"U2", "User Configured 2"},
969 {"U3", "User Configured 3"},
970 {"U4", "User Configured 4"},
971 {"U5", "User Configured 5"},
972 {"U6", "User Configured 6"},
973 {"U7", "User Configured 7"},
974 {"U8", "User Configured 8"},
975 {"U9", "User Configured 9"},
976 {"UP", "Microprocessor controller"},
977 {"VA", "VHF Data Exchange System (VDES), ASM"},
978 {"VD", "Velocity Sensor, Doppler, other/general"},
979 {"VM", "Velocity Sensor, Speed Log, Water, Magnetic"},
980 {"VR", "Voyage Data recorder"},
981 {"VS", "VHF Data Exchange System (VDES), Satellite"},
982 {"VT", "VHF Data Exchange System (VDES), Terrestrial"},
983 {"VW", "Velocity Sensor, Speed Log, Water, Mechanical"},
984 {"WD", "Watertight Door"},
985 {"WI", "Weather Instruments"},
986 {"WL", "Water Level"},
987 {"YC", "Transducer - Temperature (obsolete)"},
988 {"YD", "Transducer - Displacement, Angular or Linear (obsolete)"},
989 {"YF", "Transducer - Frequency (obsolete)"},
990 {"YL", "Transducer - Level (obsolete)"},
991 {"YP", "Transducer - Pressure (obsolete)"},
992 {"YR", "Transducer - Flow Rate (obsolete)"},
993 {"YT", "Transducer - Tachometer (obsolete)"},
994 {"YV", "Transducer - Volume (obsolete)"},
995 {"YX", "Transducer"},
996 {"ZA", "Timekeeper - Atomic Clock"},
997 {"ZC", "Timekeeper - Chronometer"},
998 {"ZQ", "Timekeeper - Quartz"},
999 {"ZV", "Timekeeper - Radio Update, WWV or WWVH"},
1000 {NULL((void*)0), NULL((void*)0)}};
1001
1002// List of known Sentence IDs (Source: NMEA Revealed by Eric S. Raymond, https://gpsd.gitlab.io/gpsd/NMEA.html, retrieved 2023-01-26)
1003static const string_string known_sentence_ids[] = {
1004 {"AAM", "Waypoint Arrival Alarm"},
1005 {"ABK", "UAIS Addressed and Binary Broadcast Acknowledgement"},
1006 {"ACA", "UAIS Regional Channel Assignment Message"},
1007 {"ACF", "General AtoN Station Configuration Command"},
1008 {"ACG", "Extended General AtoN Station Configuration Command"},
1009 {"ACK", "Alarm Acknowledgement"},
1010 {"ACM", "Preparation and Initiation of an AIS Base Station Addressed Channel Management Message (Message 22)"},
1011 {"ACS", "UAIS Channel Management Information Source"},
1012 {"ADS", "Automatic Device Status"},
1013 {"AFB", "AtoN Forced Broadcast Command"},
1014 {"AGA", "Preparation and Initiation of an AIS Base Station Broadcast of a Group Assignment Message (Message 23)"},
1015 {"AID", "AtoN Identification Configuration Command"},
1016 {"AIR", "UAIS Interrogation Request"},
1017 {"AKD", "Acknowledge Detail Alarm Condition"},
1018 {"ALA", "Set Detail Alarm Condition"},
1019 {"ALM", "GPS Almanac Data"},
1020 {"ALR", "Set Alarm State"},
1021 {"ARC", "Alert Command Refused"},
1022 {"APA", "Autopilot Sentence A"},
1023 {"APB", "Autopilot Sentence B"},
1024 {"ASD", "Autopilot System Data"},
1025 {"ASN", "Preparation and Initiation of an AIS Base Station Broadcast of Assignment VDL (Message 16)"},
1026 {"BBM", "AIS Broadcast BinaryMessage"},
1027 {"BCG", "Base Station Configuration, General Command"},
1028 {"BCL", "Base Station Configuration, Location Command"},
1029 {"BEC", "Bearing & Distance to Waypoint - Dead Reckoning"},
1030 {"BER", "Bearing & Distance to Waypoint, Dead Reckoning, Rhumb Line"},
1031 {"BOD", "Bearing - Waypoint to Waypoint"},
1032 {"BPI", "Bearing & Distance to Point of Interest"},
1033 {"BWC", "Bearing & Distance to Waypoint - Great Circle"},
1034 {"BWR", "Bearing and Distance to Waypoint - Rhumb Line"},
1035 {"BWW", "Bearing - Waypoint to Waypoint"},
1036 {"CBR", "Configure Broadcast Rates for AIS AtoN Station Message Command"},
1037 {"CEK", "Configure Encryption Key Command"},
1038 {"COP", "Configure the Operational Period, Command"},
1039 {"CPC", "Configure Parameter-Code for UNIX Time Parameter (c)"},
1040 {"CPD", "Configure Parameter-Code for Destination-Identification Parameter (d)"},
1041 {"CPG", "Configure Parameter-Code for the Sentence-Grouping Parameter (g)"},
1042 {"CPN", "Configure Parameter-Code for the Line-Count Parameter (n)"},
1043 {"CPR", "Configure Parameter-Code for Relative Time Parameter (r)"},
1044 {"CPS", "Configure Parameter-Code for the Source-Identification Parameter (s)"},
1045 {"CPT", "Configure Parameter-Code for General Alphanumeric String Parameter (t)"},
1046 {"CUR", "Water Current Layer"},
1047 {"DBK", "Echosounder - Depth Below Keel"},
1048 {"DBS", "Echosounder - Depth Below Surface"},
1049 {"DBT", "Echosounder - Depth Below Transducer"},
1050 {"DCN", "DECCA Position"},
1051 {"DCR", "Device Capability Report"},
1052 {"DDC", "Display Dimming Control"},
1053 {"DLM", "Data Link Management Slot Allocations for Base Station"},
1054 {"DOR", "Door Status Detection"},
1055 {"DPT", "Depth of Water"},
1056 {"DRU", "Dual Doppler Auxiliary Data"},
1057 {"DSC", "Digital Selective Calling Information"},
1058 {"DSE", "Extended DSC"},
1059 {"DSI", "DSC Transponder Initiate"},
1060 {"DSR", "DSC Transponder Response"},
1061 {"DTM", "Datum Reference"},
1062 {"ECB", "Configure Broadcast Rates for Base Station Messages with Epoch Planning Support"},
1063 {"ETL", "Engine Telegraph Operation Status"},
1064 {"EVE", "General Event Message"},
1065 {"FIR", "Fire Detection"},
1066 {"FSI", "Frequency Set Information"},
1067 {"FSR", "Frame Summary of AIS Reception"},
1068 {"GAL", "Galileo Almanac Data"},
1069 {"GBS", "GPS Satellite Fault Detection"},
1070 {"GDA", "Dead Reckoning Positions"},
1071 {"GEN", "Generic Binary/Status Information"},
1072 {"GFA", "GNSS Fix Accuracy and Integrity"},
1073 {"GGA", "Global Positioning System Fix Data"},
1074 {"GLA", "Loran-C Positions"},
1075 {"GLC", "Geographic Position, Loran-C"},
1076 {"GLL", "Geographic Position - Latitude/Longitude"},
1077 {"GMP", "GNSS Map Projection Fix Data"},
1078 {"GNS", "GNSS Fix data"},
1079 {"GOA", "OMEGA Positions"},
1080 {"GRS", "GNSS Range Residuals"},
1081 {"GSA", "GNSS DOP and Active Satellites"},
1082 {"GST", "GNSS Pseudorange Noise Statistics"},
1083 {"GSV", "GNSS Satellites in View"},
1084 {"GTD", "Geographic Location in Time Differences"},
1085 {"GXA", "TRANSIT Position"},
1086 {"HBT", "Heartbeat Supervision Report"},
1087 {"HCC", "Compass Heading"},
1088 {"HCD", "Heading and Deviation"},
1089 {"HDG", "Heading - Deviation & Variation"},
1090 {"HDM", "Heading - Magnetic"},
1091 {"HDT", "Heading - True"},
1092 {"HFB", "Trawl Headrope to Footrope and Bottom"},
1093 {"HMR", "Heading, Monitor Receive"},
1094 {"HMS", "Heading, Monitor Set"},
1095 {"HSC", "Heading Steering Command"},
1096 {"HSS", "Hull Stress Surveillance Systems"},
1097 {"HTC", "Heading/Track Control Command"},
1098 {"HTD", "Heading/Track Control Data"},
1099 {"HVD", "Magnetic Variation, Automatic"},
1100 {"HVM", "Magnetic Variation, Manually Set"},
1101 {"IMA", "Vessel Identification"},
1102 {"ITS", "Trawl Door Spread 2 Distance"},
1103 {"LCD", "Loran-C Signal Data"},
1104 {"LR1", "UAIS Long-range Reply Sentence 1"},
1105 {"LR2", "UAIS Long-range Reply Sentence 2"},
1106 {"LR3", "UAIS Long-range Reply Sentence 3"},
1107 {"LRF", "UAIS Long-Range Function"},
1108 {"LRI", "UAIS Long-Range Interrogation"},
1109 {"LTI", "UAIS Long-Range Interrogation"},
1110 {"MDA", "Meteorological Composite"},
1111 {"MEB", "Message Input for Broadcast, Command"},
1112 {"MHU", "Humidity"},
1113 {"MLA", "GLONASS Almanac Data"},
1114 {"MMB", "Barometer"},
1115 {"MSK", "Control for a Beacon Receiver"},
1116 {"MSS", "Beacon Receiver Status"},
1117 {"MTA", "Air Temperature"},
1118 {"MTW", "Mean Temperature of Water"},
1119 {"MWD", "Wind Direction & Speed"},
1120 {"MWH", "Wave Height"},
1121 {"MWS", "Wind & Sea State"},
1122 {"MWV", "Wind Speed and Angle"},
1123 {"NAK", "Negative Acknowledgement"},
1124 {"NRM", "NAVTEX Receiver Mask"},
1125 {"NRX", "NAVTEX Received Message"},
1126 {"ODC", "Echosounder - ODEC DPT Format"},
1127 {"OLN", "Omega Lane Numbers"},
1128 {"OLW", "Omega Lane Width"},
1129 {"OMP", "Omega Position"},
1130 {"OSD", "Own Ship Data"},
1131 {"OZN", "Omega Zone Number"},
1132 {"POS", "Device Position and Ship Dimensions Report or Configuration Command"},
1133 {"PRC", "Propulsion Remote Control Status"},
1134 {"R00", "Waypoints in active route"},
1135 {"RLM", "Return Link Message"},
1136 {"RMA", "Recommended Minimum Specific Loran-C Data"},
1137 {"RMB", "Recommended Minimum Navigation Information"},
1138 {"RMC", "Recommended Minimum Specific GNSS Data"},
1139 {"RNN", "Routes"},
1140 {"ROO", "Waypoints in Active Route"},
1141 {"ROR", "Rudder Order Status"},
1142 {"ROT", "Rate Of Turn"},
1143 {"RPM", "Revolutions"},
1144 {"RSA", "Rudder Sensor Angle"},
1145 {"RSD", "RADAR System Data"},
1146 {"RST", "Equipment Reset Command"},
1147 {"RTE", "Routes"},
1148 {"SBK", "Loran-C Blink Status"},
1149 {"SCD", "Loran-C ECDs"},
1150 {"SCY", "Loran-C Cycle Lock Status"},
1151 {"SDB", "Loran-C Signal Strength"},
1152 {"SFI", "Scanning Frequency Information"},
1153 {"SGD", "Position Accuracy Estimate"},
1154 {"SGR", "Loran-C Chain Identifier"},
1155 {"SID", "Set an Equipment's Identification, Command"},
1156 {"SIU", "Loran-C Stations in Use"},
1157 {"SLC", "Loran-C Status"},
1158 {"SNC", "Navigation Calculation Basis"},
1159 {"SNU", "Loran-C SNR Status"},
1160 {"SPO", "Select AIS Device's Processing and Output"},
1161 {"SPS", "Loran-C Predicted Signal Strength"},
1162 {"SSD", "UAIS Ship Static Data"},
1163 {"SSF", "Position Correction Offset"},
1164 {"STC", "Time Constant"},
1165 {"STN", "Multiple Data ID"},
1166 {"STR", "Tracking Reference"},
1167 {"SYS", "Hybrid System Configuration"},
1168 {"TBR", "TAG Block Report"},
1169 {"TBS", "TAG Block Listener Source-Identification Configuration Command"},
1170 {"TDS", "Trawl Door Spread Distance"},
1171 {"TEC", "TRANSIT Satellite Error Code & Doppler Count"},
1172 {"TEP", "TRANSIT Satellite Predicted Elevation"},
1173 {"TFI", "Trawl Filling Indicator"},
1174 {"TFR", "Transmit Feedback Report"},
1175 {"TGA", "TRANSIT Satellite Antenna & Geoidal Heights"},
1176 {"THS", "True Heading and Status"},
1177 {"TIF", "TRANSIT Satellite Initial Flag"},
1178 {"TLB", "Target Label"},
1179 {"TLL", "Target Latitude and Longitude"},
1180 {"TPC", "Trawl Position Cartesian Coordinates"},
1181 {"TPR", "Trawl Position Relative Vessel"},
1182 {"TPT", "Trawl Position True"},
1183 {"TRC", "Thruster Control Data"},
1184 {"TRD", "Thruster Response Data"},
1185 {"TRF", "TRANSIT Fix Data"},
1186 {"TRP", "TRANSIT Satellite Predicted Direction of Rise"},
1187 {"TRS", "TRANSIT Satellite Operating Status"},
1188 {"TSA", "Transmit Slot Assignment"},
1189 {"TSP", "Transmit Slot Prohibit"},
1190 {"TSR", "Transmit Slot Prohibit - Status Report"},
1191 {"TTD", "Tracked Target Data"},
1192 {"TTM", "Tracked Target Message"},
1193 {"TUT", "Transmission of Multi-Language Text"},
1194 {"TXT", "Text Transmission"},
1195 {"UID", "User Identification Code Transmission"},
1196 {"VBW", "Dual Ground/Water Speed"},
1197 {"VCD", "Current at Selected Depth"},
1198 {"VDR", "Set and Drift"},
1199 {"VER", "Version"},
1200 {"VHW", "Water Speed and Heading"},
1201 {"VLW", "Distance Traveled through Water"},
1202 {"VPE", "Speed, Dead Reckoned Parallel to True Wind"},
1203 {"VPW", "Speed, Measured Parallel to Wind"},
1204 {"VSD", "UAIS Voyage Static Data"},
1205 {"VSI", "VDL Signal Information"},
1206 {"VTA", "Actual Track"},
1207 {"VTG", "Track made good and Ground speed"},
1208 {"VTI", "Intended Track"},
1209 {"VWE", "Wind Track Efficiency"},
1210 {"VWR", "Relative Wind Speed and Angle"},
1211 {"VWT", "True Wind Speed and Angle"},
1212 {"WAT", "Water Level Detection"},
1213 {"WCV", "Waypoint Closure Velocity"},
1214 {"WDC", "Distance to Waypoint - Great Circle"},
1215 {"WDR", "Distance to Waypoint - Rhumb Line"},
1216 {"WFM", "Route Following Mode"},
1217 {"WNC", "Distance - Waypoint to Waypoint"},
1218 {"WNR", "Waypoint-to-Waypoint Distance, Rhumb Line"},
1219 {"WPL", "Waypoint Location"},
1220 {"XDR", "Transducer Measurement"},
1221 {"XTE", "Cross-Track Error, Measured"},
1222 {"XTR", "Cross Track Error - Dead Reckoning"},
1223 {"YWP", "Water Propagation Speed"},
1224 {"YWS", "Water Profile"},
1225 {"ZAA", "Time, Elapsed/Estimated"},
1226 {"ZCD", "Timer"},
1227 {"ZDA", "Time & Date - UTC, day, month, year and local time zone"},
1228 {"ZDL", "Time and Distance to Variable Point"},
1229 {"ZEV", "Event Timer"},
1230 {"ZFO", "UTC & Time from origin Waypoint"},
1231 {"ZLZ", "Time of Day"},
1232 {"ZTG", "UTC & Time to Destination Waypoint"},
1233 {"ZZU", "Time, UTC"},
1234 {NULL((void*)0), NULL((void*)0)}};
1235
1236/* Proprietary Manufacturer Mnemonic Coder lookup table */
1237/* https://web.nmea.org/External/WCPages/WCWebContent/webcontentpage.aspx?ContentID=364 */
1238static const string_string manufacturer_vals[] = {
1239 {"3SN", "3-S Navigation"},
1240 {"AAB", "ASM Selective Addressed Message (Reserved for Future Use)"},
1241 {"AAR", "Asian American Resources"},
1242 {"ABB", "ASM Broadcast Message (Reserved for Future Use)"},
1243 {"ACE", "Auto-Comm Engineering Corporation"},
1244 {"ACR", "ACR Electronics, Inc."},
1245 {"ACS", "Arco Solar Inc."},
1246 {"ACT", "Advanced Control Technology"},
1247 {"ADI", "Aditel"},
1248 {"ADM", "ASM VHF Data-Link Message (Reserved for Future Use)"},
1249 {"ADN", "AD Navigation"},
1250 {"ADO", "ASM VHF Data-Link Own-Vessel Report (Reserved for Future Use"},
1251 {"AGB", "ASM Geographical Multicast Message (Reserved for Future Use"},
1252 {"AGI", "Airguide Instrument Co."},
1253 {"AGL", "Alert Group List (Reserved for Future Use)"},
1254 {"AHA", "Autohelm of America"},
1255 {"AIP", "AIPHONE Corporation"},
1256 {"ALD", "Alden Electronics, Inc."},
1257 {"AMB", "Ambarella, Inc. "},
1258 {"AMC", "AllTek Marine Electronics Corp."},
1259 {"AMI", "Advanced Marine Instrumentation, Ltd."},
1260 {"AMK", "ASM Addressed and Broadcast Message Acknowledgement (Reserved for Future Use)"},
1261 {"AMM", "Aquametro Oil & Marine"},
1262 {"AMR", "AMR Systems"},
1263 {"AMT", "Airmar Technology Corporation"},
1264 {"AND", "Andrew Corporation"},
1265 {"ANI", "Autonautic Instrumental Sl. (Spain)"},
1266 {"ANS", "Antenna Specialists"},
1267 {"ANX", "Analytyx Electronic Systems"},
1268 {"ANZ", "Anschutz of America"},
1269 {"AOB", "Aerobytes, Ltd."},
1270 {"APC", "Apelco Electronics & Navigation"},
1271 {"APN", "American Pioneer, Inc."},
1272 {"APO", "Automated Procedure Options (Reserved for Future Use)"},
1273 {"APW", "Pharos Marine Automatic Power"},
1274 {"APX", "Amperex, Inc."},
1275 {"AQC", "Aqua-Chem, Inc."},
1276 {"AQD", "AquaDynamics, Inc."},
1277 {"AQM", "Aqua Meter Instrument Corp."},
1278 {"ARL", "Active Research, Ltd."},
1279 {"ART", "Arlt Technologies, GmbH (Germany)"},
1280 {"ARV", "Arvento Mobile Systems"},
1281 {"ASH", "Ashtech"},
1282 {"ASP", "American Solar Power"},
1283 {"ATC", "Advanced C Technology, Ltd."},
1284 {"ATE", "Aetna Engineering"},
1285 {"ATM", "Atlantic Marketing Company"},
1286 {"ATR", "Airtron"},
1287 {"ATV", "Activation, Inc."},
1288 {"AUC", "Automated Procedure Control (Reserved for Future Use)"},
1289 {"AUP", "Automated Procedure Query (Reserved for Future Use)"},
1290 {"AUS", "Automated Procedure Status (Reserved for Future Use)"},
1291 {"AVN", "Advanced Navigation, Inc."},
1292 {"AWA", "Awa New Zealand, Ltd."},
1293 {"AXN", "Axiom Navigation, Inc."},
1294 {"BBG", "BBG, Inc."},
1295 {"BBL", "BBL Industries, Inc."},
1296 {"BBR", "BBR and Associates"},
1297 {"BDV", "Brisson Development, Inc."},
1298 {"BEC", "Boat Electric Corporation"},
1299 {"BFA", "Blueflow Americas"},
1300 {"BGG", "Bodensee Gravitymeter Geo-Systems (BGS)"},
1301 {"BGS", "Barringer Geoservice"},
1302 {"BGT", "Brookes and Gatehouse, Inc."},
1303 {"BHE", "BH Electronics"},
1304 {"BHR", "Bahr Technologies, Inc."},
1305 {"BLB", "Bay Laboratories"},
1306 {"BMC", "BMC"},
1307 {"BME", "Bartel Marine Electronics"},
1308 {"BMS", "Becker Marine Systems"},
1309 {"BMT", "Aventics GmbH (formerly Bosch Rexroth AG Marine Technique) (Germany)"},
1310 {"BNI", "Neil Brown Instrument Systems"},
1311 {"BNS", "Bowditch Navigation Systems"},
1312 {"BRM", "Mel Barr Company"},
1313 {"BRO", "Broadgate, Ltd."},
1314 {"BRY", "Byrd Industries"},
1315 {"BTH", "Benthos, Inc."},
1316 {"BTK", "Baltek Corporation"},
1317 {"BTS", "Boat Sentry, Inc."},
1318 {"BVE", "BV Engineering"},
1319 {"BXA", "Bendix-Avalex, Inc."},
1320 {"CAI", "Cambridge Aero Instruments"},
1321 {"CAT", "Catel"},
1322 {"CBN", "Cybernet Marine Products"},
1323 {"CCA", "Copal Corporation of America"},
1324 {"CCC", "Coastel Communications Company"},
1325 {"CCL", "Coastal Climate Company"},
1326 {"CCM", "Coastal Communications"},
1327 {"CDC", "Cordic Company"},
1328 {"CDI", "Chetco Digital Instruments"},
1329 {"CDL", "Teledyne CDL (CDLTD), Inc."},
1330 {"CDS", "Central Dimming Set (Reserved for Future Use)"},
1331 {"CEC", "Ceco Communications, Inc."},
1332 {"CEI", "Cambridge Engineering, Inc."},
1333 {"CFS", "Carlisle and Finch Company"},
1334 {"CHI", "Charles Industries, Ltd."},
1335 {"CIN", "Canadian Automotive Instruments"},
1336 {"CKM", "Cinkel Marine Electronics"},
1337 {"CLR", "Colorlight AB"},
1338 {"CMA", "Soc Nouvelle D'equip Calvados"},
1339 {"CMC", "Coe Manufacturing Company"},
1340 {"CME", "Cushman Electronics, Inc."},
1341 {"CML", "CML Microsystems PLC"},
1342 {"CMN", "ComNav Marine, Ltd."},
1343 {"CMP", "C-MAP, s.r.l. (Italy)"},
1344 {"CMS", "Coastal Marine Sales Company"},
1345 {"CMV", "Coursemaster USA, Inc."},
1346 {"CNI", "Continental Instruments"},
1347 {"CNS", "CNS Systems AB (Sweden)"},
1348 {"CNV", "Coastal Navigator"},
1349 {"CNX", "Cynex Manufacturing Company"},
1350 {"CPL", "Computrol, Inc."},
1351 {"CPN", "CompuNav"},
1352 {"CPS", "Columbus Positioning, Ltd."},
1353 {"CPT", "CPT, Inc."},
1354 {"CRE", "Crystal Electronics, Ltd."},
1355 {"CRO", "The Caro Group"},
1356 {"CRY", "Crystek Crystals Corporation"},
1357 {"CSI", "Communication Systems International"},
1358 {"CSM", "COMSAT Maritime Services"},
1359 {"CSR", "CSR Stockholm"},
1360 {"CSS", "CNS, Inc."},
1361 {"CST", "CAST, Inc."},
1362 {"CSV", "Combined Services"},
1363 {"CTA", "Current Alternatives"},
1364 {"CTB", "Cetec Benmar"},
1365 {"CTC", "Cell-Tech Communications"},
1366 {"CTE", "Castle Electronics"},
1367 {"CTL", "C-Tech, Ltd."},
1368 {"CTS", "C-Tech Systems"},
1369 {"CUL", "Cyclic Procedure List (Reserved for Future Use)"},
1370 {"CUS", "Customware"},
1371 {"CWD", "Cubic Western Data"},
1372 {"CWF", "Hamilton Jet"},
1373 {"CWV", "Celwave RF, Inc."},
1374 {"CYL", "Cyclic Procedure List (Reserved for Future Use)"},
1375 {"CYZ", "CYZ, Inc."},
1376 {"DAN", "Danelec Marine A/S (Denmark)"},
1377 {"DAS", "Dassault Sercel Navigation-Positioning"},
1378 {"DBM", "Deep Blue Marine"},
1379 {"DCC", "Dolphin Components Corporation"},
1380 {"DEB", "Debeg GmbH (Germany)"},
1381 {"DEC", "Decca Division, Litton Marine Systems BV"},
1382 {"DFI", "Defender Industries, Inc."},
1383 {"DGC", "Digicourse, Inc."},
1384 {"DGY", "Digital Yacht, Ltd."},
1385 {"DGP", "Digpilot A/S (Norway)"},
1386 {"DME", "Delorme"},
1387 {"DMI", "Datamarine International"},
1388 {"DNS", "Dornier System"},
1389 {"DNT", "Del Norte Technology, Inc."},
1390 {"DOI", "Digital Oceans, Inc."},
1391 {"DPC", "Data Panel Corporation"},
1392 {"DPS", "Danaplus, Inc."},
1393 {"DRL", "RL Drake Company"},
1394 {"DSC", "Dynascan Corporation"},
1395 {"DTN", "Dytechna, Ltd."},
1396 {"DYN", "Dynamote Corporation"},
1397 {"DYT", "Dytek Laboratories, Inc."},
1398 {"EAN", "EuroAvionics Navigation Systems GmbH (Germany)"},
1399 {"EBC", "Emergency Beacon Corporation"},
1400 {"ECI", "Enhanced Selective Calling Information (Reserved for Future Use)"},
1401 {"ECR", "Escort, Inc."},
1402 {"ECT", "Echotec, Inc."},
1403 {"EDO", "EDO Corporation, Electroacoustics Division"},
1404 {"EEL", "Electronica Eutimio Sl. (Spain)"},
1405 {"EEV", "EEV, Inc."},
1406 {"EFC", "Efcom Communication Systems"},
1407 {"EKC", "Eastman Kodak"},
1408 {"ELA", "Wartsila Elac Nautik GmbH (Germany)"},
1409 {"ELD", "Electronic Devices, Inc."},
1410 {"ELM", "ELMAN, s.r.l. (Italy)"},
1411 {"EMC", "Electric Motion Company"},
1412 {"EMK", "E-Marine Company, Ltd."},
1413 {"EMR", "EMRI A/S (Denmark)"},
1414 {"EMS", "Electro Marine Systems, Inc."},
1415 {"ENA", "Energy Analysts, Inc."},
1416 {"ENC", "Encron, Inc."},
1417 {"EPM", "EPSCO Marine"},
1418 {"EPT", "Eastprint, Inc."},
1419 {"ERC", "The Ericsson Corporation"},
1420 {"ERD", "eRide, Inc."},
1421 {"ESA", "European Space Agency"},
1422 {"ESC", "Electronics Emporium Division of ESC Products"},
1423 {"ESY", "E-Systems ECI Division"},
1424 {"FDN", "FluiDyne"},
1425 {"FEC", "Furuno Electric Company"},
1426 {"FHE", "Fish Hawk Electronics"},
1427 {"FJN", "Jon Fluke Company"},
1428 {"FLA", "Flarm Technology GmbH (Germany)"},
1429 {"FLO", "Floscan, Inc."},
1430 {"FMM", "First Mate Marine Autopilots"},
1431 {"FMS", "Fugro Seastar A/S (MarineStar)"},
1432 {"FNT", "Franklin Net and Twine, Ltd."},
1433 {"FRC", "The Fredericks Company"},
1434 {"FSS", "Frequency Selection (Reserved for Future Use)"},
1435 {"FST", "Fastrax OY (Switzerland)"},
1436 {"FTG", "Thomas G Faria Corporation"},
1437 {"FTT", "FT-TEC"},
1438 {"FUG", "Fugro Intersite BV (Netherlands)"},
1439 {"FUJ", "Fujitsu Ten Corporation of America"},
1440 {"FUR", "Furuno USA, Inc."},
1441 {"FWG", "Forschungsbereich Wasserchall and Geophysik WTD 71 (German Armed Forces Research Institute) (Germany)"},
1442 {"GAM", "GRE America, Inc."},
1443 {"GCA", "Gulf Cellular Associates"},
1444 {"GDC", "GNSS Differential Correction (Reserved for Future Use)"},
1445 {"GEC", "GEC Plessey Semiconductors"},
1446 {"GES", "Geostar Corporation"},
1447 {"GFC", "Graphic Controls Corporation"},
1448 {"GFV", "GFV Marine, Ltd."},
1449 {"GIL", "Gill Instruments Limited"},
1450 {"GIS", "Galax Integrated Systems"},
1451 {"GNV", "Geonav International"},
1452 {"GPI", "Global Positioning Instrument Corporation"},
1453 {"GPP", "GEO++ GmbH (Germany)"},
1454 {"GPR", "Global Positioning System Joint Program Office (Rockwell Collins)"},
1455 {"GRF", "Grafinta (Spain)"},
1456 {"GRM", "Garmin Corporation"},
1457 {"GSC", "Gold Star Company, Ltd."},
1458 {"GTI", "Genesis Technology International, Ltd."},
1459 {"GTO", "GRO Electronics"},
1460 {"GVE", "Guest Corporation"},
1461 {"GVT", "Great Valley Technology"},
1462 {"HAI", "Hydragraphic Associates, Ltd."},
1463 {"HAL", "HAL Communications Corporation"},
1464 {"HAR", "Harris Corporation"},
1465 {"HHS", "Hydel Hellas Skaltsaris, Ltd. (Shanghai)"},
1466 {"HIG", "Hy-Gain"},
1467 {"HIL", "Philips Navigation A/S (Denmark)"},
1468 {"HIT", "Hi-Tec"},
1469 {"HMS", "Hyde Marine Systems, Inc."},
1470 {"HOM", "Hoppe Marine GmbH (Germany)"},
1471 {"HPK", "Hewlett-Packard"},
1472 {"HRC", "Harco Manufacturing Company"},
1473 {"HRM", "[Unnamed]"},
1474 {"HRT", "Hart Systems, Inc."},
1475 {"HTI", "Heart Interface, Inc."},
1476 {"HUL", "Hull Electronics Company"},
1477 {"HWM", "Honeywell Marine Systems"},
1478 {"IBM", "IBM Microelectronics"},
1479 {"ICO", "Icom of America, Inc."},
1480 {"ICG", "Initiative Computing USA, Inc. / Initiative Computing AG"},
1481 {"IDS", "ICAN Marine (Canada)"},
1482 {"IFD", "International Fishing Devices"},
1483 {"IFI", "Instruments for Industry"},
1484 {"ILS", "Ideal Teknoloji Bilisim Cozumleri A/S (Turkey)"},
1485 {"IME", "Imperial Marine Equipment"},
1486 {"IMI", "International Marine Instruments"},
1487 {"IMM", "ITT Mackay Marine"},
1488 {"IMP", "Impulse Manufacturing, Inc."},
1489 {"IMR", "Ideal Technologies, Inc."},
1490 {"IMT", "International Marketing and Trading, Inc."},
1491 {"INM", "Inmar Electronics and Sales"},
1492 {"INT", "Intech, Inc."},
1493 {"IRT", "Intera Technologies, Ltd."},
1494 {"IST", "Innerspace Technology, Inc."},
1495 {"ITM", "Intermarine Electronics, Inc."},
1496 {"ITR", "Itera, Ltd."},
1497 {"IWW", "Inland Waterways (Germany)"},
1498 {"IXB", "iXblue"},
1499 {"JAN", "Jan Crystals"},
1500 {"JAS", "Jasco Research, Ltd."},
1501 {"JFR", "Ray Jefferson"},
1502 {"JLD", "Jargoon Limited"},
1503 {"JMT", "Japan Marine Telecommunications"},
1504 {"JPI", "JP Instruments"},
1505 {"JRC", "Japan Radio Company, Ltd."},
1506 {"JRI", "J-R Industries, Inc."},
1507 {"JTC", "J-Tech Associates, Inc."},
1508 {"JTR", "Jotron Radiosearch, Ltd."},
1509 {"KBE", "KB Electronics, Ltd."},
1510 {"KBM", "Kennebec Marine Company"},
1511 {"KEL", "Knudsen Engineering, Ltd."},
1512 {"KHU", "Kelvin Hughes, Ltd."},
1513 {"KLA", "Klein Associates, Inc."},
1514 {"KME", "Kyushu Matsushita Electric"},
1515 {"KML", "Kongsberg Mesotech, Ltd. (Canada)"},
1516 {"KMO", "Kongsberg Maritime A/S (Norway)"},
1517 {"KMR", "King Marine Radio Corporation"},
1518 {"KMS", "Kongsberg Maritime Subsea (Norway)"},
1519 {"KNC", "Kongsberg Norcontrols (Norway)"},
1520 {"KNG", "King Radio Corporation"},
1521 {"KOD", "Koden Electronics Company, Ltd."},
1522 {"KRA", "EDV Krajka (Germany)"},
1523 {"KRP", "Krupp International, Inc."},
1524 {"KST", "Kongsberg Seatex A/S (Norway)"},
1525 {"KVH", "KVH Company"},
1526 {"KYI", "Kyocera International, Inc."},
1527 {"L3A", "L3 Communications Recorders Division"},
1528 {"LAT", "Latitude Corporation"},
1529 {"L3I", "L-3 Interstate Electronics Corporation"},
1530 {"LCI", "Lasercraft, Inc."},
1531 {"LEC", "Lorain Electronics Corporation"},
1532 {"LEI", "Leica Geosystems Pty, Ltd."},
1533 {"LIT", "Litton Laser Systems"},
1534 {"LMM", "Lamarche Manufacturing Company"},
1535 {"LRD", "Lorad"},
1536 {"LSE", "Littlemore Scientific (ELSEC) Engineering"},
1537 {"LSP", "Laser Plot, Inc."},
1538 {"LST", "Lite Systems Engineering"},
1539 {"LTH", "Lars Thrane A/S (Denmark)"},
1540 {"LTF", "Littlefuse, Inc."},
1541 {"LTI", "Laser Technology, Inc."},
1542 {"LWR", "Lowrance Electronics Corporation"},
1543 {"MCA", "Canadian Marconi Company"},
1544 {"MCI", "Matsushita Communications (Japan)"},
1545 {"MCL", "Micrologic, Inc."},
1546 {"MDL", "Medallion Instruments, Inc."},
1547 {"MDS", "Marine Data Systems"},
1548 {"MEC", "Marine Engine Center, Inc."},
1549 {"MEG", "Maritec Engineering GmbH (Germany)"},
1550 {"MES", "Marine Electronics Services, Inc."},
1551 {"MEW", "Matsushita Electric Works (Japan)"},
1552 {"MFR", "Modern Products, Ltd."},
1553 {"MFW", "Frank W. Murphy Manufacturing"},
1554 {"MGN", "Magellen Systems Corporation"},
1555 {"MGS", "MG Electronic Sales Corporation"},
1556 {"MIE", "Mieco, Inc."},
1557 {"MIK", "Mikrolab GmbH (Germany)"},
1558 {"MIR", "Miros A/S (Norway)"},
1559 {"MIM", "Marconi International Marine"},
1560 {"MLE", "Martha Lake Electronics"},
1561 {"MLN", "Matlin Company"},
1562 {"MLP", "Marlin Products"},
1563 {"MLT", "Miller Technologies"},
1564 {"MMB", "Marsh-McBirney, Inc."},
1565 {"MME", "Marks Marine Engineering"},
1566 {"MMI", "Microwave Monolithics"},
1567 {"MMM", "Madman Marine"},
1568 {"MMP", "Metal Marine Pilot, Inc."},
1569 {"MMS", "Mars Marine Systems"},
1570 {"MMT", "Micro Modular Technologies"},
1571 {"MNI", "Micro-Now Instrument Company"},
1572 {"MNT", "Marine Technology"},
1573 {"MNX", "Marinex"},
1574 {"MOT", "Motorola Communications & Electronics"},
1575 {"MPI", "Megapulse, Inc."},
1576 {"MPN", "Memphis Net and Twine Company, Inc."},
1577 {"MQS", "Marquis Industries, Inc."},
1578 {"MRC", "Marinecomp, Inc."},
1579 {"MRE", "Morad Electronics Corporation"},
1580 {"MRP", "Mooring Products of New England"},
1581 {"MRR", "II Morrow, Inc."},
1582 {"MRS", "Marine Radio Service"},
1583 {"MSB", "Mitsubishi Electric Company, Ltd."},
1584 {"MSE", "Master Electronics"},
1585 {"MSF", "Microsoft Corporation"},
1586 {"MSM", "Master Mariner, Inc."},
1587 {"MST", "Mesotech Systems, Ltd."},
1588 {"MTA", "Marine Technical Associates"},
1589 {"MTD", "Maritel Data Services"},
1590 {"MTG", "Marine Technical Assistance Group"},
1591 {"MTI", "Mobile Telesystems, Inc."},
1592 {"MTK", "Martech, Inc."},
1593 {"MTL", "Marine Technologies, LLC"},
1594 {"MTR", "The MITRE Corporation"},
1595 {"MTS", "Mets, Inc."},
1596 {"MUR", "Murata Erie North America"},
1597 {"MVX", "Magnavox Advanced Products and Systems Company"},
1598 {"MXS", "Maxsea International"},
1599 {"MXX", "Maxxima Marine"},
1600 {"MYS", "Marine Electronics Company (South Korea)"},
1601 {"NAG", "Noris Automation GmbH (Germany)"},
1602 {"NAT", "Nautech, Ltd."},
1603 {"NAU", "Nauticast (a.k.a. Nauticall)"},
1604 {"NAV", "Navtec, Inc."},
1605 {"NCG", "Navcert, GmbH (Germany)"},
1606 {"NCT", "Navcom Technology, Inc."},
1607 {"NEC", "NEC Corporation"},
1608 {"NEF", "New England Fishing Gear"},
1609 {"NGC", "Northrop Grumman Maritime Systems"},
1610 {"NGS", "Navigation Sciences, Inc."},
1611 {"NIX", "L-3 Nautronix"},
1612 {"NLS", "Navigation Light Status (Reserved for Future Use)"},
1613 {"NMR", "Newmar"},
1614 {"NMX", "Nanometrics"},
1615 {"NOM", "Nav-Com, Inc."},
1616 {"NOR", "Nortech Surveys (Canada)"},
1617 {"NOS", "Northern Solutions A/S (Norway)"},
1618 {"NOV", "NovAtel Communications, Ltd."},
1619 {"NSI", "Noregon Systems, Inc."},
1620 {"NSL", "Navitron Systems, Ltd."},
1621 {"NSM", "Northstar Marine"},
1622 {"NTI", "Northstar Technologies, Inc."},
1623 {"NTK", "Novatech Designs, Ltd."},
1624 {"NTS", "Navtech Systems"},
1625 {"NUT", "Nautitech Pty, Ltd."},
1626 {"NVC", "Navico"},
1627 {"NVG", "NVS Technologies AG (Switzerland)"},
1628 {"NVL", "Navelec Marine Systems Sl. (Spain)"},
1629 {"NVO", "Navionics, s.p.a. (Italy)"},
1630 {"NVS", "Navstar"},
1631 {"NVT", "Novariant, Inc."},
1632 {"NWC", "Naval Warfare Center"},
1633 {"OAR", "On-Line Applications Research (OAR) Corporation"},
1634 {"OBS", "Observator Instruments"},
1635 {"OCC", "Occupation Control (Reserved for Future Use)"},
1636 {"ODE", "Ocean Data Equipment Corporation"},
1637 {"ODN", "Odin Electronics, Inc."},
1638 {"OHB", "OHB Systems"},
1639 {"OIN", "Ocean Instruments, Inc."},
1640 {"OKI", "Oki Electric Industry Company, Ltd."},
1641 {"OLY", "Navstard, Ltd. (Polytechnic Electronics)"},
1642 {"OMN", "Omnetics Corporation"},
1643 {"OMT", "Omnitech A/S (Norway)"},
1644 {"ONI", "Omskiy Nauchno Issledovatelskiy Institut Priborostroeniya (Russia)"},
1645 {"ORB", "Orbcomm"},
1646 {"ORE", "Ocean Research"},
1647 {"OSG", "Ocean Signal, Ltd."},
1648 {"OSI", "OSI Maritime Systems (was Offshore Systems International)"},
1649 {"OSL", "OSI Maritime Systems (was Offshore Systems, Ltd.)"},
1650 {"OSS", "Ocean Solution Systems"},
1651 {"OTK", "Ocean Technology"},
1652 {"PCE", "Pace"},
1653 {"PCM", "P-Sea Marine Systems"},
1654 {"PDC", "Pan Delta Controls, Ltd."},
1655 {"PDM", "Prodelco Marine Systems"},
1656 {"PLA", "Plath C Division of Litton Industries"},
1657 {"PLI", "Pilot Instruments"},
1658 {"PMI", "Pernicka Marine Instruments"},
1659 {"PMP", "Pacific Marine Products"},
1660 {"PNI", "PNI Sensors, Inc."},
1661 {"PNL", "Points North, Ltd."},
1662 {"POM", "POMS Engineering"},
1663 {"PPL", "Pamarine Private, Ltd."},
1664 {"PRK", "Perko, Inc."},
1665 {"PSM", "Pearce-Simpson, Inc."},
1666 {"PST", "Pointstar A/S (Denmark)"},
1667 {"PTC", "Petro-Com"},
1668 {"PTG", "PTI/Guest"},
1669 {"PTH", "Pathcom, Inc."},
1670 {"PVS", "Planevision Systems"},
1671 {"QNQ", "QinetiQ (United Kingdom)"},
1672 {"QRC", "QinetiQ (United Kingdom)"},
1673 {"QWE", "Qwerty Elektronik AB (Sweden)"},
1674 {"QZM", "[Unnamed]"},
1675 {"Q2N", "QQN Navigation ABS"},
1676 {"RAC", "Racal Marine, Inc."},
1677 {"RAE", "RCA Astro-Electronics"},
1678 {"RAF", "Robins Air Force (USAF)"},
1679 {"RAK", "Rockson Automation Kiel"},
1680 {"RAY", "Raytheon Marine Company"},
1681 {"RCA", "RCA Service Company"},
1682 {"RCH", "Roach Engineering"},
1683 {"RCI", "Rochester Instruments, Inc."},
1684 {"RCQ", "QinetiQ (United Kingdom)"},
1685 {"RDC", "U.S. Coast Guard Research & Development Center"},
1686 {"RDI", "Radar Devices"},
1687 {"RDM", "Ray-Dar Manufacturing Company"},
1688 {"REC", "Ross Engineering Company"},
1689 {"RFP", "Rolfite Products, Inc."},
1690 {"RGC", "RCA Global Communications"},
1691 {"RGL", "Riegl Laser Measurement Systems"},
1692 {"RGY", "Regency Electronics, Inc."},
1693 {"RHO", "Rhotheta Elektronik GmbH (Germany)"},
1694 {"RHM", "RH Marine"},
1695 {"RLK", "Reelektronika NL (Netherlands)"},
1696 {"RME", "Racal Marine Electronics"},
1697 {"RMR", "RCA Missile and Radar"},
1698 {"RSL", "Ross Laboratories, Inc."},
1699 {"RSM", "Robertson-Shipmate USA"},
1700 {"RTH", "Parthus"},
1701 {"RTN", "Robertson Tritech Nyaskaien (Norway)"},
1702 {"RWC", "Rockwell Collins"},
1703 {"RWI", "Rockwell International"},
1704 {"SAA", "Satronika Sl. (Spain)"},
1705 {"SAB", "VDE Satellite Selective Addressed Binary and Safety Related Message (Reserved for Future Use)"},
1706 {"SAE", "STN Atlas Elektronik GmbH (Germany)"},
1707 {"SAF", "Safemine"},
1708 {"SAI", "SAIT, Inc."},
1709 {"SAJ", "SAJ Instrument AB (Finland)"},
1710 {"SAM", "SAM Electronics GmbH (Germany)"},
1711 {"SAL", "Consilium Marine AB (Sweden)"},
1712 {"SAP", "Systems Engineering & Assessment, Ltd."},
1713 {"SAT", "Satloc"},
1714 {"SBB", "VDE Satellite Broadcast Binary Message (Reserved for Future Use)"},
1715 {"SBG", "SBG Systems"},
1716 {"SBR", "Sea-Bird Electronics, Inc."},
1717 {"SCL", "Sokkia Company, Ltd."},
1718 {"SCM", "Scandinavian Microsystems A/S (Norway)"},
1719 {"SCO", "Simoco Telecommunications, Ltd."},
1720 {"SCR", "Signalcrafters, Inc."},
1721 {"SDM", "VDE Satellite VHF Data-Link Message (Reserved for Future Use)"},
1722 {"SDN", "Sapien Design"},
1723 {"SDO", "VDE Satellite VHF Data-Link Own-Vessel Report (Reserved for Future Use)"},
1724 {"SEA", "Sea, Inc."},
1725 {"SEC", "Sercel Electronics of Canada"},
1726 {"SEE", "Seetrac (a.k.a. Global Marine Tracking)"},
1727 {"SEL", "Selection Report (Reserved for Future Use)"},
1728 {"SEM", "Semtech, Ltd."},
1729 {"SEP", "Steel and Engine Products"},
1730 {"SER", "Sercel France"},
1731 {"SFN", "Seafarer Navigation International"},
1732 {"SGB", "VDE Satellite Geographical Addressed Binary and Safety Message (Reserved for Future Use)"},
1733 {"SGC", "SGC, Inc."},
1734 {"SGN", "Signav"},
1735 {"SHI", "Shine Micro, Inc."},
1736 {"SIG", "Signet, Inc."},
1737 {"SIM", "Simrad, Inc."},
1738 {"SKA", "Skantek Corporation"},
1739 {"SKP", "Skipper Electronics A/S (Norway)"},
1740 {"SLI", "Starlink, Inc."},
1741 {"SLM", "Steering Location Mode (Reserved for Future Use)"},
1742 {"SMC", "Solis Marine Consultants"},
1743 {"SMD", "ShipModul Customware (Netherlands)"},
1744 {"SME", "Shakespeare Marine Electronics"},
1745 {"SMF", "Seattle Marine and Fishing Supply Company"},
1746 {"SMI", "Sperry Marine, Inc."},
1747 {"SMK", "VDE Satellite Addressed and Broadcast Message Acknowledgement (Reserved for Future Use)"},
1748 {"SML", "Simerl Instruments"},
1749 {"SMT", "SRT Marine Technology, Ltd. (United Kingdom)"},
1750 {"SMV", "SafetyNet Message Vessel (Reserved for Future Use)"},
1751 {"SNP", "Science Applications International Corporation"},
1752 {"SNV", "STARNAV Corporation (Canada)"},
1753 {"SNY", "Sony Corporation - Mobile Electronics"},
1754 {"SOM", "Sound Marine Electronics"},
1755 {"SON", "Sonardyne International, Ltd. (United Kingdom)"},
1756 {"SOV", "Sell Overseas America"},
1757 {"SPL", "Spelmar"},
1758 {"SPT", "Sound Powered Telephone"},
1759 {"SRC", "Stellar Research Group"},
1760 {"SRD", "SRD Labs"},
1761 {"SRF", "SIRF Technology, Inc."},
1762 {"SRP", "System Function ID Resolution Protocol (Reserved for Future Use)"},
1763 {"SRS", "Scientific Radio Systems, Inc."},
1764 {"SRT", "Standard Radio and Telefon AB (Sweden)"},
1765 {"SRV", "(Reserved for Future Use)"},
1766 {"SSA", "(Reserved for Future Use)"},
1767 {"SSC", "Swedish Space Corporation"},
1768 {"SSD", "Saab AB, Security & Defense Solutions, Command and Control Systems Division (Sweden)"},
1769 {"SSE", "Seven Star Electronics"},
1770 {"SSI", "Sea Scout Industries"},
1771 {"SSN", "Septentrio"},
1772 {"STC", "Standard Communications"},
1773 {"STI", "Sea-Temp Instrument Corporation"},
1774 {"STK", "Seatechnik, Ltd. (a.k.a. Trelleborg Marine Systems) (United Kingdom)"},
1775 {"STL", "Streamline Technology, Ltd."},
1776 {"STM", "SI-TEX Marine Electronics"},
1777 {"STO", "Stowe Marine Electronics"},
1778 {"STT", "Saab TransponderTech AB (Sweden)"},
1779 {"SVY", "Savoy Electronics"},
1780 {"SWI", "Swoffer Marine Instruments"},
1781 {"SWT", "Swift Navigation, Inc."},
1782 {"SYE", "Samyung ENC Company, Ltd. (South Korea)"},
1783 {"SYN", "Synergy Systems, LLC"},
1784 {"TAB", "VDE Terrestrial Selective Addressed Binary and Safety Related Message (Reserved for Future Use)"},
1785 {"TBB", "Thompson Brothers Boat Manufacturing"},
1786 {"TBM", "VDE Terrestrial Broadcast Binary Message (Reserved for Future Use)"},
1787 {"TCN", "Trade Commission of Norway"},
1788 {"TDI", "Teledyne RD Instruments, Inc."},
1789 {"TDL", "Tideland Signal"},
1790 {"TDM", "VDE Terrestrial VHF Data-Link Message (Reserved for Future Use)"},
1791 {"TDO", "VDE Terrestrial VHF Data-Link Own-Vessel Report (Reserved for Future Use)"},
1792 {"TEL", "Plessey Tellumat (South Africa)"},
1793 {"TES", "Thales Electronic Systems GmbH (Germany)"},
1794 {"TGB", "VDE Terrestrial Geographical Addressed Binary and Safety Message (Reserved for Future Use)"},
1795 {"THR", "Thrane and Thrane A/A (Denmark)"},
1796 {"TKI", "Tokyo Keiki, Inc. (Japan)"},
1797 {"TLS", "Telesystems"},
1798 {"TMK", "VDE Terrestrial Addressed and Broadcast Message Acknowledgement (Reserved for Future Use)"},
1799 {"TMS", "Trelleborg Marine Systems"},
1800 {"TMT", "Tamtech, Ltd."},
1801 {"TNL", "Trimble Navigation, Inc."},
1802 {"TOP", "Topcon Positioning Systems, Inc."},
1803 {"TPL", "Totem Plus, Ltd."},
1804 {"TRC", "Tracor, Inc."},
1805 {"TRS", "Travroute Software"},
1806 {"TSG", "(Reserved for Future Use)"},
1807 {"TSI", "Techsonic Industries, Inc."},
1808 {"TSS", "Teledyne TSS, Ltd. (United Kingdom)"},
1809 {"TTK", "Talon Technology Corporation"},
1810 {"TTS", "Transtector Systems, Inc."},
1811 {"TYC", "Vincotech GmbH (formerly Tyco Electronics) (Germany)"},
1812 {"TWC", "Transworld Communications"},
1813 {"TWS", "Telit Location Solutions, a Division of Telit Wireless Solutions"},
1814 {"TXI", "Texas Instruments, Inc."},
1815 {"UBX", "u-blox AG (Switzerland)"},
1816 {"UCG", "United States Coast Guard"},
1817 {"UEL", "Ultra Electronics, Ltd."},
1818 {"UME", "UMEC"},
1819 {"UNF", "Uniforce Electronics Company"},
1820 {"UNI", "Uniden Corporation of America"},
1821 {"UNP", "Unipas, Inc."},
1822 {"URS", "UrsaNav, Inc."},
1823 {"VAN", "Vanner, Inc."},
1824 {"VAR", "Varian Eimac Associates"},
1825 {"VBC", "Docking Speed Log (Reserved for Future Use)"},
1826 {"VCM", "Videocom"},
1827 {"VDB", "Bertold Vandenbergh"},
1828 {"VEA", "Vard Electro A/S (Norway)"},
1829 {"VEC", "Vectron International"},
1830 {"VEX", "Vexilar"},
1831 {"VIS", "Vessel Information Systems"},
1832 {"VMR", "Vast Marketing Corporation"},
1833 {"VSP", "Vesper Marine"},
1834 {"VXS", "Vertex Standard"},
1835 {"WAL", "Walport USA"},
1836 {"WBE", "Wamblee, s.r.l. (Italy)"},
1837 {"WBG", "Westberg Manufacturing"},
1838 {"WBR", "Wesbar Corporation"},
1839 {"WEC", "Westinghouse Electric Corporation"},
1840 {"WEI", "Weidmueller Interface GmbH (Germany)"},
1841 {"WCI", "Wi-Sys Communications"},
1842 {"WDC", "Weatherdock Corporation"},
1843 {"WHA", "W-H Autopilots, Inc."},
1844 {"WMM", "Wait Manufacturing and Marine Sales Company"},
1845 {"WMR", "Wesmar Electronics"},
1846 {"WNG", "Winegard Company"},
1847 {"WOE", "Woosung Engineering Company, Ltd. (South Korea)"},
1848 {"WSE", "Wilson Electronics Corporation"},
1849 {"WST", "West Electronics, Ltd."},
1850 {"WTC", "Watercom"},
1851 {"XEL", "3XEL Electronics and Navigation Systems, s.r.l. (Italy)"},
1852 {"YAS", "Yaesu Electronics (Japan)"},
1853 {"YDK", "Yokogawa Denshikiki Company, Ltd. (Japan)"},
1854 {"YSH", "Standard Horizon Yaesu"},
1855 {"ZNS", "Zinnos, Inc. (South Korea)"},
1856 {NULL((void*)0), NULL((void*)0)}};
1857
1858// List of GPS Quality Indicator (Source: NMEA Revealed by Eric S. Raymond, https://gpsd.gitlab.io/gpsd/NMEA.html, retrieved 2023-01-26)
1859static const string_string known_gps_quality_indicators[] = {
1860 {"0", "Fix not available"},
1861 {"1", "GPS fix"},
1862 {"2", "Differential GPS fix"},
1863 {"3", "PPS fix"},
1864 {"4", "Real Time Kinematic"},
1865 {"5", "Float Real Time Kinematic"},
1866 {"6", "Estimated (dead reckoning)"},
1867 {"7", "Manual input mode"},
1868 {"8", "Simulation mode"},
1869 {NULL((void*)0), NULL((void*)0)}};
1870
1871// List of status indicators (Source: NMEA Revealed by Eric S. Raymond, https://gpsd.gitlab.io/gpsd/NMEA.html, retrieved 2024-04-19)
1872static const string_string known_status_indicators[] = {
1873 {"A", "Valid/Active"},
1874 {"V", "Invalid/Void"},
1875 {NULL((void*)0), NULL((void*)0)}};
1876
1877// List of FAA Mode Indicator (Source: NMEA Revealed by Eric S. Raymond, https://gpsd.gitlab.io/gpsd/NMEA.html, retrieved 2024-04-19)
1878static const string_string known_faa_mode_indicators[] = {
1879 {"A", "Autonomous mode"},
1880 {"C", "Quectel Querk, Caution"},
1881 {"D", "Differential Mode"},
1882 {"E", "Estimated (dead-reckoning) mode"},
1883 {"F", "RTK Float mode"},
1884 {"M", "Manual Input Mode"},
1885 {"N", "Data Not Valid"},
1886 {"P", "Precise"},
1887 {"R", "RTK Integer mode"},
1888 {"S", "Simulated Mode"},
1889 {"U", "Quectel Querk, Unsafe"},
1890 {NULL((void*)0), NULL((void*)0)}};
1891
1892static const value_string abk_ack_type[] = {
1893 {'0', "Message (6 or 12) successfully received by addressed AIS unit"},
1894 {'1', "Message (6 or 12) was broadcast, but no acknowledgement by addressed AIS unit"},
1895 {'2', "Message could not be broadcast (i.e., quantity of encapsulated data exceeds five slots)"},
1896 {'3', "Requested broadcast of message (8, 14, or 15) has been successfully completed"},
1897 {'4', "Late reception of a message 7 or 13 acknowledgement that was addressed to this AIS unit (own-ship) and referenced a valid transaction"},
1898 {0, NULL((void*)0)}};
1899
1900static const value_string abk_channel[] = {
1901 {'A', "Channel A"},
1902 {'B', "Channel B"},
1903 {0, NULL((void*)0)}};
1904
1905static const value_string aca_chbw[] = {
1906 {'0', "Bandwidth specified by channel number (see ITU-R M.1084, Annex 4)"},
1907 {'1', "Bandwidth is 12.5 kHz"},
1908 {0, NULL((void*)0)}};
1909
1910static const value_string aca_in_use[] = {
1911 {'0', "Not in use"},
1912 {'1', "In use"},
1913 {0, NULL((void*)0)}};
1914
1915static const value_string aca_info_src[] = {
1916 {'A', "ITU-R M.1371 Message 22: Channel Management addressed message"},
1917 {'B', "ITU-R M.1371 Message 22: Channel Management broadcast geographical area message"},
1918 {'C', "IEC 61162-1 AIS Channel Assignment sentence"},
1919 {'D', "DSC Channel 70 Telecommand"},
1920 {'M', "Operator Manual Input"},
1921 {0, NULL((void*)0)}};
1922
1923static const value_string aca_power[] = {
1924 {'0', "High Power"},
1925 {'1', "Low Power"},
1926 {0, NULL((void*)0)}};
1927
1928static const value_string aca_txrx_control[] = {
1929 {'0', "Transmit on Channels A and B, Receive on Channels A and B"},
1930 {'1', "Transmit on Channel A, Receive on Channels A and B"},
1931 {'2', "Transmit on Channel B, Receive on Channels A and B"},
1932 {'3', "Do not transmit, Receive on Channels A and B"},
1933 {'4', "Do not transmit, Receive on Channel A"},
1934 {'5', "Do not transmit, Receive on Channel B"},
1935 {0, NULL((void*)0)}};
1936
1937static const value_string alarm_ack_state_vals[] = {
1938 {'A', "Acknowledged"},
1939 {'V', "Not Acknowledged"},
1940 {'B', "Broadcast (Acknowledgement not applicable)"},
1941 {'H', "Harbour Mode"},
1942 {'O', "Override"},
1943 {0, NULL((void*)0)}};
1944
1945static const value_string alarm_cond_state_vals[] = {
1946 {'N', "Normal State"},
1947 {'H', "Alarm State: Threshold Exceeded"},
1948 {'J', "Alarm State: Extreme Threshold Exceeded"},
1949 {'L', "Alarm State: Low Threshold Exceeded"},
1950 {'K', "Alarm State: Extreme Low Threshold Exceeded (i.e., not reached)"},
1951 {'X', "Other"},
1952 {0, NULL((void*)0)}};
1953
1954static const value_string arrival_circle_status[] = {
1955 {'A', "Arrival circle entered"},
1956 {'V', "Arrival circle not entered"},
1957 {0, NULL((void*)0)}};
1958
1959static const value_string auto_manual_vals[] = {
1960 {'M', "Manual"},
1961 {'A', "Automatic"},
1962 {0, NULL((void*)0)}};
1963
1964static const value_string control_flag_vals[] = {
1965 {'0', "AIS unit responds if AIS unit is within geographic rectangle provided and AIS unit hasn't responded to requesting MMSI within last 24 hours and MMSI destination field is NULL"},
1966 {'1', "AIS unit responds if AIS unit is within geographic rectangle provided"},
1967 {0, NULL((void*)0)}};
1968
1969static const value_string course_ref_vals[] = {
1970 {'B', "Bottom tracking log"},
1971 {'M', "Manually entered"},
1972 {'W', "Water referenced"},
1973 {'R', "Radar tracking (of fixed target)"},
1974 {'P', "Positioning system ground reference"},
1975 {0, NULL((void*)0)}};
1976
1977static const value_string data_status[] = {
1978 {'A', "Data valid"},
1979 {'V', "Data not valid"},
1980 {0, NULL((void*)0)}};
1981
1982static const string_string datum_vals[] = {
1983 {"W84", "WGS84"},
1984 {"W72", "WGS72"},
1985 {"S85", "SGS85"},
1986 {"P90", "PE90"},
1987 {"999", "User Defined"},
1988 {NULL((void*)0), NULL((void*)0)}
1989};
1990
1991static const value_string dcn_data_basis[] = {
1992 {'1', "Normal pattern"},
1993 {'2', "Lane identification pattern"},
1994 {'3', "Lane identification transmissions"},
1995 {0, NULL((void*)0)}};
1996
1997static const value_string dimming_palette_preset_vals[] = {
1998 {'D', "Daytime"},
1999 {'K', "Dusk"},
2000 {'N', "Nighttime"},
2001 {'O', "Backlighting Off"},
2002 {0, NULL((void*)0)}};
2003
2004static const value_string direction_reference[] = {
2005 {'T', "True"},
2006 {'R', "Relative"},
2007 {0, NULL((void*)0)}};
2008
2009static const value_string display_rotation_vals[] = {
2010 {'C', "Course-up, course-over-ground up, degrees True"},
2011 {'H', "Head-up, ship's heading (centerline) 0 degrees up"},
2012 {'N', "North-up, True North is 0 degrees up"},
2013 {0, NULL((void*)0)}};
2014
2015static const value_string dma_setup_vals[] = {
2016 {'0', "FATDMA"},
2017 {'1', "RATDMA"},
2018 {'2', "CSTDMA"},
2019 {0, NULL((void*)0)}};
2020
2021static const string_string door_mon_sys_type_vals[] = {
2022 {"WT", "Watertight Door"},
2023 {"WS", "Semi-watertight Door (splash-tight)"},
2024 {"FD", "Fire Door"},
2025 {"HD", "Hull (shell) Door"},
2026 {"OT", "Other"},
2027 {NULL((void*)0), NULL((void*)0)}};
2028
2029static const value_string door_status_vals[] = {
2030 {'O', "Open"},
2031 {'C', "Closed"},
2032 {'S', "Secured"},
2033 {'F', "Free status (for watertight door)"},
2034 {'X', "Fault (door status unknown)"},
2035 {0, NULL((void*)0)}};
2036
2037static const value_string dor_msg_type_vals[] = {
2038 {'S', "Status for section"},
2039 {'E', "Status for single door"},
2040 {'F', "Fault in system"},
2041 {0, NULL((void*)0)}};
2042
2043static const value_string dsc_ack_vals[] = {
2044 {'R', "Acknowledgement Request"},
2045 {'B', "Acknowledgement"},
2046 {'S', "Neither (end of sequence)"},
2047 {0, NULL((void*)0)}};
2048
2049static const value_string dse_flag_vals[] = {
2050 {'Q', "Query"},
2051 {'R', "Reply"},
2052 {'A', "Automatic"},
2053 {0, NULL((void*)0)}};
2054
2055static const value_string dte_indicator_vals[] = {
2056 {'0', "Keyboard and display are a standard configuration, and communication is supported"},
2057 {'1', "Keyboard and display are either unknown or unable to support communication"},
2058 {0, NULL((void*)0)}};
2059
2060static const value_string equipment_status_vals[] = {
2061 {'A', "Normal operation"},
2062 {'V', "Not normal operation"},
2063 {0, NULL((void*)0)}};
2064
2065static const value_string etl_message_type_vals[] = {
2066 {'O', "Order"},
2067 {'A', "Answer-back"},
2068 {0, NULL((void*)0)}};
2069
2070static const value_string fsi_mode_vals[] = {
2071 {'d', "F3E/G3E simplex, telephone"},
2072 {'e', "F3E/G3E duplex, telephone"},
2073 {'m', "J3E, telephone"},
2074 {'o', "H3E, telephone"},
2075 {'q', "F1B/J2B FEC NBDP, Telex/teleprinter"},
2076 {'s', "F1B/J2B ARQ NBDP, Telex/teleprinter"},
2077 {'t', "F1B/J2B receive only, teleprinter/DSC"},
2078 {'w', "F1B/J2B, teleprinter/DSC"},
2079 {'x', "A1A Morse, tape recorder"},
2080 {'{', "A1A Morse, Morse key/head set"},
2081 {'|', "F1C/F2C/F3C, FAX-machine"},
2082 {0, NULL((void*)0)}};
2083
2084static const value_string fsi_power_vals[] = {
2085 {'0', "Standby"},
2086 {'1', "Lowest"},
2087 {'9', "Highest"},
2088 {0, NULL((void*)0)}};
2089
2090static const value_string glc_sig_status[] = {
2091 {'B', "Blink warning"},
2092 {'C', "Cycle warning"},
2093 {'S', "SNR warning"},
2094 {'A', "Valid"},
2095 {0, NULL((void*)0)}};
2096
2097static const value_string grs_mode_vals[] = {
2098 {'0', "Residuals were used to calculate the position given in the matching GGA/GNS sentence"},
2099 {'1', "Residuals were recomputed after the GGA/GNS position was computed"},
2100 {0, NULL((void*)0)}};
2101
2102static const value_string gsa_fix_mode[] = {
2103 {'1', "Fix not available"},
2104 {'2', "2D"},
2105 {'3', "3D"},
2106 {0, NULL((void*)0)}};
2107
2108static const value_string gsa_op_mode[] = {
2109 {'M', "Manual, forced to operate in 2D or 3D mode"},
2110 {'A', "Automatic, allowed to automatically switch 2D/3D"},
2111 {0, NULL((void*)0)}};
2112
2113static const value_string heading_monitor_sensor_type[] = {
2114 {'T', "True"},
2115 {'M', "Magnetic"},
2116 {0, NULL((void*)0)}};
2117
2118static const value_string heading_monitor_sensor_vals[] = {
2119 {'A', "Data valid"},
2120 {'V', "Data not valid"},
2121 {0, NULL((void*)0)}};
2122
2123static const value_string heading_reference[] = {
2124 {'T', "True"},
2125 {'M', "Magnetic"},
2126 {0, NULL((void*)0)}};
2127
2128static const value_string indicators_for_engine_telegraph[] = {
2129 {0, "Stop Engine"},
2130 {1, "[AH] Dead Slow"},
2131 {2, "[AH] Slow"},
2132 {3, "[AH] Half"},
2133 {4, "[AH] Full"},
2134 {5, "[AH] Navigation Full"},
2135 {11, "[AS] Dead Slow"},
2136 {12, "[AS] Slow"},
2137 {13, "[AS] Half"},
2138 {14, "[AS] Full"},
2139 {15, "[AS] Crash Astern"},
2140 {0, NULL((void*)0)}};
2141
2142static const value_string indicators_for_sub_telegraph[] = {
2143 {20, "S/B (Stand-by Engine)"},
2144 {30, "F/A (Full Away - Navigation Full"},
2145 {40, "F/E (Finish with Engine)"},
2146 {0, NULL((void*)0)}};
2147
2148static const value_string loranc_blink_snr_warning_vals[] = {
2149 {'A', "Data valid"},
2150 {'V', "Loran-C Blink, SNR, or General warning"},
2151 {0, NULL((void*)0)}};
2152
2153static const value_string loranc_cycle_lock_warning_vals[] = {
2154 {'A', "Data valid or not used"},
2155 {'V', "Loran-C Cycle Lock warning"},
2156 {0, NULL((void*)0)}};
2157
2158static const value_string lrf_func_rep_vals[] = {
2159 {'2', "Information available and provided in the following LR1, LR2, or LR3 sentence"},
2160 {'3', "Information not available from the IAS unit"},
2161 {'4', "Information is available but not provided (i.e., restricted access determined by ship's master)"},
2162 {0, NULL((void*)0)}};
2163
2164static const value_string lrf_func_req_vals[] = {
2165 {'A', "Ship's: name, call sign, and IMO number"},
2166 {'B', "Date and time of message composition"},
2167 {'C', "Position"},
2168 {'E', "Course over ground"},
2169 {'F', "Speed over ground"},
2170 {'I', "Destination and Estimated Time of Arrival (ETA)"},
2171 {'O', "Draught"},
2172 {'P', "Ship / Cargo"},
2173 {'U', "Ship's: length, breadth, type"},
2174 {'W', "Persons on board"},
2175 {0, NULL((void*)0)}};
2176
2177static const value_string mode_indicator[] = {
2178 {'A', "Autonomous mode"},
2179 {'D', "Differential mode"},
2180 {'E', "Estimated (dead reckoning) mode"},
2181 {'M', "Manual input mode"},
2182 {'S', "Simulator mode"},
2183 {'N', "Data not valid"},
2184 {0, NULL((void*)0)}};
2185
2186static const value_string mwv_reference[] = {
2187 {'R', "Relative"},
2188 {'T', "Theoretical"},
2189 {0, NULL((void*)0)}};
2190
2191/* Navigational Status per ITU-R M.1371 Message 1, Navigational Status parameter */
2192static const string_string nav_status_vals[] = {
2193 {"0", "Under way using engine"},
2194 {"1", "At anchor"},
2195 {"2", "Not under command"},
2196 {"3", "Restricted maneuverability"},
2197 {"4", "Constrained by draught"},
2198 {"5", "Moored"},
2199 {"6", "Aground"},
2200 {"7", "Engaged in fishing"},
2201 {"8", "Under way sailing"},
2202 {"9", "Reserved for High Speed Craft (HSC)"},
2203 {"10", "Reserved for Wing in Ground (WIG)"},
2204 {"11", "Reserved for Future Use"},
2205 {"12", "Reserved for Future Use"},
2206 {"13", "Reserved for Future Use"},
2207 {"14", "Reserved for Future Use"},
2208 {"15", "Default"},
2209 {NULL((void*)0), NULL((void*)0)}};
2210
2211static const value_string navigation_data_status[] = {
2212 {'A', "Data valid"},
2213 {'V', "Navigation receiver warning"},
2214 {0, NULL((void*)0)}};
2215
2216static const value_string oplocation_indicator_vals[] = {
2217 {'B', "Bridge"},
2218 {'P', "Port Wing"},
2219 {'S', "Starboard Wing"},
2220 {'C', "Engine Control Room"},
2221 {'E', "Engine Side / Local"},
2222 {'W', "Wing (port or starboard not specified)"},
2223 {0, NULL((void*)0)}};
2224
2225static const value_string override_vals[] = {
2226 {'A', "In use"},
2227 {'V', "Not in use"},
2228 {0, NULL((void*)0)}};
2229
2230static const value_string perpendicular_pass_status[] = {
2231 {'A', "Perpendicular passed at waypoint"},
2232 {'V', "Perpendicular not passed"},
2233 {0, NULL((void*)0)}};
2234
2235static const value_string point_type_vals[] = {
2236 {'C', "Collision"},
2237 {'T', "Turning point"},
2238 {'R', "Reference (general)"},
2239 {'W', "Wheelover"},
2240 {0, NULL((void*)0)}};
2241
2242static const value_string r_oh_ot_status[] = {
2243 {'A', "Within limits"},
2244 {'V', "Limit reached or exceeded"},
2245 {0, NULL((void*)0)}};
2246
2247static const value_string ref_target_vals[] = {
2248 {'R', "Target is a reference to determine own-ship position/velocity"},
2249 {0, NULL((void*)0)}};
2250
2251static const value_string revolutions_number_vals[] = {
2252 {'0', "Single or on centerline"},
2253 {'1', "Starboard"},
2254 {'2', "Port"},
2255 {0, NULL((void*)0)}};
2256
2257static const value_string revolutions_source_vals[] = {
2258 {'S', "Shaft"},
2259 {'E', "Engine"},
2260 {0, NULL((void*)0)}};
2261
2262static const value_string rma_data_status[] = {
2263 {'A', "Data valid"},
2264 {'V', "Blink, Cycle, or SNR warning"},
2265 {0, NULL((void*)0)}};
2266
2267static const value_string rudder_dir_vals[] = {
2268 {'L', "Port"},
2269 {'R', "Starboard"},
2270 {0, NULL((void*)0)}};
2271
2272static const range_string sat_prn_type[] = {
2273 {1, 32, "GPS satellite"},
2274 {33, 64, "WAAS/SBAS satellite"},
2275 {65, 88, "GLONASS satellite"},
2276 {89, 96, "GLONASS on-orbit spare"},
2277 {193, 197, "QZSS satellite"},
2278 {0, 0, NULL((void*)0)}};
2279
2280static const value_string satellite_mode_vals[] = {
2281 {'N', "No fix. Satellite system not used in position fix, or fix not valid"},
2282 {'A', "Autonomous. Satellite system used in non-differential mode in position fix"},
2283 {'D', "Differential. Satellite system used in differential mode in position fix"},
2284 {'P', "Precise. Satellite system used in precision mode"},
2285 {'R', "Real Time Kinematic (RTK). Satellite system used in RTK mode with fixed integers"},
2286 {'F', "Float RTK. Satellite system used in RTK mode with floating integers"},
2287 {'E', "Estimated (dead reckoning) mode"},
2288 {'M', "Manual input mode"},
2289 {'S', "Simulator mode"},
2290 {0, NULL((void*)0)}};
2291
2292static const value_string sentence_mode_vals[] = {
2293 {'c', "Complete route, all waypoints"},
2294 {'w', "Working route, 1st listed waypoint is 'FROM', 2nd is 'TO', remaining are the route"},
2295 {0, NULL((void*)0)}};
2296
2297static const value_string sentence_status_vals[] = {
2298 {'R', "Sentence is a status report of current settings (use for a reply to a query)"},
2299 {'C', "Sentence is a configuration command to change settings"},
2300 {0, NULL((void*)0)}};
2301
2302static const value_string sfi_operation_mode_vals[] = {
2303 {'d', "F3E/G3E simplex, telephone"},
2304 {'e', "F3E/G3E duplex, telephone"},
2305 {'m', "J3E, telephone"},
2306 {'o', "H3E, telephone"},
2307 {'q', "F1B/J2B FEC NBDP, telex/teleprinter"},
2308 {'s', "F1B/J2B ARQ NBDP, telex/teleprinter"},
2309 {'t', "F1B/J2B receive only, teleprinter/DSC"},
2310 {'w', "F1B/J2B, teleprinter/DSC"},
2311 {'x', "A1A Morse, tape recorder"},
2312 {'{', "A1A Morse, Morse key/head set"},
2313 {'|', "F1C/F2C/F3C, FAX-machine"},
2314 {'\0', "No information"},
2315 {0, NULL((void*)0)}};
2316
2317static const value_string speed_reference[] = {
2318 {'B', "Bottom track"},
2319 {'W', "Water track"},
2320 {'P', "Positioning System"},
2321 {0, NULL((void*)0)}};
2322
2323static const value_string speed_unit_vals[] = {
2324 {'K', "Kilometers/hour"},
2325 {'M', "Meters/sec"},
2326 {'N', "Knots"},
2327 {'S', "Statute Miles/hour"},
2328 {0, NULL((void*)0)}};
2329
2330static const value_string steer_direction[] = {
2331 {'L', "Left"},
2332 {'R', "Right"},
2333 {0, NULL((void*)0)}};
2334
2335static const value_string steering_mode_vals[] = {
2336 {'M', "Manual steering. The main steering system is in use"},
2337 {'S', "Standalone (heading control). System works as a standalone heading controller"},
2338 {'H', "Heading control. Input of commanded heading to steer is from external device"},
2339 {'T', "Track control. System works as track controller by correcting course received in fielded 'Commanded Track'"},
2340 {'R', "Rudder control. Input of commanded rudder angle and direction from external device"},
2341 {0, NULL((void*)0)}};
2342
2343/* IEC 61126-1 Ed. 4 Annex D Subsystem Tables */
2344static const string_string subsystem_equipment_vals[] = {
2345 {"AL", "Group Alarm System"},
2346 {"AR", "Air"},
2347 {"BD", "Boiler Drum"},
2348 {"BL", "Boiler"},
2349 {"BN", "Burner"},
2350 {"CA", "Compressed Air"},
2351 {"CB", "Combustion"},
2352 {"CD", "Condensate"},
2353 {"CH", "Chemical Cargo System"},
2354 {"CL", "Control System (Actuator or Drive Unit for Steering Signal)"},
2355 {"CM", "Cooling Medium"},
2356 {"CN", "Combustion"},
2357 {"CO", "Condensate"},
2358 {"EG", "Engine"},
2359 {"EH", "Exhaust Gas"},
2360 {"EP", "Electric Power Generator Plant"},
2361 {"FO", "[System=AM] Fuel Oil System / [System=GT/PB/AB/AD/AG] Fuel Oil"},
2362 {"FV", "Fuel Valve Coolant"},
2363 {"FW", "Feed Water"},
2364 /* Duplicate character mapping from the table
2365 {"FW", "Cylinder Fresh Water Cooling"},*/
2366 {"HT", "Heat Detection Type"},
2367 {"LC", "Lubricating Oil Cooling System"},
2368 {"LG", "LPG/LNG Cargo System"},
2369 {"LO", "Lubricating/Lubrication Oil"},
2370 {"MN", "Monitoring System"},
2371 {"MS", "Propulsion Machinery Space"},
2372 {"OL", "Inert Gas System"},
2373 {"OT", "Others"},
2374 {"PA", "Propulsion Motor - AC"},
2375 {"PC", "Propulsion Control"},
2376 {"PD", "Propulsion Motor - DC"},
2377 {"PG", "Propulsion Generator"},
2378 {"PS", "[System=DE] Piston Cooling / [System=EP] Propulsion SCR"},
2379 {"PU", "Power Unit"},
2380 {"PW", "Power"},
2381 {"RC", "Remote Control System"},
2382 {"RM", "High-Voltage Rotating Machine"},
2383 {"RT", "Rotor"},
2384 {"SA", "[System=AG/GT] Starting / [System=DE] Scavenge Air"},
2385 {"SC", "Seawater Cooling"},
2386 {"SM", "[System=FR] Smoke Detection Type / [System=AB/PB/ST] Steam"},
2387 {"SP", "System Power Source"},
2388 {"ST", "[System=AM] Stern Tube Lub. Oil / [System=AD] Starting Medium / [System=AT] Steam"},
2389 {"SW", "Seawater"},
2390 {"TB", "Turbine"},
2391 {"TC", "Turbo-Charger"},
2392 {NULL((void*)0), NULL((void*)0)}};
2393
2394/* IEC 61126-1 Ed. 4 Annex D System Tables */
2395static const string_string system_equipment_vals[] = {
2396 {"AB", "Auxiliary Boiler"},
2397 {"AD", "Auxiliary Diesel Engine"},
2398 {"AG", "Auxiliary Gas Turbine"},
2399 {"AM", "Auxiliary Machinery"},
2400 {"AT", "Auxiliary Turbine"},
2401 {"CG", "Cargo Control Plant"},
2402 {"DE", "Diesel Plant"},
2403 {"EP", "Electric Propulsion Plant"},
2404 {"FD", "Fire Door Controller"},
2405 {"FR", "Fire Detection System"},
2406 {"GT", "Gas Turbine Plant"},
2407 {"HD", "Hull (shell) Door Controller"},
2408 {"OT", "Other's System"},
2409 {"PB", "Propulsion Boiler"},
2410 {"PC", "Propulsion Control"},
2411 {"SG", "Steering Gear"},
2412 {"ST", "Steam Turbines Plant"},
2413 {"WD", "Watertight Door Controller"},
2414 {NULL((void*)0), NULL((void*)0)}};
2415
2416static const value_string target_acq_vals[] = {
2417 {'A', "Auto"},
2418 {'M', "Manual"},
2419 {'R', "Reported"},
2420 {0, NULL((void*)0)}};
2421
2422static const value_string tgt_status_vals[] = {
2423 {'L', "Lost, tracked target has been lost"},
2424 {'Q', "Query, target in the process of acquisition"},
2425 {'T', "Tracking"},
2426 {0, NULL((void*)0)}};
2427
2428static const value_string transducer_type_vals[] = {
2429 {'C', "Temperature"},
2430 {'A', "Angular displacement"},
2431 {'D', "Linear displacement"},
2432 {'F', "Frequency"},
2433 {'N', "Force"},
2434 {'P', "Pressure"},
2435 {'R', "Flow rate"},
2436 {'T', "Tachometer"},
2437 {'H', "Humidity"},
2438 {'V', "Volume"},
2439 {'G', "Generic"},
2440 {'I', "Current"},
2441 {'U', "Voltage"},
2442 {'S', "Switch or valve"},
2443 {'L', "Salinity"},
2444 {0, NULL((void*)0)}};
2445
2446static const value_string transducer_unit_vals[] = {
2447 {'C', "Degrees Celsius"},
2448 {'D', "Degrees"},
2449 {'H', "Hertz"},
2450 {'N', "Newton"},
2451 {'B', "Bars"},
2452 {'P', "Pascal (Pressure) or Percent (Humidity)"},
2453 {'l', "Liters/second"},
2454 {'R', "RPM"},
2455 {'M', "Cubic meters"},
2456 {'A', "Amperes"},
2457 {'V', "Volts"},
2458 {'S', "ppt"},
2459 {0, NULL((void*)0)}};
2460
2461static const value_string turning_mode_vals[] = {
2462 {'R', "Radius controlled"},
2463 {'T', "Turn rate controlled"},
2464 {'N', "Turn is not controlled"},
2465 {0, NULL((void*)0)}};
2466
2467static const value_string warning_flag_vals[] = {
2468 {'A', "Difference within set limit"},
2469 {'V', "Difference exceeds set limit"},
2470 {0, NULL((void*)0)}};
2471
2472static const value_string watertight_switch_setting_vals[] = {
2473 {'O', "Harbor mode (allowed open)"},
2474 {'C', "Sea mode (ordered closed)"},
2475 {0, NULL((void*)0)}};
2476
2477static const value_string xte_unit_vals[] = {
2478 {'K', "Kilometers"},
2479 {'M', "Meters"},
2480 {'N', "Nautical miles"},
2481 {'S', "Statute miles"},
2482 {0, NULL((void*)0)}};
2483
2484static uint8_t calculate_checksum(tvbuff_t *tvb, const int start, const int length)
2485{
2486 uint8_t checksum = 0;
2487 for (int i = start; i < start + length; i++)
2488 {
2489 checksum ^= tvb_get_uint8(tvb, i);
2490 }
2491 return checksum;
2492}
2493
2494static char *
2495decode_time(wmem_allocator_t *scope, const char *value)
2496{
2497 size_t length = strlen(value);
2498
2499 if (length < 4)
2500 {
2501 return wmem_strdup(scope, value);
2502 }
2503 return wmem_strdup_printf(scope, "%.2s:%.2s:%s",
2504 value, value + 2, value + 4);
2505}
2506
2507static char *
2508decode_date(wmem_allocator_t *scope, const char *value)
2509{
2510 static const char *months[] = {
2511 "JAN", "FEB", "MAR", "APR", "MAY", "JUN",
2512 "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"
2513 };
2514 unsigned month;
2515 unsigned year;
2516
2517 if (strlen(value) < 6)
2518 {
2519 return wmem_strdup(scope, value);
2520 }
2521 month = (unsigned)(value[2] - '0') * 10 + (unsigned)(value[3] - '0');
2522 if (month < 1 || month > G_N_ELEMENTS(months)(sizeof (months) / sizeof ((months)[0])))
2523 {
2524 return wmem_strdup(scope, value);
2525 }
2526 year = (unsigned)(value[4] - '0') * 10 + (unsigned)(value[5] - '0');
2527 return wmem_strdup_printf(scope, "%.2s %s %s%.2s",
2528 value, months[month - 1],
2529 year >= 70 ? "19" : "20", value + 4);
2530}
2531
2532static bool_Bool
2533decode_latlong(const char *latlong, const char *direction, float *result)
2534{
2535 if (latlong == NULL((void*)0) || latlong[0] == '\0' ||
2536 direction == NULL((void*)0) || direction[0] == '\0')
2537 {
2538 return false0;
2539 }
2540
2541 double raw = g_ascii_strtod(latlong, NULL((void*)0));
2542 double degrees = (int)(raw / 100.0);
2543 double coordinate = degrees + (raw - degrees * 100.0) / 60.0;
2544
2545 if (direction[0] == 'S' || direction[0] == 'W')
2546 {
2547 coordinate = -coordinate;
2548 }
2549 *result = (float)coordinate;
2550 return true1;
2551}
2552
2553static char *
2554field_binding(wmem_allocator_t *scope, const char *value, const char *label)
2555{
2556 return wmem_strdup_printf(scope, "%s %.1s", value, label);
2557}
2558
2559/* Find first occurrence of a field separator in tvbuff, starting at offset. Searches
2560 * to end of tvbuff.
2561 * Returns the offset of the found separator.
2562 * If separator is not found, return the offset of end of tvbuff.
2563 * If offset is out of bounds, return the offset of end of tvbuff.
2564 **/
2565static unsigned
2566tvb_find_end_of_nmea0183_field(tvbuff_t *tvb, const unsigned offset)
2567{
2568 if (tvb_captured_length_remaining(tvb, offset) == 0)
2569 {
2570 return tvb_captured_length(tvb);
2571 }
2572
2573 unsigned end_of_field_offset;
2574 if (!tvb_find_uint8_remaining(tvb, offset, ',', &end_of_field_offset))
2575 {
2576 return tvb_captured_length(tvb);
2577 }
2578 return end_of_field_offset;
2579}
2580
2581/* Add a zero length item which indicates an expected but missing field */
2582static proto_item *
2583proto_tree_add_missing_field(proto_tree *tree, packet_info *pinfo, int hf, tvbuff_t *tvb,
2584 const int offset)
2585{
2586 proto_item *ti = NULL((void*)0);
2587 ti = proto_tree_add_item(tree, hf, tvb, offset, 0, ENC_ASCII0x00000000);
2588 proto_item_append_text(ti, "[missing]");
2589 expert_add_info(pinfo, ti, &ei_nmea0183_field_missing);
2590 return ti;
2591}
2592
2593/* Dissect a time field. The field is split into a tree with hour, minute and second elements.
2594 * Returns length including separator
2595 **/
2596static int
2597dissect_nmea0183_field_time(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset,
2598 int hf_time, int hf_hour, int hf_minute, int hf_second, int ett_time)
2599{
2600 if (offset > (int)tvb_captured_length(tvb))
2601 {
2602 proto_tree_add_missing_field(tree, pinfo, hf_time, tvb, tvb_captured_length(tvb));
2603 return 0;
2604 }
2605
2606 proto_item *ti = NULL((void*)0);
2607 int end_of_field_offset = tvb_find_end_of_nmea0183_field(tvb, offset);
2608 ti = proto_tree_add_item(tree, hf_time, tvb, offset, end_of_field_offset - offset, ENC_ASCII0x00000000);
2609 if (end_of_field_offset - offset == 0)
2610 {
2611 proto_item_append_text(ti, ": [empty]");
2612 }
2613 else if (end_of_field_offset - offset >= 6)
2614 {
2615 const uint8_t *hour = NULL((void*)0);
2616 const uint8_t *minute = NULL((void*)0);
2617 const uint8_t *second = NULL((void*)0);
2618 proto_tree *time_subtree = proto_item_add_subtree(ti, ett_time);
2619
2620 proto_tree_add_item_ret_string(time_subtree, hf_hour,
2621 tvb, offset, 2, ENC_ASCII0x00000000,
2622 pinfo->pool, &hour);
2623
2624 proto_tree_add_item_ret_string(time_subtree, hf_minute,
2625 tvb, offset + 2, 2, ENC_ASCII0x00000000,
2626 pinfo->pool, &minute);
2627
2628 proto_tree_add_item_ret_string(time_subtree, hf_second,
2629 tvb, offset + 4, end_of_field_offset - offset - 4,
2630 ENC_ASCII0x00000000, pinfo->pool, &second);
2631
2632 proto_item_append_text(ti, ": %s:%s:%s", hour, minute, second);
2633 }
2634 else
2635 {
2636 expert_add_info(pinfo, ti, &ei_nmea0183_field_time_too_short);
2637 }
2638 return end_of_field_offset - offset + 1;
2639}
2640
2641/* Dissect a single field containing a dimensionless value. Returns length including separator */
2642static int
2643dissect_nmea0183_field(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int hf, const char *suffix, const string_string *str_str)
2644{
2645 const uint8_t *field_str = NULL((void*)0);
2646
2647 if (offset > (int)tvb_captured_length(tvb))
2648 {
2649 proto_tree_add_missing_field(tree, pinfo, hf, tvb, tvb_captured_length(tvb));
2650 return 0;
2651 }
2652
2653 proto_item *ti = NULL((void*)0);
2654 int end_of_field_offset = tvb_find_end_of_nmea0183_field(tvb, offset);
2655 ti = proto_tree_add_item_ret_string(tree, hf, tvb, offset, end_of_field_offset - offset, ENC_ASCII0x00000000, pinfo->pool, &field_str);
2656 if (end_of_field_offset - offset == 0)
2657 {
2658 proto_item_append_text(ti, "[empty]");
2659 }
2660 else if (suffix != NULL((void*)0))
2661 {
2662 proto_item_append_text(ti, " %s", suffix);
2663 }
2664 if ((str_str)&&(field_str)) {
2665 proto_item_append_text(ti, " - %s", str_to_str_wmem(pinfo->pool, (const char *)field_str, str_str, " "));
2666 }
2667 return end_of_field_offset - offset + 1;
2668}
2669
2670/* Dissect a latitude/longitude direction field.
2671 * Returns length including separator
2672 **/
2673static int
2674dissect_nmea0183_field_latlong_direction(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
2675 int offset, int hf,
2676 wmem_allocator_t *scope, const uint8_t **retval)
2677{
2678 if (offset > (int)tvb_captured_length(tvb))
2679 {
2680 proto_tree_add_missing_field(tree, pinfo, hf, tvb, tvb_captured_length(tvb));
2681 return 0;
2682 }
2683
2684 int end_of_field_offset = tvb_find_end_of_nmea0183_field(tvb, offset);
2685 proto_item *ti = proto_tree_add_item_ret_string(tree, hf,
2686 tvb, offset, end_of_field_offset - offset, ENC_ASCII0x00000000,
2687 scope, retval);
2688 if (end_of_field_offset - offset == 0)
2689 {
2690 if (retval == NULL((void*)0))
2691 {
2692 proto_item_append_text(ti, "[empty]");
2693 }
2694 else
2695 {
2696 proto_item_append_text(ti, "[missing]");
2697 expert_add_info(pinfo, ti, &ei_nmea0183_field_missing);
2698 }
2699 }
2700 return end_of_field_offset - offset + 1;
2701}
2702
2703/* Dissect a latitude field + direction field. The fields are split into a tree with degree, minute and direction elements.
2704 * Returns length including separator
2705 **/
2706static int
2707dissect_nmea0183_field_latitude(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset,
2708 int hf_latitude, int hf_degree, int hf_minute, int hf_direction, int ett_latitude)
2709{
2710 if (offset > (int)tvb_captured_length(tvb))
2711 {
2712 proto_tree_add_missing_field(tree, pinfo, hf_latitude, tvb, tvb_captured_length(tvb));
2713 return 0;
2714 }
2715
2716 proto_item *ti = NULL((void*)0);
2717 int end_of_field_offset = tvb_find_end_of_nmea0183_field(tvb, offset);
2718 ti = proto_tree_add_item(tree, hf_latitude, tvb, offset, end_of_field_offset - offset, ENC_ASCII0x00000000);
2719 if (end_of_field_offset - offset == 0)
2720 {
2721 proto_item_append_text(ti, ": [empty]");
2722
2723 end_of_field_offset += dissect_nmea0183_field_latlong_direction(tvb, pinfo, tree, end_of_field_offset + 1, hf_direction, NULL((void*)0), NULL((void*)0));
2724 }
2725 else if (end_of_field_offset - offset >= 4)
2726 {
2727 const uint8_t *degree = NULL((void*)0);
2728 const uint8_t *minute = NULL((void*)0);
2729 const uint8_t *direction = NULL((void*)0);
2730 proto_tree *latitude_subtree = proto_item_add_subtree(ti, ett_latitude);
2731
2732 proto_tree_add_item_ret_string(latitude_subtree, hf_degree,
2733 tvb, offset, 2,
2734 ENC_ASCII0x00000000, pinfo->pool, &degree);
2735
2736 proto_tree_add_item_ret_string(latitude_subtree, hf_minute,
2737 tvb, offset + 2, end_of_field_offset - offset - 2,
2738 ENC_ASCII0x00000000, pinfo->pool, &minute);
2739
2740 end_of_field_offset += dissect_nmea0183_field_latlong_direction(tvb, pinfo, latitude_subtree, end_of_field_offset + 1, hf_direction, pinfo->pool, &direction);
2741
2742 proto_item_append_text(ti, ": %s° %s' %s", degree, minute, direction);
2743 }
2744 else
2745 {
2746 expert_add_info(pinfo, ti, &ei_nmea0183_field_latitude_too_short);
2747
2748 end_of_field_offset += dissect_nmea0183_field_latlong_direction(tvb, pinfo, tree, end_of_field_offset + 1, hf_direction, NULL((void*)0), NULL((void*)0));
2749 }
2750 return end_of_field_offset - offset + 1;
2751}
2752
2753/* Dissect a longitude field + direction field. The fields are split into a tree with degree, minute and direction elements.
2754 * Returns length including separator
2755 **/
2756static int
2757dissect_nmea0183_field_longitude(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset,
2758 int hf_longitude, int hf_degree, int hf_minute, int hf_direction, int ett_latitude)
2759{
2760 if (offset > (int)tvb_captured_length(tvb))
2761 {
2762 proto_tree_add_missing_field(tree, pinfo, hf_longitude, tvb, tvb_captured_length(tvb));
2763 return 0;
2764 }
2765
2766 proto_item *ti = NULL((void*)0);
2767 int end_of_field_offset = tvb_find_end_of_nmea0183_field(tvb, offset);
2768 ti = proto_tree_add_item(tree, hf_longitude, tvb, offset, end_of_field_offset - offset, ENC_ASCII0x00000000);
2769 if (end_of_field_offset - offset == 0)
2770 {
2771 proto_item_append_text(ti, ": [empty]");
2772
2773 end_of_field_offset += dissect_nmea0183_field_latlong_direction(tvb, pinfo, tree, end_of_field_offset + 1, hf_direction, NULL((void*)0), NULL((void*)0));
2774 }
2775 else if (end_of_field_offset - offset >= 5)
2776 {
2777 const uint8_t *degree = NULL((void*)0);
2778 const uint8_t *minute = NULL((void*)0);
2779 const uint8_t *direction = NULL((void*)0);
2780 proto_tree *longitude_subtree = proto_item_add_subtree(ti, ett_latitude);
2781
2782 proto_tree_add_item_ret_string(longitude_subtree, hf_degree,
2783 tvb, offset, 3,
2784 ENC_ASCII0x00000000, pinfo->pool, &degree);
2785
2786 proto_tree_add_item_ret_string(longitude_subtree, hf_minute,
2787 tvb, offset + 3, end_of_field_offset - offset - 3,
2788 ENC_ASCII0x00000000, pinfo->pool, &minute);
2789
2790 end_of_field_offset += dissect_nmea0183_field_latlong_direction(tvb, pinfo, longitude_subtree, end_of_field_offset + 1, hf_direction, pinfo->pool, &direction);
2791
2792 proto_item_append_text(ti, ": %s° %s' %s", degree, minute, direction);
2793 }
2794 else
2795 {
2796 expert_add_info(pinfo, ti, &ei_nmea0183_field_longitude_too_short);
2797
2798 end_of_field_offset += dissect_nmea0183_field_latlong_direction(tvb, pinfo, tree, end_of_field_offset + 1, hf_direction, NULL((void*)0), NULL((void*)0));
2799 }
2800 return end_of_field_offset - offset + 1;
2801}
2802
2803/* Dissect a required gps quality field. Returns length including separator */
2804static int
2805dissect_nmea0183_field_gps_quality(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int hf)
2806{
2807 if (offset > (int)tvb_captured_length(tvb))
2808 {
2809 proto_tree_add_missing_field(tree, pinfo, hf, tvb, tvb_captured_length(tvb));
2810 return 0;
2811 }
2812
2813 proto_item *ti = NULL((void*)0);
2814 int end_of_field_offset = tvb_find_end_of_nmea0183_field(tvb, offset);
2815 const char *quality = NULL((void*)0);
2816 ti = proto_tree_add_item_ret_string(tree, hf,
2817 tvb, offset, end_of_field_offset - offset, ENC_ASCII0x00000000,
2818 pinfo->pool, (const uint8_t**)&quality);
2819 if (end_of_field_offset - offset == 0)
2820 {
2821 proto_item_append_text(ti, "[missing]");
2822 expert_add_info(pinfo, ti, &ei_nmea0183_field_missing);
2823 }
2824 else
2825 {
2826 proto_item_append_text(ti, " (%s)", str_to_str_wmem(pinfo->pool, quality, known_gps_quality_indicators, "Unknown quality"));
2827 }
2828 return end_of_field_offset - offset + 1;
2829}
2830
2831/* Dissect a single field containing a fixed text.
2832 The text of the field must match the `expected_text` or expert info `invalid_ei` is
2833 added to the field. An empty field is allowed. Returns length including separator */
2834static int
2835dissect_nmea0183_field_fixed_text(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int hf,
2836 const char *expected_text, expert_field *invalid_ei)
2837{
2838 if (offset > (int)tvb_captured_length(tvb))
2839 {
2840 proto_tree_add_missing_field(tree, pinfo, hf, tvb, tvb_captured_length(tvb));
2841 return 0;
2842 }
2843
2844 proto_item *ti = NULL((void*)0);
2845 const char *text = NULL((void*)0);
2846 int end_of_field_offset = tvb_find_end_of_nmea0183_field(tvb, offset);
2847 ti = proto_tree_add_item_ret_string(tree, hf,
2848 tvb, offset, end_of_field_offset - offset, ENC_ASCII0x00000000,
2849 pinfo->pool, (const uint8_t**)&text);
2850 if (end_of_field_offset - offset == 0)
2851 {
2852 proto_item_append_text(ti, "[empty]");
2853 }
2854 else if (g_ascii_strcasecmp(text, expected_text) != 0)
2855 {
2856 expert_add_info(pinfo, ti, invalid_ei);
2857 }
2858 return end_of_field_offset - offset + 1;
2859}
2860
2861/* Dissect a optional FAA mode indicator field. Returns length including separator */
2862static int
2863dissect_nmea0183_field_faa_mode(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int hf)
2864{
2865 if (offset > (int)tvb_captured_length(tvb))
2866 {
2867 proto_tree_add_missing_field(tree, pinfo, hf, tvb, tvb_captured_length(tvb));
2868 return 0;
2869 }
2870
2871 proto_item *ti = NULL((void*)0);
2872 int end_of_field_offset = tvb_find_end_of_nmea0183_field(tvb, offset);
2873 const char *mode = NULL((void*)0);
2874 ti = proto_tree_add_item_ret_string(tree, hf,
2875 tvb, offset, end_of_field_offset - offset, ENC_ASCII0x00000000,
2876 pinfo->pool, (const uint8_t**)&mode);
2877 if (end_of_field_offset - offset == 0)
2878 {
2879 proto_item_append_text(ti, "[empty]");
2880 }
2881 else
2882 {
2883 proto_item_append_text(ti, " (%s)", str_to_str_wmem(pinfo->pool, mode, known_faa_mode_indicators, "Unknown FAA mode"));
2884 }
2885 return end_of_field_offset - offset + 1;
2886}
2887
2888/* Dissect a optional A/V status field. Returns length including separator */
2889static int
2890dissect_nmea0183_field_status(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int hf)
2891{
2892 if (offset > (int)tvb_captured_length(tvb))
2893 {
2894 proto_tree_add_missing_field(tree, pinfo, hf, tvb, tvb_captured_length(tvb));
2895 return 0;
2896 }
2897
2898 proto_item *ti = NULL((void*)0);
2899 int end_of_field_offset = tvb_find_end_of_nmea0183_field(tvb, offset);
2900 const char *mode = NULL((void*)0);
2901 ti = proto_tree_add_item_ret_string(tree, hf,
2902 tvb, offset, end_of_field_offset - offset, ENC_ASCII0x00000000,
2903 pinfo->pool, (const uint8_t**)&mode);
2904 if (end_of_field_offset - offset == 0)
2905 {
2906 proto_item_append_text(ti, "[empty]");
2907 }
2908 else
2909 {
2910 proto_item_append_text(ti, " (%s)", str_to_str_wmem(pinfo->pool, mode, known_status_indicators, "Unknown status"));
2911 }
2912 return end_of_field_offset - offset + 1;
2913}
2914
2915/* Dissect a ALR sentence. */
2916/*
2917 * $--ALR,hhmmss.ss,xxx,A,A,c--c*hh<CR><LF>
2918*/
2919static const string_string alarm_condition_str[] = {
2920 {"A", "Threshold exceeded"},
2921 {"V", "Threshold not exceeded"},
2922 { NULL((void*)0), NULL((void*)0)},
2923};
2924
2925static const string_string alarm_ack_state_str[] = {
2926 {"A", "Acknowledged"},
2927 {"V", "Unacknowledged"},
2928 { NULL((void*)0), NULL((void*)0)},
2929};
2930
2931static int
2932dissect_nmea0183_sentence_alr(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree)
2933{
2934 unsigned offset = 0;
2935
2936 proto_tree* subtree = proto_tree_add_subtree(tree, tvb, offset, -1,
2937 ett_nmea0183_sentence, NULL((void*)0), "ALR sentence - Set Alarm State");
2938
2939 /* hhmmss.ss */
2940 offset += dissect_nmea0183_field_time(tvb, pinfo, subtree, offset, hf_nmea0183_alr_time,
2941 hf_nmea0183_alr_time_hour, hf_nmea0183_alr_time_minute,
2942 hf_nmea0183_alr_time_second, ett_nmea0183_alr_time);
2943 /* xxx Unique alarm number (identifier) at alarm source */
2944 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_alr_alarm_id, NULL((void*)0), NULL((void*)0));
2945 /* Alarm condition (A = threshold exceeded, V = not exceeded) */
2946 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_alr_alarm_cond, NULL((void*)0), alarm_condition_str);
2947 /* Alarm’s acknowledge state, A= acknowledged, V= unacknowledged*/
2948 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_alr_alarm_ack_st, NULL((void*)0), alarm_ack_state_str);
2949 /* c--c Alarm’s description text*/
2950 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_alr_alarm_desc_txt, NULL((void*)0), NULL((void*)0));
2951
2952 return tvb_captured_length(tvb);
2953}
2954
2955/* Dissect a DPT sentence. */
2956static int
2957dissect_nmea0183_sentence_dpt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
2958{
2959 unsigned offset = 0;
2960
2961 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
2962 NULL((void*)0), "DPT sentence - Depth of Water");
2963
2964 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dpt_depth, "meter", NULL((void*)0));
2965
2966 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dpt_offset, "meter", NULL((void*)0));
2967
2968 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dpt_max_range, "meter", NULL((void*)0));
2969
2970 return tvb_captured_length(tvb);
2971}
2972
2973/* Dissect a GGA sentence. The time, latitude and longitude fields is split into individual parts. */
2974static int
2975dissect_nmea0183_sentence_gga(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
2976{
2977 unsigned offset = 0;
2978
2979 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
2980 NULL((void*)0), "GGA sentence - Global Positioning System Fix");
2981
2982 offset += dissect_nmea0183_field_time(tvb, pinfo, subtree, offset, hf_nmea0183_gga_time,
2983 hf_nmea0183_gga_time_hour, hf_nmea0183_gga_time_minute,
2984 hf_nmea0183_gga_time_second, ett_nmea0183_gga_time);
2985
2986 offset += dissect_nmea0183_field_latitude(tvb, pinfo, subtree, offset, hf_nmea0183_gga_latitude,
2987 hf_nmea0183_gga_latitude_degree, hf_nmea0183_gga_latitude_minute,
2988 hf_nmea0183_gga_latitude_direction, ett_nmea0183_gga_latitude);
2989
2990 offset += dissect_nmea0183_field_longitude(tvb, pinfo, subtree, offset, hf_nmea0183_gga_longitude,
2991 hf_nmea0183_gga_longitude_degree, hf_nmea0183_gga_longitude_minute,
2992 hf_nmea0183_gga_longitude_direction, ett_nmea0183_gga_longitude);
2993
2994 offset += dissect_nmea0183_field_gps_quality(tvb, pinfo, subtree, offset, hf_nmea0183_gga_quality);
2995
2996 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gga_number_satellites, NULL((void*)0), NULL((void*)0));
2997
2998 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gga_horizontal_dilution, "meter", NULL((void*)0));
2999
3000 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gga_altitude, "meter", NULL((void*)0));
3001
3002 offset += dissect_nmea0183_field_fixed_text(tvb, pinfo, subtree, offset, hf_nmea0183_gga_altitude_unit,
3003 "M", &ei_nmea0183_gga_altitude_unit_incorrect);
3004
3005 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gga_geoidal_separation, "meter", NULL((void*)0));
3006
3007 offset += dissect_nmea0183_field_fixed_text(tvb, pinfo, subtree, offset, hf_nmea0183_gga_geoidal_separation_unit,
3008 "M", &ei_nmea0183_gga_geoidal_separation_unit_incorrect);
3009
3010 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gga_age_dgps, "second", NULL((void*)0));
3011
3012 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gga_dgps_station, NULL((void*)0), NULL((void*)0));
3013
3014 return tvb_captured_length(tvb);
3015}
3016
3017/* Dissect a GLL sentence. The latitude, longitude and time fields is split into individual parts. */
3018static int
3019dissect_nmea0183_sentence_gll(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3020{
3021 unsigned offset = 0;
3022
3023 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3024 NULL((void*)0), "GLL sentence - Geographic Position");
3025
3026 offset += dissect_nmea0183_field_latitude(tvb, pinfo, subtree, offset, hf_nmea0183_gll_latitude,
3027 hf_nmea0183_gll_latitude_degree, hf_nmea0183_gll_latitude_minute,
3028 hf_nmea0183_gll_latitude_direction, ett_nmea0183_gll_latitude);
3029
3030 offset += dissect_nmea0183_field_longitude(tvb, pinfo, subtree, offset, hf_nmea0183_gll_longitude,
3031 hf_nmea0183_gll_longitude_degree, hf_nmea0183_gll_longitude_minute,
3032 hf_nmea0183_gll_longitude_direction, ett_nmea0183_gll_longitude);
3033
3034 offset += dissect_nmea0183_field_time(tvb, pinfo, subtree, offset, hf_nmea0183_gll_time,
3035 hf_nmea0183_gll_time_hour, hf_nmea0183_gll_time_minute,
3036 hf_nmea0183_gll_time_second, ett_nmea0183_gll_time);
3037
3038 offset += dissect_nmea0183_field_status(tvb, pinfo, subtree, offset, hf_nmea0183_gll_status);
3039
3040 dissect_nmea0183_field_faa_mode(tvb, pinfo, subtree, offset, hf_nmea0183_gll_mode);
3041
3042 return tvb_captured_length(tvb);
3043}
3044
3045/* Dissect a GST sentence. The time field is split into individual parts. */
3046static int
3047dissect_nmea0183_sentence_gst(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3048{
3049 unsigned offset = 0;
3050
3051 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3052 NULL((void*)0), "GST sentence - GPS Pseudorange Noise Statistics");
3053
3054 offset += dissect_nmea0183_field_time(tvb, pinfo, subtree, offset, hf_nmea0183_gst_time,
3055 hf_nmea0183_gst_time_hour, hf_nmea0183_gst_time_minute,
3056 hf_nmea0183_gst_time_second, ett_nmea0183_gst_time);
3057
3058 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gst_rms_total_sd, NULL((void*)0), NULL((void*)0));
3059
3060 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gst_ellipse_major_sd, "meter", NULL((void*)0));
3061 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gst_ellipse_minor_sd, "meter", NULL((void*)0));
3062 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gst_ellipse_orientation, "degree (true north)", NULL((void*)0));
3063
3064 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gst_latitude_sd, "meter", NULL((void*)0));
3065 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gst_longitude_sd, "meter", NULL((void*)0));
3066 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gst_altitude_sd, "meter", NULL((void*)0));
3067
3068 return tvb_captured_length(tvb);
3069}
3070
3071/* Dissect a HDT sentence. */
3072static int
3073dissect_nmea0183_sentence_hdt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3074{
3075 unsigned offset = 0;
3076
3077 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3078 NULL((void*)0), "HDT sentence - True Heading");
3079
3080 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_hdt_heading, "degree", NULL((void*)0));
3081
3082 dissect_nmea0183_field_fixed_text(tvb, pinfo, subtree, offset, hf_nmea0183_hdt_unit,
3083 "T", &ei_nmea0183_hdt_unit_incorrect);
3084
3085 return tvb_captured_length(tvb);
3086}
3087
3088/* Dissect a ROT sentence. */
3089static int
3090dissect_nmea0183_sentence_rot(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3091{
3092 unsigned offset = 0;
3093
3094 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3095 NULL((void*)0), "ROT sentence - Rate Of Turn");
3096
3097 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rot_rate_of_turn, "degree per minute", NULL((void*)0));
3098
3099 dissect_nmea0183_field_status(tvb, pinfo, subtree, offset, hf_nmea0183_rot_valid);
3100
3101 return tvb_captured_length(tvb);
3102}
3103
3104/* Dissect a TXT sentence */
3105static int
3106dissect_nmea0183_sentence_txt(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree)
3107{
3108 unsigned offset = 0;
3109
3110 proto_tree* subtree = proto_tree_add_subtree(tree, tvb, offset, -1,
3111 ett_nmea0183_sentence, NULL((void*)0), "TXT sentence - Text Transmission");
3112
3113 /* Total number of sentences, 01 to 99 */
3114 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_txt_num, NULL((void*)0), NULL((void*)0));
3115 /* Sentence number */
3116 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_txt_sent_num, NULL((void*)0), NULL((void*)0));
3117 /* Text identifier */
3118 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_txt_id, NULL((void*)0), NULL((void*)0));
3119 /* Text message */
3120 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_txt_msg, NULL((void*)0), NULL((void*)0));
3121
3122 return tvb_captured_length(tvb);
3123}
3124
3125
3126/* Dissect a VHW sentence. */
3127static int
3128dissect_nmea0183_sentence_vhw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3129{
3130 unsigned offset = 0;
3131
3132 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3133 NULL((void*)0), "VHW sentence - Water speed and heading");
3134
3135 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vhw_true_heading, "degree", NULL((void*)0));
3136
3137 offset += dissect_nmea0183_field_fixed_text(tvb, pinfo, subtree, offset, hf_nmea0183_vhw_true_heading_unit,
3138 "T", &ei_nmea0183_vhw_true_heading_unit_incorrect);
3139
3140 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vhw_magnetic_heading, "degree", NULL((void*)0));
3141
3142 offset += dissect_nmea0183_field_fixed_text(tvb, pinfo, subtree, offset, hf_nmea0183_vhw_magnetic_heading_unit,
3143 "M", &ei_nmea0183_vhw_magnetic_heading_unit_incorrect);
3144
3145 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vhw_water_speed_knot, "knot", NULL((void*)0));
3146
3147 offset += dissect_nmea0183_field_fixed_text(tvb, pinfo, subtree, offset, hf_nmea0183_vhw_water_speed_knot_unit,
3148 "N", &ei_nmea0183_vhw_water_speed_knot_unit_incorrect);
3149
3150 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vhw_water_speed_kilometer, "kilometer per hour", NULL((void*)0));
3151
3152 dissect_nmea0183_field_fixed_text(tvb, pinfo, subtree, offset, hf_nmea0183_vhw_water_speed_kilometer_unit,
3153 "K", &ei_nmea0183_vhw_water_speed_kilometer_unit_incorrect);
3154
3155 return tvb_captured_length(tvb);
3156}
3157
3158/* Dissect a VBW sentence. */
3159static int
3160dissect_nmea0183_sentence_vbw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3161{
3162 unsigned offset = 0;
3163
3164 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3165 NULL((void*)0), "VBW sentence - Dual Ground/Water Speed");
3166
3167 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vbw_water_speed_longitudinal, "knot", NULL((void*)0));
3168 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vbw_water_speed_transverse, "knot", NULL((void*)0));
3169 offset += dissect_nmea0183_field_status(tvb, pinfo, subtree, offset, hf_nmea0183_vbw_water_speed_valid);
3170
3171 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vbw_ground_speed_longitudinal, "knot", NULL((void*)0));
3172 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vbw_ground_speed_transverse, "knot", NULL((void*)0));
3173 offset += dissect_nmea0183_field_status(tvb, pinfo, subtree, offset, hf_nmea0183_vbw_ground_speed_valid);
3174
3175 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vbw_stern_water_speed, "knot", NULL((void*)0));
3176 offset += dissect_nmea0183_field_status(tvb, pinfo, subtree, offset, hf_nmea0183_vbw_stern_water_speed_valid);
3177
3178 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vbw_stern_ground_speed, "knot", NULL((void*)0));
3179 dissect_nmea0183_field_status(tvb, pinfo, subtree, offset, hf_nmea0183_vbw_stern_ground_speed_valid);
3180
3181 return tvb_captured_length(tvb);
3182}
3183
3184/* Dissect a VLW sentence. */
3185static int
3186dissect_nmea0183_sentence_vlw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3187{
3188 unsigned offset = 0;
3189
3190 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3191 NULL((void*)0), "VLW sentence - Distance Traveled through Water");
3192
3193 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vlw_cumulative_water, "nautical miles", NULL((void*)0));
3194
3195 offset += dissect_nmea0183_field_fixed_text(tvb, pinfo, subtree, offset, hf_nmea0183_vlw_cumulative_water_unit,
3196 "N", &ei_nmea0183_vlw_cumulative_water_unit_incorrect);
3197
3198 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vlw_trip_water, "nautical miles", NULL((void*)0));
3199
3200 offset += dissect_nmea0183_field_fixed_text(tvb, pinfo, subtree, offset, hf_nmea0183_vlw_trip_water_unit,
3201 "N", &ei_nmea0183_vlw_trip_water_unit_incorrect);
3202
3203 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vlw_cumulative_ground, "nautical miles", NULL((void*)0));
3204
3205 offset += dissect_nmea0183_field_fixed_text(tvb, pinfo, subtree, offset, hf_nmea0183_vlw_cumulative_ground_unit,
3206 "N", &ei_nmea0183_vlw_cumulative_ground_unit_incorrect);
3207
3208 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vlw_trip_ground, "nautical miles", NULL((void*)0));
3209
3210 dissect_nmea0183_field_fixed_text(tvb, pinfo, subtree, offset, hf_nmea0183_vlw_trip_ground_unit,
3211 "N", &ei_nmea0183_vlw_trip_ground_unit_incorrect);
3212
3213 return tvb_captured_length(tvb);
3214}
3215
3216/* Dissect a VTG sentence. */
3217static int
3218dissect_nmea0183_sentence_vtg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3219{
3220 unsigned offset = 0;
3221
3222 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3223 NULL((void*)0), "VTG sentence - Track made good and Ground speed");
3224
3225 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vtg_true_course, "degree", NULL((void*)0));
3226
3227 offset += dissect_nmea0183_field_fixed_text(tvb, pinfo, subtree, offset, hf_nmea0183_vtg_true_course_unit,
3228 "T", &ei_nmea0183_vtg_true_course_unit_incorrect);
3229
3230 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vtg_magnetic_course, "degree", NULL((void*)0));
3231
3232 offset += dissect_nmea0183_field_fixed_text(tvb, pinfo, subtree, offset, hf_nmea0183_vtg_magnetic_course_unit,
3233 "M", &ei_nmea0183_vtg_magnetic_course_unit_incorrect);
3234
3235 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vtg_ground_speed_knot, "knot", NULL((void*)0));
3236
3237 offset += dissect_nmea0183_field_fixed_text(tvb, pinfo, subtree, offset, hf_nmea0183_vtg_ground_speed_knot_unit,
3238 "N", &ei_nmea0183_vtg_ground_speed_knot_unit_incorrect);
3239
3240 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vtg_ground_speed_kilometer, "kilometer per hour", NULL((void*)0));
3241
3242 offset += dissect_nmea0183_field_fixed_text(tvb, pinfo, subtree, offset, hf_nmea0183_vtg_ground_speed_kilometer_unit,
3243 "K", &ei_nmea0183_vtg_ground_speed_kilometer_unit_incorrect);
3244
3245 dissect_nmea0183_field_faa_mode(tvb, pinfo, subtree, offset, hf_nmea0183_vtg_mode);
3246
3247 return tvb_captured_length(tvb);
3248}
3249
3250/* Dissect a ZDA (Time & Date) sentence. The time field is split into individual parts. */
3251static int
3252dissect_nmea0183_sentence_zda(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3253{
3254 unsigned offset = 0;
3255 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3256 NULL((void*)0), "ZDA sentence - Time & Date");
3257
3258 offset += dissect_nmea0183_field_time(tvb, pinfo, subtree, offset, hf_nmea0183_zda_time,
3259 hf_nmea0183_zda_time_hour, hf_nmea0183_zda_time_minute,
3260 hf_nmea0183_zda_time_second, ett_nmea0183_zda_time);
3261
3262 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_zda_date_day, NULL((void*)0), NULL((void*)0));
3263
3264 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_zda_date_month, NULL((void*)0), NULL((void*)0));
3265
3266 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_zda_date_year, NULL((void*)0), NULL((void*)0));
3267
3268 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_zda_local_zone_hour, NULL((void*)0), NULL((void*)0));
3269
3270 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_zda_local_zone_minute, NULL((void*)0), NULL((void*)0));
3271
3272 return tvb_captured_length(tvb);
3273}
3274
3275
3276/* Dissect a single character or numeric field. Returns length including separator. */
3277static int
3278dissect_nmea0183_field_item(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int hf)
3279{
3280 if (offset > (int)tvb_captured_length(tvb))
3281 {
3282 proto_tree_add_missing_field(tree, pinfo, hf, tvb, tvb_captured_length(tvb));
3283 return 0;
3284 }
3285
3286 int end_of_field_offset = tvb_find_end_of_nmea0183_field(tvb, offset);
3287 proto_item *ti = proto_tree_add_item(tree, hf, tvb, offset, end_of_field_offset - offset, ENC_BIG_ENDIAN0x00000000);
3288 if (end_of_field_offset - offset == 0)
3289 {
3290 proto_item_append_text(ti, "[empty]");
3291 }
3292 return end_of_field_offset - offset + 1;
3293}
3294
3295/* Skip a field which is represented by an adjacent value or has no registered field. */
3296static int
3297dissect_nmea0183_field_skip(tvbuff_t *tvb, int offset)
3298{
3299 if (offset > (int)tvb_captured_length(tvb))
3300 {
3301 return 0;
3302 }
3303
3304 int end_of_field_offset = tvb_find_end_of_nmea0183_field(tvb, offset);
3305 return end_of_field_offset - offset + 1;
3306}
3307
3308/* Return the current field as a packet-scoped string without advancing the offset. */
3309static const char *
3310nmea0183_field_value(tvbuff_t *tvb, packet_info *pinfo, int offset)
3311{
3312 if (offset > (int)tvb_captured_length(tvb))
3313 {
3314 return "";
3315 }
3316
3317 int end_of_field_offset = tvb_find_end_of_nmea0183_field(tvb, offset);
3318 return (const char *)tvb_get_string_enc(pinfo->pool, tvb, offset,
3319 end_of_field_offset - offset, ENC_ASCII0x00000000);
3320}
3321
3322/* Dissect a string field and optionally return its item. */
3323static int
3324dissect_nmea0183_field_ret_item(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset,
3325 int hf, proto_item **item)
3326{
3327 if (offset > (int)tvb_captured_length(tvb))
3328 {
3329 proto_item *ti = proto_tree_add_missing_field(tree, pinfo, hf, tvb,
3330 tvb_captured_length(tvb));
3331 if (item != NULL((void*)0))
3332 {
3333 *item = ti;
3334 }
3335 return 0;
3336 }
3337
3338 int end_of_field_offset = tvb_find_end_of_nmea0183_field(tvb, offset);
3339 proto_item *ti = proto_tree_add_item(tree, hf, tvb, offset,
3340 end_of_field_offset - offset, ENC_ASCII0x00000000);
3341 if (end_of_field_offset - offset == 0)
3342 {
3343 proto_item_append_text(ti, "[empty]");
3344 }
3345 if (item != NULL((void*)0))
3346 {
3347 *item = ti;
3348 }
3349 return end_of_field_offset - offset + 1;
3350}
3351
3352/* Dissect a long-range response field and flag an empty requested value. */
3353static int
3354dissect_nmea0183_field_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset,
3355 int hf, const char *description, bool_Bool decode_time_value)
3356{
3357 const char *value;
3358 proto_item *ti;
3359 int length;
3360
3361 if (offset > (int)tvb_captured_length(tvb))
3362 {
3363 ti = proto_tree_add_missing_field(tree, pinfo, hf, tvb, tvb_captured_length(tvb));
3364 value = "";
3365 length = 0;
3366 }
3367 else
3368 {
3369 int end_of_field_offset = tvb_find_end_of_nmea0183_field(tvb, offset);
3370 length = end_of_field_offset - offset;
3371 value = (const char *)tvb_get_string_enc(pinfo->pool, tvb, offset, length, ENC_ASCII0x00000000);
3372 if (decode_time_value)
3373 {
3374 ti = proto_tree_add_string(tree, hf, tvb, offset, length,
3375 decode_time(pinfo->pool, value));
3376 }
3377 else
3378 {
3379 ti = proto_tree_add_string(tree, hf, tvb, offset, length, value);
3380 }
3381 }
3382
3383 if (value[0] == '\0')
3384 {
3385 expert_add_info_format(pinfo, ti, &ei_nmea0183_legacy_empty_response,
3386 "Empty Response Message (unavailable/not provided) - %s",
3387 description);
3388 }
3389 return length + 1;
3390}
3391
3392/* Dissect a time field and display it in a readable form. Returns length including separator. */
3393static int
3394dissect_nmea0183_field_decoded_time(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int hf)
3395{
3396 if (offset > (int)tvb_captured_length(tvb))
3397 {
3398 proto_tree_add_missing_field(tree, pinfo, hf, tvb, tvb_captured_length(tvb));
3399 return 0;
3400 }
3401
3402 int end_of_field_offset = tvb_find_end_of_nmea0183_field(tvb, offset);
3403 const char *value = (const char *)tvb_get_string_enc(pinfo->pool, tvb, offset,
3404 end_of_field_offset - offset, ENC_ASCII0x00000000);
3405 proto_tree_add_string(tree, hf, tvb, offset, end_of_field_offset - offset,
3406 decode_time(pinfo->pool, value));
3407 return end_of_field_offset - offset + 1;
3408}
3409
3410/* Dissect a date field and display it in a readable form. Returns length including separator. */
3411static int
3412dissect_nmea0183_field_decoded_date(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int hf)
3413{
3414 if (offset > (int)tvb_captured_length(tvb))
3415 {
3416 proto_tree_add_missing_field(tree, pinfo, hf, tvb, tvb_captured_length(tvb));
3417 return 0;
3418 }
3419
3420 int end_of_field_offset = tvb_find_end_of_nmea0183_field(tvb, offset);
3421 const char *value = (const char *)tvb_get_string_enc(pinfo->pool, tvb, offset,
3422 end_of_field_offset - offset, ENC_ASCII0x00000000);
3423 proto_tree_add_string(tree, hf, tvb, offset, end_of_field_offset - offset,
3424 decode_date(pinfo->pool, value));
3425 return end_of_field_offset - offset + 1;
3426}
3427
3428/* Dissect a latitude or longitude value and its direction field. */
3429static int
3430dissect_nmea0183_field_latlong(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int hf)
3431{
3432 if (offset > (int)tvb_captured_length(tvb))
3433 {
3434 proto_tree_add_missing_field(tree, pinfo, hf, tvb, tvb_captured_length(tvb));
3435 return 0;
3436 }
3437
3438 int value_end = tvb_find_end_of_nmea0183_field(tvb, offset);
3439 int direction_offset = MIN(value_end + 1, (int)tvb_captured_length(tvb))(((value_end + 1) < ((int)tvb_captured_length(tvb))) ? (value_end
+ 1) : ((int)tvb_captured_length(tvb)))
;
3440 int direction_end = tvb_find_end_of_nmea0183_field(tvb, direction_offset);
3441 const char *value = (const char *)tvb_get_string_enc(pinfo->pool, tvb, offset,
3442 value_end - offset, ENC_ASCII0x00000000);
3443 const char *direction = (const char *)tvb_get_string_enc(pinfo->pool, tvb, direction_offset,
3444 direction_end - direction_offset, ENC_ASCII0x00000000);
3445 float coordinate;
3446
3447 if (decode_latlong(value, direction, &coordinate))
3448 {
3449 proto_tree_add_float(tree, hf, tvb, offset, direction_end - offset, coordinate);
3450 }
3451 return direction_end - offset + 1;
3452}
3453
3454/* Dissect a value and its following unit field as one displayed value. */
3455static int
3456dissect_nmea0183_field_with_unit(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int hf)
3457{
3458 if (offset > (int)tvb_captured_length(tvb))
3459 {
3460 proto_tree_add_missing_field(tree, pinfo, hf, tvb, tvb_captured_length(tvb));
3461 return 0;
3462 }
3463
3464 int value_end = tvb_find_end_of_nmea0183_field(tvb, offset);
3465 int unit_offset = MIN(value_end + 1, (int)tvb_captured_length(tvb))(((value_end + 1) < ((int)tvb_captured_length(tvb))) ? (value_end
+ 1) : ((int)tvb_captured_length(tvb)))
;
3466 int unit_end = tvb_find_end_of_nmea0183_field(tvb, unit_offset);
3467 const char *value = (const char *)tvb_get_string_enc(pinfo->pool, tvb, offset,
3468 value_end - offset, ENC_ASCII0x00000000);
3469 const char *unit = (const char *)tvb_get_string_enc(pinfo->pool, tvb, unit_offset,
3470 unit_end - unit_offset, ENC_ASCII0x00000000);
3471
3472 proto_tree_add_string(tree, hf, tvb, offset, value_end - offset,
3473 field_binding(pinfo->pool, value, unit));
3474 return unit_end - offset + 1;
3475}
3476
3477/* Dissect an ASCII integer field. Returns length including separator. */
3478static int
3479dissect_nmea0183_field_uint(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int hf)
3480{
3481 uint32_t uint_value;
3482 proto_item *ti;
3483
3484 if (offset > (int)tvb_captured_length(tvb))
3485 {
3486 proto_tree_add_missing_field(tree, pinfo, hf, tvb, tvb_captured_length(tvb));
3487 return 0;
3488 }
3489
3490 int end_of_field_offset = tvb_find_end_of_nmea0183_field(tvb, offset);
3491 int length = end_of_field_offset - offset;
3492 const char *value = (const char *)tvb_get_string_enc(pinfo->pool, tvb, offset,
3493 length, ENC_ASCII0x00000000);
3494
3495 if (length == 0)
3496 {
3497 ti = proto_tree_add_uint(tree, hf, tvb, offset, length, 0);
3498 expert_add_info(pinfo, ti, &ei_nmea0183_field_missing);
3499 }
3500 else if (!ws_strtou32(value, NULL((void*)0), &uint_value))
3501 {
3502 ti = proto_tree_add_uint(tree, hf, tvb, offset, length, uint_value);
3503 expert_add_info_format(pinfo, ti, &ei_nmea0183_field_uint_invalid,
3504 "Invalid unsigned integer: %s", value);
3505 }
3506 else
3507 {
3508 proto_tree_add_uint(tree, hf, tvb, offset, length, uint_value);
3509 }
3510
3511 return length + 1;
3512}
3513
3514/* Add a satellite-system classification by parsing an ASCII PRN as a decimal number. */
3515static proto_item *
3516dissect_nmea0183_satellite_type(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
3517 int offset, int length, int hf, const char *value)
3518{
3519 uint32_t prn;
3520 proto_item *ti;
3521
3522 if (value[0] == '\0')
3523 {
3524 return NULL((void*)0);
3525 }
3526
3527 if (!ws_strtou32(value, NULL((void*)0), &prn) || prn > UINT16_MAX(65535))
3528 {
3529 ti = proto_tree_add_uint(tree, hf, tvb, offset, length, prn);
3530 expert_add_info_format(pinfo, ti, &ei_nmea0183_sat_prn_invalid,
3531 "Invalid satellite PRN: %s", value);
3532 return ti;
3533 }
3534
3535 return proto_tree_add_uint(tree, hf, tvb, offset, length, prn);
3536}
3537
3538static int
3539dissect_nmea0183_sentence_aam(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3540{
3541 unsigned offset = 0;
3542
3543 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3544 NULL((void*)0), "AAM sentence - Waypoint Arrival Alarm");
3545 /* Arrival Circle Status */
3546 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_aam_arr_circle_status);
3547
3548 /* Perpendicular Pass Status */
3549 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_aam_perp_status);
3550
3551 /* Arrival Circle Radius */
3552 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_aam_arr_circle_radius, NULL((void*)0), NULL((void*)0));
3553
3554 /* Units of Radius (NM) */
3555 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_aam_units_radius);
3556
3557 /* Waypoint ID */
3558 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_aam_waypoint, NULL((void*)0), NULL((void*)0));
3559
3560 return tvb_captured_length(tvb);
3561}
3562
3563static int
3564dissect_nmea0183_sentence_abk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3565{
3566 unsigned offset = 0;
3567
3568 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3569 NULL((void*)0), "ABK sentence - UAIS Addressed and Binary Broadcast Acknowledgement");
3570 /* MMSI of the Addressed AIS Unit */
3571 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_abk_mmsi, NULL((void*)0), NULL((void*)0));
3572
3573 /* AIS Channel of Reception (either A or B) */
3574 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_abk_ais_channel);
3575
3576 /* ITU-R M.1371 Message ID */
3577 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_abk_msg_id, NULL((void*)0), NULL((void*)0));
3578
3579 /* Message Sequence Number */
3580 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_abk_msg_seq, NULL((void*)0), NULL((void*)0));
3581
3582 /* Type of Acknowledgement */
3583 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_abk_ack_type);
3584
3585 return tvb_captured_length(tvb);
3586}
3587
3588static int
3589dissect_nmea0183_sentence_aca(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3590{
3591 unsigned offset = 0;
3592
3593 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3594 NULL((void*)0), "ACA sentence - UAIS Regional Channel Assignment Message");
3595
3596 /* Sequence Number */
3597 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_aca_seq_num, NULL((void*)0), NULL((void*)0));
3598
3599 /* Region Northeast Corner Latitude */
3600 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_aca_ne_clat);
3601
3602 /* Region Northeast Corner Longitude */
3603 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_aca_ne_clong);
3604
3605 /* Region Southwest Corner Latitude */
3606 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_aca_sw_clat);
3607
3608 /* Region Southwest Corner Longitude */
3609 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_aca_sw_clong);
3610
3611 /* Transition Zone Size (1 to 8 nm) */
3612 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_aca_zone_size, NULL((void*)0), NULL((void*)0));
3613
3614 /* Channel A */
3615 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_aca_chan_a, NULL((void*)0), NULL((void*)0));
3616
3617 /* Channel A Bandwidth */
3618 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_aca_chan_a_bw);
3619
3620 /* Channel B */
3621 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_aca_chan_b, NULL((void*)0), NULL((void*)0));
3622
3623 /* Channel B Bandwidth */
3624 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_aca_chan_b_bw);
3625
3626 /* Tx/Rx Mode Control */
3627 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_aca_txrx_mode);
3628
3629 /* Power Level Control */
3630 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_aca_power);
3631
3632 /* Information Source */
3633 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_aca_info_src);
3634
3635 /* In-use Flag */
3636 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_aca_inuse);
3637
3638 /* Time of "in-use" Change */
3639 dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_aca_inuse_change);
3640
3641 return tvb_captured_length(tvb);
3642}
3643
3644static int
3645dissect_nmea0183_sentence_ack(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3646{
3647 unsigned offset = 0;
3648
3649 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3650 NULL((void*)0), "ACK sentence - Alarm Acknowledgement");
3651 /* Unique Alarm Number (Identifier) at Alarm Source */
3652 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ack_alarm_id, NULL((void*)0), NULL((void*)0));
3653
3654 return tvb_captured_length(tvb);
3655}
3656
3657static int
3658dissect_nmea0183_sentence_acs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3659{
3660 unsigned offset = 0;
3661
3662 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3663 NULL((void*)0), "ACS sentence - Arco Solar Inc.");
3664
3665 /* Sequence Number */
3666 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_acs_seq_num, NULL((void*)0), NULL((void*)0));
3667
3668 /* MMSI of Originator */
3669 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_acs_mmsi, NULL((void*)0), NULL((void*)0));
3670
3671 /* UTC of Receipt of Channel Management Information */
3672 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_acs_utc);
3673
3674 /* Day, 01 to 31 (UTC) */
3675 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_acs_day, NULL((void*)0), NULL((void*)0));
3676
3677 /* Month, 01 to 12 (UTC) */
3678 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_acs_month, NULL((void*)0), NULL((void*)0));
3679
3680 /* Year (UTC) */
3681 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_acs_year, NULL((void*)0), NULL((void*)0));
3682
3683 return tvb_captured_length(tvb);
3684}
3685
3686static int
3687dissect_nmea0183_sentence_air(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3688{
3689 unsigned offset = 0;
3690
3691 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3692 NULL((void*)0), "AIR sentence - UAIS Interrogation Request");
3693 /* MMSI of Interrogated Station #1 */
3694 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_air_mmsi_is1, NULL((void*)0), NULL((void*)0));
3695
3696 /* ITU-R M.1371 Message #1 Requested from Station #1 */
3697 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_air_msg_req, NULL((void*)0), NULL((void*)0));
3698
3699 /* Message #1 Sub-Section from Station #1 */
3700 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_air_msg_sub, NULL((void*)0), NULL((void*)0));
3701
3702 /* ITU-R M.1371 Message #2 Requested from Station #1 */
3703 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_air_msg2_req, NULL((void*)0), NULL((void*)0));
3704
3705 /* Message #2 Sub-Section from Station #1 */
3706 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_air_msg2_sub, NULL((void*)0), NULL((void*)0));
3707
3708 /* MMSI of Interrogated Station #2 */
3709 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_air_mmsi_is2, NULL((void*)0), NULL((void*)0));
3710
3711 /* ITU-R M.1371 Message #1 Requested from Station #2 */
3712 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_air_msg_req_is2, NULL((void*)0), NULL((void*)0));
3713
3714 /* Message #1 Sub-Section from Station #2 */
3715 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_air_msg_sub_is2, NULL((void*)0), NULL((void*)0));
Value stored to 'offset' is never read
3716
3717 return tvb_captured_length(tvb);
3718}
3719
3720static int
3721dissect_nmea0183_sentence_akd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3722{
3723 unsigned offset = 0;
3724 const char *value;
3725
3726 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3727 NULL((void*)0), "AKD sentence - Acknowledge Detail Alarm Condition");
3728
3729 /* UTC of Time Acknowledgement */
3730 value = nmea0183_field_value(tvb, pinfo, offset);
3731 if (value[0] == '\0')
3732 {
3733 /* May be NULL */
3734 proto_tree_add_string(subtree, hf_nmea0183_akd_utc, tvb, offset, 0, "Time omitted");
3735 offset += dissect_nmea0183_field_skip(tvb, offset);
3736 }
3737 else
3738 {
3739 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset,
3740 hf_nmea0183_akd_utc);
3741 }
3742
3743 /* System Indicator of Original Alarm Source */
3744 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
3745 hf_nmea0183_akd_sys_indicator_orig, NULL((void*)0),
3746 system_equipment_vals);
3747
3748 /* Subsystem Equipment Indicator of Original Alarm Source */
3749 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
3750 hf_nmea0183_akd_subsys_indicator_orig, NULL((void*)0),
3751 subsystem_equipment_vals);
3752
3753 /* Instance number of Equipment Unit/Item */
3754 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_akd_inst_num_orig, NULL((void*)0), NULL((void*)0));
3755
3756 /* Type of Alarm */
3757 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_akd_alarm_type, NULL((void*)0), NULL((void*)0));
3758
3759 /* System Indicator of the System Sending the Acknowledgement */
3760 value = nmea0183_field_value(tvb, pinfo, offset);
3761 if (value[0] == '\0')
3762 {
3763 /* May be NULL - this is a table lookup so if it's not there we'll skip past it */
3764 offset += dissect_nmea0183_field_skip(tvb, offset);
3765 }
3766 else
3767 {
3768 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
3769 hf_nmea0183_akd_sys_indicator_send, NULL((void*)0),
3770 system_equipment_vals);
3771 }
3772
3773 /* Subsystem Indicator of the System Sending the Acknowledgement */
3774 value = nmea0183_field_value(tvb, pinfo, offset);
3775 if (value[0] == '\0')
3776 {
3777 /* May be NULL - this is a table lookup so if it's not there we'll skip past it */
3778 offset += dissect_nmea0183_field_skip(tvb, offset);
3779 }
3780 else
3781 {
3782 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
3783 hf_nmea0183_akd_sybsys_indicator_send, NULL((void*)0),
3784 subsystem_equipment_vals);
3785 }
3786
3787 /* Instance of Equipment/Unit/Item Sending the Acknowledgement */
3788 value = nmea0183_field_value(tvb, pinfo, offset);
3789 if (value[0] != '\0')
3790 {
3791 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_akd_inst_num_send, NULL((void*)0), NULL((void*)0));
3792 }
3793
3794 return tvb_captured_length(tvb);
3795}
3796
3797static int
3798dissect_nmea0183_sentence_ala(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3799{
3800 unsigned offset = 0;
3801
3802 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3803 NULL((void*)0), "ALA sentence - Set Detail Alarm Condition");
3804
3805 /* Event Time */
3806 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_ala_time);
3807
3808 /* System Indicator */
3809 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
3810 hf_nmea0183_ala_sys_indicator, NULL((void*)0),
3811 system_equipment_vals);
3812
3813 /* Subsystem Indicator */
3814 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
3815 hf_nmea0183_ala_subsys_indicator, NULL((void*)0),
3816 subsystem_equipment_vals);
3817
3818 /* Instance Number of Equipment/Unit/Item */
3819 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ala_inst_num, NULL((void*)0), NULL((void*)0));
3820
3821 /* Type of Alarm */
3822 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ala_alarm_type, NULL((void*)0), NULL((void*)0));
3823
3824 /* Alarm's Condition */
3825 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_ala_alarm_cond);
3826
3827 /* Alarm's Acknowledged State */
3828 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_ala_alarm_ack_state);
3829
3830 /* Alarm's Description Text */
3831 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ala_alarm_text, NULL((void*)0), NULL((void*)0));
3832
3833 return tvb_captured_length(tvb);
3834}
3835
3836static int
3837dissect_nmea0183_sentence_alm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3838{
3839 unsigned offset = 0;
3840
3841 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3842 NULL((void*)0), "ALM sentence - GPS Almanac Data");
3843 /* Total Number of Sentences */
3844 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_alm_sent_tot, NULL((void*)0), NULL((void*)0));
3845
3846 /* Sentence Number */
3847 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_alm_sent_num, NULL((void*)0), NULL((void*)0));
3848
3849 /* Satellite PRN Number, 01 to 32 */
3850 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_alm_sat_prn, NULL((void*)0), NULL((void*)0));
3851
3852 /* GPS Week Number */
3853 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_alm_gps_week, NULL((void*)0), NULL((void*)0));
3854
3855 /* SV Health, Bits 17-24 of Each Almanac Page */
3856 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_alm_sv_health, NULL((void*)0), NULL((void*)0));
3857
3858 /* All the following fields require the scaling factors and units table */
3859
3860 /* e, Eccentricity */
3861 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_alm_eccent, NULL((void*)0), NULL((void*)0));
3862
3863 /* t(oa), Almanac Reference Time */
3864 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_alm_alm_ref_time, NULL((void*)0), NULL((void*)0));
3865
3866 /* (sigma), Inclination Angle */
3867 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_alm_incl_angle, NULL((void*)0), NULL((void*)0));
3868
3869 /* OMEGADOT, Rate of Right Ascension */
3870 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_alm_rate_right_asc, NULL((void*)0), NULL((void*)0));
3871
3872 /* root(A), Root of Semi-Major Axis */
3873 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_alm_root_sm_axis, NULL((void*)0), NULL((void*)0));
3874
3875 /* OMEGA, Argument of Perigee */
3876 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_alm_arg_perigee, NULL((void*)0), NULL((void*)0));
3877
3878 /* (OMEGA)(o), Longitude of Ascension Node */
3879 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_alm_long_asc_node, NULL((void*)0), NULL((void*)0));
3880
3881 /* M(o), Mean Anomaly */
3882 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_alm_mean_anomaly, NULL((void*)0), NULL((void*)0));
3883
3884 /* a(f0), Clock Parameter */
3885 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_alm_af0_clock_param, NULL((void*)0), NULL((void*)0));
3886
3887 /* a(f1), clock Parameter */
3888 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_alm_af1_clock_param, NULL((void*)0), NULL((void*)0));
3889
3890 return tvb_captured_length(tvb);
3891}
3892
3893static int
3894dissect_nmea0183_sentence_apb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3895{
3896 unsigned offset = 0;
3897 const char *value;
3898
3899 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3900 NULL((void*)0), "APB sentence - Autopilot Sentence B");
3901
3902 /* Data Valid or Loran-C Blink or SNR Warning */
3903 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_loranc_blink_snr_warning);
3904
3905 /* Data Valid or not used / Loran-C Cycle Lock Warning Flag */
3906 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_apb_cycle_lock_warning);
3907
3908 /* Magnitude of XTE (cross-track-error) */
3909 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_apb_mag_xte, NULL((void*)0), NULL((void*)0));
3910
3911 /* Direction to Steer, L/R */
3912 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_apb_dir_steer);
3913
3914 /* XTE units, nautical miles */
3915 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_apb_xte_units);
3916
3917 /* Status: A = arrival cricle entered */
3918 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_apb_arr_circle_status);
3919
3920 /* Status: A = perpendicular passed at waypoint */
3921 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_apb_perp_status);
3922
3923 /* Bearing Origin to Destination, M/T */
3924 offset += dissect_nmea0183_field_with_unit(tvb, pinfo, subtree, offset, hf_nmea0183_apb_bearing_origin);
3925
3926 /* Destination Waypoint ID */
3927 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_apb_waypoint_id, NULL((void*)0), NULL((void*)0));
3928
3929 /* Bearing, Present Position to Destination, Magnetic or True */
3930 offset += dissect_nmea0183_field_with_unit(tvb, pinfo, subtree, offset, hf_nmea0183_apb_bearing_present);
3931
3932 /* Heading-to-steer to Destination Waypoint, Magnetic or True */
3933 value = nmea0183_field_value(tvb, pinfo, offset);
3934 if (value[0] == '\0')
3935 {
3936 proto_tree_add_string(subtree, hf_nmea0183_apb_heading_steer, tvb, offset, 0,
3937 "Data unavailable");
3938 offset += dissect_nmea0183_field_skip(tvb, offset);
3939 offset += dissect_nmea0183_field_skip(tvb, offset);
3940 }
3941 else
3942 {
3943 offset += dissect_nmea0183_field_with_unit(tvb, pinfo, subtree, offset,
3944 hf_nmea0183_apb_heading_steer);
3945 }
3946
3947 /* Mode Indicator */
3948 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_apb_mode);
3949
3950 return tvb_captured_length(tvb);
3951}
3952
3953static int
3954dissect_nmea0183_sentence_bec(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3955{
3956 unsigned offset = 0;
3957
3958 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3959 NULL((void*)0), "BEC sentence - Boat Electric Corporation");
3960
3961 /* UTC of Observation */
3962 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_bec_utc);
3963
3964 /* Waypoint Latitude */
3965 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_bec_latitude);
3966
3967 /* Waypoint Longitude */
3968 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_bec_longitude);
3969
3970 /* Bearing, degrees True */
3971 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bec_bearing_true, NULL((void*)0), NULL((void*)0));
3972 offset += dissect_nmea0183_field_skip(tvb, offset);
3973
3974 /* Bearing, degrees Magnetic */
3975 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bec_bearing_mag, NULL((void*)0), NULL((void*)0));
3976 offset += dissect_nmea0183_field_skip(tvb, offset);
3977
3978 /* Distance (nm) */
3979 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bec_distance, NULL((void*)0), NULL((void*)0));
3980 offset += dissect_nmea0183_field_skip(tvb, offset);
3981
3982 /* Waypoint ID */
3983 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bec_waypoint, NULL((void*)0), NULL((void*)0));
3984
3985 return tvb_captured_length(tvb);
3986}
3987
3988static int
3989dissect_nmea0183_sentence_bod(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3990{
3991 unsigned offset = 0;
3992
3993 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
3994 NULL((void*)0), "BOD sentence - Bearing - Waypoint to Waypoint");
3995 /* Bearing, degrees True */
3996 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bod_bearing_true, NULL((void*)0), NULL((void*)0));
3997 offset += dissect_nmea0183_field_skip(tvb, offset);
3998
3999 /* Bearing, degrees Magnetic */
4000 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bod_bearing_mag, NULL((void*)0), NULL((void*)0));
4001 offset += dissect_nmea0183_field_skip(tvb, offset);
4002
4003 /* Destination Waypoint ID */
4004 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bod_dest_waypoint, NULL((void*)0), NULL((void*)0));
4005
4006 /* Origin Waypoint ID */
4007 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bod_orig_waypoint, NULL((void*)0), NULL((void*)0));
4008
4009 return tvb_captured_length(tvb);
4010}
4011
4012static int
4013dissect_nmea0183_sentence_bwc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4014{
4015 unsigned offset = 0;
4016
4017 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4018 NULL((void*)0), "BWC sentence - Bearing & Distance to Waypoint - Great Circle");
4019
4020 /* UTC of Observation */
4021 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_bwc_utc);
4022
4023 /* Waypoint Latitude */
4024 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_bwc_latitude);
4025
4026 /* Waypoint Longitude */
4027 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_bwc_longitude);
4028
4029 /* Bearing, degrees True */
4030 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bwc_bearing_true, NULL((void*)0), NULL((void*)0));
4031 offset += dissect_nmea0183_field_skip(tvb, offset);
4032
4033 /* Bearing, degrees Magnetic */
4034 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bwc_bearing_mag, NULL((void*)0), NULL((void*)0));
4035 offset += dissect_nmea0183_field_skip(tvb, offset);
4036
4037 /* Distance (nm) */
4038 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bwc_distance, NULL((void*)0), NULL((void*)0));
4039 offset += dissect_nmea0183_field_skip(tvb, offset);
4040
4041 /* Waypoint ID */
4042 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bwc_waypoint, NULL((void*)0), NULL((void*)0));
4043
4044 /* Mode Indicator */
4045 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_bwc_mode);
4046
4047 return tvb_captured_length(tvb);
4048}
4049
4050static int
4051dissect_nmea0183_sentence_bwr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4052{
4053 unsigned offset = 0;
4054
4055 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4056 NULL((void*)0), "BWR sentence - Bearing and Distance to Waypoint - Rhumb Line");
4057
4058 /* UTC of Observation */
4059 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_bwr_utc);
4060
4061 /* Waypoint Latitude */
4062 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_bwr_latitude);
4063
4064 /* Waypoint Longitude */
4065 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_bwr_longitude);
4066
4067 /* Bearing, degrees True */
4068 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bwr_bearing_true, NULL((void*)0), NULL((void*)0));
4069 offset += dissect_nmea0183_field_skip(tvb, offset);
4070
4071 /* Bearing, degrees Magnetic */
4072 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bwr_bearing_mag, NULL((void*)0), NULL((void*)0));
4073 offset += dissect_nmea0183_field_skip(tvb, offset);
4074
4075 /* Distance (nm) */
4076 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bwr_distance, NULL((void*)0), NULL((void*)0));
4077 offset += dissect_nmea0183_field_skip(tvb, offset);
4078
4079 /* Waypoint ID */
4080 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bwr_waypoint, NULL((void*)0), NULL((void*)0));
4081
4082 /* Mode Indicator */
4083 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_bwr_mode);
4084
4085 return tvb_captured_length(tvb);
4086}
4087
4088static int
4089dissect_nmea0183_sentence_bww(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4090{
4091 unsigned offset = 0;
4092
4093 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4094 NULL((void*)0), "BWW sentence - Bearing - Waypoint to Waypoint");
4095 /* Bearing, degrees True */
4096 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bww_bearing_true, NULL((void*)0), NULL((void*)0));
4097 offset += dissect_nmea0183_field_skip(tvb, offset);
4098
4099 /* Bearing, degrees Magnetic */
4100 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bww_bearing_mag, NULL((void*)0), NULL((void*)0));
4101 offset += dissect_nmea0183_field_skip(tvb, offset);
4102
4103 /* TO Waypoint ID */
4104 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bww_to_waypoint, NULL((void*)0), NULL((void*)0));
4105
4106 /* FROM Waypoint ID */
4107 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_bww_from_waypoint, NULL((void*)0), NULL((void*)0));
4108
4109 return tvb_captured_length(tvb);
4110}
4111
4112static int
4113dissect_nmea0183_sentence_cbr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4114{
4115 unsigned offset = 0;
4116
4117 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4118 NULL((void*)0), "CBR sentence - Configure Broadcast Rates for AIS AtoN Station Message Command");
4119 /* MMSI */
4120 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_cbr_mmsi, NULL((void*)0), NULL((void*)0));
4121
4122 /* Message ID */
4123 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_cbr_msg_id, NULL((void*)0), NULL((void*)0));
4124
4125 /* Message ID Index */
4126 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_cbr_msd_id_index, NULL((void*)0), NULL((void*)0));
4127
4128 /* Start UTC Hour, Channel A */
4129 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_cbr_hr_chan_a, NULL((void*)0), NULL((void*)0));
4130
4131 /* Start UTC Minute, Channel A */
4132 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_cbr_min_chan_a, NULL((void*)0), NULL((void*)0));
4133
4134 /* Start Slot, Channel A */
4135 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_cbr_slot_chan_a, NULL((void*)0), NULL((void*)0));
4136
4137 /* Slot Interval, Channel A */
4138 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_cbr_interv_chan_a, NULL((void*)0), NULL((void*)0));
4139
4140 /* FATDMA or RATDMA/CSTDMA Setup */
4141 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_cbr_setup);
4142
4143 /* Start UTC Hour, Channel B */
4144 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_cbr_hr_chan_b, NULL((void*)0), NULL((void*)0));
4145
4146 /* Start UTC Minute, Channel B */
4147 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_cbr_min_chan_b, NULL((void*)0), NULL((void*)0));
4148
4149 /* Start Slot, Channel B */
4150 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_cbr_slot_chan_b, NULL((void*)0), NULL((void*)0));
4151
4152 /* Slot Interval, Channel B */
4153 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_cbr_interv_chan_b, NULL((void*)0), NULL((void*)0));
4154
4155 /* Sentence Status Flag */
4156 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_cbr_status);
4157
4158 return tvb_captured_length(tvb);
4159}
4160
4161static int
4162dissect_nmea0183_sentence_cur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4163{
4164 unsigned offset = 0;
4165
4166 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4167 NULL((void*)0), "CUR sentence - Water Current Layer");
4168 /* Validity of the Data */
4169 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_cur_validity);
4170
4171 /* Data Set Number */
4172 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_cur_data_set, NULL((void*)0), NULL((void*)0));
4173
4174 /* Layer Number */
4175 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_cur_layer, NULL((void*)0), NULL((void*)0));
4176
4177 /* Current Depth in meters */
4178 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_cur_depth, NULL((void*)0), NULL((void*)0));
4179
4180 /* Current Direction in degrees */
4181 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_cur_direction, NULL((void*)0), NULL((void*)0));
4182
4183 /* Direction Reference in use (True/Relative) */
4184 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_cur_direction_ref);
4185
4186 /* Current Speed in knots */
4187 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_cur_speed, NULL((void*)0), NULL((void*)0));
4188
4189 /* Reference Layer Depth in meters */
4190 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_cur_ref_layer, NULL((void*)0), NULL((void*)0));
4191
4192 /* Heading */
4193 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_cur_heading, NULL((void*)0), NULL((void*)0));
4194
4195 /* Heading Reference in use (True/Magnetic) */
4196 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_cur_heading_ref);
4197
4198 /* Speed Reference */
4199 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_cur_speed_ref);
4200
4201 return tvb_captured_length(tvb);
4202}
4203
4204static int
4205dissect_nmea0183_sentence_dbt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4206{
4207 unsigned offset = 0;
4208
4209 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4210 NULL((void*)0), "DBT sentence - Echosounder - Depth Below Transducer");
4211
4212 /* Water Depth (feet) */
4213 offset += dissect_nmea0183_field_with_unit(tvb, pinfo, subtree, offset, hf_nmea0183_dbt_feet);
4214
4215 /* Water Depth (meters) */
4216 offset += dissect_nmea0183_field_with_unit(tvb, pinfo, subtree, offset, hf_nmea0183_dbt_meters);
4217
4218 /* Water Depth (fathoms) */
4219 dissect_nmea0183_field_with_unit(tvb, pinfo, subtree, offset, hf_nmea0183_dbt_fathoms);
4220
4221 return tvb_captured_length(tvb);
4222}
4223
4224static int
4225dissect_nmea0183_sentence_dcn(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4226{
4227 unsigned offset = 0;
4228
4229 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4230 NULL((void*)0), "DCN sentence - DECCA Position");
4231 /* Decca Chain Identifier */
4232 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dcn_dc_id, NULL((void*)0), NULL((void*)0));
4233
4234 /* Red Zone Identifier, Number-Letter */
4235 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dcn_rz_id, NULL((void*)0), NULL((void*)0));
4236
4237 /* Red Line of Position (LOP) */
4238 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dcn_rlop, NULL((void*)0), NULL((void*)0));
4239
4240 /* Status: Red-Master Line */
4241 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_dcn_rstatus);
4242
4243 /* Green Zone Identifier, Number-Letter */
4244 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dcn_gz_id, NULL((void*)0), NULL((void*)0));
4245
4246 /* Green LOP */
4247 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dcn_glop, NULL((void*)0), NULL((void*)0));
4248
4249 /* Status: Green-Master Line */
4250 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_dcn_gstatus);
4251
4252 /* Purple Zone Identifier, Number-Letter */
4253 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dcn_pz_id, NULL((void*)0), NULL((void*)0));
4254
4255 /* Purple LOP */
4256 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dcn_plop, NULL((void*)0), NULL((void*)0));
4257
4258 /* Status: Purple-Master Line */
4259 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_dcn_pstatus);
4260
4261 /* Red-line Navigation Use */
4262 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_dcn_rnav);
4263
4264 /* Green-line Navigation Use */
4265 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_dcn_gnav);
4266
4267 /* Purple-line Navigation Use */
4268 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_dcn_pnav);
4269
4270 /* Position Uncertainty (nm) */
4271 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dcn_pos_uncertainty, NULL((void*)0), NULL((void*)0));
4272
4273 /* Fix Data Basis */
4274 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_dcn_data_basis);
4275
4276 return tvb_captured_length(tvb);
4277}
4278
4279static int
4280dissect_nmea0183_sentence_ddc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4281{
4282 unsigned offset = 0;
4283
4284 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4285 NULL((void*)0), "DDC sentence - Display Dimming Control");
4286 /* Display Dimming Preset */
4287 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_ddc_dimming);
4288
4289 /* Brightness Percentage (00 to 99) */
4290 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ddc_brightness, NULL((void*)0), NULL((void*)0));
4291
4292 /* Color Palette */
4293 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_ddc_palette);
4294
4295 /* Sentence Status Flag */
4296 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_ddc_status);
4297
4298 return tvb_captured_length(tvb);
4299}
4300
4301static int
4302dissect_nmea0183_sentence_dor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4303{
4304 unsigned offset = 0;
4305 const char *message_type;
4306
4307 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4308 NULL((void*)0), "DOR sentence - Door Status Detection");
4309
4310 /* Message Type */
4311 message_type = nmea0183_field_value(tvb, pinfo, offset);
4312 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_dor_msg_type);
4313
4314 /* Event Time (UTC) - may be NULL */
4315 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset,
4316 hf_nmea0183_dor_time);
4317
4318 /* Type of Door Monitoring System */
4319 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
4320 hf_nmea0183_dor_system_type, NULL((void*)0),
4321 door_mon_sys_type_vals);
4322
4323 /* First Division Indicator */
4324 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
4325 hf_nmea0183_dor_first_indic, NULL((void*)0), NULL((void*)0));
4326
4327 /* Second Division Indicator */
4328 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
4329 hf_nmea0183_dor_second_indic, NULL((void*)0), NULL((void*)0));
4330
4331 /* If Message Type is 'S' then it represents number of open or faulty doors.
4332 * If Message Type is 'E' then it represents the door number.
4333 * If Message Type is 'F' then this field is NULL so just continue */
4334 if (strcmp(message_type, "S") == 0)
4335 {
4336 /* Count of Open/Faulty Doors */
4337 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
4338 hf_nmea0183_dor_open_count, NULL((void*)0), NULL((void*)0));
4339 }
4340 else if (strcmp(message_type, "E") == 0)
4341 {
4342 /* Door Number */
4343 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
4344 hf_nmea0183_dor_door_num, NULL((void*)0), NULL((void*)0));
4345 }
4346 else
4347 {
4348 /* Message Type is "F" so this field is NULL so offset and continue */
4349 offset += dissect_nmea0183_field_skip(tvb, offset);
4350 }
4351
4352 /* Door Status */
4353 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_dor_status);
4354
4355 /* Watertight Door Switch Setting */
4356 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_dor_setting);
4357
4358 /* Message Description Text */
4359 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dor_text, NULL((void*)0), NULL((void*)0));
4360
4361 return tvb_captured_length(tvb);
4362}
4363
4364static int
4365dissect_nmea0183_sentence_dsc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4366{
4367 unsigned offset = 0;
4368
4369 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4370 NULL((void*)0), "DSC sentence - Dynascan Corporation");
4371 /* Format Specifier */
4372 /* TODO: Set up ITU-R M.493 Table 3 and map to two least-significant bits */
4373 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsc_format, NULL((void*)0), NULL((void*)0));
4374
4375 /* Address (i.e., MMSI for the station to be called or
4376 * the MMSI of the calling station in a received call */
4377 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsc_address, NULL((void*)0), NULL((void*)0));
4378
4379 /* Category */
4380 /* TODO: Set up ITU-R M.493 Table 3 and map to two least-significant bits */
4381 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsc_category, NULL((void*)0), NULL((void*)0));
4382
4383 /* Nature of Distress or First Telecommand */
4384 /* TODO: Set up ITU-R M.493 Table 3 and map to two least-significant bits */
4385 /* Nature of Distress is used here ONLY for distress calls */
4386 /* TODO: Probably ought to use an if/else statement with two separate fields here */
4387 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsc_first_tcmd, NULL((void*)0), NULL((void*)0));
4388
4389 /* Type of Communication or Second Telecommand */
4390 /* TODO: Set up ITU-R M.493 Table 3 and map to two least-significant bits */
4391 /* Type of Communication is used here ONLY for:
4392 * (1) Distress
4393 * (2) Distress Acknowledgement
4394 * (3) Distress Relay
4395 * (4) Distress Relay Acknowledgement */
4396 /* TODO: Probably ought to use an if/else statement with two separate fields here */
4397 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsc_comm_type, NULL((void*)0), NULL((void*)0));
4398
4399 /* Position or Channel/Frequency */
4400 /* TODO: Set up ITU-R M.493 Paragraph 8.1.2 table for Position Message */
4401 /* TODO: Set up ITU-R M.493 Table 13 for Channel/Frequency Message */
4402 /* TODO: Probably ought to use an if/else statement with two separate fields here */
4403 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsc_position, NULL((void*)0), NULL((void*)0));
4404
4405 /* Time or Telephone Number */
4406 /* Time is HHMM format and in UTC */
4407 /* Telephone Number is 16 digits max., odd/even information inserted by DSC equipment */
4408 /* TODO: Probably ought to use an if/else statement with two separate fields here */
4409 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsc_time, NULL((void*)0), NULL((void*)0));
4410
4411 /* MMSI of Ship in Distress */
4412 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsc_mmsi, NULL((void*)0), NULL((void*)0));
4413
4414 /* Nature of Distress */
4415 /* TODO: Set up ITU-R M.493 Table 3 and map to two least-significant bits */
4416 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsc_nature_distress, NULL((void*)0), NULL((void*)0));
4417
4418 /* Acknowledgement */
4419 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_dsc_ack);
4420
4421 /* Expansion Indicator */
4422 /* TODO: Write code to account for expanded messages when this is set to 'E' */
4423 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsc_expansion, NULL((void*)0), NULL((void*)0));
4424
4425 return tvb_captured_length(tvb);
4426}
4427
4428static int
4429dissect_nmea0183_sentence_dse(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4430{
4431 unsigned offset = 0;
4432
4433 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4434 NULL((void*)0), "DSE sentence - Extended DSC");
4435 /* Total Number of Sentences */
4436 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dse_total_sentences, NULL((void*)0), NULL((void*)0));
4437
4438 /* Sentence Number */
4439 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dse_sentence_number, NULL((void*)0), NULL((void*)0));
4440
4441 /* Query/Reply Flag */
4442 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_dse_flag);
4443
4444 /* Vessel MMSI */
4445 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dse_mmsi, NULL((void*)0), NULL((void*)0));
4446
4447 /* TODO: This is a loop - can be a lot of "Data sets" comprised of a code field and data field */
4448 /* Code Field */
4449 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dse_code, NULL((void*)0), NULL((void*)0));
4450
4451 /* Data Field */
4452 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dse_data, NULL((void*)0), NULL((void*)0));
4453
4454 return tvb_captured_length(tvb);
4455}
4456
4457static int
4458dissect_nmea0183_sentence_dsi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4459{
4460 unsigned offset = 0;
4461
4462 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4463 NULL((void*)0), "DSI sentence - DSC Transponder Initiate");
4464 /* Total Number of Sentences */
4465 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsi_total_sentences, NULL((void*)0), NULL((void*)0));
4466
4467 /* Sentence Number */
4468 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsi_sentence_number, NULL((void*)0), NULL((void*)0));
4469
4470 /* Vessel MMSI */
4471 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsi_mmsi, NULL((void*)0), NULL((void*)0));
4472
4473 /* Vessel Course, degrees True */
4474 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsi_course, NULL((void*)0), NULL((void*)0));
4475
4476 /* Vessel Type */
4477 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsi_type, NULL((void*)0), NULL((void*)0));
4478
4479 /* Geographic Area, 0.01 minutes */
4480 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsi_geo_area, NULL((void*)0), NULL((void*)0));
4481
4482 /* TODO: The next two fields are part of a 1-to-n loop of "Command Sets" */
4483 /* Symbol Field */
4484 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsi_symbol, NULL((void*)0), NULL((void*)0));
4485
4486 /* Information Field */
4487 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsi_info, NULL((void*)0), NULL((void*)0));
4488
4489 /* TODO: Account for expanded messages when this is set to 'E' */
4490 /* Expansion Indicator */
4491 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsi_expansion, NULL((void*)0), NULL((void*)0));
4492
4493 return tvb_captured_length(tvb);
4494}
4495
4496static int
4497dissect_nmea0183_sentence_dsr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4498{
4499 unsigned offset = 0;
4500
4501 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4502 NULL((void*)0), "DSR sentence - DSC Transponder Response");
4503 /* Total Number of Sentences */
4504 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsr_total_sentences, NULL((void*)0), NULL((void*)0));
4505
4506 /* Sentence Number */
4507 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsr_sentence_number, NULL((void*)0), NULL((void*)0));
4508
4509 /* Vessel MMSI */
4510 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsr_mmsi, NULL((void*)0), NULL((void*)0));
4511
4512 /* TODO: The next two fields are part of a 1-to-n loop of "Command Sets" */
4513 /* Symbol Field */
4514 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsr_symbol, NULL((void*)0), NULL((void*)0));
4515
4516 /* Information Field */
4517 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsr_info, NULL((void*)0), NULL((void*)0));
4518
4519 /* TODO: Account for expanded messages when this is set to 'E' */
4520 /* Expansion Indicator */
4521 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dsr_expansion, NULL((void*)0), NULL((void*)0));
4522
4523 return tvb_captured_length(tvb);
4524}
4525
4526static int
4527dissect_nmea0183_sentence_dtm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4528{
4529 unsigned offset = 0;
4530 const char *datum_code;
4531 const char *value;
4532
4533 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4534 NULL((void*)0), "DTM sentence - Datum Reference");
4535
4536 /* Datum Code */
4537 value = nmea0183_field_value(tvb, pinfo, offset);
4538 datum_code = try_str_to_str(value, datum_vals);
4539 proto_tree_add_string(subtree, hf_nmea0183_dtm_datum, tvb, offset, (int)strlen(value),
4540 datum_code ? datum_code : "Unknown Datum/Unavailable");
4541 offset += dissect_nmea0183_field_skip(tvb, offset);
4542
4543 /* Datum Subdivision Code */
4544 /* TODO: Create table from IHO Publication S-60 Appendices B and C, perhaps in a separate file due to size */
4545 value = nmea0183_field_value(tvb, pinfo, offset);
4546 if (value[0] == '\0')
4547 {
4548 proto_tree_add_string(subtree, hf_nmea0183_dtm_datum_subdiv, tvb, offset, 0,
4549 "Data unavailable");
4550 offset += dissect_nmea0183_field_skip(tvb, offset);
4551 }
4552 else
4553 {
4554 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
4555 hf_nmea0183_dtm_datum_subdiv, NULL((void*)0), NULL((void*)0));
4556 }
4557
4558 /* Latitude Offset in minutes */
4559 /* TODO: Write an offset decode function for latitude and longitude offsets */
4560 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
4561 hf_nmea0183_dtm_lat_offset, NULL((void*)0), NULL((void*)0));
4562 offset += dissect_nmea0183_field_skip(tvb, offset);
4563
4564 /* Longitude Offset in minutes */
4565 /* TODO: Write an offset decode function for latitude and longitude offsets */
4566 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
4567 hf_nmea0183_dtm_lon_offset, NULL((void*)0), NULL((void*)0));
4568 offset += dissect_nmea0183_field_skip(tvb, offset);
4569
4570 /* Altitude Offset in meters */
4571 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_dtm_alt_offset, NULL((void*)0), NULL((void*)0));
4572
4573 /* Reference Datum Code */
4574 value = nmea0183_field_value(tvb, pinfo, offset);
4575 datum_code = try_str_to_str(value, datum_vals);
4576 proto_tree_add_string(subtree, hf_nmea0183_dtm_ref_datum, tvb, offset, (int)strlen(value),
4577 datum_code ? datum_code : "Unknown Datum/Unavailable");
4578
4579 return tvb_captured_length(tvb);
4580}
4581
4582static int
4583dissect_nmea0183_sentence_etl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4584{
4585 unsigned offset = 0;
4586
4587 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4588 NULL((void*)0), "ETL sentence - Engine Telegraph Operation Status");
4589
4590 /* Event Time */
4591 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_etl_time);
4592
4593 /* Message Type */
4594 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_etl_msg_type);
4595
4596 /* Position Indicator of Engine Telegraph */
4597 offset += dissect_nmea0183_field_uint(tvb, pinfo, subtree, offset, hf_nmea0183_etl_posind_engine);
4598
4599 /* Position Indicator of Sub Telegraph */
4600 offset += dissect_nmea0183_field_uint(tvb, pinfo, subtree, offset, hf_nmea0183_etl_posind_sub);
4601
4602 /* Operating Location Indicator */
4603 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_etl_opind);
4604
4605 /* Number of Engine or Propeller Shafts */
4606 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_etl_num_eng_shaft, NULL((void*)0), NULL((void*)0));
4607
4608 return tvb_captured_length(tvb);
4609}
4610
4611static int
4612dissect_nmea0183_sentence_fsi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4613{
4614 unsigned offset = 0;
4615
4616 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4617 NULL((void*)0), "FSI sentence - Frequency Set Information");
4618 /* Transmit Frequency (100 Hz Increments) */
4619 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_fsi_xmit_freq, NULL((void*)0), NULL((void*)0));
4620
4621 /* Receive Frequency (100 Hz Increments) */
4622 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_fsi_recv_freq, NULL((void*)0), NULL((void*)0));
4623
4624 /* Mode of Operation */
4625 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_fsi_mode);
4626
4627 /* Power Level */
4628 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_fsi_power);
4629
4630 return tvb_captured_length(tvb);
4631}
4632
4633static int
4634dissect_nmea0183_sentence_gbs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4635{
4636 unsigned offset = 0;
4637 const char *value;
4638 int length;
4639
4640 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4641 NULL((void*)0), "GBS sentence - GPS Satellite Fault Detection");
4642
4643 /* UTC of Position */
4644 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_gbs_utc);
4645
4646 /* Expected Error in Latitude */
4647 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gbs_lat_err, NULL((void*)0), NULL((void*)0));
4648
4649 /* Expected Error in Longitude */
4650 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gbs_long_err, NULL((void*)0), NULL((void*)0));
4651
4652 /* Expected Error in Altitude */
4653 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gbs_alt_err, NULL((void*)0), NULL((void*)0));
4654
4655 /* ID Number of Most Likely Failed Satellite */
4656 value = nmea0183_field_value(tvb, pinfo, offset);
4657 length = (int)strlen(value);
4658 if (length == 0)
4659 {
4660 proto_tree_add_string(subtree, hf_nmea0183_gbs_sat_id, tvb, offset, 0,
4661 "Satellite ID unavailable");
4662 }
4663 else
4664 {
4665 proto_tree_add_string(subtree, hf_nmea0183_gbs_sat_id, tvb, offset, length, value);
4666 dissect_nmea0183_satellite_type(tvb, pinfo, subtree, offset, length,
4667 hf_nmea0183_gbs_sat_type, value);
4668 }
4669 offset += dissect_nmea0183_field_skip(tvb, offset);
4670
4671 /* Probability of Missed Detection for Most Likely Failed Satellite */
4672 value = nmea0183_field_value(tvb, pinfo, offset);
4673 if (value[0] == '\0')
4674 {
4675 proto_tree_add_string(subtree, hf_nmea0183_gbs_prob_miss, tvb, offset, 0,
4676 "Data not available");
4677 offset += dissect_nmea0183_field_skip(tvb, offset);
4678 }
4679 else
4680 {
4681 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
4682 hf_nmea0183_gbs_prob_miss, NULL((void*)0), NULL((void*)0));
4683 }
4684
4685 /* Estimate of Bias in meters on Most Likely Failed Satellite */
4686 value = nmea0183_field_value(tvb, pinfo, offset);
4687 if (value[0] == '\0')
4688 {
4689 proto_tree_add_string(subtree, hf_nmea0183_gbs_est_bias, tvb, offset, 0,
4690 "Data not available");
4691 offset += dissect_nmea0183_field_skip(tvb, offset);
4692 }
4693 else
4694 {
4695 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
4696 hf_nmea0183_gbs_est_bias, NULL((void*)0), NULL((void*)0));
4697 }
4698
4699 /* Standard Deviation of Bias Estimate */
4700 value = nmea0183_field_value(tvb, pinfo, offset);
4701 if (value[0] == '\0')
4702 {
4703 proto_tree_add_string(subtree, hf_nmea0183_gbs_std_dev, tvb, offset, 0,
4704 "Data not available");
4705 }
4706 else
4707 {
4708 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gbs_std_dev, NULL((void*)0), NULL((void*)0));
4709 }
4710
4711 return tvb_captured_length(tvb);
4712}
4713
4714static int
4715dissect_nmea0183_sentence_glc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4716{
4717 unsigned offset = 0;
4718
4719 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4720 NULL((void*)0), "GLC sentence - Geographic Position, Loran-C");
4721 /* GRI, tens of microseconds */
4722 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_glc_gri, NULL((void*)0), NULL((void*)0));
4723
4724 /* Master TOA, microseconds */
4725 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_glc_master_toa, NULL((void*)0), NULL((void*)0));
4726 offset += dissect_nmea0183_field_skip(tvb, offset);
4727
4728 /* Time Difference #1, microseconds */
4729 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_glc_td1, NULL((void*)0), NULL((void*)0));
4730 offset += dissect_nmea0183_field_skip(tvb, offset);
4731
4732 /* Time Difference #2, microseconds */
4733 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_glc_td2, NULL((void*)0), NULL((void*)0));
4734 offset += dissect_nmea0183_field_skip(tvb, offset);
4735
4736 /* Time Difference #3, microseconds */
4737 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_glc_td3, NULL((void*)0), NULL((void*)0));
4738 offset += dissect_nmea0183_field_skip(tvb, offset);
4739
4740 /* Time Difference #4, microseconds */
4741 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_glc_td4, NULL((void*)0), NULL((void*)0));
4742 offset += dissect_nmea0183_field_skip(tvb, offset);
4743
4744 /* Time Difference #5, microseconds */
4745 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_glc_td5, NULL((void*)0), NULL((void*)0));
4746
4747 /* Signal Status */
4748 proto_tree_add_item(subtree, hf_nmea0183_glc_sig_status, tvb, offset + 2, 1, ENC_BIG_ENDIAN0x00000000);
4749
4750 return tvb_captured_length(tvb);
4751}
4752
4753static int
4754dissect_nmea0183_sentence_gmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4755{
4756 unsigned offset = 0;
4757 const char *mode;
4758 int mode_offset;
4759
4760 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4761 NULL((void*)0), "GMP sentence - GNSS Map Projection Fix Data");
4762
4763 /* UTC of Position */
4764 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_gmp_utc);
4765
4766 /* Map Projection Identification */
4767 /* TODO: Convert three-character values to strings:
4768 * UTM = Universal Transverse Mercator | LOC = Local Coordinate System */
4769 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gmp_projection, NULL((void*)0), NULL((void*)0));
4770
4771 /* Map Zone */
4772 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gmp_zone, NULL((void*)0), NULL((void*)0));
4773
4774 /* X (Northern) component of grid (or local) coordinates */
4775 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gmp_x_comp, NULL((void*)0), NULL((void*)0));
4776
4777 /* Y (Eastern) component of grid (or local) coordinates */
4778 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gmp_y_comp, NULL((void*)0), NULL((void*)0));
4779
4780 /* Mode Indicator */
4781 mode_offset = offset;
4782 mode = nmea0183_field_value(tvb, pinfo, offset);
4783 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gmp_mode_string, NULL((void*)0), NULL((void*)0));
4784
4785 /* This is a variable length string that uses a table lookup for each character.
4786 * The first character indicates use of GPS satellites.
4787 * The second character indicates use of GLONASS satellites.
4788 * The third to nth character indicates new satellite systems not-yet-incorporated */
4789 for (int i = 0; mode[i] != '\0'; i++)
4790 {
4791 /* GPS Mode Indicator */
4792 if (i == 0)
4793 {
4794 proto_tree_add_item(subtree, hf_nmea0183_gmp_mode_gps, tvb,
4795 mode_offset + i, 1, ENC_BIG_ENDIAN0x00000000);
4796 }
4797 /* GLONASS Mode Indicator */
4798 else if (i == 1)
4799 {
4800 proto_tree_add_item(subtree, hf_nmea0183_gmp_mode_glonass, tvb,
4801 mode_offset + i, 1, ENC_BIG_ENDIAN0x00000000);
4802 }
4803 /* Other Satellite System Mode Indicators (1 to n) */
4804 else
4805 {
4806 proto_tree_add_item(subtree, hf_nmea0183_gmp_mode_other, tvb,
4807 mode_offset + i, 1, ENC_BIG_ENDIAN0x00000000);
4808 }
4809 }
4810 offset += dissect_nmea0183_field_skip(tvb, offset);
4811
4812 /* Total Number of Satellites in use, 00-99 */
4813 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gmp_tot_sats, NULL((void*)0), NULL((void*)0));
4814
4815 /* Horizontal Dilution of Precision */
4816 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gmp_hdop, NULL((void*)0), NULL((void*)0));
4817
4818 /* Antenna Altitude in meters, re: mean-sea-level (geoid) */
4819 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gmp_ant_alt, NULL((void*)0), NULL((void*)0));
4820
4821 /* Geoidal Separation in meters */
4822 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gmp_geoid_sep, NULL((void*)0), NULL((void*)0));
4823
4824 /* Age of Differential Data */
4825 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gmp_data_age, NULL((void*)0), NULL((void*)0));
4826
4827 /* Differential Reference Station ID */
4828 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gmp_diff_ref_id, NULL((void*)0), NULL((void*)0));
4829
4830 return tvb_captured_length(tvb);
4831}
4832
4833static int
4834dissect_nmea0183_sentence_gns(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4835{
4836 unsigned offset = 0;
4837 const char *mode;
4838 const char *value;
4839 int mode_offset;
4840 proto_item *pi;
4841 proto_tree *pt;
4842
4843 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4844 NULL((void*)0), "GNS sentence - GNSS Fix data");
4845
4846 /* UTC of Position */
4847 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_gns_utc);
4848
4849 /* Latitude */
4850 value = nmea0183_field_value(tvb, pinfo, offset);
4851 if (value[0] == '\0')
4852 {
4853 /* Skip this field and the next since we don't have anything to report */
4854 offset += dissect_nmea0183_field_skip(tvb, offset);
4855 offset += dissect_nmea0183_field_skip(tvb, offset);
4856 }
4857 else
4858 {
4859 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset,
4860 hf_nmea0183_gns_latitude);
4861 }
4862
4863 /* Longitude */
4864 value = nmea0183_field_value(tvb, pinfo, offset);
4865 if (value[0] == '\0')
4866 {
4867 /* Skip this field and the next since we don't have anything to report */
4868 offset += dissect_nmea0183_field_skip(tvb, offset);
4869 offset += dissect_nmea0183_field_skip(tvb, offset);
4870 }
4871 else
4872 {
4873 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset,
4874 hf_nmea0183_gns_longitude);
4875 }
4876
4877 /* Mode Indicator */
4878 mode_offset = offset;
4879 mode = nmea0183_field_value(tvb, pinfo, offset);
4880 if (mode[0] == '\0')
4881 {
4882 /* Skip this field since we have nothing to report */
4883 offset += dissect_nmea0183_field_skip(tvb, offset);
4884 }
4885 else
4886 {
4887 offset += dissect_nmea0183_field_ret_item(tvb, pinfo, subtree, offset,
4888 hf_nmea0183_gns_mode_string, &pi);
4889 pt = proto_item_add_subtree(pi, ett_nmea0183_legacy_satellite_info);
4890 /* This is a variable length string that uses a table lookup for each character.
4891 * The first character indicates use of GPS satellites.
4892 * The second character indicates use of GLONASS satellites.
4893 * The third to nth character indicates new satellite systems not-yet-incorporated */
4894 for (int i = 0; mode[i] != '\0'; i++)
4895 {
4896 /* GPS Mode Indicator */
4897 if (i == 0)
4898 {
4899 proto_tree_add_item(pt, hf_nmea0183_gns_mode_gps, tvb,
4900 mode_offset + i, 1, ENC_BIG_ENDIAN0x00000000);
4901 }
4902 /* GLONASS Mode Indicator */
4903 else if (i == 1)
4904 {
4905 proto_tree_add_item(pt, hf_nmea0183_gns_mode_glonass, tvb,
4906 mode_offset + i, 1, ENC_BIG_ENDIAN0x00000000);
4907 }
4908 /* Other Satellite System Mode Indicators (1 to n) */
4909 else
4910 {
4911 proto_tree_add_item(pt, hf_nmea0183_gns_mode_other, tvb,
4912 mode_offset + i, 1, ENC_BIG_ENDIAN0x00000000);
4913 }
4914 }
4915 }
4916
4917 /* Total Number of Satellites in use, 00-99 */
4918 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gns_tot_sats, NULL((void*)0), NULL((void*)0));
4919
4920 /* Horizontal DOP */
4921 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gns_hdop, NULL((void*)0), NULL((void*)0));
4922
4923 /* Antenna Altitude in meters (re: mean-sea-level - geoid) */
4924 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gns_ant_alt, NULL((void*)0), NULL((void*)0));
4925
4926 /* Geoidal Separation in meters */
4927 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gns_geoid_sep, NULL((void*)0), NULL((void*)0));
4928
4929 /* Age of Differential Data */
4930 value = nmea0183_field_value(tvb, pinfo, offset);
4931 if (value[0] == '\0')
4932 {
4933 proto_tree_add_string(subtree, hf_nmea0183_gns_data_age, tvb, offset, 0,
4934 "DGPS is not used");
4935 offset += dissect_nmea0183_field_skip(tvb, offset);
4936 }
4937 else
4938 {
4939 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
4940 hf_nmea0183_gns_data_age, NULL((void*)0), NULL((void*)0));
4941 }
4942
4943 /* Differential Reference Station ID */
4944 value = nmea0183_field_value(tvb, pinfo, offset);
4945 if (value[0] == '\0')
4946 {
4947 proto_tree_add_string(subtree, hf_nmea0183_gns_diff_ref_id, tvb, offset, 0, "[None]");
4948 }
4949 else
4950 {
4951 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gns_diff_ref_id, NULL((void*)0), NULL((void*)0));
4952 }
4953
4954 return tvb_captured_length(tvb);
4955}
4956
4957static int
4958dissect_nmea0183_sentence_grs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4959{
4960 unsigned offset = 0;
4961
4962 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4963 NULL((void*)0), "GRS sentence - GNSS Range Residuals");
4964 /* UTC decoded_time of associated GGA/GNS fix */
4965 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_grs_utc);
4966
4967 /* Mode (residuals) */
4968 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_grs_mode);
4969
4970 /* Can be multiple range residuals */
4971 while (tvb_captured_length_remaining(tvb, offset) > 0)
4972 {
4973 /* Range Residuals */
4974 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
4975 hf_nmea0183_grs_range_resid, NULL((void*)0), NULL((void*)0));
4976 }
4977
4978 return tvb_captured_length(tvb);
4979}
4980
4981static int
4982dissect_nmea0183_sentence_gsa(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
4983{
4984 unsigned offset = 0;
4985 const char *value;
4986 int length;
4987
4988 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
4989 NULL((void*)0), "GSA sentence - GNSS DOP and Active Satellites");
4990
4991 /* Operational Mode - Manual or Automatic */
4992 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_gsa_op_mode);
4993
4994 /* Fix Mode */
4995 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_gsa_fix_mode);
4996
4997 /* 12x Satellite IDs */
4998 for (int i = 0; i < 12; i++)
4999 {
5000 /* Satellite ID */
5001 value = nmea0183_field_value(tvb, pinfo, offset);
5002 length = (int)strlen(value);
5003 if (length == 0)
5004 {
5005 proto_tree_add_string(subtree, hf_nmea0183_gsa_sat_id, tvb, offset, 0,
5006 "[No Satellite]");
5007 }
5008 else
5009 {
5010 proto_tree_add_string(subtree, hf_nmea0183_gsa_sat_id, tvb, offset, length, value);
5011 dissect_nmea0183_satellite_type(tvb, pinfo, subtree, offset, length,
5012 hf_nmea0183_gsa_sat_type, value);
5013 }
5014 offset += dissect_nmea0183_field_skip(tvb, offset);
5015 }
5016
5017 /* Position DOP */
5018 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gsa_pdop, NULL((void*)0), NULL((void*)0));
5019
5020 /* Horizontal DOP */
5021 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gsa_hdop, NULL((void*)0), NULL((void*)0));
5022
5023 /* Vertical DOP */
5024 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gsa_vdop, NULL((void*)0), NULL((void*)0));
5025
5026 return tvb_captured_length(tvb);
5027}
5028
5029static int
5030dissect_nmea0183_sentence_gsv(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5031{
5032 unsigned offset = 0;
5033 const char *value;
5034 int length;
5035 int satellite_offset;
5036 proto_item *pi;
5037 proto_tree *pt;
5038
5039 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5040 NULL((void*)0), "GSV sentence - GNSS Satellites in View");
5041
5042 /* Total Number of Sentences, 1 to 9 */
5043 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gsv_total_sentences, NULL((void*)0), NULL((void*)0));
5044
5045 /* Sentence Number, 1 to 9 */
5046 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gsv_sentence_number, NULL((void*)0), NULL((void*)0));
5047
5048 /* Total Number of Satellites in View */
5049 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_gsv_sats_in_view, NULL((void*)0), NULL((void*)0));
5050
5051 /* Variable number of "Satellite ID-Elevation-Azimuth-SNR" string sets (from 1 to 4) */
5052 for (int i = 0; i < 4 && tvb_captured_length_remaining(tvb, offset) > 0; i++)
5053 {
5054 /* Satellite ID Number (use PRN numbers) */
5055 satellite_offset = offset;
5056 value = nmea0183_field_value(tvb, pinfo, offset);
5057 offset += dissect_nmea0183_field_ret_item(tvb, pinfo, subtree, offset,
5058 hf_nmea0183_gsv_sat_id, &pi);
5059 pt = proto_item_add_subtree(pi, ett_nmea0183_legacy_satellite_info);
5060
5061 /* Satellite type based on the numeric PRN range. */
5062 length = (int)strlen(value);
5063 dissect_nmea0183_satellite_type(tvb, pinfo, pt, satellite_offset, length,
5064 hf_nmea0183_gsv_sat_type, value);
5065
5066 /* Elevation, degrees, 90deg maximum */
5067 offset += dissect_nmea0183_field(tvb, pinfo, pt, offset,
5068 hf_nmea0183_gsv_elevation, NULL((void*)0), NULL((void*)0));
5069
5070 /* Azimuth, degrees True, 00 to 359 */
5071 offset += dissect_nmea0183_field(tvb, pinfo, pt, offset,
5072 hf_nmea0183_gsv_azimuth, NULL((void*)0), NULL((void*)0));
5073
5074 /* SNR (C/No) 00-99 dB-Hz, null when not tracking */
5075 value = nmea0183_field_value(tvb, pinfo, offset);
5076 if (value[0] == '\0')
5077 {
5078 proto_tree_add_string(pt, hf_nmea0183_gsv_snr, tvb, offset, 0, "Not tracking");
5079 offset += dissect_nmea0183_field_skip(tvb, offset);
5080 }
5081 else
5082 {
5083 offset += dissect_nmea0183_field(tvb, pinfo, pt, offset,
5084 hf_nmea0183_gsv_snr, NULL((void*)0), NULL((void*)0));
5085 }
5086 }
5087
5088 return tvb_captured_length(tvb);
5089}
5090
5091static int
5092dissect_nmea0183_sentence_hbt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5093{
5094 unsigned offset = 0;
5095 const char *value;
5096
5097 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5098 NULL((void*)0), "HBT sentence - Heartbeat Supervision Report");
5099 /* Configured Repeat Interval */
5100 value = nmea0183_field_value(tvb, pinfo, offset);
5101 if (value[0] == '\0')
5102 {
5103 /* NULL in response to a query */
5104 proto_tree_add_string(subtree, hf_nmea0183_hbt_interval, tvb, offset, 0,
5105 "NULL for query");
5106 offset += dissect_nmea0183_field_skip(tvb, offset);
5107 }
5108 else
5109 {
5110 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
5111 hf_nmea0183_hbt_interval, NULL((void*)0), NULL((void*)0));
5112 }
5113
5114 /* Equipment Status (Normal/Abnormal) */
5115 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_hbt_status);
5116
5117 /* Sequential Sentence Identifier */
5118 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_hbt_sent_id, NULL((void*)0), NULL((void*)0));
5119
5120 return tvb_captured_length(tvb);
5121}
5122
5123static int
5124dissect_nmea0183_sentence_hdg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5125{
5126 unsigned offset = 0;
5127
5128 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5129 NULL((void*)0), "HDG sentence - Heading - Deviation & Variation");
5130 /* Magnetic Sensor Heading, degrees */
5131 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_hdg_mag_sensor, NULL((void*)0), NULL((void*)0));
5132
5133 /* Magnetic Deviation, degrees E/W */
5134 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_hdg_mag_dev, NULL((void*)0), NULL((void*)0));
5135 offset += dissect_nmea0183_field_skip(tvb, offset);
5136
5137 /* Magnetic Variation, degrees E/W */
5138 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_hdg_mag_var, NULL((void*)0), NULL((void*)0));
5139
5140 return tvb_captured_length(tvb);
5141}
5142
5143static int
5144dissect_nmea0183_sentence_hmr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5145{
5146 unsigned offset = 0;
5147
5148 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5149 NULL((void*)0), "HMR sentence - Heading, Monitor Receive");
5150 /* Heading Sensor #1 ID */
5151 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_hmr_heading_s1, NULL((void*)0), NULL((void*)0));
5152
5153 /* Heading Sensor #2 ID */
5154 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_hmr_heading_s2, NULL((void*)0), NULL((void*)0));
5155
5156 /* Difference Limit Setting, degrees */
5157 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_hmr_difflim_setting, NULL((void*)0), NULL((void*)0));
5158
5159 /* Actual Heading Sensor Difference, degrees */
5160 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_hmr_heading_sdiff, NULL((void*)0), NULL((void*)0));
5161
5162 /* Warning Flag */
5163 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_hmr_warning_flag);
5164
5165 /* Heading Reading, Sensor #1, degrees */
5166 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_hmr_hr_s1, NULL((void*)0), NULL((void*)0));
5167
5168 /* Status, Sensor #1 */
5169 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_hmr_status_s1);
5170
5171 /* Sensor #1 Type */
5172 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_hmr_s1_type);
5173
5174 /* Deviation, Sensor #1, degrees */
5175 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_hmr_dev_s1, NULL((void*)0), NULL((void*)0));
5176 offset += dissect_nmea0183_field_skip(tvb, offset);
5177
5178 /* Heading Reading, Sensor #2, degrees */
5179 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_hmr_hr_s2, NULL((void*)0), NULL((void*)0));
5180
5181 /* Status, Sensor #2 */
5182 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_hmr_status_s2);
5183
5184 /* Sensor #2 Type */
5185 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_hmr_s2_type);
5186
5187 /* Deviation, Sensor #2, degrees */
5188 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_hmr_dev_s2, NULL((void*)0), NULL((void*)0));
5189 offset += dissect_nmea0183_field_skip(tvb, offset);
5190
5191 /* Variation, degrees */
5192 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_hmr_variation, NULL((void*)0), NULL((void*)0));
5193
5194 return tvb_captured_length(tvb);
5195}
5196
5197static int
5198dissect_nmea0183_sentence_hms(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5199{
5200 unsigned offset = 0;
5201
5202 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5203 NULL((void*)0), "HMS sentence - Hyde Marine Systems, Inc.");
5204 /* Heading, Sensor #1 ID */
5205 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_hms_heading_s1, NULL((void*)0), NULL((void*)0));
5206
5207 /* Heading, Sensor #2 ID */
5208 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_hms_heading_s2, NULL((void*)0), NULL((void*)0));
5209
5210 /* Maximum Difference (allowed between sensors), degrees */
5211 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_hms_max_diff, NULL((void*)0), NULL((void*)0));
5212
5213 return tvb_captured_length(tvb);
5214}
5215
5216static int
5217dissect_nmea0183_sentence_hsc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5218{
5219 unsigned offset = 0;
5220
5221 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5222 NULL((void*)0), "HSC sentence - Heading Steering Command");
5223 /* Commanded Heading, degrees True */
5224 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_hsc_heading_true, NULL((void*)0), NULL((void*)0));
5225 offset += dissect_nmea0183_field_skip(tvb, offset);
5226
5227 /* Commanded Heading, degrees Magnetic */
5228 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_hsc_heading_magnetic, NULL((void*)0), NULL((void*)0));
5229
5230 return tvb_captured_length(tvb);
5231}
5232
5233static int
5234dissect_nmea0183_sentence_htc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5235{
5236 unsigned offset = 0;
5237
5238 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5239 NULL((void*)0), "HTC sentence - Heading/Track Control Command");
5240 /* Override */
5241 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_htc_override);
5242
5243 /* Commanded rudder angle, degrees */
5244 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_htc_cmd_rudder_angle, NULL((void*)0), NULL((void*)0));
5245
5246 /* Commanded rudder direction, L/R=port/starboard */
5247 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_htc_cmd_rudder_dir);
5248
5249 /* Selected Steering Mode */
5250 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_htc_steering_mode);
5251
5252 /* Turn Mode */
5253 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_htc_turn_mode);
5254
5255 /* Commanded Rudder Limit, degrees (unsigned) */
5256 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_htc_cmd_rudder_lim, NULL((void*)0), NULL((void*)0));
5257
5258 /* Commanded Off-heading Limit, degrees (unsigned) */
5259 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_htc_cmd_offhead_lim, NULL((void*)0), NULL((void*)0));
5260
5261 /* Commanded Radius of Turn for Heading Changes, n. miles */
5262 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_htc_cmd_radius, NULL((void*)0), NULL((void*)0));
5263
5264 /* Commanded Rate of Turn for Heading Changes, deg./minute */
5265 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_htc_cmd_rate, NULL((void*)0), NULL((void*)0));
5266
5267 /* Commanded Heading-to-Steer, degrees */
5268 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_htc_cmd_steer, NULL((void*)0), NULL((void*)0));
5269
5270 /* Commanded Off-Track Limit, n. miles (unsigned) */
5271 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_htc_cmd_offtrack, NULL((void*)0), NULL((void*)0));
5272
5273 /* Commanded Track, degrees */
5274 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_htc_cmd_track, NULL((void*)0), NULL((void*)0));
5275
5276 /* Heading Reference in Use, T/M */
5277 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_htc_heading_ref);
5278
5279 return tvb_captured_length(tvb);
5280}
5281
5282static int
5283dissect_nmea0183_sentence_htd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5284{
5285 unsigned offset = 0;
5286
5287 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5288 NULL((void*)0), "HTD sentence - Heading/Track Control Data");
5289 /* Override */
5290 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_htd_override);
5291
5292 /* Commanded rudder angle, degrees */
5293 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_htd_cmd_rudder_angle, NULL((void*)0), NULL((void*)0));
5294
5295 /* Commanded rudder direction, L/R=port/starboard */
5296 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_htd_cmd_rudder_dir);
5297
5298 /* Selected Steering Mode */
5299 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_htd_steering_mode);
5300
5301 /* Turn Mode */
5302 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_htd_turn_mode);
5303
5304 /* Commanded Rudder Limit, degrees (unsigned) */
5305 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_htd_cmd_rudder_lim, NULL((void*)0), NULL((void*)0));
5306
5307 /* Commanded Off-heading Limit, degrees (unsigned) */
5308 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_htd_cmd_offhead_lim, NULL((void*)0), NULL((void*)0));
5309
5310 /* Commanded Radius of Turn for Heading Changes, n. miles */
5311 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_htd_cmd_radius, NULL((void*)0), NULL((void*)0));
5312
5313 /* Commanded Rate of Turn for Heading Changes, deg./minute */
5314 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_htd_cmd_rate, NULL((void*)0), NULL((void*)0));
5315
5316 /* Commanded Heading-to-Steer, degrees */
5317 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_htd_cmd_steer, NULL((void*)0), NULL((void*)0));
5318
5319 /* Commanded Off-Track Limit, n. miles (unsigned) */
5320 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_htd_cmd_offtrack, NULL((void*)0), NULL((void*)0));
5321
5322 /* Commanded Track, degrees */
5323 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_htd_cmd_track, NULL((void*)0), NULL((void*)0));
5324
5325 /* Heading Reference in Use, T/M */
5326 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_htd_heading_ref);
5327
5328 /* Rudder Status */
5329 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_htd_rudder_status);
5330
5331 /* Off-heading Status */
5332 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_htd_offhdng_status);
5333
5334 /* Off-Track Status */
5335 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_htd_offtrack_status);
5336
5337 /* Vessel Heading, degrees */
5338 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_htd_vessel_heading, NULL((void*)0), NULL((void*)0));
5339
5340 return tvb_captured_length(tvb);
5341}
5342
5343static int
5344dissect_nmea0183_sentence_lcd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5345{
5346 unsigned offset = 0;
5347
5348 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5349 NULL((void*)0), "LCD sentence - Loran-C Signal Data");
5350 /* GRI, tens of microseconds */
5351 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lcd_gri, NULL((void*)0), NULL((void*)0));
5352
5353 /* Master - SNR */
5354 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lcd_master_snr, NULL((void*)0), NULL((void*)0));
5355
5356 /* Master - Pulse Shape (ECD) */
5357 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lcd_master_ecd, NULL((void*)0), NULL((void*)0));
5358
5359 /* Secondary 1 - SNR */
5360 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lcd_s1_snr, NULL((void*)0), NULL((void*)0));
5361
5362 /* Secondary 1 - Pulse Shape (ECD) */
5363 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lcd_s1_ecd, NULL((void*)0), NULL((void*)0));
5364
5365 /* Secondary 2 - SNR */
5366 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lcd_s2_snr, NULL((void*)0), NULL((void*)0));
5367
5368 /* Secondary 2 - Pulse Shape (ECD) */
5369 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lcd_s2_ecd, NULL((void*)0), NULL((void*)0));
5370
5371 /* Secondary 3 - SNR */
5372 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lcd_s3_snr, NULL((void*)0), NULL((void*)0));
5373
5374 /* Secondary 3 - Pulse Shape (ECD) */
5375 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lcd_s3_ecd, NULL((void*)0), NULL((void*)0));
5376
5377 /* Secondary 4 - SNR */
5378 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lcd_s4_snr, NULL((void*)0), NULL((void*)0));
5379
5380 /* Secondary 4 - Pulse Shape (ECD) */
5381 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lcd_s4_ecd, NULL((void*)0), NULL((void*)0));
5382
5383 /* Secondary 5 - SNR */
5384 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lcd_s5_snr, NULL((void*)0), NULL((void*)0));
5385
5386 /* Secondary 5 - Pulse Shape (ECD) */
5387 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lcd_s5_ecd, NULL((void*)0), NULL((void*)0));
5388
5389 return tvb_captured_length(tvb);
5390}
5391
5392static int
5393dissect_nmea0183_sentence_lrf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5394{
5395 unsigned offset = 0;
5396 const char *value;
5397 int field_offset;
5398
5399 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5400 NULL((void*)0), "LRF sentence - UAIS Long-Range Function");
5401 /* Sequence Number, 0 to 9 */
5402 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lrf_seqnum, NULL((void*)0), NULL((void*)0));
5403
5404 /* MMSI of Requestor */
5405 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lrf_mmsi, NULL((void*)0), NULL((void*)0));
5406
5407 /* Name of Requestor */
5408 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lrf_name, NULL((void*)0), NULL((void*)0));
5409
5410 /* Function Request, 1 to 26 characters */
5411 field_offset = offset;
5412 value = nmea0183_field_value(tvb, pinfo, offset);
5413 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lrf_function_req, NULL((void*)0), NULL((void*)0));
5414
5415 /* This is a variable length string that uses a table lookup for each character. */
5416 for (int i = 0; value[i] != '\0'; i++)
5417 {
5418 /* Add each function request by looking it up and resolving it. */
5419 proto_tree_add_item(subtree, hf_nmea0183_lrf_function_req_val, tvb,
5420 field_offset + i, 1, ENC_BIG_ENDIAN0x00000000);
5421 }
5422 offset += dissect_nmea0183_field_skip(tvb, offset);
5423
5424 /* Function Reply Status */
5425 field_offset = offset;
5426 value = nmea0183_field_value(tvb, pinfo, offset);
5427 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lrf_function_rep, NULL((void*)0), NULL((void*)0));
5428
5429 /* This is a variable length string that uses a table lookup for each character. */
5430 for (int i = 0; value[i] != '\0'; i++)
5431 {
5432 /* Add each function reply by looking it up and resolving it. */
5433 proto_tree_add_item(subtree, hf_nmea0183_lrf_function_rep_val, tvb,
5434 field_offset + i, 1, ENC_BIG_ENDIAN0x00000000);
5435 }
5436
5437 return tvb_captured_length(tvb);
5438}
5439
5440static int
5441dissect_nmea0183_sentence_lri(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5442{
5443 unsigned offset = 0;
5444
5445 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5446 NULL((void*)0), "LRI sentence - UAIS Long-Range Interrogation");
5447 /* Sequence Number, 0 to 9 */
5448 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lri_seqnum, NULL((void*)0), NULL((void*)0));
5449
5450 /* Control Flag */
5451 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset,
5452 hf_nmea0183_lri_control);
5453
5454 /* MMSI of Requestor */
5455 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lri_req_mmsi, NULL((void*)0), NULL((void*)0));
5456
5457 /* MMSI of Destination */
5458 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lri_dest_mmsi, NULL((void*)0), NULL((void*)0));
5459
5460 /* NE Corner Latitude */
5461 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_lri_latitude_ne);
5462
5463 /* NE Corner Longitude */
5464 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_lri_longitude_ne);
5465
5466 /* SW Corner Latitude */
5467 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_lri_latitude_sw);
5468
5469 /* SW Corner Longitude */
5470 dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset,
5471 hf_nmea0183_lri_longitude_sw);
5472
5473 return tvb_captured_length(tvb);
5474}
5475
5476static int
5477dissect_nmea0183_sentence_lr1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5478{
5479 unsigned offset = 0;
5480
5481 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5482 NULL((void*)0), "LR1 sentence - UAIS Long-range Reply Sentence 1");
5483 /* Sequence Number, 0 to 9 */
5484 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lr1_seqnum, NULL((void*)0), NULL((void*)0));
5485
5486 /* MMSI of Responder */
5487 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lr1_resp_mmsi, NULL((void*)0), NULL((void*)0));
5488
5489 /* MMSI of Requestor */
5490 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lr1_req_mmsi, NULL((void*)0), NULL((void*)0));
5491
5492 /* Ship's Name */
5493 offset += dissect_nmea0183_field_response(tvb, pinfo, subtree, offset,
5494 hf_nmea0183_lr1_shipname, "Ship's Name", false0);
5495
5496 /* Call Sign */
5497 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lr1_callsign, NULL((void*)0), NULL((void*)0));
5498
5499 /* IMO Number */
5500 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lr1_imo_num, NULL((void*)0), NULL((void*)0));
5501
5502 return tvb_captured_length(tvb);
5503}
5504
5505static int
5506dissect_nmea0183_sentence_lr2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5507{
5508 unsigned offset = 0;
5509
5510 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5511 NULL((void*)0), "LR2 sentence - UAIS Long-range Reply Sentence 2");
5512
5513 /* Sequence Number, 0 to 9 */
5514 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lr2_seqnum, NULL((void*)0), NULL((void*)0));
5515
5516 /* MMSI of Responder */
5517 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lr2_resp_mmsi, NULL((void*)0), NULL((void*)0));
5518
5519 /* Date (ddmmyyyy) */
5520 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lr2_date, NULL((void*)0), NULL((void*)0));
5521
5522 /* UTC of Position */
5523 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_lr2_utc);
5524
5525 /* Latitude */
5526 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_lr2_latitude);
5527
5528 /* Longitude */
5529 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_lr2_longitude);
5530
5531 /* Course over ground, degrees True */
5532 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lr2_course_ground, NULL((void*)0), NULL((void*)0));
5533 offset += dissect_nmea0183_field_skip(tvb, offset);
5534
5535 /* Speed over ground, knots */
5536 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_lr2_speed_ground, NULL((void*)0), NULL((void*)0));
5537
5538 return tvb_captured_length(tvb);
5539}
5540
5541static int
5542dissect_nmea0183_sentence_lr3(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5543{
5544 unsigned offset = 0;
5545
5546 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5547 NULL((void*)0), "LR3 sentence - UAIS Long-range Reply Sentence 3");
5548
5549 /* Sequence Number, 0 to 9 */
5550 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
5551 hf_nmea0183_lr3_seqnum, NULL((void*)0), NULL((void*)0));
5552
5553 /* MMSI of Responder */
5554 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
5555 hf_nmea0183_lr3_resp_mmsi, NULL((void*)0), NULL((void*)0));
5556
5557 /* Voyage Destination, 1 to 20 characters */
5558 offset += dissect_nmea0183_field_response(tvb, pinfo, subtree, offset,
5559 hf_nmea0183_lr3_destination,
5560 "Voyage Destination", false0);
5561
5562 /* ETA Date (ddmmyyyy) */
5563 offset += dissect_nmea0183_field_response(tvb, pinfo, subtree, offset,
5564 hf_nmea0183_lr3_eta_date,
5565 "ETA Date (ddmmyyyy)", false0);
5566
5567 /* ETA Time */
5568 offset += dissect_nmea0183_field_response(tvb, pinfo, subtree, offset,
5569 hf_nmea0183_lr3_eta_time,
5570 "ETA Time (hhmmss.ss)", true1);
5571
5572 /* Draught */
5573 offset += dissect_nmea0183_field_response(tvb, pinfo, subtree, offset,
5574 hf_nmea0183_lr3_draught,
5575 "Draught", false0);
5576
5577 /* Ship's Cargo */
5578 offset += dissect_nmea0183_field_response(tvb, pinfo, subtree, offset,
5579 hf_nmea0183_lr3_ship_cargo,
5580 "Ship's Cargo", false0);
5581
5582 /* Ship's Length */
5583 offset += dissect_nmea0183_field_response(tvb, pinfo, subtree, offset,
5584 hf_nmea0183_lr3_ship_length,
5585 "Ship's Length", false0);
5586
5587 /* Ship's Breadth */
5588 offset += dissect_nmea0183_field_response(tvb, pinfo, subtree, offset,
5589 hf_nmea0183_lr3_ship_breadth,
5590 "Ship's Breadth", false0);
5591
5592 /* Ship Type */
5593 offset += dissect_nmea0183_field_response(tvb, pinfo, subtree, offset,
5594 hf_nmea0183_lr3_ship_type,
5595 "Ship Type", false0);
5596
5597 /* Persons, 0 to 8191, 8191 means greater than or equal to 8191 people */
5598 dissect_nmea0183_field_response(tvb, pinfo, subtree, offset,
5599 hf_nmea0183_lr3_persons,
5600 "Personnel Aboard", false0);
5601
5602 return tvb_captured_length(tvb);
5603}
5604
5605static int
5606dissect_nmea0183_sentence_mla(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5607{
5608 unsigned offset = 0;
5609
5610 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5611 NULL((void*)0), "MLA sentence - GLONASS Almanac Data");
5612 /* Total Number of Sentences */
5613 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mla_total_sentences, NULL((void*)0), NULL((void*)0));
5614
5615 /* Sentence Number */
5616 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mla_sentence_number, NULL((void*)0), NULL((void*)0));
5617
5618 /* Satellite ID (satellite slot) number */
5619 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mla_sat_id, NULL((void*)0), NULL((void*)0));
5620
5621 /* NA, calendar day count within the four year period beginning with the previous leap year */
5622 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mla_calday_count, NULL((void*)0), NULL((void*)0));
5623
5624 /* CnA and HnA, generalized health of the satellite and carrier frequency number respectively */
5625 /* TODO: This is a 2-character hexadecimal bitmask (ref: GLONASS ICD, 1995) and should
5626 * probably be two separate fields once the bitmask is understood. */
5627 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mla_sat_health, NULL((void*)0), NULL((void*)0));
5628
5629 /* e, Eccentricity */
5630 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mla_eccentricity, NULL((void*)0), NULL((void*)0));
5631
5632 /* DOT, rate of change of the draconitic circling decoded_time */
5633 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mla_roc_circling, NULL((void*)0), NULL((void*)0));
5634
5635 /* Argument of Perigee */
5636 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mla_perigee, NULL((void*)0), NULL((void*)0));
5637
5638 /* 16 MSB of system decoded_time scale correction */
5639 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mla_16msb_corr_t_scale, NULL((void*)0), NULL((void*)0));
5640
5641 /* Correction to the average value of the draconitic circling decoded_time */
5642 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mla_corr_circling, NULL((void*)0), NULL((void*)0));
5643
5644 /* Time of the Ascension Node, Almanac Reference Time */
5645 /* TODO: This is a 2-character hexadecimal bitmask (ref: GLONASS ICD, 1995, Section 4.5, Table 4.3)
5646 * and should probably be two separate fields once the bitmask is understood. */
5647 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mla_t_asc_node, NULL((void*)0), NULL((void*)0));
5648
5649 /* Greenwich Longitude of the Ascension Node */
5650 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mla_long_asc_node, NULL((void*)0), NULL((void*)0));
5651
5652 /* Correction to the average value of the inclination angle */
5653 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mla_corr_incl_angle, NULL((void*)0), NULL((void*)0));
5654
5655 /* 12 LSB of system decoded_time scale correction */
5656 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mla_12lsb_corr_t_scale, NULL((void*)0), NULL((void*)0));
5657
5658 /* Course Value of the Time Scale Shift */
5659 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mla_t_scale_shift, NULL((void*)0), NULL((void*)0));
5660
5661 return tvb_captured_length(tvb);
5662}
5663
5664static int
5665dissect_nmea0183_sentence_msk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5666{
5667 unsigned offset = 0;
5668
5669 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5670 NULL((void*)0), "MSK sentence - Control for a Beacon Receiver");
5671 /* Beacon Frequency, 283.5 - 325.0 kHz */
5672 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_msk_beacon_freq, NULL((void*)0), NULL((void*)0));
5673
5674 /* Auto/Manual Frequency */
5675 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_msk_am_freq);
5676
5677 /* Beacon Bit Rate (25, 50, 100, or 200) bits per second */
5678 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_msk_beacon_bitrate, NULL((void*)0), NULL((void*)0));
5679
5680 /* Auto/Manual Bit Rate */
5681 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_msk_am_bitrate);
5682
5683 /* Interval for sending MSS status, seconds */
5684 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_msk_interval, NULL((void*)0), NULL((void*)0));
5685
5686 /* Channel Number */
5687 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_msk_channel, NULL((void*)0), NULL((void*)0));
5688
5689 return tvb_captured_length(tvb);
5690}
5691
5692static int
5693dissect_nmea0183_sentence_mss(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5694{
5695 unsigned offset = 0;
5696
5697 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5698 NULL((void*)0), "MSS sentence - Beacon Receiver Status");
5699 /* Signal Strength (SS), dB re: 1 uV/m */
5700 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mss_sig_str, NULL((void*)0), NULL((void*)0));
5701
5702 /* Signal-to-Noise Ratio (SNR), dB */
5703 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mss_snr, NULL((void*)0), NULL((void*)0));
5704
5705 /* Beacon Frequency, 283.5-325.0 kHz */
5706 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mss_beacon_freq, NULL((void*)0), NULL((void*)0));
5707
5708 /* Beacon bit rate (25, 50, 100, or 200) bits per second */
5709 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mss_beacon_bitrate, NULL((void*)0), NULL((void*)0));
5710
5711 /* Channel Number */
5712 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mss_channel, NULL((void*)0), NULL((void*)0));
5713
5714 return tvb_captured_length(tvb);
5715}
5716
5717static int
5718dissect_nmea0183_sentence_mtw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5719{
5720 unsigned offset = 0;
5721
5722 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5723 NULL((void*)0), "MTW sentence - Mean Temperature of Water");
5724
5725 /* Temperature (in Celsius) */
5726 dissect_nmea0183_field_with_unit(tvb, pinfo, subtree, offset, hf_nmea0183_mtw_temp);
5727
5728 return tvb_captured_length(tvb);
5729}
5730
5731static int
5732dissect_nmea0183_sentence_mwd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5733{
5734 unsigned offset = 0;
5735
5736 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5737 NULL((void*)0), "MWD sentence - Wind Direction & Speed");
5738 /* Wind Direction, degrees True */
5739 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mwd_direction_true, NULL((void*)0), NULL((void*)0));
5740 offset += dissect_nmea0183_field_skip(tvb, offset);
5741
5742 /* Wind Direction, degrees Magnetic */
5743 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mwd_direction_mag, NULL((void*)0), NULL((void*)0));
5744 offset += dissect_nmea0183_field_skip(tvb, offset);
5745
5746 /* Wind Speed, knots */
5747 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mwd_speed_knots, NULL((void*)0), NULL((void*)0));
5748 offset += dissect_nmea0183_field_skip(tvb, offset);
5749
5750 /* Wind Speed, meters/second */
5751 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mwd_speed_ms, NULL((void*)0), NULL((void*)0));
5752
5753 return tvb_captured_length(tvb);
5754}
5755
5756static int
5757dissect_nmea0183_sentence_mwv(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5758{
5759 unsigned offset = 0;
5760
5761 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5762 NULL((void*)0), "MWV sentence - Wind Speed and Angle");
5763 /* Wind Angle, 0 to 359 degrees */
5764 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mwv_wind_angle, NULL((void*)0), NULL((void*)0));
5765
5766 /* Reference, R = Relative and T = Theoretical */
5767 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_mwv_reference);
5768
5769 /* Wind Speed */
5770 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_mwv_wind_speed, NULL((void*)0), NULL((void*)0));
5771
5772 /* Wind speed units, K/M/N/S */
5773 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_mwv_speed_units);
5774
5775 /* Data Status */
5776 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_mwv_status);
5777
5778 return tvb_captured_length(tvb);
5779}
5780
5781static int
5782dissect_nmea0183_sentence_osd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5783{
5784 unsigned offset = 0;
5785
5786 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5787 NULL((void*)0), "OSD sentence - Own Ship Data");
5788 /* Heading, degrees True */
5789 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_osd_heading_true, NULL((void*)0), NULL((void*)0));
5790
5791 /* Heading Status */
5792 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_osd_heading_status);
5793
5794 /* Vessel Course, degrees True */
5795 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_osd_course_true, NULL((void*)0), NULL((void*)0));
5796
5797 /* Course Reference */
5798 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_osd_course_ref);
5799
5800 /* Vessel Speed */
5801 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_osd_speed, NULL((void*)0), NULL((void*)0));
5802
5803 /* Speed Reference */
5804 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_osd_speed_ref);
5805
5806 /* Vessel Set, degrees True */
5807 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_osd_set_true, NULL((void*)0), NULL((void*)0));
5808
5809 /* Vessel Drift (speed) */
5810 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_osd_drift, NULL((void*)0), NULL((void*)0));
5811
5812 /* Speed Units (K/N/S) */
5813 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_osd_speed_units);
5814
5815 return tvb_captured_length(tvb);
5816}
5817
5818static int
5819dissect_nmea0183_sentence_rma(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5820{
5821 unsigned offset = 0;
5822
5823 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5824 NULL((void*)0), "RMA sentence - Recommended Minimum Specific Loran-C Data");
5825
5826 /* Data Status */
5827 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_rma_status);
5828
5829 /* Latitude */
5830 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_rma_latitude);
5831
5832 /* Longitude */
5833 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_rma_longitude);
5834
5835 /* Time Difference A (microseconds) */
5836 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rma_time_diff_a, NULL((void*)0), NULL((void*)0));
5837
5838 /* Time Difference B (microseconds) */
5839 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rma_time_diff_b, NULL((void*)0), NULL((void*)0));
5840
5841 /* Speed over Ground, knots */
5842 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rma_speed, NULL((void*)0), NULL((void*)0));
5843
5844 /* Course over Ground, degrees True */
5845 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rma_course, NULL((void*)0), NULL((void*)0));
5846
5847 /* Magnetic Variation, degrees E/W */
5848 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rma_mag_var, NULL((void*)0), NULL((void*)0));
5849 offset += dissect_nmea0183_field_skip(tvb, offset);
5850
5851 /* Mode Indicator */
5852 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_rma_mode);
5853
5854 return tvb_captured_length(tvb);
5855}
5856
5857static int
5858dissect_nmea0183_sentence_rmb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5859{
5860 unsigned offset = 0;
5861
5862 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5863 NULL((void*)0), "RMB sentence - Recommended Minimum Navigation Information");
5864
5865 /* Data Status */
5866 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_rmb_data_status);
5867
5868 /* Cross Track Error (XTE) */
5869 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rmb_xte, NULL((void*)0), NULL((void*)0));
5870
5871 /* Direction to Steer */
5872 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_rmb_steer);
5873
5874 /* Origin Waypoint ID */
5875 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rmb_orig_id, NULL((void*)0), NULL((void*)0));
5876
5877 /* Destination Waypoint ID */
5878 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rmb_dest_id, NULL((void*)0), NULL((void*)0));
5879
5880 /* Destination Waypoint Latitude */
5881 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_rmb_dest_wp_latitude);
5882
5883 /* Destination Waypoint Longitude */
5884 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_rmb_dest_wp_longitude);
5885
5886 /* Range to Destination, nautical miles */
5887 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rmb_range_dest, NULL((void*)0), NULL((void*)0));
5888
5889 /* Bearing to Destination, degrees True */
5890 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rmb_bearing_dest, NULL((void*)0), NULL((void*)0));
5891
5892 /* Destination Closing Velocity, knots */
5893 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rmb_dest_velocity, NULL((void*)0), NULL((void*)0));
5894
5895 /* Arrival Status */
5896 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_rmb_arrival_status);
5897
5898 /* Mode Indicator */
5899 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_rmb_mode);
5900
5901 return tvb_captured_length(tvb);
5902}
5903
5904static int
5905dissect_nmea0183_sentence_rmc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5906{
5907 unsigned offset = 0;
5908 const char *direction;
5909 const char *value;
5910 int length;
5911
5912 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5913 NULL((void*)0), "RMC sentence - Recommended Minimum Specific GNSS Data");
5914
5915 /* UTC of Position Fix */
5916 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_rmc_utc);
5917
5918 /* Data Status */
5919 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_rmc_status);
5920
5921 /* Latitude */
5922 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_rmc_latitude);
5923
5924 /* Longitude */
5925 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_rmc_longitude);
5926
5927 /* Speed over ground (knots) */
5928 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rmc_speed, NULL((void*)0), NULL((void*)0));
5929
5930 /* Course Over Ground (degrees true) */
5931 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rmc_course, NULL((void*)0), NULL((void*)0));
5932
5933 /* Date: ddmmyy */
5934 offset += dissect_nmea0183_field_decoded_date(tvb, pinfo, subtree, offset, hf_nmea0183_rmc_date);
5935
5936 /* Magnetic Variation, degrees E/W */
5937 value = nmea0183_field_value(tvb, pinfo, offset);
5938 length = (int)strlen(value);
5939 if (length == 0)
5940 {
5941 /* Sometimes this field is empty. */
5942 proto_tree_add_string(subtree, hf_nmea0183_rmc_magnetic, tvb, offset, 0,
5943 "Data temporarily unavailable");
5944 offset += dissect_nmea0183_field_skip(tvb, offset);
5945
5946 direction = nmea0183_field_value(tvb, pinfo, offset);
5947 if (direction[0] == '\0' || strcmp(direction, "E") == 0 ||
5948 strcmp(direction, "W") == 0)
5949 {
5950 offset += dissect_nmea0183_field_skip(tvb, offset);
5951 }
5952 else
5953 {
5954 /* The magnetic variation direction field was omitted. */
5955 expert_add_info(pinfo, tree, &ei_nmea0183_legacy_nonstandard);
5956 }
5957 }
5958 else
5959 {
5960 /* Easterly variation subtracts from True course / Westerly adds to True course */
5961 int magnetic_offset = offset;
5962
5963 offset += dissect_nmea0183_field_skip(tvb, offset);
5964 direction = nmea0183_field_value(tvb, pinfo, offset);
5965 if (strcmp(direction, "E") == 0)
5966 {
5967 proto_tree_add_string_format_value(subtree, hf_nmea0183_rmc_magnetic, tvb,
5968 magnetic_offset, length, value,
5969 "%s E (subtract from True Course)", value);
5970 offset += dissect_nmea0183_field_skip(tvb, offset);
5971 }
5972 else if (strcmp(direction, "W") == 0)
5973 {
5974 proto_tree_add_string_format_value(subtree, hf_nmea0183_rmc_magnetic, tvb,
5975 magnetic_offset, length, value,
5976 "%s W (add to True Course)", value);
5977 offset += dissect_nmea0183_field_skip(tvb, offset);
5978 }
5979 else
5980 {
5981 proto_tree_add_string(subtree, hf_nmea0183_rmc_magnetic, tvb,
5982 magnetic_offset, length, value);
5983 expert_add_info(pinfo, tree, &ei_nmea0183_legacy_nonstandard);
5984 }
5985 }
5986
5987 /* Mode Indicator */
5988 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_rmc_mode);
5989
5990 return tvb_captured_length(tvb);
5991}
5992
5993static int
5994dissect_nmea0183_sentence_rpm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5995{
5996 unsigned offset = 0;
5997
5998 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
5999 NULL((void*)0), "RPM sentence - Revolutions");
6000 /* Source, shaft/engine */
6001 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_rpm_source);
6002
6003 /* Engine or Shaft Number, numbered from centerline */
6004 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_rpm_number);
6005
6006 /* Speed, rev/min where negative numbers represent counter-clockwise */
6007 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rpm_speed, NULL((void*)0), NULL((void*)0));
6008
6009 /* Propeller Pitch, % of max */
6010 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rpm_pitch, NULL((void*)0), NULL((void*)0));
6011
6012 /* Data Status */
6013 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_rpm_status);
6014
6015 return tvb_captured_length(tvb);
6016}
6017
6018static int
6019dissect_nmea0183_sentence_rsa(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6020{
6021 unsigned offset = 0;
6022
6023 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6024 NULL((void*)0), "RSA sentence - Rudder Sensor Angle");
6025 /* Starboard (or single) Rudder Sensor */
6026 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rsa_sb_sensor, NULL((void*)0), NULL((void*)0));
6027
6028 /* Starboard sensor status */
6029 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_rsa_sb_status);
6030
6031 /* Port Rudder Sensor */
6032 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rsa_pt_sensor, NULL((void*)0), NULL((void*)0));
6033
6034 /* Port sensor status */
6035 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_rsa_pt_status);
6036
6037 return tvb_captured_length(tvb);
6038}
6039
6040static int
6041dissect_nmea0183_sentence_rsd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6042{
6043 unsigned offset = 0;
6044
6045 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6046 NULL((void*)0), "RSD sentence - RADAR System Data");
6047 /* Origin 1 range, from own ship */
6048 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rsd_orig_range, NULL((void*)0), NULL((void*)0));
6049
6050 /* Origin 1 bearing, degrees from 0 */
6051 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rsd_orig_bearing, NULL((void*)0), NULL((void*)0));
6052
6053 /* Variable Range Marker 1 (VRM1), range */
6054 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rsd_vrm1, NULL((void*)0), NULL((void*)0));
6055
6056 /* Bearing Line 1 (EBL1), degrees from 0 */
6057 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rsd_ebl1, NULL((void*)0), NULL((void*)0));
6058
6059 /* Origin 2 range */
6060 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rsd_orig2_range, NULL((void*)0), NULL((void*)0));
6061
6062 /* VRM2, range */
6063 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rsd_vrm2, NULL((void*)0), NULL((void*)0));
6064 /* EBL2, degrees */
6065 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rsd_ebl2, NULL((void*)0), NULL((void*)0));
6066
6067 /* Cursor range, from own ship */
6068 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rsd_cursor_range, NULL((void*)0), NULL((void*)0));
6069
6070 /* Cursor bearing, degrees clockwise from 0 */
6071 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rsd_cursor_bearing, NULL((void*)0), NULL((void*)0));
6072
6073 /* Range scale in use */
6074 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rsd_scale, NULL((void*)0), NULL((void*)0));
6075
6076 /* Range units */
6077 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_rsd_units);
6078
6079 /* Display Rotation */
6080 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_rsd_display);
6081
6082 return tvb_captured_length(tvb);
6083}
6084
6085static int
6086dissect_nmea0183_sentence_rte(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6087{
6088 unsigned offset = 0;
6089
6090 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6091 NULL((void*)0), "RTE sentence - Routes");
6092 /* Total number of sentences being transmitted */
6093 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rte_total_sentences, NULL((void*)0), NULL((void*)0));
6094
6095 /* Sentence Number */
6096 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rte_sentence_number, NULL((void*)0), NULL((void*)0));
6097
6098 /* Sentence Mode */
6099 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_rte_sentence_mode);
6100
6101 /* Route Identifier */
6102 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_rte_route, NULL((void*)0), NULL((void*)0));
6103
6104 /* There can be 1 to n waypoint identifiers so we loop through them all */
6105 while (tvb_captured_length_remaining(tvb, offset) > 0)
6106 {
6107 /* Waypoint identifier */
6108 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
6109 hf_nmea0183_rte_waypoint, NULL((void*)0), NULL((void*)0));
6110 }
6111
6112 return tvb_captured_length(tvb);
6113}
6114
6115static int
6116dissect_nmea0183_sentence_sfi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6117{
6118 unsigned offset = 0;
6119
6120 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6121 NULL((void*)0), "SFI sentence - Scanning Frequency Information");
6122 /* Total number of sentences being transmitted */
6123 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_sfi_total_sentences, NULL((void*)0), NULL((void*)0));
6124
6125 /* Sentence Number */
6126 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_sfi_sentence_number, NULL((void*)0), NULL((void*)0));
6127
6128 /* There can be up to 6 of these freq+mode pairs */
6129 for (int i = 0; i < 6 && tvb_captured_length_remaining(tvb, offset) > 0; i++)
6130 {
6131 /* Frequency or ITU Channel (100 Hz increments) */
6132 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
6133 hf_nmea0183_sfi_frequency, NULL((void*)0), NULL((void*)0));
6134
6135 /* Mode of Operation */
6136 if (tvb_captured_length_remaining(tvb, offset) > 0)
6137 {
6138 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset,
6139 hf_nmea0183_sfi_mode);
6140 }
6141 }
6142
6143 return tvb_captured_length(tvb);
6144}
6145
6146static int
6147dissect_nmea0183_sentence_ssd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6148{
6149 unsigned offset = 0;
6150
6151 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6152 NULL((void*)0), "SSD sentence - Saab AB, Security & Defense Solutions, Command and Control Systems Division (Sweden)");
6153 /* Ship's Callsign */
6154 /* Note: Callsign of "@@@@@@@" means unavailable */
6155 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ssd_callsign, NULL((void*)0), NULL((void*)0));
6156
6157 /* Ship's Name */
6158 /* Note: Ship's name of "@@@@@@@@@@@@@@@@@@@@" means unavailable */
6159 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ssd_name, NULL((void*)0), NULL((void*)0));
6160
6161 /* Pos. ref. point distance, "A," from bow 3, 0 to 511 meters */
6162 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ssd_ref_a, NULL((void*)0), NULL((void*)0));
6163
6164 /* Pos. ref. point distance, "B," from stern 3, 0 to 511 Meters */
6165 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ssd_ref_b, NULL((void*)0), NULL((void*)0));
6166
6167 /* Pos. ref. point distance, "C," from port beam 3, 0 to 63 Meters */
6168 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ssd_ref_c, NULL((void*)0), NULL((void*)0));
6169
6170 /* Pos. ref. point distance, "D," from starboard beam 3, 0 to 63 Meters */
6171 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ssd_ref_d, NULL((void*)0), NULL((void*)0));
6172
6173 /* DTE Indicator Flag */
6174 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_ssd_dte_flag);
6175
6176 /* Source Identifier */
6177 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ssd_source, NULL((void*)0), NULL((void*)0));
6178
6179 return tvb_captured_length(tvb);
6180}
6181
6182static int
6183dissect_nmea0183_sentence_stn(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6184{
6185 unsigned offset = 0;
6186
6187 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6188 NULL((void*)0), "STN sentence - Multiple Data ID");
6189 /* Talker ID Number (00-99) */
6190 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_stn_talker, NULL((void*)0), NULL((void*)0));
6191
6192 return tvb_captured_length(tvb);
6193}
6194
6195static int
6196dissect_nmea0183_sentence_tlb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6197{
6198 unsigned offset = 0;
6199
6200 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6201 NULL((void*)0), "TLB sentence - Target Label");
6202 /* There can be 1 to n of these target + label pairs */
6203 while (tvb_captured_length_remaining(tvb, offset) > 0)
6204 {
6205 /* Target number 'n' reported by the device */
6206 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
6207 hf_nmea0183_tlb_target, NULL((void*)0), NULL((void*)0));
6208
6209 /* Label assigned to target 'n' */
6210 if (tvb_captured_length_remaining(tvb, offset) > 0)
6211 {
6212 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
6213 hf_nmea0183_tlb_label, NULL((void*)0), NULL((void*)0));
6214 }
6215 }
6216
6217 return tvb_captured_length(tvb);
6218}
6219
6220static int
6221dissect_nmea0183_sentence_tll(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6222{
6223 unsigned offset = 0;
6224
6225 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6226 NULL((void*)0), "TLL sentence - Target Latitude and Longitude");
6227
6228 /* Target Number, 00-99 */
6229 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_tll_tgt_num, NULL((void*)0), NULL((void*)0));
6230
6231 /* Target Latitude */
6232 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_tll_tgt_latitude);
6233
6234 /* Target Longitude */
6235 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_tll_tgt_longitude);
6236
6237 /* Target Name */
6238 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_tll_tgt_name, NULL((void*)0), NULL((void*)0));
6239
6240 /* UTC of Data */
6241 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_tll_utc);
6242
6243 /* Target Status */
6244 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_tll_tgt_status);
6245
6246 /* Reference Target */
6247 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_tll_ref_tgt);
6248
6249 return tvb_captured_length(tvb);
6250}
6251
6252static int
6253dissect_nmea0183_sentence_ttm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6254{
6255 unsigned offset = 0;
6256
6257 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6258 NULL((void*)0), "TTM sentence - Tracked Target Message");
6259
6260 /* Target Number, 00 to 99 */
6261 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ttm_tgt_num, NULL((void*)0), NULL((void*)0));
6262
6263 /* Target Distance, from own ship */
6264 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ttm_tgt_dist, NULL((void*)0), NULL((void*)0));
6265
6266 /* Bearing from own ship, degrees true/relative */
6267 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ttm_bearing, NULL((void*)0), NULL((void*)0));
6268 offset += dissect_nmea0183_field_skip(tvb, offset);
6269
6270 /* Target Speed */
6271 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ttm_tgt_speed, NULL((void*)0), NULL((void*)0));
6272
6273 /* Target Course, degrees true/relative */
6274 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ttm_tgt_course, NULL((void*)0), NULL((void*)0));
6275 offset += dissect_nmea0183_field_skip(tvb, offset);
6276
6277 /* Distance of closest-point-of-approach */
6278 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ttm_dist_pt_approach, NULL((void*)0), NULL((void*)0));
6279
6280 /* Time to CPA, minutes ("-" = increasing decoded_time) */
6281 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ttm_time_cpa, NULL((void*)0), NULL((void*)0));
6282
6283 /* Speed/Distance Units */
6284 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_ttm_units);
6285
6286 /* Target Name */
6287 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ttm_tgt_name, NULL((void*)0), NULL((void*)0));
6288
6289 /* Target Status */
6290 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_ttm_tgt_status);
6291
6292 /* Reference Target */
6293 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_ttm_ref_tgt);
6294
6295 /* UTC of Data */
6296 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_ttm_utc);
6297
6298 /* Type of Acquisition */
6299 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_ttm_acq_type);
6300
6301 return tvb_captured_length(tvb);
6302}
6303
6304static int
6305dissect_nmea0183_sentence_tut(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6306{
6307 unsigned offset = 0;
6308
6309 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6310 NULL((void*)0), "TUT sentence - Transmission of Multi-Language Text");
6311 /* Source Identifier */
6312 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_tut_src_id, NULL((void*)0), NULL((void*)0));
6313
6314 /* Total number of sentences, 00 - FF */
6315 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_tut_total_sentences, NULL((void*)0), NULL((void*)0));
6316
6317 /* Sentence Number, 00 to FF */
6318 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_tut_sentence_num, NULL((void*)0), NULL((void*)0));
6319
6320 /* Sequential Message Identifier, 0 to 9 */
6321 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_tut_seq_msg, NULL((void*)0), NULL((void*)0));
6322
6323 /* Translation Code for Text Body */
6324 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_tut_trans_code, NULL((void*)0), NULL((void*)0));
6325
6326 /* Text Body */
6327 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_tut_text, NULL((void*)0), NULL((void*)0));
6328
6329 return tvb_captured_length(tvb);
6330}
6331
6332static int
6333dissect_nmea0183_sentence_vdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6334{
6335 unsigned offset = 0;
6336
6337 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6338 NULL((void*)0), "VDR sentence - Set and Drift");
6339 /* Direction, degrees True */
6340 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vdr_heading_true, NULL((void*)0), NULL((void*)0));
6341 offset += dissect_nmea0183_field_skip(tvb, offset);
6342
6343 /* Direction, degrees Magnetic */
6344 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vdr_heading_magnetic, NULL((void*)0), NULL((void*)0));
6345 offset += dissect_nmea0183_field_skip(tvb, offset);
6346
6347 /* Current Speed, knots */
6348 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vdr_speed, NULL((void*)0), NULL((void*)0));
6349
6350 return tvb_captured_length(tvb);
6351}
6352
6353static int
6354dissect_nmea0183_sentence_vpw(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6355{
6356 unsigned offset = 0;
6357
6358 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6359 NULL((void*)0), "VPW sentence - Speed, Measured Parallel to Wind");
6360 /* "-" means downwind for either of the following two fields */
6361
6362 /* Speed, knots */
6363 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vpw_speed_knots, NULL((void*)0), NULL((void*)0));
6364 offset += dissect_nmea0183_field_skip(tvb, offset);
6365
6366 /* Speed, meters/second */
6367 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vpw_speed_ms, NULL((void*)0), NULL((void*)0));
6368
6369 return tvb_captured_length(tvb);
6370}
6371
6372static int
6373dissect_nmea0183_sentence_vsd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6374{
6375 unsigned offset = 0;
6376
6377 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6378 NULL((void*)0), "VSD sentence - UAIS Voyage Static Data");
6379
6380 /* Type of Ship and Cargo Category, 0-255 */
6381 /* TODO: These are defined under Message 5 of ITU-R M.1371. NULL field means "unchanged". */
6382 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vsd_ship_cargo, NULL((void*)0), NULL((void*)0));
6383
6384 /* Maximum Present Static Draught, 0-25.5 meters */
6385 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vsd_max_draught, NULL((void*)0), NULL((void*)0));
6386
6387 /* Persons on-board, 0-8191 where a value of 8191 implies greater than or equal to 8191 */
6388 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vsd_persons, NULL((void*)0), NULL((void*)0));
6389
6390 /* Destination */
6391 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vsd_destination, NULL((void*)0), NULL((void*)0));
6392
6393 /* Estimated UTC of arrival at Destination */
6394 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_vsd_utc_arrival);
6395
6396 /* Estimated Day of Arrival at Destination, 00 to 31 */
6397 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vsd_day_arrival, NULL((void*)0), NULL((void*)0));
6398
6399 /* Estimated Month of Arrival at Destination, 00 to 12 */
6400 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vsd_month_arrival, NULL((void*)0), NULL((void*)0));
6401
6402 /* Navigational Status */
6403 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
6404 hf_nmea0183_vsd_nav_status, NULL((void*)0),
6405 nav_status_vals);
6406
6407 /* Regional Application Flags - set by Regional Authority (i.e., no table lookup) */
6408 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_vsd_app_flags, NULL((void*)0), NULL((void*)0));
6409
6410 return tvb_captured_length(tvb);
6411}
6412
6413static int
6414dissect_nmea0183_sentence_wcv(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6415{
6416 unsigned offset = 0;
6417
6418 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6419 NULL((void*)0), "WCV sentence - Waypoint Closure Velocity");
6420 /* Velocity component, knots */
6421 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_wcv_velocity, NULL((void*)0), NULL((void*)0));
6422 offset += dissect_nmea0183_field_skip(tvb, offset);
6423
6424 /* Waypoint identifier */
6425 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_wcv_waypoint, NULL((void*)0), NULL((void*)0));
6426
6427 /* Mode Indicator */
6428 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_wcv_mode);
6429
6430 return tvb_captured_length(tvb);
6431}
6432
6433static int
6434dissect_nmea0183_sentence_wnc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6435{
6436 unsigned offset = 0;
6437
6438 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6439 NULL((void*)0), "WNC sentence - Distance - Waypoint to Waypoint");
6440 /* Distance (nm) */
6441 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_wnc_dist_nm, NULL((void*)0), NULL((void*)0));
6442 offset += dissect_nmea0183_field_skip(tvb, offset);
6443
6444 /* Distance (km) */
6445 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_wnc_dist_km, NULL((void*)0), NULL((void*)0));
6446 offset += dissect_nmea0183_field_skip(tvb, offset);
6447
6448 /* 'TO' Waypoint Identifier */
6449 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_wnc_to_id, NULL((void*)0), NULL((void*)0));
6450
6451 /* 'FROM' Waypoint Identifier */
6452 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_wnc_from_id, NULL((void*)0), NULL((void*)0));
6453
6454 return tvb_captured_length(tvb);
6455}
6456
6457static int
6458dissect_nmea0183_sentence_wpl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6459{
6460 unsigned offset = 0;
6461
6462 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6463 NULL((void*)0), "WPL sentence - Waypoint Location");
6464
6465 /* Waypoint Latitude */
6466 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_wpl_latitude);
6467
6468 /* Waypoint Longitude */
6469 offset += dissect_nmea0183_field_latlong(tvb, pinfo, subtree, offset, hf_nmea0183_wpl_longitude);
6470
6471 /* Waypoint identifer */
6472 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_wpl_waypoint, NULL((void*)0), NULL((void*)0));
6473
6474 return tvb_captured_length(tvb);
6475}
6476
6477static int
6478dissect_nmea0183_sentence_xdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6479{
6480 unsigned offset = 0;
6481
6482 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6483 NULL((void*)0), "XDR sentence - Transducer Measurement");
6484 /* This can be from 1 to n transducer messages */
6485 while (tvb_captured_length_remaining(tvb, offset) > 0)
6486 {
6487 /* Transducer Type */
6488 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_xdr_type);
6489
6490 /* Transducer Data */
6491 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
6492 hf_nmea0183_xdr_data, NULL((void*)0), NULL((void*)0));
6493
6494 /* Transducer Units of Measure */
6495 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_xdr_units);
6496
6497 /* Transducer ID */
6498 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset,
6499 hf_nmea0183_xdr_id, NULL((void*)0), NULL((void*)0));
6500 }
6501
6502 return tvb_captured_length(tvb);
6503}
6504
6505static int
6506dissect_nmea0183_sentence_xte(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6507{
6508 unsigned offset = 0;
6509
6510 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6511 NULL((void*)0), "XTE sentence - Cross-Track Error, Measured");
6512 /* Data Status - Loran-C Blink or SNR Warning */
6513 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_xte_blinksnr_status);
6514
6515 /* Data Status - Loran-C Cycle Lock Warning Flag */
6516 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_xte_cycle_status);
6517
6518 /* Magnitude of XTE */
6519 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_xte_magnitude, NULL((void*)0), NULL((void*)0));
6520
6521 /* Direction to Steer (L/R) */
6522 offset += dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_xte_direction);
6523
6524 /* Mode Indicator */
6525 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_xte_mode);
6526
6527 return tvb_captured_length(tvb);
6528}
6529
6530static int
6531dissect_nmea0183_sentence_xtr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6532{
6533 unsigned offset = 0;
6534
6535 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6536 NULL((void*)0), "XTR sentence - Cross Track Error - Dead Reckoning");
6537 /* Magnitude of XTE */
6538 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_xtr_magnitude, NULL((void*)0), NULL((void*)0));
6539
6540 /* Direction to Steer (L/R) */
6541 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_xtr_direction, NULL((void*)0), NULL((void*)0));
6542
6543 return tvb_captured_length(tvb);
6544}
6545
6546static int
6547dissect_nmea0183_sentence_zdl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6548{
6549 unsigned offset = 0;
6550
6551 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6552 NULL((void*)0), "ZDL sentence - Time and Distance to Variable Point");
6553
6554 /* Time to point, hh = 00 to 99 hours */
6555 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_zdl_time);
6556
6557 /* Distance to point, nautical miles */
6558 offset += dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_zdl_dist, NULL((void*)0), NULL((void*)0));
6559
6560 /* Type of Point (table lookup) */
6561 dissect_nmea0183_field_item(tvb, pinfo, subtree, offset, hf_nmea0183_zdl_type);
6562
6563 return tvb_captured_length(tvb);
6564}
6565
6566static int
6567dissect_nmea0183_sentence_zfo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6568{
6569 unsigned offset = 0;
6570
6571 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6572 NULL((void*)0), "ZFO sentence - UTC & Time from origin Waypoint");
6573
6574 /* UTC of Observation */
6575 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_zfo_utc);
6576
6577 /* Elapsed Time, hh = 00 to 99 */
6578 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_zfo_elapsed);
6579
6580 /* Origin Waypoint ID */
6581 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_zfo_origin, NULL((void*)0), NULL((void*)0));
6582
6583 return tvb_captured_length(tvb);
6584}
6585
6586static int
6587dissect_nmea0183_sentence_ztg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
6588{
6589 unsigned offset = 0;
6590
6591 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6592 NULL((void*)0), "ZTG sentence - UTC & Time to Destination Waypoint");
6593
6594 /* UTC of Observation */
6595 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_ztg_utc);
6596
6597 /* Time-to-go, hh = 00 to 99 */
6598 offset += dissect_nmea0183_field_decoded_time(tvb, pinfo, subtree, offset, hf_nmea0183_ztg_time_left);
6599
6600 /* Destination Waypoint ID */
6601 dissect_nmea0183_field(tvb, pinfo, subtree, offset, hf_nmea0183_ztg_dest, NULL((void*)0), NULL((void*)0));
6602
6603 return tvb_captured_length(tvb);
6604}
6605
6606 /* Dissect a sentence where the sentence id is unknown. Each field is shown as an generic field. */
6607static int
6608dissect_nmea0183_sentence_unknown(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree)
6609{
6610 unsigned offset = 0;
6611
6612 proto_tree *subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_nmea0183_sentence,
6613 NULL((void*)0), "Unknown sentence");
6614
6615 /* In an unknown sentence, the name of each field is unknown. Find all field by splitting at a comma. */
6616 while (tvb_captured_length_remaining(tvb, offset) > 0)
6617 {
6618 int end_of_field_offset = tvb_find_end_of_nmea0183_field(tvb, offset);
6619 proto_item *ti = proto_tree_add_item(subtree, hf_nmea0183_unknown_field,
6620 tvb, offset, end_of_field_offset - offset, ENC_ASCII0x00000000);
6621 if (end_of_field_offset - offset == 0)
6622 {
6623 proto_item_append_text(ti, "[empty]");
6624 }
6625 offset = end_of_field_offset + 1;
6626 }
6627 return tvb_captured_length(tvb);
6628}
6629
6630
6631/* <tag block 1>,<tagblock2>, … <tagblock n>*<tagblocks CS> */
6632//static void
6633//dissect_nmea0183_tag_block(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree)
6634//{
6635// unsigned offset = 0, chk_sum_off, comma_off;
6636//
6637// if (!tvb_find_uint8_remaining(tvb, offset, '*', &chk_sum_off)) {
6638// /* No checksum ??*/
6639// return;
6640// }
6641// while (offset < chk_sum_off) {
6642// if (!tvb_find_uint8_remaining(tvb, offset, ',', &comma_off)) {
6643//
6644// }
6645//
6646// }
6647//
6648//}
6649static unsigned
6650dissect_nmea0183_tag_blocks(tvbuff_t* tvb, packet_info* pinfo _U___attribute__((unused)), proto_tree* tree, unsigned offset) {
6651
6652 unsigned start_offset;
6653 unsigned end_offset;
6654
6655 while (tvb_get_uint8(tvb, offset) == '\\') {
6656 start_offset = offset;
6657 offset++;
6658 if (!tvb_find_uint8_remaining(tvb, offset, '\\', &end_offset)) {
6659 // Add expert info
6660 return tvb_captured_length(tvb);
6661 }
6662 proto_tree_add_item(tree, hf_nmea0183_tag_block, tvb, start_offset, (end_offset - start_offset) + 1, ENC_ASCII0x00000000);
6663 //proto_tree* tree = proto_item_add_subtree(ti, ett_nmea0183_tag_block);
6664 offset = end_offset + 1;
6665 }
6666 return offset;
6667}
6668
6669static int
6670dissect_nmea0183_msg(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree)
6671{
6672 proto_item* ti;
6673 unsigned offset = 0,start_offset;
6674 unsigned start_checksum_offset = 0;
6675 const char* talker_id = NULL((void*)0);
6676 const char* sentence_id = NULL((void*)0);
6677 const char* checksum = NULL((void*)0);
6678 uint8_t start_delimiter;
6679
6680 /* Start delimiter */
6681 start_delimiter = tvb_get_uint8(tvb, offset);
6682 if ((start_delimiter != '$') && (start_delimiter != '!'))
6683 {
6684 expert_add_info(pinfo, tree, &ei_nmea0183_invalid_first_character);
6685 }
6686
6687 offset += 1;
6688 start_offset = offset;
6689 /* Talker id */
6690 ti = proto_tree_add_item_ret_string(tree, hf_nmea0183_talker_id,
6691 tvb, offset, 2, ENC_ASCII0x00000000,
6692 pinfo->pool, (const uint8_t**)&talker_id);
6693
6694 proto_item_append_text(ti, " (%s)", str_to_str_wmem(pinfo->pool, talker_id, known_talker_ids, "Unknown talker ID"));
6695
6696 col_append_fstr(pinfo->cinfo, COL_INFO, "Talker %s", str_to_str_wmem(pinfo->pool, talker_id, known_talker_ids, "Unknown talker ID"));
6697
6698 offset += 2;
6699
6700 /* Sentence id */
6701 ti = proto_tree_add_item_ret_string(tree, hf_nmea0183_sentence_id,
6702 tvb, offset, 3, ENC_ASCII0x00000000,
6703 pinfo->pool, (const uint8_t**)&sentence_id);
6704
6705 proto_item_append_text(ti, " (%s)", str_to_str_wmem(pinfo->pool, sentence_id, known_sentence_ids, "Unknown sentence ID"));
6706
6707 col_append_fstr(pinfo->cinfo, COL_INFO, ", Sentence %s", str_to_str_wmem(pinfo->pool, sentence_id, known_sentence_ids, "Unknown sentence ID"));
6708
6709 offset += 3;
6710
6711 /* Start of checksum */
6712 if (!tvb_find_uint8_remaining(tvb, offset, '*', &start_checksum_offset))
6713 {
6714 expert_add_info(pinfo, tree, &ei_nmea0183_missing_checksum_character);
6715 return tvb_captured_length(tvb);
6716 }
6717
6718 /* Data */
6719 offset += 1;
6720 tvbuff_t *data_tvb = tvb_new_subset_length(tvb, offset, start_checksum_offset - offset);
6721 if (g_ascii_strcasecmp(sentence_id, "AAM") == 0)
6722 {
6723 offset += dissect_nmea0183_sentence_aam(data_tvb, pinfo, tree);
6724 }
6725 else if (g_ascii_strcasecmp(sentence_id, "ABK") == 0)
6726 {
6727 offset += dissect_nmea0183_sentence_abk(data_tvb, pinfo, tree);
6728 }
6729 else if (g_ascii_strcasecmp(sentence_id, "ACA") == 0)
6730 {
6731 offset += dissect_nmea0183_sentence_aca(data_tvb, pinfo, tree);
6732 }
6733 else if (g_ascii_strcasecmp(sentence_id, "ACK") == 0)
6734 {
6735 offset += dissect_nmea0183_sentence_ack(data_tvb, pinfo, tree);
6736 }
6737 else if (g_ascii_strcasecmp(sentence_id, "ACS") == 0)
6738 {
6739 offset += dissect_nmea0183_sentence_acs(data_tvb, pinfo, tree);
6740 }
6741 else if (g_ascii_strcasecmp(sentence_id, "AIR") == 0)
6742 {
6743 offset += dissect_nmea0183_sentence_air(data_tvb, pinfo, tree);
6744 }
6745 else if (g_ascii_strcasecmp(sentence_id, "AKD") == 0)
6746 {
6747 offset += dissect_nmea0183_sentence_akd(data_tvb, pinfo, tree);
6748 }
6749 else if (g_ascii_strcasecmp(sentence_id, "ALA") == 0)
6750 {
6751 offset += dissect_nmea0183_sentence_ala(data_tvb, pinfo, tree);
6752 }
6753 else if (g_ascii_strcasecmp(sentence_id, "ALM") == 0)
6754 {
6755 offset += dissect_nmea0183_sentence_alm(data_tvb, pinfo, tree);
6756 }
6757 else if (g_ascii_strcasecmp(sentence_id, "ALR") == 0)
6758 {
6759 offset += dissect_nmea0183_sentence_alr(data_tvb, pinfo, tree);
6760 }
6761 else if (g_ascii_strcasecmp(sentence_id, "APB") == 0)
6762 {
6763 offset += dissect_nmea0183_sentence_apb(data_tvb, pinfo, tree);
6764 }
6765 else if (g_ascii_strcasecmp(sentence_id, "BEC") == 0)
6766 {
6767 offset += dissect_nmea0183_sentence_bec(data_tvb, pinfo, tree);
6768 }
6769 else if (g_ascii_strcasecmp(sentence_id, "BOD") == 0)
6770 {
6771 offset += dissect_nmea0183_sentence_bod(data_tvb, pinfo, tree);
6772 }
6773 else if (g_ascii_strcasecmp(sentence_id, "BWC") == 0)
6774 {
6775 offset += dissect_nmea0183_sentence_bwc(data_tvb, pinfo, tree);
6776 }
6777 else if (g_ascii_strcasecmp(sentence_id, "BWR") == 0)
6778 {
6779 offset += dissect_nmea0183_sentence_bwr(data_tvb, pinfo, tree);
6780 }
6781 else if (g_ascii_strcasecmp(sentence_id, "BWW") == 0)
6782 {
6783 offset += dissect_nmea0183_sentence_bww(data_tvb, pinfo, tree);
6784 }
6785 else if (g_ascii_strcasecmp(sentence_id, "CBR") == 0)
6786 {
6787 offset += dissect_nmea0183_sentence_cbr(data_tvb, pinfo, tree);
6788 }
6789 else if (g_ascii_strcasecmp(sentence_id, "CUR") == 0)
6790 {
6791 offset += dissect_nmea0183_sentence_cur(data_tvb, pinfo, tree);
6792 }
6793 else if (g_ascii_strcasecmp(sentence_id, "DBT") == 0)
6794 {
6795 offset += dissect_nmea0183_sentence_dbt(data_tvb, pinfo, tree);
6796 }
6797 else if (g_ascii_strcasecmp(sentence_id, "DCN") == 0)
6798 {
6799 offset += dissect_nmea0183_sentence_dcn(data_tvb, pinfo, tree);
6800 }
6801 else if (g_ascii_strcasecmp(sentence_id, "DDC") == 0)
6802 {
6803 offset += dissect_nmea0183_sentence_ddc(data_tvb, pinfo, tree);
6804 }
6805 else if (g_ascii_strcasecmp(sentence_id, "DOR") == 0)
6806 {
6807 offset += dissect_nmea0183_sentence_dor(data_tvb, pinfo, tree);
6808 }
6809 else if (g_ascii_strcasecmp(sentence_id, "DPT") == 0)
6810 {
6811 offset += dissect_nmea0183_sentence_dpt(data_tvb, pinfo, tree);
6812 }
6813 else if (g_ascii_strcasecmp(sentence_id, "DSC") == 0)
6814 {
6815 offset += dissect_nmea0183_sentence_dsc(data_tvb, pinfo, tree);
6816 }
6817 else if (g_ascii_strcasecmp(sentence_id, "DSE") == 0)
6818 {
6819 offset += dissect_nmea0183_sentence_dse(data_tvb, pinfo, tree);
6820 }
6821 else if (g_ascii_strcasecmp(sentence_id, "DSI") == 0)
6822 {
6823 offset += dissect_nmea0183_sentence_dsi(data_tvb, pinfo, tree);
6824 }
6825 else if (g_ascii_strcasecmp(sentence_id, "DSR") == 0)
6826 {
6827 offset += dissect_nmea0183_sentence_dsr(data_tvb, pinfo, tree);
6828 }
6829 else if (g_ascii_strcasecmp(sentence_id, "DTM") == 0)
6830 {
6831 offset += dissect_nmea0183_sentence_dtm(data_tvb, pinfo, tree);
6832 }
6833 else if (g_ascii_strcasecmp(sentence_id, "ETL") == 0)
6834 {
6835 offset += dissect_nmea0183_sentence_etl(data_tvb, pinfo, tree);
6836 }
6837 else if (g_ascii_strcasecmp(sentence_id, "FSI") == 0)
6838 {
6839 offset += dissect_nmea0183_sentence_fsi(data_tvb, pinfo, tree);
6840 }
6841 else if (g_ascii_strcasecmp(sentence_id, "GBS") == 0)
6842 {
6843 offset += dissect_nmea0183_sentence_gbs(data_tvb, pinfo, tree);
6844 }
6845 else if (g_ascii_strcasecmp(sentence_id, "GGA") == 0)
6846 {
6847 offset += dissect_nmea0183_sentence_gga(data_tvb, pinfo, tree);
6848 }
6849 else if (g_ascii_strcasecmp(sentence_id, "GLC") == 0)
6850 {
6851 offset += dissect_nmea0183_sentence_glc(data_tvb, pinfo, tree);
6852 }
6853 else if (g_ascii_strcasecmp(sentence_id, "GLL") == 0)
6854 {
6855 offset += dissect_nmea0183_sentence_gll(data_tvb, pinfo, tree);
6856 }
6857 else if (g_ascii_strcasecmp(sentence_id, "GMP") == 0)
6858 {
6859 offset += dissect_nmea0183_sentence_gmp(data_tvb, pinfo, tree);
6860 }
6861 else if (g_ascii_strcasecmp(sentence_id, "GNS") == 0)
6862 {
6863 offset += dissect_nmea0183_sentence_gns(data_tvb, pinfo, tree);
6864 }
6865 else if (g_ascii_strcasecmp(sentence_id, "GRS") == 0)
6866 {
6867 offset += dissect_nmea0183_sentence_grs(data_tvb, pinfo, tree);
6868 }
6869 else if (g_ascii_strcasecmp(sentence_id, "GSA") == 0)
6870 {
6871 offset += dissect_nmea0183_sentence_gsa(data_tvb, pinfo, tree);
6872 }
6873 else if (g_ascii_strcasecmp(sentence_id, "GST") == 0)
6874 {
6875 offset += dissect_nmea0183_sentence_gst(data_tvb, pinfo, tree);
6876 }
6877 else if (g_ascii_strcasecmp(sentence_id, "GSV") == 0)
6878 {
6879 offset += dissect_nmea0183_sentence_gsv(data_tvb, pinfo, tree);
6880 }
6881 else if (g_ascii_strcasecmp(sentence_id, "HBT") == 0)
6882 {
6883 offset += dissect_nmea0183_sentence_hbt(data_tvb, pinfo, tree);
6884 }
6885 else if (g_ascii_strcasecmp(sentence_id, "HDG") == 0)
6886 {
6887 offset += dissect_nmea0183_sentence_hdg(data_tvb, pinfo, tree);
6888 }
6889 else if (g_ascii_strcasecmp(sentence_id, "HDT") == 0)
6890 {
6891 offset += dissect_nmea0183_sentence_hdt(data_tvb, pinfo, tree);
6892 }
6893 else if (g_ascii_strcasecmp(sentence_id, "HMR") == 0)
6894 {
6895 offset += dissect_nmea0183_sentence_hmr(data_tvb, pinfo, tree);
6896 }
6897 else if (g_ascii_strcasecmp(sentence_id, "HMS") == 0)
6898 {
6899 offset += dissect_nmea0183_sentence_hms(data_tvb, pinfo, tree);
6900 }
6901 else if (g_ascii_strcasecmp(sentence_id, "HSC") == 0)
6902 {
6903 offset += dissect_nmea0183_sentence_hsc(data_tvb, pinfo, tree);
6904 }
6905 else if (g_ascii_strcasecmp(sentence_id, "HTC") == 0)
6906 {
6907 offset += dissect_nmea0183_sentence_htc(data_tvb, pinfo, tree);
6908 }
6909 else if (g_ascii_strcasecmp(sentence_id, "HTD") == 0)
6910 {
6911 offset += dissect_nmea0183_sentence_htd(data_tvb, pinfo, tree);
6912 }
6913 else if (g_ascii_strcasecmp(sentence_id, "LCD") == 0)
6914 {
6915 offset += dissect_nmea0183_sentence_lcd(data_tvb, pinfo, tree);
6916 }
6917 else if (g_ascii_strcasecmp(sentence_id, "LR1") == 0)
6918 {
6919 offset += dissect_nmea0183_sentence_lr1(data_tvb, pinfo, tree);
6920 }
6921 else if (g_ascii_strcasecmp(sentence_id, "LR2") == 0)
6922 {
6923 offset += dissect_nmea0183_sentence_lr2(data_tvb, pinfo, tree);
6924 }
6925 else if (g_ascii_strcasecmp(sentence_id, "LR3") == 0)
6926 {
6927 offset += dissect_nmea0183_sentence_lr3(data_tvb, pinfo, tree);
6928 }
6929 else if (g_ascii_strcasecmp(sentence_id, "LRF") == 0)
6930 {
6931 offset += dissect_nmea0183_sentence_lrf(data_tvb, pinfo, tree);
6932 }
6933 else if (g_ascii_strcasecmp(sentence_id, "LRI") == 0)
6934 {
6935 offset += dissect_nmea0183_sentence_lri(data_tvb, pinfo, tree);
6936 }
6937 else if (g_ascii_strcasecmp(sentence_id, "MLA") == 0)
6938 {
6939 offset += dissect_nmea0183_sentence_mla(data_tvb, pinfo, tree);
6940 }
6941 else if (g_ascii_strcasecmp(sentence_id, "MSK") == 0)
6942 {
6943 offset += dissect_nmea0183_sentence_msk(data_tvb, pinfo, tree);
6944 }
6945 else if (g_ascii_strcasecmp(sentence_id, "MSS") == 0)
6946 {
6947 offset += dissect_nmea0183_sentence_mss(data_tvb, pinfo, tree);
6948 }
6949 else if (g_ascii_strcasecmp(sentence_id, "MTW") == 0)
6950 {
6951 offset += dissect_nmea0183_sentence_mtw(data_tvb, pinfo, tree);
6952 }
6953 else if (g_ascii_strcasecmp(sentence_id, "MWD") == 0)
6954 {
6955 offset += dissect_nmea0183_sentence_mwd(data_tvb, pinfo, tree);
6956 }
6957 else if (g_ascii_strcasecmp(sentence_id, "MWV") == 0)
6958 {
6959 offset += dissect_nmea0183_sentence_mwv(data_tvb, pinfo, tree);
6960 }
6961 else if (g_ascii_strcasecmp(sentence_id, "OSD") == 0)
6962 {
6963 offset += dissect_nmea0183_sentence_osd(data_tvb, pinfo, tree);
6964 }
6965 else if (g_ascii_strcasecmp(sentence_id, "RMA") == 0)
6966 {
6967 offset += dissect_nmea0183_sentence_rma(data_tvb, pinfo, tree);
6968 }
6969 else if (g_ascii_strcasecmp(sentence_id, "RMB") == 0)
6970 {
6971 offset += dissect_nmea0183_sentence_rmb(data_tvb, pinfo, tree);
6972 }
6973 else if (g_ascii_strcasecmp(sentence_id, "RMC") == 0)
6974 {
6975 offset += dissect_nmea0183_sentence_rmc(data_tvb, pinfo, tree);
6976 }
6977 else if (g_ascii_strcasecmp(sentence_id, "ROT") == 0)
6978 {
6979 offset += dissect_nmea0183_sentence_rot(data_tvb, pinfo, tree);
6980 }
6981 else if (g_ascii_strcasecmp(sentence_id, "RPM") == 0)
6982 {
6983 offset += dissect_nmea0183_sentence_rpm(data_tvb, pinfo, tree);
6984 }
6985 else if (g_ascii_strcasecmp(sentence_id, "RSA") == 0)
6986 {
6987 offset += dissect_nmea0183_sentence_rsa(data_tvb, pinfo, tree);
6988 }
6989 else if (g_ascii_strcasecmp(sentence_id, "RSD") == 0)
6990 {
6991 offset += dissect_nmea0183_sentence_rsd(data_tvb, pinfo, tree);
6992 }
6993 else if (g_ascii_strcasecmp(sentence_id, "RTE") == 0)
6994 {
6995 offset += dissect_nmea0183_sentence_rte(data_tvb, pinfo, tree);
6996 }
6997 else if (g_ascii_strcasecmp(sentence_id, "SFI") == 0)
6998 {
6999 offset += dissect_nmea0183_sentence_sfi(data_tvb, pinfo, tree);
7000 }
7001 else if (g_ascii_strcasecmp(sentence_id, "SSD") == 0)
7002 {
7003 offset += dissect_nmea0183_sentence_ssd(data_tvb, pinfo, tree);
7004 }
7005 else if (g_ascii_strcasecmp(sentence_id, "STN") == 0)
7006 {
7007 offset += dissect_nmea0183_sentence_stn(data_tvb, pinfo, tree);
7008 }
7009 else if (g_ascii_strcasecmp(sentence_id, "TLB") == 0)
7010 {
7011 offset += dissect_nmea0183_sentence_tlb(data_tvb, pinfo, tree);
7012 }
7013 else if (g_ascii_strcasecmp(sentence_id, "TLL") == 0)
7014 {
7015 offset += dissect_nmea0183_sentence_tll(data_tvb, pinfo, tree);
7016 }
7017 else if (g_ascii_strcasecmp(sentence_id, "TTM") == 0)
7018 {
7019 offset += dissect_nmea0183_sentence_ttm(data_tvb, pinfo, tree);
7020 }
7021 else if (g_ascii_strcasecmp(sentence_id, "TUT") == 0)
7022 {
7023 offset += dissect_nmea0183_sentence_tut(data_tvb, pinfo, tree);
7024 }
7025 else if (g_ascii_strcasecmp(sentence_id, "TXT") == 0)
7026 {
7027 offset += dissect_nmea0183_sentence_txt(data_tvb, pinfo, tree);
7028 }
7029 else if (g_ascii_strcasecmp(sentence_id, "VBW") == 0)
7030 {
7031 offset += dissect_nmea0183_sentence_vbw(data_tvb, pinfo, tree);
7032 }
7033 else if (g_ascii_strcasecmp(sentence_id, "VDR") == 0)
7034 {
7035 offset += dissect_nmea0183_sentence_vdr(data_tvb, pinfo, tree);
7036 }
7037 else if (g_ascii_strcasecmp(sentence_id, "VHW") == 0)
7038 {
7039 offset += dissect_nmea0183_sentence_vhw(data_tvb, pinfo, tree);
7040 }
7041 else if (g_ascii_strcasecmp(sentence_id, "VLW") == 0)
7042 {
7043 offset += dissect_nmea0183_sentence_vlw(data_tvb, pinfo, tree);
7044 }
7045 else if (g_ascii_strcasecmp(sentence_id, "VPW") == 0)
7046 {
7047 offset += dissect_nmea0183_sentence_vpw(data_tvb, pinfo, tree);
7048 }
7049 else if (g_ascii_strcasecmp(sentence_id, "VSD") == 0)
7050 {
7051 offset += dissect_nmea0183_sentence_vsd(data_tvb, pinfo, tree);
7052 }
7053 else if (g_ascii_strcasecmp(sentence_id, "VTG") == 0)
7054 {
7055 offset += dissect_nmea0183_sentence_vtg(data_tvb, pinfo, tree);
7056 }
7057 else if (g_ascii_strcasecmp(sentence_id, "WCV") == 0)
7058 {
7059 offset += dissect_nmea0183_sentence_wcv(data_tvb, pinfo, tree);
7060 }
7061 else if (g_ascii_strcasecmp(sentence_id, "WNC") == 0)
7062 {
7063 offset += dissect_nmea0183_sentence_wnc(data_tvb, pinfo, tree);
7064 }
7065 else if (g_ascii_strcasecmp(sentence_id, "WPL") == 0)
7066 {
7067 offset += dissect_nmea0183_sentence_wpl(data_tvb, pinfo, tree);
7068 }
7069 else if (g_ascii_strcasecmp(sentence_id, "XDR") == 0)
7070 {
7071 offset += dissect_nmea0183_sentence_xdr(data_tvb, pinfo, tree);
7072 }
7073 else if (g_ascii_strcasecmp(sentence_id, "XTE") == 0)
7074 {
7075 offset += dissect_nmea0183_sentence_xte(data_tvb, pinfo, tree);
7076 }
7077 else if (g_ascii_strcasecmp(sentence_id, "XTR") == 0)
7078 {
7079 offset += dissect_nmea0183_sentence_xtr(data_tvb, pinfo, tree);
7080 }
7081 else if (g_ascii_strcasecmp(sentence_id, "ZDA") == 0)
7082 {
7083 offset += dissect_nmea0183_sentence_zda(data_tvb, pinfo, tree);
7084 }
7085 else if (g_ascii_strcasecmp(sentence_id, "ZDL") == 0)
7086 {
7087 offset += dissect_nmea0183_sentence_zdl(data_tvb, pinfo, tree);
7088 }
7089 else if (g_ascii_strcasecmp(sentence_id, "ZFO") == 0)
7090 {
7091 offset += dissect_nmea0183_sentence_zfo(data_tvb, pinfo, tree);
7092 }
7093 else if (g_ascii_strcasecmp(sentence_id, "ZTG") == 0)
7094 {
7095 offset += dissect_nmea0183_sentence_ztg(data_tvb, pinfo, tree);
7096 }
7097 else
7098 {
7099 offset += dissect_nmea0183_sentence_unknown(data_tvb, pinfo, tree);
7100 }
7101
7102 /* Checksum */
7103 offset += 1;
7104 ti = proto_tree_add_item_ret_string(tree, hf_nmea0183_checksum,
7105 tvb, offset, 2, ENC_ASCII0x00000000,
7106 pinfo->pool, (const uint8_t**)&checksum);
7107
7108 uint8_t received_checksum = (uint8_t)strtol(checksum, NULL((void*)0), 16);
7109 uint8_t calculated_checksum;
7110
7111 //calculated_checksum = calculate_checksum(tvb, 1, offset - 2);
7112 calculated_checksum = calculate_checksum(tvb, start_offset, (offset - start_offset-1));
7113
7114 if (received_checksum == calculated_checksum)
7115 {
7116 proto_item_append_text(ti, " [correct]");
7117 }
7118 else
7119 {
7120 proto_item_append_text(ti, " [INCORRECT]");
7121 expert_add_info(pinfo, ti, &ei_nmea0183_checksum_incorrect);
7122 }
7123
7124 // Calculated checksum highlights 2 bytes, which is the ascii hex value of a 1 byte checksum
7125 proto_item *checksum_tree = proto_item_add_subtree(ti, ett_nmea0183_checksum);
7126 ti = proto_tree_add_uint(checksum_tree, hf_nmea0183_checksum_calculated,
7127 tvb, offset, 2, calculated_checksum);
7128
7129 proto_item_set_generated(ti);
7130
7131 offset += 2;
7132
7133 /* End of line */
7134 if (tvb_captured_length_remaining(tvb, offset) < 2 ||
7135 tvb_get_uint8(tvb, offset) != '\r' ||
7136 tvb_get_uint8(tvb, offset + 1) != '\n')
7137 {
7138 expert_add_info(pinfo, tree, &ei_nmea0183_invalid_end_of_line);
7139 }
7140 offset += 2;
7141
7142 /* Check sentence length */
7143 if (offset > 82)
7144 {
7145 expert_add_info(pinfo, tree, &ei_nmea0183_sentence_too_long);
7146 }
7147
7148 return tvb_captured_length(tvb);
7149}
7150
7151static const value_string nmea0183_bin_mtype_vals[] = {
7152 { 1, "Data"},
7153 { 2, "Query"},
7154 { 3, "Ack"},
7155 { 0, NULL((void*)0) },
7156};
7157
7158static int
7159dissect_nmea0183_bin(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, void* data _U___attribute__((unused)))
7160{
7161 proto_item* ti;
7162 proto_tree* nmea0183_tree, *fd_tree;
7163 uint32_t mtype, seqnum, file_descriptor_len, type_len;
7164
7165 unsigned offset = 0;
7166
7167 col_set_str(pinfo->cinfo, COL_PROTOCOL, "NMEA 0183 Binary");
7168 /* Clear the info column */
7169 col_clear(pinfo->cinfo, COL_INFO);
7170
7171 ti = proto_tree_add_item(tree, proto_nmea0183_bin, tvb, 0, -1, ENC_NA0x00000000);
7172 nmea0183_tree = proto_item_add_subtree(ti, ett_nmea0183);
7173
7174 proto_tree_add_item(nmea0183_tree, hf_nmea0183_sentence_prefix, tvb, offset, 6, ENC_ASCII0x00000000);
7175 offset += 6;
7176 proto_tree_add_item(nmea0183_tree, hf_nmea0183_bin_version, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
7177 offset+=2;
7178 proto_tree_add_item(nmea0183_tree, hf_nmea0183_bin_srcid, tvb, offset, 6, ENC_ASCII0x00000000);
7179 offset += 6;
7180 proto_tree_add_item(nmea0183_tree, hf_nmea0183_bin_dstid, tvb, offset, 6, ENC_ASCII0x00000000);
7181 offset += 6;
7182 proto_tree_add_item_ret_uint(nmea0183_tree, hf_nmea0183_bin_mtype, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000, &mtype);
7183 offset += 2;
7184 proto_tree_add_item(nmea0183_tree, hf_nmea0183_bin_blockid, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
7185 offset += 4;
7186 proto_tree_add_item_ret_uint(nmea0183_tree, hf_nmea0183_bin_seqnum, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &seqnum);
7187 offset += 4;
7188 proto_tree_add_item(nmea0183_tree, hf_nmea0183_bin_max_seqnum, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
7189 offset += 4;
7190 if (offset < tvb_reported_length(tvb)) {
7191 if ((mtype == 1) && (seqnum == 1)) {
7192 /* binary file descriptor*/
7193 ti = proto_tree_add_item(nmea0183_tree, hf_nmea0183_bin_file_descriptor, tvb, offset, -1, ENC_ASCII0x00000000);
7194 fd_tree = proto_item_add_subtree(ti, ett_nmea0183_fd);
7195 proto_tree_add_item_ret_uint(fd_tree, hf_nmea0183_bin_file_descriptor_len, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000, &file_descriptor_len);
7196 proto_item_set_len(ti, file_descriptor_len);
7197 offset += 4;
7198 proto_tree_add_item(fd_tree, hf_nmea0183_bin_file_length, tvb, offset, 4, ENC_BIG_ENDIAN0x00000000);
7199 offset += 4;
7200 proto_tree_add_item(fd_tree, hf_nmea0183_bin_stat_of_acquisition, tvb, offset, 2, ENC_BIG_ENDIAN0x00000000);
7201 offset += 2;
7202 proto_tree_add_item(fd_tree, hf_nmea0183_bin_device, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
7203 offset++;
7204 proto_tree_add_item(fd_tree, hf_nmea0183_bin_channel, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
7205 offset++;
7206 proto_tree_add_item_ret_uint(fd_tree, hf_nmea0183_bin_type_len, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &type_len);
7207 offset++;
7208 proto_tree_add_item(fd_tree, hf_nmea0183_bin_data_type, tvb, offset, type_len, ENC_ASCII0x00000000);
7209 offset += type_len;
7210 proto_tree_add_item(fd_tree, hf_nmea0183_bin_status_and_info, tvb, offset, file_descriptor_len - type_len - 13, ENC_ASCII0x00000000);
7211 offset += file_descriptor_len - type_len - 13;
7212 }
7213 proto_tree_add_item(nmea0183_tree, hf_nmea0183_bin_data, tvb, offset, -1, ENC_NA0x00000000);
7214 }
7215
7216
7217 return tvb_reported_length(tvb);
7218}
7219
7220static int
7221dissect_nmea0183(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, void* data)
7222{
7223 proto_item* ti;
7224 proto_tree* nmea0183_tree = NULL((void*)0);
7225 unsigned offset = 0;
7226 unsigned end_offset;
7227 bool_Bool first_msg = true1;
7228
7229 col_set_str(pinfo->cinfo, COL_PROTOCOL, "NMEA 0183");
7230 /* Clear the info column */
7231 col_clear(pinfo->cinfo, COL_INFO);
7232
7233 /* Find end of nmea message */
7234 if (tvb_find_uint16_remaining(tvb, 0, NMEA0183_CRLF0x0d0a, &end_offset)) {
7235 /* Add CRLF */
7236 end_offset += 2;
7237 } else {
7238 end_offset = tvb_reported_length(tvb);
7239 }
7240
7241 /* UdPbC\<tag block 1>,<tagblock2>, … <tagblock n>*<tagblocks CS>\<NMEA message>*/
7242 if (tvb_strneql(tvb, 0, UDPBC"UdPbC", strlen(UDPBC"UdPbC")) == 0) {
7243 if (first_msg == true1) {
7244 ti = proto_tree_add_item(tree, proto_nmea0183, tvb, 0, end_offset, ENC_NA0x00000000);
7245 nmea0183_tree = proto_item_add_subtree(ti, ett_nmea0183);
7246 }
7247 proto_tree_add_item(nmea0183_tree, hf_nmea0183_sentence_prefix, tvb, offset, 6, ENC_ASCII0x00000000);
7248 offset += 6;
7249 while (tvb_reported_length_remaining(tvb, offset)) {
7250 if (first_msg != true1) {
7251 if (tvb_find_uint16_remaining(tvb, offset, NMEA0183_CRLF0x0d0a, &end_offset)) {
7252 /* Add CRLF */
7253 end_offset += 2;
7254 } else {
7255 end_offset = tvb_reported_length(tvb);
7256 }
7257
7258 ti = proto_tree_add_item(tree, proto_nmea0183, tvb, offset, end_offset, ENC_NA0x00000000);
7259 nmea0183_tree = proto_item_add_subtree(ti, ett_nmea0183);
7260 }
7261 offset = dissect_nmea0183_tag_blocks(tvb, pinfo, nmea0183_tree, offset);
7262 tvbuff_t* msg_tvb = tvb_new_subset_length(tvb, offset, end_offset - offset);
7263 dissect_nmea0183_msg(msg_tvb, pinfo, nmea0183_tree);
7264 offset += (end_offset - offset);
7265 first_msg = false0;
7266 }
7267 return offset;
7268 } else if (tvb_strneql(tvb, 0, RRUDP"RrUdP", strlen(RRUDP"RrUdP")) == 0) {
7269 /* Binary nmea0183 */
7270 offset = dissect_nmea0183_bin(tvb, pinfo, tree, data);
7271 return offset;
7272 } else if (tvb_strneql(tvb, 0, RAUDP"RaUdp", strlen(RAUDP"RaUdp")) == 0) {
7273 /* Binary nmea0183 */
7274 offset = dissect_nmea0183_bin(tvb, pinfo, tree, data);
7275 return offset;
7276 } else if (tvb_strneql(tvb, 0, RPUDP"RpUdP", strlen(RPUDP"RpUdP")) == 0) {
7277 /* Binary nmea0183 */
7278 offset = dissect_nmea0183_bin(tvb, pinfo, tree, data);
7279 return offset;
7280 }
7281
7282 ti = proto_tree_add_item(tree, proto_nmea0183, tvb, 0, end_offset, ENC_NA0x00000000);
7283 nmea0183_tree = proto_item_add_subtree(ti, ett_nmea0183);
7284
7285 tvbuff_t *msg_tvb = tvb_new_subset_length(tvb, offset, end_offset - offset);
7286 offset = dissect_nmea0183_msg(msg_tvb, pinfo, nmea0183_tree);
7287
7288 return offset;
7289}
7290
7291/* Try to detect NMEA 0183 heuristically */
7292static bool_Bool dissect_nmea0183_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
7293{
7294 char *sent_type;
7295 const char *talker, *t_val, *p_val, *m_val, *manuf;
7296
7297 /* Have to have at least 11 bytes:
7298 * 1-byte sentence type character ('!' or '$')
7299 * 2-byte TALKER lookup value
7300 * 2-byte TALKER (for Query sentences) or 3-byte FORMATTER
7301 * variable number of bytes for delimiters and data fields (minimum would be a single ',' byte)
7302 * '*' delimeter byte, 2-bytes for checksum, and 2-bytes for EOM "\r\n" */
7303 if(tvb_reported_length(tvb) < 11 || tvb_captured_length(tvb) < 5){
7304 return false0;
7305 }
7306 /* See if we have a UDP brodcast message */
7307 if (tvb_strneql(tvb, 0, UDPBC"UdPbC", strlen(UDPBC"UdPbC")) == 0) {
7308 return (dissect_nmea0183(tvb, pinfo, tree, data) != 0);
7309 }
7310 if (tvb_strneql(tvb, 0, RRUDP"RrUdP", strlen(RRUDP"RrUdP")) == 0) {
7311 return (dissect_nmea0183_bin(tvb, pinfo, tree, data) != 0);
7312 }
7313 if (tvb_strneql(tvb, 0, RAUDP"RaUdp", strlen(RAUDP"RaUdp")) == 0) {
7314 return (dissect_nmea0183_bin(tvb, pinfo, tree, data) != 0);
7315 }
7316 if (tvb_strneql(tvb, 0, RPUDP"RpUdP", strlen(RPUDP"RpUdP")) == 0) {
7317 return (dissect_nmea0183_bin(tvb, pinfo, tree, data) != 0);
7318 }
7319 /* Grab the first byte and check the first character */
7320 sent_type = (char*)tvb_get_string_enc(pinfo->pool, tvb, 0, 1, ENC_ASCII0x00000000);
7321
7322 /* Sentence type character ('!' or '$') */
7323 if( (sent_type[0] != '!') && (sent_type[0] != '$') ){
7324 return false0;
7325 }
7326
7327 /* We either have a 'P' and corresponding manufacturer 3-byte value OR
7328 * we have a non-proprietary 2-byte TALKER field */
7329 //TODO: Implement encapsulation and proprietary message parsing
7330
7331 /* Do a lookup for the 2-byte TALKER field */
7332 t_val = (char*)tvb_get_string_enc(pinfo->pool, tvb, 1, 2, ENC_ASCII0x00000000);
7333 talker = try_str_to_str(t_val, known_talker_ids);
7334
7335 /* Do a lookup for the 3-byte manufacturer if the 2nd byte in the PDU is 'P' */
7336 p_val = (char*)tvb_get_string_enc(pinfo->pool, tvb, 1, 1, ENC_ASCII0x00000000);
7337 m_val = (char*)tvb_get_string_enc(pinfo->pool, tvb, 2, 3, ENC_ASCII0x00000000);
7338 manuf = try_str_to_str(m_val, manufacturer_vals);
7339
7340 /* If one of the two conditions are true then try to dissect NMEA 0183 */
7341 if( ((p_val[0] == 'P') && (manuf != NULL((void*)0))) ||
7342 (talker != NULL((void*)0)) ){
7343 /* Looks like NMEA 0183 so let's give it a try */
7344 return (dissect_nmea0183(tvb, pinfo, tree, data) != 0);
7345 }
7346 /* If neither conditions are met then we return false */
7347 else{
7348 return false0;
7349 }
7350}
7351
7352void proto_register_nmea0183(void)
7353{
7354 expert_module_t *expert_nmea0183;
7355
7356 static hf_register_info hf[] = {
7357 {&hf_nmea0183_talker_id,
7358 {"Talker ID", "nmea0183.talker",
7359 FT_STRING, BASE_NONE,
7360 NULL((void*)0), 0x0,
7361 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7362 {&hf_nmea0183_sentence_id,
7363 {"Sentence ID", "nmea0183.sentence",
7364 FT_STRING, BASE_NONE,
7365 NULL((void*)0), 0x0,
7366 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7367 {&hf_nmea0183_unknown_field,
7368 {"Field", "nmea0183.unknown_field",
7369 FT_STRING, BASE_NONE,
7370 NULL((void*)0), 0x0,
7371 "NMEA 0183 Unknown field", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7372 {&hf_nmea0183_checksum,
7373 {"Checksum", "nmea0183.checksum",
7374 FT_STRING, BASE_NONE,
7375 NULL((void*)0), 0x0,
7376 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7377 {&hf_nmea0183_checksum_calculated,
7378 {"Calculated checksum", "nmea0183.checksum_calculated",
7379 FT_UINT8, BASE_HEX,
7380 NULL((void*)0), 0x0,
7381 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7382 {&hf_nmea0183_aam_arr_circle_radius,
7383 {"Arrival Circle Radius", "nmea0183.aam.circle_radius",
7384 FT_STRING, BASE_NONE,
7385 NULL((void*)0), 0x0,
7386 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7387 {&hf_nmea0183_aam_arr_circle_status,
7388 {"Arrival Circle Status", "nmea0183.aam.arrival_status",
7389 FT_CHAR, BASE_NONE,
7390 VALS(arrival_circle_status)((0 ? (const struct _value_string*)0 : ((arrival_circle_status
))))
, 0x0,
7391 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7392 {&hf_nmea0183_aam_perp_status,
7393 {"Perpendicular Pass Status", "nmea0183.aam.perp_status",
7394 FT_CHAR, BASE_NONE,
7395 VALS(perpendicular_pass_status)((0 ? (const struct _value_string*)0 : ((perpendicular_pass_status
))))
, 0x0,
7396 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7397 {&hf_nmea0183_aam_units_radius,
7398 {"Units of Radius (nm)", "nmea0183.aam.units",
7399 FT_UINT8, BASE_DEC,
7400 NULL((void*)0), 0x0,
7401 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7402 {&hf_nmea0183_aam_waypoint,
7403 {"Waypoint ID", "nmea0183.aam.waypoint",
7404 FT_STRING, BASE_NONE,
7405 NULL((void*)0), 0x0,
7406 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7407 {&hf_nmea0183_abk_ack_type,
7408 {"Type of Acknowledgement", "nmea0183.abk.ack_type",
7409 FT_CHAR, BASE_NONE,
7410 VALS(abk_ack_type)((0 ? (const struct _value_string*)0 : ((abk_ack_type)))), 0x0,
7411 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7412 {&hf_nmea0183_abk_ais_channel,
7413 {"AIS Channel of Reception", "nmea0183.abk.channel",
7414 FT_CHAR, BASE_NONE,
7415 VALS(abk_channel)((0 ? (const struct _value_string*)0 : ((abk_channel)))), 0x0,
7416 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7417 {&hf_nmea0183_abk_mmsi,
7418 {"MMSI of Addressed AIS Unit", "nmea0183.abk.mmsi",
7419 FT_STRING, BASE_NONE,
7420 NULL((void*)0), 0x0,
7421 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7422 {&hf_nmea0183_abk_msg_id,
7423 {"ITU-R M.1371 Message ID", "nmea0183.abk.msg_id",
7424 FT_STRING, BASE_NONE,
7425 NULL((void*)0), 0x0,
7426 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7427 {&hf_nmea0183_abk_msg_seq,
7428 {"Message Sequence Number", "nmea0183.abk.msg_seq",
7429 FT_STRING, BASE_NONE,
7430 NULL((void*)0), 0x0,
7431 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7432 {&hf_nmea0183_aca_chan_a,
7433 {"Channel A", "nmea0183.aca.chan_a",
7434 FT_STRING, BASE_NONE,
7435 NULL((void*)0), 0x0,
7436 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7437 {&hf_nmea0183_aca_chan_a_bw,
7438 {"Channel A Bandwidth", "nmea0183.aca.chan_a_bw",
7439 FT_CHAR, BASE_NONE,
7440 VALS(aca_chbw)((0 ? (const struct _value_string*)0 : ((aca_chbw)))), 0x0,
7441 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7442 {&hf_nmea0183_aca_chan_b,
7443 {"Channel B", "nmea0183.aca.chan_b",
7444 FT_STRING, BASE_NONE,
7445 NULL((void*)0), 0x0,
7446 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7447 {&hf_nmea0183_aca_chan_b_bw,
7448 {"Channel B Bandwidth", "nmea0183.aca.chan_b_bw",
7449 FT_CHAR, BASE_NONE,
7450 VALS(aca_chbw)((0 ? (const struct _value_string*)0 : ((aca_chbw)))), 0x0,
7451 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7452 {&hf_nmea0183_aca_info_src,
7453 {"Information Source", "nmea0183.aca.info_src",
7454 FT_CHAR, BASE_NONE,
7455 VALS(aca_info_src)((0 ? (const struct _value_string*)0 : ((aca_info_src)))), 0x0,
7456 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7457 {&hf_nmea0183_aca_inuse,
7458 {"'In-use' Flag", "nmea0183.aca.inuse",
7459 FT_CHAR, BASE_NONE,
7460 VALS(aca_in_use)((0 ? (const struct _value_string*)0 : ((aca_in_use)))), 0x0,
7461 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7462 {&hf_nmea0183_aca_inuse_change,
7463 {"Time of 'in-use' Change (UTC)", "nmea0183.aca.inuse_change",
7464 FT_STRING, BASE_NONE,
7465 NULL((void*)0), 0x0,
7466 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7467 {&hf_nmea0183_aca_ne_clat,
7468 {"Northeast Corner Latitude", "nmea0183.aca.ne_clatitude",
7469 FT_FLOAT, BASE_NONE,
7470 NULL((void*)0), 0x0,
7471 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7472 {&hf_nmea0183_aca_ne_clong,
7473 {"Northeast Corner Longitude", "nmea0183.aca.ne_clongitude",
7474 FT_FLOAT, BASE_NONE,
7475 NULL((void*)0), 0x0,
7476 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7477 {&hf_nmea0183_aca_power,
7478 {"Power Level Control", "nmea0183.aca.power",
7479 FT_CHAR, BASE_NONE,
7480 VALS(aca_power)((0 ? (const struct _value_string*)0 : ((aca_power)))), 0x0,
7481 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7482 {&hf_nmea0183_aca_seq_num,
7483 {"Sequence Number", "nmea0183.aca.seq_num",
7484 FT_STRING, BASE_NONE,
7485 NULL((void*)0), 0x0,
7486 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7487 {&hf_nmea0183_aca_sw_clat,
7488 {"Southwest Corner Latitude", "nmea0183.aca.sw_clatitude",
7489 FT_FLOAT, BASE_NONE,
7490 NULL((void*)0), 0x0,
7491 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7492 {&hf_nmea0183_aca_sw_clong,
7493 {"Southwest Corner Longitude", "nmea0183.aca.sw_clongitude",
7494 FT_FLOAT, BASE_NONE,
7495 NULL((void*)0), 0x0,
7496 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7497 {&hf_nmea0183_aca_txrx_mode,
7498 {"Tx/Rx Mode Control", "nmea0183.aca.txrx_mode",
7499 FT_CHAR, BASE_NONE,
7500 VALS(aca_txrx_control)((0 ? (const struct _value_string*)0 : ((aca_txrx_control)))), 0x0,
7501 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7502 {&hf_nmea0183_aca_zone_size,
7503 {"Transition Zone Size (nm)", "nmea0183.aca.zonesize",
7504 FT_STRING, BASE_NONE,
7505 NULL((void*)0), 0x0,
7506 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7507 {&hf_nmea0183_ack_alarm_id,
7508 {"Unique Alarm Number at Alarm Source", "nmea0183.acs.id",
7509 FT_STRING, BASE_NONE,
7510 NULL((void*)0), 0x0,
7511 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7512 {&hf_nmea0183_acs_day,
7513 {"Day (01 to 31) (UTC)", "nmea0183.acs.day",
7514 FT_STRING, BASE_NONE,
7515 NULL((void*)0), 0x0,
7516 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7517 {&hf_nmea0183_acs_mmsi,
7518 {"MMSI of Originator", "nmea0183.acs.mmsi",
7519 FT_STRING, BASE_NONE,
7520 NULL((void*)0), 0x0,
7521 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7522 {&hf_nmea0183_acs_month,
7523 {"Month (01 to 12) (UTC)", "nmea0183.acs.month",
7524 FT_STRING, BASE_NONE,
7525 NULL((void*)0), 0x0,
7526 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7527 {&hf_nmea0183_acs_seq_num,
7528 {"Sequence Number", "nmea0183.acs.seq_num",
7529 FT_STRING, BASE_NONE,
7530 NULL((void*)0), 0x0,
7531 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7532 {&hf_nmea0183_acs_utc,
7533 {"UTC of Receipt of Channel Management Information", "nmea0183.acs.utc",
7534 FT_STRING, BASE_NONE,
7535 NULL((void*)0), 0x0,
7536 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7537 {&hf_nmea0183_acs_year,
7538 {"Year (UTC)", "nmea0183.acs.year",
7539 FT_STRING, BASE_NONE,
7540 NULL((void*)0), 0x0,
7541 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7542 {&hf_nmea0183_air_mmsi_is1,
7543 {"MMSI of Interrogated Station #1", "nmea0183.air.mmsi1",
7544 FT_STRING, BASE_NONE,
7545 NULL((void*)0), 0x0,
7546 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7547 {&hf_nmea0183_air_mmsi_is2,
7548 {"MMSI of Interrogated Station #2", "nmea0183.air.mmsi2",
7549 FT_STRING, BASE_NONE,
7550 NULL((void*)0), 0x0,
7551 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7552 {&hf_nmea0183_air_msg2_req,
7553 {"ITU-R M.1371 Message #2 Requested from Station #1", "nmea0183.air.msg2_req_is1",
7554 FT_STRING, BASE_NONE,
7555 NULL((void*)0), 0x0,
7556 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7557 {&hf_nmea0183_air_msg2_sub,
7558 {"Message #2 Sub-Section", "nmea0183.air.msg2_sub_is1",
7559 FT_STRING, BASE_NONE,
7560 NULL((void*)0), 0x0,
7561 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7562 {&hf_nmea0183_air_msg_req,
7563 {"ITU-R M.1371 Message #1 Requested from Station #1", "nmea0183.air.msg_req_is1",
7564 FT_STRING, BASE_NONE,
7565 NULL((void*)0), 0x0,
7566 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7567 {&hf_nmea0183_air_msg_req_is2,
7568 {"ITU-R M.1371 Message Requested from Station #2", "nmea0183.air.msg_req_is2",
7569 FT_STRING, BASE_NONE,
7570 NULL((void*)0), 0x0,
7571 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7572 {&hf_nmea0183_air_msg_sub,
7573 {"Message #1 Sub-Section", "nmea0183.air.msg_sub_is1",
7574 FT_STRING, BASE_NONE,
7575 NULL((void*)0), 0x0,
7576 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7577 {&hf_nmea0183_air_msg_sub_is2,
7578 {"Message Sub-Section - Station #2", "nmea0183.air.msg_sub_is2",
7579 FT_STRING, BASE_NONE,
7580 NULL((void*)0), 0x0,
7581 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7582 {&hf_nmea0183_akd_alarm_type,
7583 {"Type of Alarm", "nmea0183.akd.alarm_type",
7584 FT_STRING, BASE_NONE,
7585 NULL((void*)0), 0x0,
7586 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7587 {&hf_nmea0183_akd_inst_num_orig,
7588 {"Instance Number of Equipment/Unit/Item (Original)", "nmea0183.akd.inst_num_orig",
7589 FT_STRING, BASE_NONE,
7590 NULL((void*)0), 0x0,
7591 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7592 {&hf_nmea0183_akd_inst_num_send,
7593 {"Instance Number of Equipment/Unit/Item (Sending)", "nmea0183.akd.inst_num_send",
7594 FT_STRING, BASE_NONE,
7595 NULL((void*)0), 0x0,
7596 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7597 {&hf_nmea0183_akd_subsys_indicator_orig,
7598 {"Subsystem Indicator of Original Alarm Source", "nmea0183.akd.ss_indic_orig",
7599 FT_STRING, BASE_NONE,
7600 NULL((void*)0), 0x0,
7601 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7602 {&hf_nmea0183_akd_sybsys_indicator_send,
7603 {"Subsystem Indicator of System Sending Acknowledgement", "nmea0183.akd.ss_indic_send",
7604 FT_STRING, BASE_NONE,
7605 NULL((void*)0), 0x0,
7606 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7607 {&hf_nmea0183_akd_sys_indicator_orig,
7608 {"System Indicator of Original Alarm Source", "nmea0183.akd.s_indic_orig",
7609 FT_STRING, BASE_NONE,
7610 NULL((void*)0), 0x0,
7611 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7612 {&hf_nmea0183_akd_sys_indicator_send,
7613 {"System Indicator of System Sending Acknowledgement", "nmea0183.akd.s_indic_send",
7614 FT_STRING, BASE_NONE,
7615 NULL((void*)0), 0x0,
7616 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7617 {&hf_nmea0183_akd_utc,
7618 {"Time of Acknowledgement (UTC)", "nmea0183.akd.time",
7619 FT_STRING, BASE_NONE,
7620 NULL((void*)0), 0x0,
7621 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7622 {&hf_nmea0183_ala_alarm_ack_state,
7623 {"Alarm's Acknowledged State", "nmea0183.ala.alarm_state",
7624 FT_CHAR, BASE_NONE,
7625 VALS(alarm_ack_state_vals)((0 ? (const struct _value_string*)0 : ((alarm_ack_state_vals
))))
, 0x0,
7626 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7627 {&hf_nmea0183_ala_alarm_cond,
7628 {"Alarm Condition", "nmea0183.ala.alarm_cond",
7629 FT_CHAR, BASE_NONE,
7630 VALS(alarm_cond_state_vals)((0 ? (const struct _value_string*)0 : ((alarm_cond_state_vals
))))
, 0x0,
7631 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7632 {&hf_nmea0183_ala_alarm_text,
7633 {"Alarm's Description Text", "nmea0183.ala.alarm_text",
7634 FT_STRING, BASE_NONE,
7635 NULL((void*)0), 0x0,
7636 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7637 {&hf_nmea0183_ala_alarm_type,
7638 {"Type of Alarm", "nmea0183.ala.alarm_type",
7639 FT_STRING, BASE_NONE,
7640 NULL((void*)0), 0x0,
7641 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7642 {&hf_nmea0183_ala_inst_num,
7643 {"Instance Number of Equipment/Unit/Item", "nmea0183.ala.inst_num",
7644 FT_STRING, BASE_NONE,
7645 NULL((void*)0), 0x0,
7646 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7647 {&hf_nmea0183_ala_subsys_indicator,
7648 {"Subsystem Indicator of Alarm Source", "nmea0183.ala.ss_indic",
7649 FT_STRING, BASE_NONE,
7650 NULL((void*)0), 0x0,
7651 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7652 {&hf_nmea0183_ala_sys_indicator,
7653 {"System Indicator of Alarm Source", "nmea0183.ala.s_indic",
7654 FT_STRING, BASE_NONE,
7655 NULL((void*)0), 0x0,
7656 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7657 {&hf_nmea0183_ala_time,
7658 {"Event Time (UTC)", "nmea0183.ala.time",
7659 FT_STRING, BASE_NONE,
7660 NULL((void*)0), 0x0,
7661 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7662 {&hf_nmea0183_alm_af0_clock_param,
7663 {"a(f0), Clock Parameter", "nmea0183.alm.af0_clock",
7664 FT_STRING, BASE_NONE,
7665 NULL((void*)0), 0x0,
7666 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7667 {&hf_nmea0183_alm_af1_clock_param,
7668 {"a(f1), Clock Parameter", "nmea0183.alm.af1_clock",
7669 FT_STRING, BASE_NONE,
7670 NULL((void*)0), 0x0,
7671 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7672 {&hf_nmea0183_alm_alm_ref_time,
7673 {"t(oa), Almanac Reference Time", "nmea0183.alm.ref_time",
7674 FT_STRING, BASE_NONE,
7675 NULL((void*)0), 0x0,
7676 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7677 {&hf_nmea0183_alm_arg_perigee,
7678 {"OMEGA, Argument of Perigee", "nmea0183.alm.perigee",
7679 FT_STRING, BASE_NONE,
7680 NULL((void*)0), 0x0,
7681 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7682 {&hf_nmea0183_alm_eccent,
7683 {"e, Eccentricity", "nmea0183.alm.eccentricity",
7684 FT_STRING, BASE_NONE,
7685 NULL((void*)0), 0x0,
7686 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7687 {&hf_nmea0183_alm_gps_week,
7688 {"GPS Week Number", "nmea0183.alm.gps_week",
7689 FT_STRING, BASE_NONE,
7690 NULL((void*)0), 0x0,
7691 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7692 {&hf_nmea0183_alm_incl_angle,
7693 {"(sigma)(i), Inclination Angle", "nmea0183.alm.inc_angle",
7694 FT_STRING, BASE_NONE,
7695 NULL((void*)0), 0x0,
7696 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7697 {&hf_nmea0183_alm_long_asc_node,
7698 {"(OMEGA)(o), Longitude of Ascending Node", "nmea0183.alm.long_asn_node",
7699 FT_STRING, BASE_NONE,
7700 NULL((void*)0), 0x0,
7701 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7702 {&hf_nmea0183_alm_mean_anomaly,
7703 {"M(o), Mean Anomaly", "nmea0183.alm.anomaly",
7704 FT_STRING, BASE_NONE,
7705 NULL((void*)0), 0x0,
7706 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7707 {&hf_nmea0183_alm_rate_right_asc,
7708 {"OMEGADOT, Rate of Right Ascension", "nmea0183.alm.rate_right_asc",
7709 FT_STRING, BASE_NONE,
7710 NULL((void*)0), 0x0,
7711 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7712 {&hf_nmea0183_alm_root_sm_axis,
7713 {"root(A), Root of Semi-Major Axis", "nmea0183.alm.axis",
7714 FT_STRING, BASE_NONE,
7715 NULL((void*)0), 0x0,
7716 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7717 {&hf_nmea0183_alm_sat_prn,
7718 {"Satellite PRN Number", "nmea0183.alm.satprn",
7719 FT_STRING, BASE_NONE,
7720 NULL((void*)0), 0x0,
7721 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7722 {&hf_nmea0183_alm_sent_num,
7723 {"Sentence Number", "nmea0183.alm.sentence_num",
7724 FT_STRING, BASE_NONE,
7725 NULL((void*)0), 0x0,
7726 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7727 {&hf_nmea0183_alm_sent_tot,
7728 {"Total Number of Sentences", "nmea0183.alm.num_sentences",
7729 FT_STRING, BASE_NONE,
7730 NULL((void*)0), 0x0,
7731 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7732 {&hf_nmea0183_alm_sv_health,
7733 {"SV Health", "nmea0183.alm.sv_health",
7734 FT_STRING, BASE_NONE,
7735 NULL((void*)0), 0x0,
7736 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7737 {&hf_nmea0183_alr_alarm_ack_st,
7738 {"Alarm’s acknowledge state", "nmea0183.alr_alarm_ack_st",
7739 FT_STRING, BASE_NONE,
7740 NULL((void*)0), 0x0,
7741 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7742 {&hf_nmea0183_alr_alarm_cond,
7743 {"Alarm condition", "nmea0183.alr_alarm_cond",
7744 FT_STRING, BASE_NONE,
7745 NULL((void*)0), 0x0,
7746 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7747 {&hf_nmea0183_alr_alarm_desc_txt,
7748 {"Alarm’s description text", "nmea0183.alr_alarm_desc_txt",
7749 FT_STRING, BASE_NONE,
7750 NULL((void*)0), 0x0,
7751 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7752 {&hf_nmea0183_alr_alarm_id,
7753 {"Alarm id", "nmea0183.alr_id",
7754 FT_STRING, BASE_NONE,
7755 NULL((void*)0), 0x0,
7756 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7757 {&hf_nmea0183_alr_time,
7758 {"UTC Time of alarm condition change", "nmea0183.alr_time",
7759 FT_NONE, BASE_NONE,
7760 NULL((void*)0), 0x0,
7761 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7762 {&hf_nmea0183_alr_time_hour,
7763 {"Hour", "nmea0183.alr_time_hour",
7764 FT_STRING, BASE_NONE,
7765 NULL((void*)0), 0x0,
7766 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7767 {&hf_nmea0183_alr_time_minute,
7768 {"Minute", "nmea0183.alr_time_minute",
7769 FT_STRING, BASE_NONE,
7770 NULL((void*)0), 0x0,
7771 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7772 {&hf_nmea0183_alr_time_second,
7773 {"Second", "nmea0183.alr_time_second",
7774 FT_STRING, BASE_NONE,
7775 NULL((void*)0), 0x0,
7776 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7777 {&hf_nmea0183_apb_arr_circle_status,
7778 {"Arrival Circle Status", "nmea0183.apb.arrival_status",
7779 FT_CHAR, BASE_NONE,
7780 VALS(arrival_circle_status)((0 ? (const struct _value_string*)0 : ((arrival_circle_status
))))
, 0x0,
7781 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7782 {&hf_nmea0183_apb_bearing_origin,
7783 {"Bearing Origin to Destination", "nmea0183.apb.bearing_origin",
7784 FT_STRING, BASE_NONE,
7785 NULL((void*)0), 0x0,
7786 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7787 {&hf_nmea0183_apb_bearing_present,
7788 {"Bearing, Present position to Destination", "nmea0183.apb.bearing_present",
7789 FT_STRING, BASE_NONE,
7790 NULL((void*)0), 0x0,
7791 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7792 {&hf_nmea0183_apb_cycle_lock_warning,
7793 {"Data Status (Loran-C Cycle Lock)", "nmea0183.apb.cycle_warning",
7794 FT_CHAR, BASE_NONE,
7795 VALS(loranc_cycle_lock_warning_vals)((0 ? (const struct _value_string*)0 : ((loranc_cycle_lock_warning_vals
))))
, 0x0,
7796 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7797 {&hf_nmea0183_apb_dir_steer,
7798 {"Direction to Steer", "nmea0183.apb.steer",
7799 FT_CHAR, BASE_NONE,
7800 VALS(steer_direction)((0 ? (const struct _value_string*)0 : ((steer_direction)))), 0x0,
7801 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7802 {&hf_nmea0183_apb_heading_steer,
7803 {"Heading-to-Steer to Destination Waypoint", "nmea0183.apb.steer_heading",
7804 FT_STRING, BASE_NONE,
7805 NULL((void*)0), 0x0,
7806 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7807 {&hf_nmea0183_apb_mag_xte,
7808 {"Magnitude of Cross-Track-Error (XTE)", "nmea0183.apb.mag_xte",
7809 FT_STRING, BASE_NONE,
7810 NULL((void*)0), 0x0,
7811 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7812 {&hf_nmea0183_apb_mode,
7813 {"Mode Indicator", "nmea0183.apb.mode",
7814 FT_CHAR, BASE_NONE,
7815 VALS(mode_indicator)((0 ? (const struct _value_string*)0 : ((mode_indicator)))), 0x0,
7816 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7817 {&hf_nmea0183_apb_perp_status,
7818 {"Perpendicular Pass Status", "nmea0183.apb.perp_status",
7819 FT_CHAR, BASE_NONE,
7820 VALS(perpendicular_pass_status)((0 ? (const struct _value_string*)0 : ((perpendicular_pass_status
))))
, 0x0,
7821 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7822 {&hf_nmea0183_apb_waypoint_id,
7823 {"Waypoint ID", "nmea0183.apb.waypoint",
7824 FT_STRING, BASE_NONE,
7825 NULL((void*)0), 0x0,
7826 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7827 {&hf_nmea0183_apb_xte_units,
7828 {"XTE units", "nmea0183.apb.xte_units",
7829 FT_CHAR, BASE_NONE,
7830 VALS(xte_unit_vals)((0 ? (const struct _value_string*)0 : ((xte_unit_vals)))), 0x0,
7831 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7832 {&hf_nmea0183_bec_bearing_mag,
7833 {"Bearing (degrees Magnetic)", "nmea0183.bec.bearing_mag",
7834 FT_STRING, BASE_NONE,
7835 NULL((void*)0), 0x0,
7836 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7837 {&hf_nmea0183_bec_bearing_true,
7838 {"Bearing (degrees True)", "nmea0183.bec.bearing_true",
7839 FT_STRING, BASE_NONE,
7840 NULL((void*)0), 0x0,
7841 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7842 {&hf_nmea0183_bec_distance,
7843 {"Distance (nm)", "nmea0183.bec.distance",
7844 FT_STRING, BASE_NONE,
7845 NULL((void*)0), 0x0,
7846 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7847 {&hf_nmea0183_bec_latitude,
7848 {"Waypoint Latitude", "nmea0183.bec.latitude",
7849 FT_FLOAT, BASE_NONE,
7850 NULL((void*)0), 0x0,
7851 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7852 {&hf_nmea0183_bec_longitude,
7853 {"Waypoint Longitude", "nmea0183.bec.longitude",
7854 FT_FLOAT, BASE_NONE,
7855 NULL((void*)0), 0x0,
7856 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7857 {&hf_nmea0183_bec_utc,
7858 {"UTC of Observation", "nmea0183.bec.utc",
7859 FT_STRING, BASE_NONE,
7860 NULL((void*)0), 0x0,
7861 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7862 {&hf_nmea0183_bec_waypoint,
7863 {"Waypoint ID", "nmea0183.bec.waypoint",
7864 FT_STRING, BASE_NONE,
7865 NULL((void*)0), 0x0,
7866 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7867 { &hf_nmea0183_bin_blockid,
7868 { "Blockid", "nmea0183.bin.blockid",
7869 FT_UINT32, BASE_DEC,
7870 NULL((void*)0), 0x0,
7871 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } },
7872 { &hf_nmea0183_bin_channel,
7873 { "Channel", "nmea0183.bin.channel",
7874 FT_UINT8, BASE_HEX,
7875 NULL((void*)0), 0x0,
7876 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } },
7877 { &hf_nmea0183_bin_data,
7878 { "Data", "nmea0183.bin.data",
7879 FT_BYTES, BASE_NONE,
7880 NULL((void*)0), 0x0,
7881 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } },
7882 { &hf_nmea0183_bin_data_type,
7883 { "Data type", "nmea0183.bin.data_type",
7884 FT_STRING, BASE_NONE,
7885 NULL((void*)0), 0x0,
7886 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } },
7887 { &hf_nmea0183_bin_device,
7888 { "Device", "nmea0183.bin.device",
7889 FT_UINT8, BASE_HEX,
7890 NULL((void*)0), 0x0,
7891 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } },
7892 { &hf_nmea0183_bin_dstid,
7893 { "Destination Id", "nmea0183.bin.dst_id",
7894 FT_STRING, BASE_NONE,
7895 NULL((void*)0), 0x0,
7896 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } },
7897 { &hf_nmea0183_bin_file_descriptor,
7898 { "File descriptor", "nmea0183.bin.file_descriptor",
7899 FT_STRING, BASE_NONE,
7900 NULL((void*)0), 0x0,
7901 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } },
7902 { &hf_nmea0183_bin_file_descriptor_len,
7903 { "File descriptor length", "nmea0183.bin.fd_len",
7904 FT_UINT32, BASE_DEC,
7905 NULL((void*)0), 0x0,
7906 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } },
7907 { &hf_nmea0183_bin_file_length,
7908 { "File length", "nmea0183.bin.file_len",
7909 FT_UINT32, BASE_DEC,
7910 NULL((void*)0), 0x0,
7911 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } },
7912 { &hf_nmea0183_bin_max_seqnum,
7913 { "Max Sequence number", "nmea0183.bin.maxseqnum",
7914 FT_UINT32, BASE_DEC,
7915 NULL((void*)0), 0x0,
7916 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } },
7917 { &hf_nmea0183_bin_mtype,
7918 { "Mtype", "nmea0183.bin.mtype",
7919 FT_UINT16, BASE_DEC,
7920 VALS(nmea0183_bin_mtype_vals)((0 ? (const struct _value_string*)0 : ((nmea0183_bin_mtype_vals
))))
, 0x0,
7921 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } },
7922 { &hf_nmea0183_bin_seqnum,
7923 { "Sequence number", "nmea0183.bin.seqnum",
7924 FT_UINT32, BASE_DEC,
7925 NULL((void*)0), 0x0,
7926 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } },
7927 { &hf_nmea0183_bin_srcid,
7928 { "Source Id", "nmea0183.bin.src_id",
7929 FT_STRING, BASE_NONE,
7930 NULL((void*)0), 0x0,
7931 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
7932 { &hf_nmea0183_bin_stat_of_acquisition,
7933 { "Status of acquisition", "nmea0183.bin.stat_of_acquisition",
7934 FT_UINT16, BASE_DEC,
7935 NULL((void*)0), 0x0,
7936 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } },
7937 { &hf_nmea0183_bin_status_and_info,
7938 { "Status and information text", "nmea0183.bin.status_and_info",
7939 FT_STRING, BASE_NONE,
7940 NULL((void*)0), 0x0,
7941 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } },
7942 { &hf_nmea0183_bin_type_len,
7943 { "Type length", "nmea0183.bin.type_len",
7944 FT_UINT8, BASE_DEC,
7945 NULL((void*)0), 0x0,
7946 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } },
7947 { &hf_nmea0183_bin_version,
7948 { "Version", "nmea0183.bin.version",
7949 FT_UINT16, BASE_DEC,
7950 NULL((void*)0), 0x0,
7951 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
7952 {&hf_nmea0183_bod_bearing_mag,
7953 {"Bearing (degrees Magnetic)", "nmea0183.bod.bearing_mag",
7954 FT_STRING, BASE_NONE,
7955 NULL((void*)0), 0x0,
7956 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7957 {&hf_nmea0183_bod_bearing_true,
7958 {"Bearing (degrees True)", "nmea0183.bod.bearing_true",
7959 FT_STRING, BASE_NONE,
7960 NULL((void*)0), 0x0,
7961 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7962 {&hf_nmea0183_bod_dest_waypoint,
7963 {"Destination Waypoint ID", "nmea0183.bod.waypoint_dest",
7964 FT_STRING, BASE_NONE,
7965 NULL((void*)0), 0x0,
7966 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7967 {&hf_nmea0183_bod_orig_waypoint,
7968 {"Origin Waypoint ID", "nmea0183.bod.waypoint_orig",
7969 FT_STRING, BASE_NONE,
7970 NULL((void*)0), 0x0,
7971 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7972 {&hf_nmea0183_bwc_bearing_mag,
7973 {"Bearing (degrees Magnetic)", "nmea0183.bwc.bearing_mag",
7974 FT_STRING, BASE_NONE,
7975 NULL((void*)0), 0x0,
7976 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7977 {&hf_nmea0183_bwc_bearing_true,
7978 {"Bearing (degrees True)", "nmea0183.bwc.bearing_true",
7979 FT_STRING, BASE_NONE,
7980 NULL((void*)0), 0x0,
7981 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7982 {&hf_nmea0183_bwc_distance,
7983 {"Distance (nm)", "nmea0183.bwc.distance",
7984 FT_STRING, BASE_NONE,
7985 NULL((void*)0), 0x0,
7986 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7987 {&hf_nmea0183_bwc_latitude,
7988 {"Waypoint Latitude", "nmea0183.bwc.latitude",
7989 FT_FLOAT, BASE_NONE,
7990 NULL((void*)0), 0x0,
7991 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7992 {&hf_nmea0183_bwc_longitude,
7993 {"Waypoint Longitude", "nmea0183.bwc.longitude",
7994 FT_FLOAT, BASE_NONE,
7995 NULL((void*)0), 0x0,
7996 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
7997 {&hf_nmea0183_bwc_mode,
7998 {"Mode Indicator", "nmea0183.bwc.mode",
7999 FT_CHAR, BASE_NONE,
8000 VALS(mode_indicator)((0 ? (const struct _value_string*)0 : ((mode_indicator)))), 0x0,
8001 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8002 {&hf_nmea0183_bwc_utc,
8003 {"UTC of Observation", "nmea0183.bwc.utc",
8004 FT_STRING, BASE_NONE,
8005 NULL((void*)0), 0x0,
8006 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8007 {&hf_nmea0183_bwc_waypoint,
8008 {"Waypoint ID", "nmea0183.bwc.waypoint",
8009 FT_STRING, BASE_NONE,
8010 NULL((void*)0), 0x0,
8011 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8012 {&hf_nmea0183_bwr_bearing_mag,
8013 {"Bearing (degrees Magnetic)", "nmea0183.bwr.bearing_mag",
8014 FT_STRING, BASE_NONE,
8015 NULL((void*)0), 0x0,
8016 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8017 {&hf_nmea0183_bwr_bearing_true,
8018 {"Bearing (degrees True)", "nmea0183.bwr.bearing_true",
8019 FT_STRING, BASE_NONE,
8020 NULL((void*)0), 0x0,
8021 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8022 {&hf_nmea0183_bwr_distance,
8023 {"Distance (nm)", "nmea0183.bwr.distance",
8024 FT_STRING, BASE_NONE,
8025 NULL((void*)0), 0x0,
8026 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8027 {&hf_nmea0183_bwr_latitude,
8028 {"Waypoint Latitude", "nmea0183.bwr.latitude",
8029 FT_FLOAT, BASE_NONE,
8030 NULL((void*)0), 0x0,
8031 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8032 {&hf_nmea0183_bwr_longitude,
8033 {"Waypoint Longitude", "nmea0183.bwr.longitude",
8034 FT_FLOAT, BASE_NONE,
8035 NULL((void*)0), 0x0,
8036 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8037 {&hf_nmea0183_bwr_mode,
8038 {"Mode Indicator", "nmea0183.bwr.mode",
8039 FT_CHAR, BASE_NONE,
8040 VALS(mode_indicator)((0 ? (const struct _value_string*)0 : ((mode_indicator)))), 0x0,
8041 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8042 {&hf_nmea0183_bwr_utc,
8043 {"UTC of Observation", "nmea0183.bwr.utc",
8044 FT_STRING, BASE_NONE,
8045 NULL((void*)0), 0x0,
8046 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8047 {&hf_nmea0183_bwr_waypoint,
8048 {"Waypoint ID", "nmea0183.bwr.waypoint",
8049 FT_STRING, BASE_NONE,
8050 NULL((void*)0), 0x0,
8051 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8052 {&hf_nmea0183_bww_bearing_mag,
8053 {"Bearing (degrees Magnetic)", "nmea0183.bww.bearing_mag",
8054 FT_STRING, BASE_NONE,
8055 NULL((void*)0), 0x0,
8056 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8057 {&hf_nmea0183_bww_bearing_true,
8058 {"Bearing (degrees True)", "nmea0183.bww.bearing_true",
8059 FT_STRING, BASE_NONE,
8060 NULL((void*)0), 0x0,
8061 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8062 {&hf_nmea0183_bww_from_waypoint,
8063 {"FROM Waypoint ID", "nmea0183.bww.waypoint_from",
8064 FT_STRING, BASE_NONE,
8065 NULL((void*)0), 0x0,
8066 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8067 {&hf_nmea0183_bww_to_waypoint,
8068 {"TO Waypoint ID", "nmea0183.bww.waypoint_to",
8069 FT_STRING, BASE_NONE,
8070 NULL((void*)0), 0x0,
8071 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8072 {&hf_nmea0183_cbr_hr_chan_a,
8073 {"Start Hour (UTC), Channel A", "nmea0183.cbr.chan_a_hr",
8074 FT_STRING, BASE_NONE,
8075 NULL((void*)0), 0x0,
8076 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8077 {&hf_nmea0183_cbr_hr_chan_b,
8078 {"Start Hour (UTC), Channel B", "nmea0183.cbr.chan_b_hr",
8079 FT_STRING, BASE_NONE,
8080 NULL((void*)0), 0x0,
8081 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8082 {&hf_nmea0183_cbr_interv_chan_a,
8083 {"Slot Interval, Channel A", "nmea0183.cbr.chan_a_interval",
8084 FT_STRING, BASE_NONE,
8085 NULL((void*)0), 0x0,
8086 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8087 {&hf_nmea0183_cbr_interv_chan_b,
8088 {"Slot Interval, Channel B", "nmea0183.cbr.chan_b_interval",
8089 FT_STRING, BASE_NONE,
8090 NULL((void*)0), 0x0,
8091 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8092 {&hf_nmea0183_cbr_min_chan_a,
8093 {"Start Minute (UTC), Channel A", "nmea0183.cbr.chan_a_min",
8094 FT_STRING, BASE_NONE,
8095 NULL((void*)0), 0x0,
8096 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8097 {&hf_nmea0183_cbr_min_chan_b,
8098 {"Start Minute (UTC), Channel B", "nmea0183.cbr.chan_b_min",
8099 FT_STRING, BASE_NONE,
8100 NULL((void*)0), 0x0,
8101 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8102 {&hf_nmea0183_cbr_mmsi,
8103 {"MMSI", "nmea0183.cbr.mmsi",
8104 FT_STRING, BASE_NONE,
8105 NULL((void*)0), 0x0,
8106 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8107 {&hf_nmea0183_cbr_msd_id_index,
8108 {"Message ID Index", "nmea0183.cbr.msg_id_index",
8109 FT_STRING, BASE_NONE,
8110 NULL((void*)0), 0x0,
8111 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8112 {&hf_nmea0183_cbr_msg_id,
8113 {"Message ID", "nmea0183.cbr.msg_id",
8114 FT_STRING, BASE_NONE,
8115 NULL((void*)0), 0x0,
8116 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8117 {&hf_nmea0183_cbr_setup,
8118 {"FATDMA or RATDMA/CSTDMA Setup", "nmea0183.cbr.setup",
8119 FT_CHAR, BASE_NONE,
8120 VALS(dma_setup_vals)((0 ? (const struct _value_string*)0 : ((dma_setup_vals)))), 0x0,
8121 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8122 {&hf_nmea0183_cbr_slot_chan_a,
8123 {"Start Slot, Channel A", "nmea0183.cbr.chan_a_slot",
8124 FT_STRING, BASE_NONE,
8125 NULL((void*)0), 0x0,
8126 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8127 {&hf_nmea0183_cbr_slot_chan_b,
8128 {"Start Slot, Channel B", "nmea0183.cbr.chan_b_slot",
8129 FT_STRING, BASE_NONE,
8130 NULL((void*)0), 0x0,
8131 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8132 {&hf_nmea0183_cbr_status,
8133 {"Sentence Status Flag", "nmea0183.cbr.status",
8134 FT_CHAR, BASE_NONE,
8135 VALS(sentence_status_vals)((0 ? (const struct _value_string*)0 : ((sentence_status_vals
))))
, 0x0,
8136 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8137 {&hf_nmea0183_cur_data_set,
8138 {"Data Set Number (0 to 9)", "nmea0183.cur.dataset_num",
8139 FT_STRING, BASE_NONE,
8140 NULL((void*)0), 0x0,
8141 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8142 {&hf_nmea0183_cur_depth,
8143 {"Current Depth (m)", "nmea0183.cur.depth",
8144 FT_STRING, BASE_NONE,
8145 NULL((void*)0), 0x0,
8146 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8147 {&hf_nmea0183_cur_direction,
8148 {"Current Direction (degrees)", "nmea0183.cur.direction",
8149 FT_STRING, BASE_NONE,
8150 NULL((void*)0), 0x0,
8151 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8152 {&hf_nmea0183_cur_direction_ref,
8153 {"Direction Reference in use", "nmea0183.cur.direction_ref",
8154 FT_CHAR, BASE_NONE,
8155 VALS(direction_reference)((0 ? (const struct _value_string*)0 : ((direction_reference)
)))
, 0x0,
8156 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8157 {&hf_nmea0183_cur_heading,
8158 {"Heading", "nmea0183.cur.heading",
8159 FT_STRING, BASE_NONE,
8160 NULL((void*)0), 0x0,
8161 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8162 {&hf_nmea0183_cur_heading_ref,
8163 {"Heading Reference in use", "nmea0183.cur.heading_ref",
8164 FT_CHAR, BASE_NONE,
8165 VALS(heading_reference)((0 ? (const struct _value_string*)0 : ((heading_reference)))
)
, 0x0,
8166 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8167 {&hf_nmea0183_cur_layer,
8168 {"Layer Number", "nmea0183.cur.layer",
8169 FT_STRING, BASE_NONE,
8170 NULL((void*)0), 0x0,
8171 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8172 {&hf_nmea0183_cur_ref_layer,
8173 {"Reference Layer Depth (m)", "nmea0183.cur.ref_layer",
8174 FT_STRING, BASE_NONE,
8175 NULL((void*)0), 0x0,
8176 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8177 {&hf_nmea0183_cur_speed,
8178 {"Current Speed (knots)", "nmea0183.cur.speed",
8179 FT_STRING, BASE_NONE,
8180 NULL((void*)0), 0x0,
8181 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8182 {&hf_nmea0183_cur_speed_ref,
8183 {"Speed Reference", "nmea0183.cur.speed_ref",
8184 FT_CHAR, BASE_NONE,
8185 VALS(speed_reference)((0 ? (const struct _value_string*)0 : ((speed_reference)))), 0x0,
8186 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8187 {&hf_nmea0183_cur_validity,
8188 {"Validity of the Data", "nmea0183.cur.validity",
8189 FT_CHAR, BASE_NONE,
8190 VALS(data_status)((0 ? (const struct _value_string*)0 : ((data_status)))), 0x0,
8191 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8192 {&hf_nmea0183_dbt_fathoms,
8193 {"Water depth (fathoms)", "nmea0183.dbt.fathoms",
8194 FT_STRING, BASE_NONE,
8195 NULL((void*)0), 0x0,
8196 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8197 {&hf_nmea0183_dbt_feet,
8198 {"Water depth (feet)", "nmea0183.dbt.feet",
8199 FT_STRING, BASE_NONE,
8200 NULL((void*)0), 0x0,
8201 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8202 {&hf_nmea0183_dbt_meters,
8203 {"Water depth (meters)", "nmea0183.dbt.meters",
8204 FT_STRING, BASE_NONE,
8205 NULL((void*)0), 0x0,
8206 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8207 {&hf_nmea0183_dcn_data_basis,
8208 {"Fix Data Basis", "nmea0183.dcn.basis",
8209 FT_CHAR, BASE_NONE,
8210 VALS(dcn_data_basis)((0 ? (const struct _value_string*)0 : ((dcn_data_basis)))), 0x0,
8211 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8212 {&hf_nmea0183_dcn_dc_id,
8213 {"Decca Chain Identifier", "nmea0183.dcn.dcid",
8214 FT_STRING, BASE_NONE,
8215 NULL((void*)0), 0x0,
8216 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8217 {&hf_nmea0183_dcn_glop,
8218 {"Green Line of Position (LOP)", "nmea0183.dcn.glop",
8219 FT_STRING, BASE_NONE,
8220 NULL((void*)0), 0x0,
8221 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8222 {&hf_nmea0183_dcn_gnav,
8223 {"Green-line Navigation Use", "nmea0183.dcn.gnav",
8224 FT_CHAR, BASE_NONE,
8225 VALS(data_status)((0 ? (const struct _value_string*)0 : ((data_status)))), 0x0,
8226 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8227 {&hf_nmea0183_dcn_gstatus,
8228 {"Status: Green-Master Line", "nmea0183.dcn.gstatus",
8229 FT_CHAR, BASE_NONE,
8230 VALS(data_status)((0 ? (const struct _value_string*)0 : ((data_status)))), 0x0,
8231 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8232 {&hf_nmea0183_dcn_gz_id,
8233 {"Green Zone Identifier", "nmea0183.dcn.gzid",
8234 FT_STRING, BASE_NONE,
8235 NULL((void*)0), 0x0,
8236 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8237 {&hf_nmea0183_dcn_plop,
8238 {"Purple Line of Position (LOP)", "nmea0183.dcn.plop",
8239 FT_STRING, BASE_NONE,
8240 NULL((void*)0), 0x0,
8241 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8242 {&hf_nmea0183_dcn_pnav,
8243 {"Purple-line Navigation Use", "nmea0183.dcn.pnav",
8244 FT_CHAR, BASE_NONE,
8245 VALS(data_status)((0 ? (const struct _value_string*)0 : ((data_status)))), 0x0,
8246 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8247 {&hf_nmea0183_dcn_pos_uncertainty,
8248 {"Position Uncertainty (nm)", "nmea0183.dcn.pos_uncertainty",
8249 FT_STRING, BASE_NONE,
8250 NULL((void*)0), 0x0,
8251 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8252 {&hf_nmea0183_dcn_pstatus,
8253 {"Status: Purple-Master Line", "nmea0183.dcn.pstatus",
8254 FT_CHAR, BASE_NONE,
8255 VALS(data_status)((0 ? (const struct _value_string*)0 : ((data_status)))), 0x0,
8256 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8257 {&hf_nmea0183_dcn_pz_id,
8258 {"Purple Zone Identifier", "nmea0183.dcn.pzid",
8259 FT_STRING, BASE_NONE,
8260 NULL((void*)0), 0x0,
8261 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8262 {&hf_nmea0183_dcn_rlop,
8263 {"Red Line of Position (LOP)", "nmea0183.dcn.rlop",
8264 FT_STRING, BASE_NONE,
8265 NULL((void*)0), 0x0,
8266 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8267 {&hf_nmea0183_dcn_rnav,
8268 {"Red-line Navigation Use", "nmea0183.dcn.rnav",
8269 FT_CHAR, BASE_NONE,
8270 VALS(data_status)((0 ? (const struct _value_string*)0 : ((data_status)))), 0x0,
8271 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8272 {&hf_nmea0183_dcn_rstatus,
8273 {"Status: Red-Master Line", "nmea0183.dcn.rstatus",
8274 FT_CHAR, BASE_NONE,
8275 VALS(data_status)((0 ? (const struct _value_string*)0 : ((data_status)))), 0x0,
8276 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8277 {&hf_nmea0183_dcn_rz_id,
8278 {"Red Zone Identifier", "nmea0183.dcn.rzid",
8279 FT_STRING, BASE_NONE,
8280 NULL((void*)0), 0x0,
8281 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8282 {&hf_nmea0183_ddc_brightness,
8283 {"Brightness Percentage", "nmea0183.ddc.brightness",
8284 FT_STRING, BASE_NONE,
8285 NULL((void*)0), 0x0,
8286 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8287 {&hf_nmea0183_ddc_dimming,
8288 {"Display Dimming Preset", "nmea0183.ddc.dimming",
8289 FT_CHAR, BASE_NONE,
8290 VALS(dimming_palette_preset_vals)((0 ? (const struct _value_string*)0 : ((dimming_palette_preset_vals
))))
, 0x0,
8291 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8292 {&hf_nmea0183_ddc_palette,
8293 {"Color Palette", "nmea0183.ddc.palette",
8294 FT_CHAR, BASE_NONE,
8295 VALS(dimming_palette_preset_vals)((0 ? (const struct _value_string*)0 : ((dimming_palette_preset_vals
))))
, 0x0,
8296 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8297 {&hf_nmea0183_ddc_status,
8298 {"Sentence Status Flag", "nmea0183.ddc.status",
8299 FT_CHAR, BASE_NONE,
8300 VALS(sentence_status_vals)((0 ? (const struct _value_string*)0 : ((sentence_status_vals
))))
, 0x0,
8301 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8302 {&hf_nmea0183_dor_door_num,
8303 {"Door Number", "nmea0183.dor.number",
8304 FT_STRING, BASE_NONE,
8305 NULL((void*)0), 0x0,
8306 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8307 {&hf_nmea0183_dor_first_indic,
8308 {"First Division Indicator", "nmea0183.dor.indicator_1",
8309 FT_STRING, BASE_NONE,
8310 NULL((void*)0), 0x0,
8311 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8312 {&hf_nmea0183_dor_msg_type,
8313 {"Message Type", "nmea0183.dor.msg_type",
8314 FT_CHAR, BASE_NONE,
8315 VALS(dor_msg_type_vals)((0 ? (const struct _value_string*)0 : ((dor_msg_type_vals)))
)
, 0x0,
8316 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8317 {&hf_nmea0183_dor_open_count,
8318 {"Open and/or Faulty Door Count", "nmea0183.dor.open_count",
8319 FT_STRING, BASE_NONE,
8320 NULL((void*)0), 0x0,
8321 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8322 {&hf_nmea0183_dor_second_indic,
8323 {"Second Division Indicator", "nmea0183.dor.indicator_2",
8324 FT_STRING, BASE_NONE,
8325 NULL((void*)0), 0x0,
8326 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8327 {&hf_nmea0183_dor_setting,
8328 {"Watertight Door Switch Setting", "nmea0183.dor.setting",
8329 FT_CHAR, BASE_NONE,
8330 VALS(watertight_switch_setting_vals)((0 ? (const struct _value_string*)0 : ((watertight_switch_setting_vals
))))
, 0x0,
8331 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8332 {&hf_nmea0183_dor_status,
8333 {"Door Status", "nmea0183.dor.status",
8334 FT_CHAR, BASE_NONE,
8335 VALS(door_status_vals)((0 ? (const struct _value_string*)0 : ((door_status_vals)))), 0x0,
8336 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8337 {&hf_nmea0183_dor_system_type,
8338 {"Type of Door Monitoring System", "nmea0183.dor.sys_type",
8339 FT_STRING, BASE_NONE,
8340 NULL((void*)0), 0x0,
8341 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8342 {&hf_nmea0183_dor_text,
8343 {"Message Description Text", "nmea0183.dor.text",
8344 FT_STRING, BASE_NONE,
8345 NULL((void*)0), 0x0,
8346 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8347 {&hf_nmea0183_dor_time,
8348 {"Event Time (UTC)", "nmea0183.dor.time",
8349 FT_STRING, BASE_NONE,
8350 NULL((void*)0), 0x0,
8351 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8352 {&hf_nmea0183_dpt_depth,
8353 {"Water depth", "nmea0183.dpt_depth",
8354 FT_STRING, BASE_NONE,
8355 NULL((void*)0), 0x0,
8356 "NMEA 0183 DPT Water depth relative to transducer", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8357 {&hf_nmea0183_dpt_max_range,
8358 {"Maximum range", "nmea0183.dpt_max_range",
8359 FT_STRING, BASE_NONE,
8360 NULL((void*)0), 0x0,
8361 "NMEA 0183 DPT Maximum range scale in use (NMEA 3.0 and above)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8362 {&hf_nmea0183_dpt_offset,
8363 {"Offset", "nmea0183.dpt_offset",
8364 FT_STRING, BASE_NONE,
8365 NULL((void*)0), 0x0,
8366 "NMEA 0183 DPT Offset from transducer, positive means distance from transducer to water line, negative means distance from transducer to keel", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8367 {&hf_nmea0183_dsc_ack,
8368 {"Acknowledgement", "nmea0183.dsc.ack",
8369 FT_CHAR, BASE_NONE,
8370 VALS(dsc_ack_vals)((0 ? (const struct _value_string*)0 : ((dsc_ack_vals)))), 0x0,
8371 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8372 {&hf_nmea0183_dsc_address,
8373 {"Address", "nmea0183.dsc.address",
8374 FT_STRING, BASE_NONE,
8375 NULL((void*)0), 0x0,
8376 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8377 {&hf_nmea0183_dsc_category,
8378 {"Category", "nmea0183.dsc.category",
8379 FT_STRING, BASE_NONE,
8380 NULL((void*)0), 0x0,
8381 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8382 {&hf_nmea0183_dsc_comm_type,
8383 {"Type of Communication", "nmea0183.dsc.comm_type",
8384 FT_STRING, BASE_NONE,
8385 NULL((void*)0), 0x0,
8386 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8387 {&hf_nmea0183_dsc_expansion,
8388 {"Expansion Indicator", "nmea0183.dsc.expansion",
8389 FT_STRING, BASE_NONE,
8390 NULL((void*)0), 0x0,
8391 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8392 {&hf_nmea0183_dsc_first_tcmd,
8393 {"First Telecommand", "nmea0183.dsc.first_tcmd",
8394 FT_STRING, BASE_NONE,
8395 NULL((void*)0), 0x0,
8396 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8397 {&hf_nmea0183_dsc_format,
8398 {"Format Specifier", "nmea0183.dsc.format",
8399 FT_STRING, BASE_NONE,
8400 NULL((void*)0), 0x0,
8401 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8402 {&hf_nmea0183_dsc_mmsi,
8403 {"MMSI of Ship in Distress", "nmea0183.dsc.mmsi",
8404 FT_STRING, BASE_NONE,
8405 NULL((void*)0), 0x0,
8406 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8407 {&hf_nmea0183_dsc_nature_distress,
8408 {"Nature of Distress", "nmea0183.dsc.distress",
8409 FT_STRING, BASE_NONE,
8410 NULL((void*)0), 0x0,
8411 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8412 {&hf_nmea0183_dsc_position,
8413 {"Position", "nmea0183.dsc.position",
8414 FT_STRING, BASE_NONE,
8415 NULL((void*)0), 0x0,
8416 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8417 {&hf_nmea0183_dsc_time,
8418 {"Time (UTC)", "nmea0183.dsc.time",
8419 FT_STRING, BASE_NONE,
8420 NULL((void*)0), 0x0,
8421 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8422 {&hf_nmea0183_dse_code,
8423 {"Code", "nmea0183.dse.code",
8424 FT_STRING, BASE_NONE,
8425 NULL((void*)0), 0x0,
8426 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8427 {&hf_nmea0183_dse_data,
8428 {"Data", "nmea0183.dse.data",
8429 FT_STRING, BASE_NONE,
8430 NULL((void*)0), 0x0,
8431 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8432 {&hf_nmea0183_dse_flag,
8433 {"Query/Reply Flag", "nmea0183.dse.flag",
8434 FT_CHAR, BASE_NONE,
8435 VALS(dse_flag_vals)((0 ? (const struct _value_string*)0 : ((dse_flag_vals)))), 0x0,
8436 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8437 {&hf_nmea0183_dse_mmsi,
8438 {"Vessel MMSI", "nmea0183.dse.mmsi",
8439 FT_STRING, BASE_NONE,
8440 NULL((void*)0), 0x0,
8441 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8442 {&hf_nmea0183_dse_sentence_number,
8443 {"Sentence Number", "nmea0183.dse.sentence_num",
8444 FT_STRING, BASE_NONE,
8445 NULL((void*)0), 0x0,
8446 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8447 {&hf_nmea0183_dse_total_sentences,
8448 {"Total Number of Sentences", "nmea0183.dse.tot_sentences",
8449 FT_STRING, BASE_NONE,
8450 NULL((void*)0), 0x0,
8451 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8452 {&hf_nmea0183_dsi_course,
8453 {"Vessel Course (degrees True)", "nmea0183.dsi.course",
8454 FT_STRING, BASE_NONE,
8455 NULL((void*)0), 0x0,
8456 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8457 {&hf_nmea0183_dsi_expansion,
8458 {"Expansion Indicator", "nmea0183.dsi.expansion",
8459 FT_STRING, BASE_NONE,
8460 NULL((void*)0), 0x0,
8461 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8462 {&hf_nmea0183_dsi_geo_area,
8463 {"Geographic Area (0.01 minutes)", "nmea0183.dsi.geo",
8464 FT_STRING, BASE_NONE,
8465 NULL((void*)0), 0x0,
8466 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8467 {&hf_nmea0183_dsi_info,
8468 {"Information", "nmea0183.dsi.info",
8469 FT_STRING, BASE_NONE,
8470 NULL((void*)0), 0x0,
8471 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8472 {&hf_nmea0183_dsi_mmsi,
8473 {"Vessel MMSI", "nmea0183.dsi.mmsi",
8474 FT_STRING, BASE_NONE,
8475 NULL((void*)0), 0x0,
8476 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8477 {&hf_nmea0183_dsi_sentence_number,
8478 {"Sentence Number", "nmea0183.dsi.sentence_num",
8479 FT_STRING, BASE_NONE,
8480 NULL((void*)0), 0x0,
8481 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8482 {&hf_nmea0183_dsi_symbol,
8483 {"Symbol", "nmea0183.dsi.symbol",
8484 FT_STRING, BASE_NONE,
8485 NULL((void*)0), 0x0,
8486 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8487 {&hf_nmea0183_dsi_total_sentences,
8488 {"Total Number of Sentences", "nmea0183.dsi.tot_sentences",
8489 FT_STRING, BASE_NONE,
8490 NULL((void*)0), 0x0,
8491 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8492 {&hf_nmea0183_dsi_type,
8493 {"Vessel Type", "nmea0183.dsi.type",
8494 FT_STRING, BASE_NONE,
8495 NULL((void*)0), 0x0,
8496 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8497 {&hf_nmea0183_dsr_expansion,
8498 {"Expansion Indicator", "nmea0183.dsr.expansion",
8499 FT_STRING, BASE_NONE,
8500 NULL((void*)0), 0x0,
8501 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8502 {&hf_nmea0183_dsr_info,
8503 {"Information", "nmea0183.dsr.info",
8504 FT_STRING, BASE_NONE,
8505 NULL((void*)0), 0x0,
8506 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8507 {&hf_nmea0183_dsr_mmsi,
8508 {"Vessel MMSI", "nmea0183.dsr.mmsi",
8509 FT_STRING, BASE_NONE,
8510 NULL((void*)0), 0x0,
8511 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8512 {&hf_nmea0183_dsr_sentence_number,
8513 {"Sentence Number", "nmea0183.dsr.sentence_num",
8514 FT_STRING, BASE_NONE,
8515 NULL((void*)0), 0x0,
8516 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8517 {&hf_nmea0183_dsr_symbol,
8518 {"Symbol", "nmea0183.dsr.symbol",
8519 FT_STRING, BASE_NONE,
8520 NULL((void*)0), 0x0,
8521 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8522 {&hf_nmea0183_dsr_total_sentences,
8523 {"Total Number of Sentences", "nmea0183.dsr.tot_sentences",
8524 FT_STRING, BASE_NONE,
8525 NULL((void*)0), 0x0,
8526 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8527 {&hf_nmea0183_dtm_alt_offset,
8528 {"Altitude Offset (m)", "nmea0183.dtm.alt_offset",
8529 FT_STRING, BASE_NONE,
8530 NULL((void*)0), 0x0,
8531 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8532 {&hf_nmea0183_dtm_datum,
8533 {"Datum Code", "nmea0183.dtm.datum",
8534 FT_STRING, BASE_NONE,
8535 NULL((void*)0), 0x0,
8536 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8537 {&hf_nmea0183_dtm_datum_subdiv,
8538 {"Datum Subdivision Code", "nmea0183.dtm.datum_sub",
8539 FT_STRING, BASE_NONE,
8540 NULL((void*)0), 0x0,
8541 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8542 {&hf_nmea0183_dtm_lat_offset,
8543 {"Latitude Offset (minutes)", "nmea0183.dtm.lat_offset",
8544 FT_STRING, BASE_NONE,
8545 NULL((void*)0), 0x0,
8546 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8547 {&hf_nmea0183_dtm_lon_offset,
8548 {"Longitude Offset (minutes)", "nmea0183.dtm.lon_offset",
8549 FT_STRING, BASE_NONE,
8550 NULL((void*)0), 0x0,
8551 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8552 {&hf_nmea0183_dtm_ref_datum,
8553 {"Reference Datum Code", "nmea0183.dtm.ref_datum",
8554 FT_STRING, BASE_NONE,
8555 NULL((void*)0), 0x0,
8556 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8557 {&hf_nmea0183_etl_msg_type,
8558 {"Message Type", "nmea0183.etl.msg_type",
8559 FT_CHAR, BASE_NONE,
8560 VALS(etl_message_type_vals)((0 ? (const struct _value_string*)0 : ((etl_message_type_vals
))))
, 0x0,
8561 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8562 {&hf_nmea0183_etl_num_eng_shaft,
8563 {"Number of Engine or Propeller Shaft", "nmea0183.etl.engshaft_num",
8564 FT_CHAR, BASE_NONE,
8565 VALS(revolutions_number_vals)((0 ? (const struct _value_string*)0 : ((revolutions_number_vals
))))
, 0x0,
8566 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8567 {&hf_nmea0183_etl_opind,
8568 {"Operating Location Indicator", "nmea0183.etl.posind_op",
8569 FT_CHAR, BASE_NONE,
8570 VALS(oplocation_indicator_vals)((0 ? (const struct _value_string*)0 : ((oplocation_indicator_vals
))))
, 0x0,
8571 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8572 {&hf_nmea0183_etl_posind_engine,
8573 {"Position Indicator of Engine Telegraph", "nmea0183.etl.posind_eng",
8574 FT_UINT16, BASE_DEC,
8575 VALS(indicators_for_engine_telegraph)((0 ? (const struct _value_string*)0 : ((indicators_for_engine_telegraph
))))
, 0x0,
8576 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8577 {&hf_nmea0183_etl_posind_sub,
8578 {"Position Indication of Sub Telegraph", "nmea0183.etl.posind_sub",
8579 FT_UINT16, BASE_DEC,
8580 VALS(indicators_for_sub_telegraph)((0 ? (const struct _value_string*)0 : ((indicators_for_sub_telegraph
))))
, 0x0,
8581 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8582 {&hf_nmea0183_etl_time,
8583 {"Event Time (UTC)", "nmea0183.etl.time",
8584 FT_STRING, BASE_NONE,
8585 NULL((void*)0), 0x0,
8586 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8587 {&hf_nmea0183_fsi_mode,
8588 {"Mode of Operation", "nmea0183.fsi.mode",
8589 FT_CHAR, BASE_NONE,
8590 VALS(fsi_mode_vals)((0 ? (const struct _value_string*)0 : ((fsi_mode_vals)))), 0x0,
8591 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8592 {&hf_nmea0183_fsi_power,
8593 {"Reference Datum Code", "nmea0183.fsi.power",
8594 FT_CHAR, BASE_NONE,
8595 VALS(fsi_power_vals)((0 ? (const struct _value_string*)0 : ((fsi_power_vals)))), 0x0,
8596 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8597 {&hf_nmea0183_fsi_recv_freq,
8598 {"Receive Frequency (100Hz Increments)", "nmea0183.fsi.recv_freq",
8599 FT_STRING, BASE_NONE,
8600 NULL((void*)0), 0x0,
8601 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8602 {&hf_nmea0183_fsi_xmit_freq,
8603 {"Transmit Frequency (100Hz Increments)", "nmea0183.fsi.xmit_freq",
8604 FT_STRING, BASE_NONE,
8605 NULL((void*)0), 0x0,
8606 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8607 {&hf_nmea0183_gbs_alt_err,
8608 {"Expected Error in Altitude (m)", "nmea0183.gbs.alt_err",
8609 FT_STRING, BASE_NONE,
8610 NULL((void*)0), 0x0,
8611 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8612 {&hf_nmea0183_gbs_est_bias,
8613 {"Estimate of Bias (m) on Most Likely Failed Satellite", "nmea0183.gbs.est_bias",
8614 FT_STRING, BASE_NONE,
8615 NULL((void*)0), 0x0,
8616 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8617 {&hf_nmea0183_gbs_lat_err,
8618 {"Expected Error in Latitude (m)", "nmea0183.gbs.lat_err",
8619 FT_STRING, BASE_NONE,
8620 NULL((void*)0), 0x0,
8621 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8622 {&hf_nmea0183_gbs_long_err,
8623 {"Expected Error in Longitude (m)", "nmea0183.gbs.long_err",
8624 FT_STRING, BASE_NONE,
8625 NULL((void*)0), 0x0,
8626 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8627 {&hf_nmea0183_gbs_prob_miss,
8628 {"Prob. of Missed Detection for Most Likely Failed Satellite", "nmea0183.gbs.prob_miss",
8629 FT_STRING, BASE_NONE,
8630 NULL((void*)0), 0x0,
8631 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8632 {&hf_nmea0183_gbs_sat_id,
8633 {"ID Number of Most Likely Failed Satellite (PRN No.)", "nmea0183.gbs.sat_id",
8634 FT_STRING, BASE_NONE,
8635 NULL((void*)0), 0x0,
8636 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8637 {&hf_nmea0183_gbs_sat_type,
8638 {"Satellite Type", "nmea0183.gbs.sat_type",
8639 FT_UINT16, BASE_DEC|BASE_RANGE_STRING0x00000100,
8640 RVALS(sat_prn_type)((0 ? (const struct _range_string*)0 : ((sat_prn_type)))), 0x0,
8641 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8642 {&hf_nmea0183_gbs_std_dev,
8643 {"Standard Deviation of Bias Estimate", "nmea0183.gbs.std_dev",
8644 FT_STRING, BASE_NONE,
8645 NULL((void*)0), 0x0,
8646 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8647 {&hf_nmea0183_gbs_utc,
8648 {"UTC time of the GGA or GNS fix", "nmea0183.gbs.utc",
8649 FT_STRING, BASE_NONE,
8650 NULL((void*)0), 0x0,
8651 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8652 {&hf_nmea0183_gga_age_dgps,
8653 {"Age of differential GPS", "nmea0183.gga_age_dgps",
8654 FT_STRING, BASE_NONE,
8655 NULL((void*)0), 0x0,
8656 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8657 {&hf_nmea0183_gga_altitude,
8658 {"Altitude", "nmea0183.gga_altitude",
8659 FT_STRING, BASE_NONE,
8660 NULL((void*)0), 0x0,
8661 "NMEA 0183 GGA Antenna Altitude above mean-sea-level", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8662 {&hf_nmea0183_gga_altitude_unit,
8663 {"Altitude unit", "nmea0183.gga_altitude_unit",
8664 FT_STRING, BASE_NONE,
8665 NULL((void*)0), 0x0,
8666 "NMEA 0183 GGA Units of antenna altitude", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8667 {&hf_nmea0183_gga_dgps_station,
8668 {"Differential GPS station id", "nmea0183.gga_dgps_station",
8669 FT_STRING, BASE_NONE,
8670 NULL((void*)0), 0x0,
8671 "NMEA 0183 GGA Differential reference station ID", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8672 {&hf_nmea0183_gga_geoidal_separation,
8673 {"Geoidal separation", "nmea0183.gga_geoidal_separation",
8674 FT_STRING, BASE_NONE,
8675 NULL((void*)0), 0x0,
8676 "NMEA 0183 GGA Geoidal separation, the difference between the WGS-84 earth ellipsoid and mean-sea-level", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8677 {&hf_nmea0183_gga_geoidal_separation_unit,
8678 {"Geoidal separation unit", "nmea0183.gga_geoidal_separation_unit",
8679 FT_STRING, BASE_NONE,
8680 NULL((void*)0), 0x0,
8681 "NMEA 0183 GGA Units of geoidal separation, meters", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8682 {&hf_nmea0183_gga_horizontal_dilution,
8683 {"Horizontal Dilution", "nmea0183.gga_horizontal_dilution",
8684 FT_STRING, BASE_NONE,
8685 NULL((void*)0), 0x0,
8686 "NMEA 0183 GGA Horizontal Dilution of precision", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8687 {&hf_nmea0183_gga_latitude,
8688 {"Latitude", "nmea0183.gga_latitude",
8689 FT_NONE, BASE_NONE,
8690 NULL((void*)0), 0x0,
8691 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8692 {&hf_nmea0183_gga_latitude_degree,
8693 {"Degree", "nmea0183.gga_latitude_degree",
8694 FT_STRING, BASE_NONE,
8695 NULL((void*)0), 0x0,
8696 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8697 {&hf_nmea0183_gga_latitude_direction,
8698 {"Direction", "nmea0183.gga_latitude_direction",
8699 FT_STRING, BASE_NONE,
8700 NULL((void*)0), 0x0,
8701 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8702 {&hf_nmea0183_gga_latitude_minute,
8703 {"Minute", "nmea0183.gga_latitude_minute",
8704 FT_STRING, BASE_NONE,
8705 NULL((void*)0), 0x0,
8706 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8707 {&hf_nmea0183_gga_longitude,
8708 {"Longitude", "nmea0183.gga_longitude",
8709 FT_NONE, BASE_NONE,
8710 NULL((void*)0), 0x0,
8711 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8712 {&hf_nmea0183_gga_longitude_degree,
8713 {"Degree", "nmea0183.gga_longitude_degree",
8714 FT_STRING, BASE_NONE,
8715 NULL((void*)0), 0x0,
8716 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8717 {&hf_nmea0183_gga_longitude_direction,
8718 {"Direction", "nmea0183.gga_longitude_direction",
8719 FT_STRING, BASE_NONE,
8720 NULL((void*)0), 0x0,
8721 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8722 {&hf_nmea0183_gga_longitude_minute,
8723 {"Minute", "nmea0183.gga_longitude_minute",
8724 FT_STRING, BASE_NONE,
8725 NULL((void*)0), 0x0,
8726 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8727 {&hf_nmea0183_gga_number_satellites,
8728 {"Number of satellites", "nmea0183.gga_number_satellites",
8729 FT_STRING, BASE_NONE,
8730 NULL((void*)0), 0x0,
8731 "NMEA 0183 GGA Number of satellites in use", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8732 {&hf_nmea0183_gga_quality,
8733 {"Quality indicator", "nmea0183.gga_quality",
8734 FT_STRING, BASE_NONE,
8735 NULL((void*)0), 0x0,
8736 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8737 {&hf_nmea0183_gga_time,
8738 {"UTC Time of position", "nmea0183.gga_time",
8739 FT_NONE, BASE_NONE,
8740 NULL((void*)0), 0x0,
8741 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8742 {&hf_nmea0183_gga_time_hour,
8743 {"Hour", "nmea0183.gga_time_hour",
8744 FT_STRING, BASE_NONE,
8745 NULL((void*)0), 0x0,
8746 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8747 {&hf_nmea0183_gga_time_minute,
8748 {"Minute", "nmea0183.gga_time_minute",
8749 FT_STRING, BASE_NONE,
8750 NULL((void*)0), 0x0,
8751 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8752 {&hf_nmea0183_gga_time_second,
8753 {"Second", "nmea0183.gga_time_second",
8754 FT_STRING, BASE_NONE,
8755 NULL((void*)0), 0x0,
8756 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8757 {&hf_nmea0183_glc_gri,
8758 {"Loran-C GRI (tens of microseconds)", "nmea0183.glc.gri",
8759 FT_STRING, BASE_NONE,
8760 NULL((void*)0), 0x0,
8761 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8762 {&hf_nmea0183_glc_master_toa,
8763 {"Master TOA (microseconds)", "nmea0183.glc.master",
8764 FT_STRING, BASE_NONE,
8765 NULL((void*)0), 0x0,
8766 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8767 {&hf_nmea0183_glc_sig_status,
8768 {"Signal Status", "nmea0183.glc.status",
8769 FT_CHAR, BASE_NONE,
8770 VALS(glc_sig_status)((0 ? (const struct _value_string*)0 : ((glc_sig_status)))), 0x0,
8771 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8772 {&hf_nmea0183_glc_td1,
8773 {"Time Difference #1 (microseconds)", "nmea0183.glc.td1",
8774 FT_STRING, BASE_NONE,
8775 NULL((void*)0), 0x0,
8776 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8777 {&hf_nmea0183_glc_td2,
8778 {"Time Difference #2 (microseconds)", "nmea0183.glc.td2",
8779 FT_STRING, BASE_NONE,
8780 NULL((void*)0), 0x0,
8781 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8782 {&hf_nmea0183_glc_td3,
8783 {"Time Difference #3 (microseconds)", "nmea0183.glc.td3",
8784 FT_STRING, BASE_NONE,
8785 NULL((void*)0), 0x0,
8786 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8787 {&hf_nmea0183_glc_td4,
8788 {"Time Difference #4 (microseconds)", "nmea0183.glc.td4",
8789 FT_STRING, BASE_NONE,
8790 NULL((void*)0), 0x0,
8791 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8792 {&hf_nmea0183_glc_td5,
8793 {"Time Difference #5 (microseconds)", "nmea0183.glc.td5",
8794 FT_STRING, BASE_NONE,
8795 NULL((void*)0), 0x0,
8796 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8797 {&hf_nmea0183_gll_latitude,
8798 {"Latitude", "nmea0183.gll_latitude",
8799 FT_NONE, BASE_NONE,
8800 NULL((void*)0), 0x0,
8801 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8802 {&hf_nmea0183_gll_latitude_degree,
8803 {"Degree", "nmea0183.gll_latitude_degree",
8804 FT_STRING, BASE_NONE,
8805 NULL((void*)0), 0x0,
8806 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8807 {&hf_nmea0183_gll_latitude_direction,
8808 {"Direction", "nmea0183.gll_latitude_direction",
8809 FT_STRING, BASE_NONE,
8810 NULL((void*)0), 0x0,
8811 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8812 {&hf_nmea0183_gll_latitude_minute,
8813 {"Minute", "nmea0183.gll_latitude_minute",
8814 FT_STRING, BASE_NONE,
8815 NULL((void*)0), 0x0,
8816 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8817 {&hf_nmea0183_gll_longitude,
8818 {"Longitude", "nmea0183.gll_longitude",
8819 FT_NONE, BASE_NONE,
8820 NULL((void*)0), 0x0,
8821 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8822 {&hf_nmea0183_gll_longitude_degree,
8823 {"Degree", "nmea0183.gll_longitude_degree",
8824 FT_STRING, BASE_NONE,
8825 NULL((void*)0), 0x0,
8826 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8827 {&hf_nmea0183_gll_longitude_direction,
8828 {"Direction", "nmea0183.gll_longitude_direction",
8829 FT_STRING, BASE_NONE,
8830 NULL((void*)0), 0x0,
8831 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8832 {&hf_nmea0183_gll_longitude_minute,
8833 {"Minute", "nmea0183.gll_longitude_minute",
8834 FT_STRING, BASE_NONE,
8835 NULL((void*)0), 0x0,
8836 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8837 {&hf_nmea0183_gll_mode,
8838 {"FAA mode", "nmea0183.gll_mode",
8839 FT_STRING, BASE_NONE,
8840 NULL((void*)0), 0x0,
8841 "NMEA 0183 GLL FAA mode indicator (NMEA 2.3 and later)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8842 {&hf_nmea0183_gll_status,
8843 {"Status", "nmea0183.gll_status",
8844 FT_STRING, BASE_NONE,
8845 NULL((void*)0), 0x0,
8846 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8847 {&hf_nmea0183_gll_time,
8848 {"UTC Time of position", "nmea0183.gll_time",
8849 FT_NONE, BASE_NONE,
8850 NULL((void*)0), 0x0,
8851 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8852 {&hf_nmea0183_gll_time_hour,
8853 {"Hour", "nmea0183.gll_time_hour",
8854 FT_STRING, BASE_NONE,
8855 NULL((void*)0), 0x0,
8856 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8857 {&hf_nmea0183_gll_time_minute,
8858 {"Minute", "nmea0183.gll_time_minute",
8859 FT_STRING, BASE_NONE,
8860 NULL((void*)0), 0x0,
8861 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8862 {&hf_nmea0183_gll_time_second,
8863 {"Second", "nmea0183.gll_time_second",
8864 FT_STRING, BASE_NONE,
8865 NULL((void*)0), 0x0,
8866 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8867 {&hf_nmea0183_gmp_ant_alt,
8868 {"Antenna Altitude (m) - MSL (geoid)", "nmea0183.gmp.ant_alt",
8869 FT_STRING, BASE_NONE,
8870 NULL((void*)0), 0x0,
8871 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8872 {&hf_nmea0183_gmp_data_age,
8873 {"Age of Differential Data", "nmea0183.gmp.data_age",
8874 FT_STRING, BASE_NONE,
8875 NULL((void*)0), 0x0,
8876 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8877 {&hf_nmea0183_gmp_diff_ref_id,
8878 {"Differential Reference Station ID", "nmea0183.gmp.diff_ref_id",
8879 FT_STRING, BASE_NONE,
8880 NULL((void*)0), 0x0,
8881 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8882 {&hf_nmea0183_gmp_geoid_sep,
8883 {"Geoidal Separation (m)", "nmea0183.gmp.geoid_sep",
8884 FT_STRING, BASE_NONE,
8885 NULL((void*)0), 0x0,
8886 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8887 {&hf_nmea0183_gmp_hdop,
8888 {"Horizontal Dilution of Precision (DOP)", "nmea0183.gmp.hdop",
8889 FT_STRING, BASE_NONE,
8890 NULL((void*)0), 0x0,
8891 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8892 {&hf_nmea0183_gmp_mode_glonass,
8893 {"GLONASS Mode Indicator", "nmea0183.gmp.mode_glonass",
8894 FT_CHAR, BASE_NONE,
8895 VALS(satellite_mode_vals)((0 ? (const struct _value_string*)0 : ((satellite_mode_vals)
)))
, 0x0,
8896 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8897 {&hf_nmea0183_gmp_mode_gps,
8898 {"GPS Mode Indicator", "nmea0183.gmp.mode_gps",
8899 FT_CHAR, BASE_NONE,
8900 VALS(satellite_mode_vals)((0 ? (const struct _value_string*)0 : ((satellite_mode_vals)
)))
, 0x0,
8901 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8902 {&hf_nmea0183_gmp_mode_other,
8903 {"Other Satellite System Mode Indicator", "nmea0183.gmp.mode_other",
8904 FT_CHAR, BASE_NONE,
8905 VALS(satellite_mode_vals)((0 ? (const struct _value_string*)0 : ((satellite_mode_vals)
)))
, 0x0,
8906 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8907 {&hf_nmea0183_gmp_mode_string,
8908 {"Mode Indicator String", "nmea0183.gmp.mode_string",
8909 FT_STRING, BASE_NONE,
8910 NULL((void*)0), 0x0,
8911 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8912 {&hf_nmea0183_gmp_projection,
8913 {"Map Projection Identification", "nmea0183.gmp.projection",
8914 FT_STRING, BASE_NONE,
8915 NULL((void*)0), 0x0,
8916 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8917 {&hf_nmea0183_gmp_tot_sats,
8918 {"Total Number of Satellites in use (00-99)", "nmea0183.gmp.tot_sats",
8919 FT_STRING, BASE_NONE,
8920 NULL((void*)0), 0x0,
8921 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8922 {&hf_nmea0183_gmp_utc,
8923 {"UTC of Position", "nmea0183.gmp.utc",
8924 FT_STRING, BASE_NONE,
8925 NULL((void*)0), 0x0,
8926 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8927 {&hf_nmea0183_gmp_x_comp,
8928 {"X (Northern) Component of Grid (or local) Coordinates", "nmea0183.gmp.x_comp",
8929 FT_STRING, BASE_NONE,
8930 NULL((void*)0), 0x0,
8931 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8932 {&hf_nmea0183_gmp_y_comp,
8933 {"Y (Eastern) Component of Grid (or local) Coordinates", "nmea0183.gmp.y_comp",
8934 FT_STRING, BASE_NONE,
8935 NULL((void*)0), 0x0,
8936 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8937 {&hf_nmea0183_gmp_zone,
8938 {"Map Zone", "nmea0183.gmp.zone",
8939 FT_STRING, BASE_NONE,
8940 NULL((void*)0), 0x0,
8941 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8942 {&hf_nmea0183_gns_ant_alt,
8943 {"Antenna Altitude (m) - MSL (geoid)", "nmea0183.gns.ant_alt",
8944 FT_STRING, BASE_NONE,
8945 NULL((void*)0), 0x0,
8946 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8947 {&hf_nmea0183_gns_data_age,
8948 {"Age of Differential Data", "nmea0183.gns.data_age",
8949 FT_STRING, BASE_NONE,
8950 NULL((void*)0), 0x0,
8951 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8952 {&hf_nmea0183_gns_diff_ref_id,
8953 {"Differential Reference Station ID", "nmea0183.gns.diff_ref_id",
8954 FT_STRING, BASE_NONE,
8955 NULL((void*)0), 0x0,
8956 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8957 {&hf_nmea0183_gns_geoid_sep,
8958 {"Geoidal Separation (m)", "nmea0183.gns.geoid_sep",
8959 FT_STRING, BASE_NONE,
8960 NULL((void*)0), 0x0,
8961 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8962 {&hf_nmea0183_gns_hdop,
8963 {"Horizontal Dilution of Precision (DOP)", "nmea0183.gns.hdop",
8964 FT_STRING, BASE_NONE,
8965 NULL((void*)0), 0x0,
8966 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8967 {&hf_nmea0183_gns_latitude,
8968 {"Latitude", "nmea0183.gns.latitude",
8969 FT_FLOAT, BASE_NONE,
8970 NULL((void*)0), 0x0,
8971 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8972 {&hf_nmea0183_gns_longitude,
8973 {"Longitude", "nmea0183.gns.longitude",
8974 FT_FLOAT, BASE_NONE,
8975 NULL((void*)0), 0x0,
8976 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8977 {&hf_nmea0183_gns_mode_glonass,
8978 {"GLONASS Mode Indicator", "nmea0183.gns.mode_glonass",
8979 FT_CHAR, BASE_NONE,
8980 VALS(satellite_mode_vals)((0 ? (const struct _value_string*)0 : ((satellite_mode_vals)
)))
, 0x0,
8981 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8982 {&hf_nmea0183_gns_mode_gps,
8983 {"GPS Mode Indicator", "nmea0183.gns.mode_gps",
8984 FT_CHAR, BASE_NONE,
8985 VALS(satellite_mode_vals)((0 ? (const struct _value_string*)0 : ((satellite_mode_vals)
)))
, 0x0,
8986 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8987 {&hf_nmea0183_gns_mode_other,
8988 {"Other Satellite System Mode Indicator", "nmea0183.gns.mode_other",
8989 FT_CHAR, BASE_NONE,
8990 VALS(satellite_mode_vals)((0 ? (const struct _value_string*)0 : ((satellite_mode_vals)
)))
, 0x0,
8991 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8992 {&hf_nmea0183_gns_mode_string,
8993 {"Mode Indicator String", "nmea0183.gns.mode_string",
8994 FT_STRING, BASE_NONE,
8995 NULL((void*)0), 0x0,
8996 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
8997 {&hf_nmea0183_gns_tot_sats,
8998 {"Total Number of Satellites in use (00-99)", "nmea0183.gns.tot_sats",
8999 FT_STRING, BASE_NONE,
9000 NULL((void*)0), 0x0,
9001 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9002 {&hf_nmea0183_gns_utc,
9003 {"UTC of Position", "nmea0183.gns.utc",
9004 FT_STRING, BASE_NONE,
9005 NULL((void*)0), 0x0,
9006 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9007 {&hf_nmea0183_grs_mode,
9008 {"Mode (Residuals)", "nmea0183.grs.mode",
9009 FT_CHAR, BASE_NONE,
9010 VALS(grs_mode_vals)((0 ? (const struct _value_string*)0 : ((grs_mode_vals)))), 0x0,
9011 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9012 {&hf_nmea0183_grs_range_resid,
9013 {"Range Residual (m)", "nmea0183.grs.residual",
9014 FT_STRING, BASE_NONE,
9015 NULL((void*)0), 0x0,
9016 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9017 {&hf_nmea0183_grs_utc,
9018 {"UTC time of the associated GGA/GNS fix", "nmea0183.grs.utc",
9019 FT_STRING, BASE_NONE,
9020 NULL((void*)0), 0x0,
9021 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9022 {&hf_nmea0183_gsa_fix_mode,
9023 {"Fix Mode", "nmea0183.gsa.fixmode",
9024 FT_CHAR, BASE_NONE,
9025 VALS(gsa_fix_mode)((0 ? (const struct _value_string*)0 : ((gsa_fix_mode)))), 0x0,
9026 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9027 {&hf_nmea0183_gsa_hdop,
9028 {"Horizontal Dilution of Precision (HDOP)", "nmea0183.gsa.hdop",
9029 FT_STRING, BASE_NONE,
9030 NULL((void*)0), 0x0,
9031 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9032 {&hf_nmea0183_gsa_op_mode,
9033 {"Operation Mode", "nmea0183.gsa.opmode",
9034 FT_CHAR, BASE_NONE,
9035 VALS(gsa_op_mode)((0 ? (const struct _value_string*)0 : ((gsa_op_mode)))), 0x0,
9036 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9037 {&hf_nmea0183_gsa_pdop,
9038 {"Position Dilution of Precision (PDOP)", "nmea0183.gsa.pdop",
9039 FT_STRING, BASE_NONE,
9040 NULL((void*)0), 0x0,
9041 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9042 {&hf_nmea0183_gsa_sat_id,
9043 {"Satellite ID", "nmea0183.gsa.sat_id",
9044 FT_STRING, BASE_NONE,
9045 NULL((void*)0), 0x0,
9046 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9047 {&hf_nmea0183_gsa_sat_type,
9048 {"Satellite Type", "nmea0183.gsa.sat_type",
9049 FT_UINT16, BASE_DEC|BASE_RANGE_STRING0x00000100,
9050 RVALS(sat_prn_type)((0 ? (const struct _range_string*)0 : ((sat_prn_type)))), 0x0,
9051 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9052 {&hf_nmea0183_gsa_vdop,
9053 {"Vertical Dilution of Precision (VDOP)", "nmea0183.gsa.vdop",
9054 FT_STRING, BASE_NONE,
9055 NULL((void*)0), 0x0,
9056 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9057 {&hf_nmea0183_gst_altitude_sd,
9058 {"Standard deviation of altitude error", "nmea0183.gst_sd_altitude",
9059 FT_STRING, BASE_NONE,
9060 NULL((void*)0), 0x0,
9061 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9062 {&hf_nmea0183_gst_ellipse_major_sd,
9063 {"Standard deviation of semi-major axis of error", "nmea0183.gst_ellipse_major_sd",
9064 FT_STRING, BASE_NONE,
9065 NULL((void*)0), 0x0,
9066 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9067 {&hf_nmea0183_gst_ellipse_minor_sd,
9068 {"Standard deviation of semi-minor axis of error ellipse", "nmea0183.gst_ellipse_minor_sd",
9069 FT_STRING, BASE_NONE,
9070 NULL((void*)0), 0x0,
9071 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9072 {&hf_nmea0183_gst_ellipse_orientation,
9073 {"Orientation of semi-major axis of error ellipse", "nmea0183.gst_ellipse_orientation",
9074 FT_STRING, BASE_NONE,
9075 NULL((void*)0), 0x0,
9076 "NMEA 0183 GST Orientation of semi-major axis of error ellipse (true north degrees)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9077 {&hf_nmea0183_gst_latitude_sd,
9078 {"Standard deviation of latitude error", "nmea0183.gst_sd_latitude",
9079 FT_STRING, BASE_NONE,
9080 NULL((void*)0), 0x0,
9081 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9082 {&hf_nmea0183_gst_longitude_sd,
9083 {"Standard deviation of longitude error", "nmea0183.gst_sd_longitude",
9084 FT_STRING, BASE_NONE,
9085 NULL((void*)0), 0x0,
9086 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9087 {&hf_nmea0183_gst_rms_total_sd,
9088 {"Total RMS standard deviation", "nmea0183.gst_sd_rms_total",
9089 FT_STRING, BASE_NONE,
9090 NULL((void*)0), 0x0,
9091 "NMEA 0183 GST Total RMS standard deviation of ranges inputs to the navigation solution", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9092 {&hf_nmea0183_gst_time,
9093 {"UTC Time of position", "nmea0183.gst_time",
9094 FT_NONE, BASE_NONE,
9095 NULL((void*)0), 0x0,
9096 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9097 {&hf_nmea0183_gst_time_hour,
9098 {"Hour", "nmea0183.gst_time_hour",
9099 FT_STRING, BASE_NONE,
9100 NULL((void*)0), 0x0,
9101 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9102 {&hf_nmea0183_gst_time_minute,
9103 {"Minute", "nmea0183.gst_time_minute",
9104 FT_STRING, BASE_NONE,
9105 NULL((void*)0), 0x0,
9106 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9107 {&hf_nmea0183_gst_time_second,
9108 {"Second", "nmea0183.gst_time_second",
9109 FT_STRING, BASE_NONE,
9110 NULL((void*)0), 0x0,
9111 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9112 {&hf_nmea0183_gsv_azimuth,
9113 {"Azimuth (degrees True)", "nmea0183.gsv.azimuth",
9114 FT_STRING, BASE_NONE,
9115 NULL((void*)0), 0x0,
9116 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9117 {&hf_nmea0183_gsv_elevation,
9118 {"Elevation (degrees, 90 max)", "nmea0183.gsv.elevation",
9119 FT_STRING, BASE_NONE,
9120 NULL((void*)0), 0x0,
9121 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9122 {&hf_nmea0183_gsv_sat_id,
9123 {"Satellite ID", "nmea0183.gsv.sat_id",
9124 FT_STRING, BASE_NONE,
9125 NULL((void*)0), 0x0,
9126 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9127 {&hf_nmea0183_gsv_sat_type,
9128 {"Satellite Type", "nmea0183.gsv.sat_type",
9129 FT_UINT16, BASE_DEC|BASE_RANGE_STRING0x00000100,
9130 RVALS(sat_prn_type)((0 ? (const struct _range_string*)0 : ((sat_prn_type)))), 0x0,
9131 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9132 {&hf_nmea0183_gsv_sats_in_view,
9133 {"Total Number of Satellites in View", "nmea0183.gsv.tot_sats",
9134 FT_STRING, BASE_NONE,
9135 NULL((void*)0), 0x0,
9136 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9137 {&hf_nmea0183_gsv_sentence_number,
9138 {"Sentence Number (1 to 9)", "nmea0183.gsv.sentence_num",
9139 FT_STRING, BASE_NONE,
9140 NULL((void*)0), 0x0,
9141 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9142 {&hf_nmea0183_gsv_snr,
9143 {"SNR (C/No) (db-Hz)", "nmea0183.gsv.snr",
9144 FT_STRING, BASE_NONE,
9145 NULL((void*)0), 0x0,
9146 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9147 {&hf_nmea0183_gsv_total_sentences,
9148 {"Total Number of Sentences (1 to 9)", "nmea0183.gsv.tot_sentences",
9149 FT_STRING, BASE_NONE,
9150 NULL((void*)0), 0x0,
9151 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9152 {&hf_nmea0183_hbt_interval,
9153 {"Configured Repeat Interval", "nmea0183.hbt.interval",
9154 FT_STRING, BASE_NONE,
9155 NULL((void*)0), 0x0,
9156 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9157 {&hf_nmea0183_hbt_sent_id,
9158 {"Sequential Sentence Identifier", "nmea0183.hbt.sent_id",
9159 FT_STRING, BASE_NONE,
9160 NULL((void*)0), 0x0,
9161 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9162 {&hf_nmea0183_hbt_status,
9163 {"Equipment Status", "nmea0183.hbt.status",
9164 FT_CHAR, BASE_NONE,
9165 VALS(equipment_status_vals)((0 ? (const struct _value_string*)0 : ((equipment_status_vals
))))
, 0x0,
9166 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9167 {&hf_nmea0183_hdg_mag_dev,
9168 {"Magnetic Deviation (degrees E/W)", "nmea0183.hdg.deviation",
9169 FT_STRING, BASE_NONE,
9170 NULL((void*)0), 0x0,
9171 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9172 {&hf_nmea0183_hdg_mag_sensor,
9173 {"Magnetic Sensor Heading (degrees)", "nmea0183.hdg.sensor",
9174 FT_STRING, BASE_NONE,
9175 NULL((void*)0), 0x0,
9176 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9177 {&hf_nmea0183_hdg_mag_var,
9178 {"Magnetic Variation (degrees E/W)", "nmea0183.hdg.variation",
9179 FT_STRING, BASE_NONE,
9180 NULL((void*)0), 0x0,
9181 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9182 {&hf_nmea0183_hdt_heading,
9183 {"True heading", "nmea0183.hdt_heading",
9184 FT_STRING, BASE_NONE,
9185 NULL((void*)0), 0x0,
9186 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9187 {&hf_nmea0183_hdt_unit,
9188 {"Heading unit", "nmea0183.hdt_unit",
9189 FT_STRING, BASE_NONE,
9190 NULL((void*)0), 0x0,
9191 "NMEA 0183 HDT Heading unit, must be T", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9192 {&hf_nmea0183_hmr_dev_s1,
9193 {"Deviation, Sensor 1 (degrees)", "nmea0183.hmr.s1_dev",
9194 FT_STRING, BASE_NONE,
9195 NULL((void*)0), 0x0,
9196 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9197 {&hf_nmea0183_hmr_dev_s2,
9198 {"Deviation, Sensor 2 (degrees)", "nmea0183.hmr.s2_dev",
9199 FT_STRING, BASE_NONE,
9200 NULL((void*)0), 0x0,
9201 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9202 {&hf_nmea0183_hmr_difflim_setting,
9203 {"Difference Limit Setting (degrees)", "nmea0183.hmr.difflim",
9204 FT_STRING, BASE_NONE,
9205 NULL((void*)0), 0x0,
9206 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9207 {&hf_nmea0183_hmr_heading_s1,
9208 {"Heading Sensor 1 ID", "nmea0183.hmr.s1_heading",
9209 FT_STRING, BASE_NONE,
9210 NULL((void*)0), 0x0,
9211 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9212 {&hf_nmea0183_hmr_heading_s2,
9213 {"Heading Sensor 2 ID", "nmea0183.hmr.s2_heading",
9214 FT_STRING, BASE_NONE,
9215 NULL((void*)0), 0x0,
9216 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9217 {&hf_nmea0183_hmr_heading_sdiff,
9218 {"Actual Heading Sensor Difference (degrees)", "nmea0183.hmr.sensor_diff",
9219 FT_STRING, BASE_NONE,
9220 NULL((void*)0), 0x0,
9221 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9222 {&hf_nmea0183_hmr_hr_s1,
9223 {"Heading Reading, Sensor 1 (degrees)", "nmea0183.hmr.s1_hr",
9224 FT_STRING, BASE_NONE,
9225 NULL((void*)0), 0x0,
9226 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9227 {&hf_nmea0183_hmr_hr_s2,
9228 {"Heading Reading, Sensor 2 (degrees)", "nmea0183.hmr.s2_hr",
9229 FT_STRING, BASE_NONE,
9230 NULL((void*)0), 0x0,
9231 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9232 {&hf_nmea0183_hmr_s1_type,
9233 {"Sensor 1 Type", "nmea0183.hmr.s1_stype",
9234 FT_CHAR, BASE_NONE,
9235 VALS(heading_monitor_sensor_type)((0 ? (const struct _value_string*)0 : ((heading_monitor_sensor_type
))))
, 0x0,
9236 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9237 {&hf_nmea0183_hmr_s2_type,
9238 {"Sensor 2 Type", "nmea0183.hmr.s2_stype",
9239 FT_CHAR, BASE_NONE,
9240 VALS(heading_monitor_sensor_type)((0 ? (const struct _value_string*)0 : ((heading_monitor_sensor_type
))))
, 0x0,
9241 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9242 {&hf_nmea0183_hmr_status_s1,
9243 {"Status, Sensor 1", "nmea0183.hmr.s1_status",
9244 FT_CHAR, BASE_NONE,
9245 VALS(heading_monitor_sensor_vals)((0 ? (const struct _value_string*)0 : ((heading_monitor_sensor_vals
))))
, 0x0,
9246 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9247 {&hf_nmea0183_hmr_status_s2,
9248 {"Status, Sensor 2", "nmea0183.hmr.s2_status",
9249 FT_CHAR, BASE_NONE,
9250 VALS(heading_monitor_sensor_vals)((0 ? (const struct _value_string*)0 : ((heading_monitor_sensor_vals
))))
, 0x0,
9251 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9252 {&hf_nmea0183_hmr_variation,
9253 {"Variation (degrees)", "nmea0183.hmr.variation",
9254 FT_STRING, BASE_NONE,
9255 NULL((void*)0), 0x0,
9256 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9257 {&hf_nmea0183_hmr_warning_flag,
9258 {"Override", "nmea0183.hmr.warning",
9259 FT_CHAR, BASE_NONE,
9260 VALS(warning_flag_vals)((0 ? (const struct _value_string*)0 : ((warning_flag_vals)))
)
, 0x0,
9261 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9262 {&hf_nmea0183_hms_heading_s1,
9263 {"Heading Sensor 1 ID", "nmea0183.hms.heading_s1",
9264 FT_STRING, BASE_NONE,
9265 NULL((void*)0), 0x0,
9266 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9267 {&hf_nmea0183_hms_heading_s2,
9268 {"Heading Sensor 2 ID", "nmea0183.hms.heading_s2",
9269 FT_STRING, BASE_NONE,
9270 NULL((void*)0), 0x0,
9271 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9272 {&hf_nmea0183_hms_max_diff,
9273 {"Maximum Difference (degrees)", "nmea0183.hms.max_diff",
9274 FT_STRING, BASE_NONE,
9275 NULL((void*)0), 0x0,
9276 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9277 {&hf_nmea0183_hsc_heading_magnetic,
9278 {"Commanded Heading (degrees Magnetic)", "nmea0183.hsc.heading_mag",
9279 FT_STRING, BASE_NONE,
9280 NULL((void*)0), 0x0,
9281 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9282 {&hf_nmea0183_hsc_heading_true,
9283 {"Commanded Heading (degrees True)", "nmea0183.hsc.heading_true",
9284 FT_STRING, BASE_NONE,
9285 NULL((void*)0), 0x0,
9286 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9287 {&hf_nmea0183_htc_cmd_offhead_lim,
9288 {"Commanded Off-heading Limit (degrees)", "nmea0183.htc.offhead_lim",
9289 FT_STRING, BASE_NONE,
9290 NULL((void*)0), 0x0,
9291 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9292 {&hf_nmea0183_htc_cmd_offtrack,
9293 {"Commanded Off-Track Limit (nm)", "nmea0183.htc.offtrack",
9294 FT_STRING, BASE_NONE,
9295 NULL((void*)0), 0x0,
9296 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9297 {&hf_nmea0183_htc_cmd_radius,
9298 {"Commanded Radius of Turn for Heading Changes (nm)", "nmea0183.htc.radius",
9299 FT_STRING, BASE_NONE,
9300 NULL((void*)0), 0x0,
9301 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9302 {&hf_nmea0183_htc_cmd_rate,
9303 {"Commanded Rate of Turn for Heading Changes (deg./min.)", "nmea0183.htc.rate",
9304 FT_STRING, BASE_NONE,
9305 NULL((void*)0), 0x0,
9306 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9307 {&hf_nmea0183_htc_cmd_rudder_angle,
9308 {"Commanded Rudder Angle (degrees)", "nmea0183.htc.rudder_angle",
9309 FT_STRING, BASE_NONE,
9310 NULL((void*)0), 0x0,
9311 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9312 {&hf_nmea0183_htc_cmd_rudder_dir,
9313 {"Commanded Rudder Direction", "nmea0183.htc.rudder_dir",
9314 FT_CHAR, BASE_NONE,
9315 VALS(rudder_dir_vals)((0 ? (const struct _value_string*)0 : ((rudder_dir_vals)))), 0x0,
9316 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9317 {&hf_nmea0183_htc_cmd_rudder_lim,
9318 {"Commanded Rudder Limit (degrees)", "nmea0183.htc.rudder_lim",
9319 FT_STRING, BASE_NONE,
9320 NULL((void*)0), 0x0,
9321 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9322 {&hf_nmea0183_htc_cmd_steer,
9323 {"Commanded Heading-to-Steer (degrees)", "nmea0183.htc.steer",
9324 FT_STRING, BASE_NONE,
9325 NULL((void*)0), 0x0,
9326 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9327 {&hf_nmea0183_htc_cmd_track,
9328 {"Commanded Track (degrees)", "nmea0183.htc.track",
9329 FT_STRING, BASE_NONE,
9330 NULL((void*)0), 0x0,
9331 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9332 {&hf_nmea0183_htc_heading_ref,
9333 {"Heading Reference in use", "nmea0183.htc.heading_ref",
9334 FT_CHAR, BASE_NONE,
9335 VALS(heading_reference)((0 ? (const struct _value_string*)0 : ((heading_reference)))
)
, 0x0,
9336 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9337 {&hf_nmea0183_htc_override,
9338 {"Override", "nmea0183.htc.override",
9339 FT_CHAR, BASE_NONE,
9340 VALS(override_vals)((0 ? (const struct _value_string*)0 : ((override_vals)))), 0x0,
9341 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9342 {&hf_nmea0183_htc_steering_mode,
9343 {"Selected Steering Mode", "nmea0183.htc.steering_mode",
9344 FT_CHAR, BASE_NONE,
9345 VALS(steering_mode_vals)((0 ? (const struct _value_string*)0 : ((steering_mode_vals))
))
, 0x0,
9346 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9347 {&hf_nmea0183_htc_turn_mode,
9348 {"Turn Mode", "nmea0183.htc.turn_mode",
9349 FT_CHAR, BASE_NONE,
9350 VALS(turning_mode_vals)((0 ? (const struct _value_string*)0 : ((turning_mode_vals)))
)
, 0x0,
9351 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9352 {&hf_nmea0183_htd_cmd_offhead_lim,
9353 {"Commanded Off-heading Limit (degrees)", "nmea0183.htd.offhead_lim",
9354 FT_STRING, BASE_NONE,
9355 NULL((void*)0), 0x0,
9356 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9357 {&hf_nmea0183_htd_cmd_offtrack,
9358 {"Commanded Off-Track Limit (nm)", "nmea0183.htd.offtrack",
9359 FT_STRING, BASE_NONE,
9360 NULL((void*)0), 0x0,
9361 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9362 {&hf_nmea0183_htd_cmd_radius,
9363 {"Commanded Radius of Turn for Heading Changes (nm)", "nmea0183.htd.radius",
9364 FT_STRING, BASE_NONE,
9365 NULL((void*)0), 0x0,
9366 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9367 {&hf_nmea0183_htd_cmd_rate,
9368 {"Commanded Rate of Turn for Heading Changes (deg./min.)", "nmea0183.htd.rate",
9369 FT_STRING, BASE_NONE,
9370 NULL((void*)0), 0x0,
9371 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9372 {&hf_nmea0183_htd_cmd_rudder_angle,
9373 {"Commanded Rudder Angle (degrees)", "nmea0183.htd.rudder_angle",
9374 FT_STRING, BASE_NONE,
9375 NULL((void*)0), 0x0,
9376 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9377 {&hf_nmea0183_htd_cmd_rudder_dir,
9378 {"Commanded Rudder Direction", "nmea0183.htd.rudder_dir",
9379 FT_CHAR, BASE_NONE,
9380 VALS(rudder_dir_vals)((0 ? (const struct _value_string*)0 : ((rudder_dir_vals)))), 0x0,
9381 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9382 {&hf_nmea0183_htd_cmd_rudder_lim,
9383 {"Commanded Rudder Limit (degrees)", "nmea0183.htd.rudder_lim",
9384 FT_STRING, BASE_NONE,
9385 NULL((void*)0), 0x0,
9386 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9387 {&hf_nmea0183_htd_cmd_steer,
9388 {"Commanded Heading-to-Steer (degrees)", "nmea0183.htd.steer",
9389 FT_STRING, BASE_NONE,
9390 NULL((void*)0), 0x0,
9391 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9392 {&hf_nmea0183_htd_cmd_track,
9393 {"Commanded Track (degrees)", "nmea0183.htd.track",
9394 FT_STRING, BASE_NONE,
9395 NULL((void*)0), 0x0,
9396 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9397 {&hf_nmea0183_htd_heading_ref,
9398 {"Heading Reference in use", "nmea0183.htd.heading_ref",
9399 FT_CHAR, BASE_NONE,
9400 VALS(heading_reference)((0 ? (const struct _value_string*)0 : ((heading_reference)))
)
, 0x0,
9401 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9402 {&hf_nmea0183_htd_offhdng_status,
9403 {"Off-heading Status", "nmea0183.htd.offheading_status",
9404 FT_CHAR, BASE_NONE,
9405 VALS(r_oh_ot_status)((0 ? (const struct _value_string*)0 : ((r_oh_ot_status)))), 0x0,
9406 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9407 {&hf_nmea0183_htd_offtrack_status,
9408 {"Off-track Status", "nmea0183.htd.offtrack_status",
9409 FT_CHAR, BASE_NONE,
9410 VALS(r_oh_ot_status)((0 ? (const struct _value_string*)0 : ((r_oh_ot_status)))), 0x0,
9411 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9412 {&hf_nmea0183_htd_override,
9413 {"Override", "nmea0183.htd.override",
9414 FT_CHAR, BASE_NONE,
9415 VALS(override_vals)((0 ? (const struct _value_string*)0 : ((override_vals)))), 0x0,
9416 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9417 {&hf_nmea0183_htd_rudder_status,
9418 {"Rudder Status", "nmea0183.htd.rudder_status",
9419 FT_CHAR, BASE_NONE,
9420 VALS(r_oh_ot_status)((0 ? (const struct _value_string*)0 : ((r_oh_ot_status)))), 0x0,
9421 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9422 {&hf_nmea0183_htd_steering_mode,
9423 {"Selected Steering Mode", "nmea0183.htd.steering_mode",
9424 FT_CHAR, BASE_NONE,
9425 VALS(steering_mode_vals)((0 ? (const struct _value_string*)0 : ((steering_mode_vals))
))
, 0x0,
9426 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9427 {&hf_nmea0183_htd_turn_mode,
9428 {"Turn Mode", "nmea0183.htd.turn_mode",
9429 FT_CHAR, BASE_NONE,
9430 VALS(turning_mode_vals)((0 ? (const struct _value_string*)0 : ((turning_mode_vals)))
)
, 0x0,
9431 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9432 {&hf_nmea0183_htd_vessel_heading,
9433 {"Vessel Heading (degrees)", "nmea0183.htd.vessel_heading",
9434 FT_STRING, BASE_NONE,
9435 NULL((void*)0), 0x0,
9436 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9437 {&hf_nmea0183_lcd_gri,
9438 {"GRI (tens of microseconds)", "nmea0183.lcd.gri",
9439 FT_STRING, BASE_NONE,
9440 NULL((void*)0), 0x0,
9441 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9442 {&hf_nmea0183_lcd_master_ecd,
9443 {"Master Pulse Shape (ECD)", "nmea0183.lcd.master_ecd",
9444 FT_STRING, BASE_NONE,
9445 NULL((void*)0), 0x0,
9446 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9447 {&hf_nmea0183_lcd_master_snr,
9448 {"Master Signal-to-Noise Ratio (SNR)", "nmea0183.lcd.master_snr",
9449 FT_STRING, BASE_NONE,
9450 NULL((void*)0), 0x0,
9451 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9452 {&hf_nmea0183_lcd_s1_ecd,
9453 {"Secondary 1 ECD", "nmea0183.lcd.s1_ecd",
9454 FT_STRING, BASE_NONE,
9455 NULL((void*)0), 0x0,
9456 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9457 {&hf_nmea0183_lcd_s1_snr,
9458 {"Secondary 1 SNR", "nmea0183.lcd.s1_snr",
9459 FT_STRING, BASE_NONE,
9460 NULL((void*)0), 0x0,
9461 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9462 {&hf_nmea0183_lcd_s2_ecd,
9463 {"Secondary 2 ECD", "nmea0183.lcd.s2_ecd",
9464 FT_STRING, BASE_NONE,
9465 NULL((void*)0), 0x0,
9466 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9467 {&hf_nmea0183_lcd_s2_snr,
9468 {"Secondary 2 SNR", "nmea0183.lcd.s2_snr",
9469 FT_STRING, BASE_NONE,
9470 NULL((void*)0), 0x0,
9471 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9472 {&hf_nmea0183_lcd_s3_ecd,
9473 {"Secondary 3 ECD", "nmea0183.lcd.s3_ecd",
9474 FT_STRING, BASE_NONE,
9475 NULL((void*)0), 0x0,
9476 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9477 {&hf_nmea0183_lcd_s3_snr,
9478 {"Secondary 3 SNR", "nmea0183.lcd.s3_snr",
9479 FT_STRING, BASE_NONE,
9480 NULL((void*)0), 0x0,
9481 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9482 {&hf_nmea0183_lcd_s4_ecd,
9483 {"Secondary 4 ECD", "nmea0183.lcd.s4_ecd",
9484 FT_STRING, BASE_NONE,
9485 NULL((void*)0), 0x0,
9486 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9487 {&hf_nmea0183_lcd_s4_snr,
9488 {"Secondary 4 SNR", "nmea0183.lcd.s4_snr",
9489 FT_STRING, BASE_NONE,
9490 NULL((void*)0), 0x0,
9491 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9492 {&hf_nmea0183_lcd_s5_ecd,
9493 {"Secondary 5 ECD", "nmea0183.lcd.s5_ecd",
9494 FT_STRING, BASE_NONE,
9495 NULL((void*)0), 0x0,
9496 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9497 {&hf_nmea0183_lcd_s5_snr,
9498 {"Secondary 5 SNR", "nmea0183.lcd.s5_snr",
9499 FT_STRING, BASE_NONE,
9500 NULL((void*)0), 0x0,
9501 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9502 {&hf_nmea0183_loranc_blink_snr_warning,
9503 {"Data Status (Loran-C Blink / SNR)", "nmea0183.apb.gen_warning",
9504 FT_CHAR, BASE_NONE,
9505 VALS(loranc_blink_snr_warning_vals)((0 ? (const struct _value_string*)0 : ((loranc_blink_snr_warning_vals
))))
, 0x0,
9506 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9507 {&hf_nmea0183_lr1_callsign,
9508 {"Call Sign", "nmea0183.lr1.callsign",
9509 FT_STRING, BASE_NONE,
9510 NULL((void*)0), 0x0,
9511 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9512 {&hf_nmea0183_lr1_imo_num,
9513 {"IMO Number", "nmea0183.lr1.imo_num",
9514 FT_STRING, BASE_NONE,
9515 NULL((void*)0), 0x0,
9516 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9517 {&hf_nmea0183_lr1_req_mmsi,
9518 {"MMSI of Requestor", "nmea0183.lr1.mmsi_req",
9519 FT_STRING, BASE_NONE,
9520 NULL((void*)0), 0x0,
9521 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9522 {&hf_nmea0183_lr1_resp_mmsi,
9523 {"MMSI of Responder", "nmea0183.lr1.mmsi_resp",
9524 FT_STRING, BASE_NONE,
9525 NULL((void*)0), 0x0,
9526 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9527 {&hf_nmea0183_lr1_seqnum,
9528 {"Sequence Number (0 to 9)", "nmea0183.lr1.seqnum",
9529 FT_STRING, BASE_NONE,
9530 NULL((void*)0), 0x0,
9531 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9532 {&hf_nmea0183_lr1_shipname,
9533 {"Ship's Name", "nmea0183.lr1.shipname",
9534 FT_STRING, BASE_NONE,
9535 NULL((void*)0), 0x0,
9536 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9537 {&hf_nmea0183_lr2_course_ground,
9538 {"Course Over Ground (degrees True)", "nmea0183.lr2.course",
9539 FT_STRING, BASE_NONE,
9540 NULL((void*)0), 0x0,
9541 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9542 {&hf_nmea0183_lr2_date,
9543 {"Date (ddmmyyyy)", "nmea0183.lr2.date",
9544 FT_STRING, BASE_NONE,
9545 NULL((void*)0), 0x0,
9546 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9547 {&hf_nmea0183_lr2_latitude,
9548 {"Latitude", "nmea0183.lr2.latitude",
9549 FT_FLOAT, BASE_NONE,
9550 NULL((void*)0), 0x0,
9551 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9552 {&hf_nmea0183_lr2_longitude,
9553 {"Longitude", "nmea0183.lr2.longitude",
9554 FT_FLOAT, BASE_NONE,
9555 NULL((void*)0), 0x0,
9556 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9557 {&hf_nmea0183_lr2_resp_mmsi,
9558 {"MMSI of Responder", "nmea0183.lr2.mmsi_resp",
9559 FT_STRING, BASE_NONE,
9560 NULL((void*)0), 0x0,
9561 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9562 {&hf_nmea0183_lr2_seqnum,
9563 {"Sequence Number (0 to 9)", "nmea0183.lr2.seqnum",
9564 FT_STRING, BASE_NONE,
9565 NULL((void*)0), 0x0,
9566 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9567 {&hf_nmea0183_lr2_speed_ground,
9568 {"Speed Over Ground (knots)", "nmea0183.lr2.speed",
9569 FT_STRING, BASE_NONE,
9570 NULL((void*)0), 0x0,
9571 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9572 {&hf_nmea0183_lr2_utc,
9573 {"UTC of Position", "nmea0183.lr2.utc",
9574 FT_STRING, BASE_NONE,
9575 NULL((void*)0), 0x0,
9576 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9577 {&hf_nmea0183_lr3_destination,
9578 {"Voyage Destination", "nmea0183.lr3.destination",
9579 FT_STRING, BASE_NONE,
9580 NULL((void*)0), 0x0,
9581 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9582 {&hf_nmea0183_lr3_draught,
9583 {"Draught", "nmea0183.lr3.draught",
9584 FT_STRING, BASE_NONE,
9585 NULL((void*)0), 0x0,
9586 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9587 {&hf_nmea0183_lr3_eta_date,
9588 {"ETA Date (ddmmyy)", "nmea0183.lr3.eta_date",
9589 FT_STRING, BASE_NONE,
9590 NULL((void*)0), 0x0,
9591 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9592 {&hf_nmea0183_lr3_eta_time,
9593 {"ETA Time", "nmea0183.lr3.eta_time",
9594 FT_STRING, BASE_NONE,
9595 NULL((void*)0), 0x0,
9596 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9597 {&hf_nmea0183_lr3_persons,
9598 {"Persons (8191 implies >= 8191)", "nmea0183.lr3.persons",
9599 FT_STRING, BASE_NONE,
9600 NULL((void*)0), 0x0,
9601 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9602 {&hf_nmea0183_lr3_resp_mmsi,
9603 {"MMSI of Responder", "nmea0183.lr3.mmsi_resp",
9604 FT_STRING, BASE_NONE,
9605 NULL((void*)0), 0x0,
9606 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9607 {&hf_nmea0183_lr3_seqnum,
9608 {"Sequence Number (0 to 9)", "nmea0183.lr3.seqnum",
9609 FT_STRING, BASE_NONE,
9610 NULL((void*)0), 0x0,
9611 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9612 {&hf_nmea0183_lr3_ship_breadth,
9613 {"Ship Breadth", "nmea0183.lr3.breadth",
9614 FT_STRING, BASE_NONE,
9615 NULL((void*)0), 0x0,
9616 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9617 {&hf_nmea0183_lr3_ship_cargo,
9618 {"Ship/Cargo", "nmea0183.lr3.cargo",
9619 FT_STRING, BASE_NONE,
9620 NULL((void*)0), 0x0,
9621 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9622 {&hf_nmea0183_lr3_ship_length,
9623 {"Ship Length", "nmea0183.lr3.length",
9624 FT_STRING, BASE_NONE,
9625 NULL((void*)0), 0x0,
9626 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9627 {&hf_nmea0183_lr3_ship_type,
9628 {"Ship Type", "nmea0183.lr3.type",
9629 FT_STRING, BASE_NONE,
9630 NULL((void*)0), 0x0,
9631 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9632 {&hf_nmea0183_lrf_function_rep,
9633 {"Function Reply Status String", "nmea0183.lr2.function_rep_string",
9634 FT_STRING, BASE_NONE,
9635 NULL((void*)0), 0x0,
9636 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9637 {&hf_nmea0183_lrf_function_rep_val,
9638 {"Function Reply Status", "nmea0183.lr2.function_rep",
9639 FT_CHAR, BASE_NONE,
9640 VALS(lrf_func_rep_vals)((0 ? (const struct _value_string*)0 : ((lrf_func_rep_vals)))
)
, 0x0,
9641 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9642 {&hf_nmea0183_lrf_function_req,
9643 {"Function Request String", "nmea0183.lr2.function_req_string",
9644 FT_STRING, BASE_NONE,
9645 NULL((void*)0), 0x0,
9646 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9647 {&hf_nmea0183_lrf_function_req_val,
9648 {"Function Request", "nmea0183.lr2.function_req",
9649 FT_CHAR, BASE_NONE,
9650 VALS(lrf_func_req_vals)((0 ? (const struct _value_string*)0 : ((lrf_func_req_vals)))
)
, 0x0,
9651 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9652 {&hf_nmea0183_lrf_mmsi,
9653 {"MMSI of Requestor", "nmea0183.lrf.mmsi",
9654 FT_STRING, BASE_NONE,
9655 NULL((void*)0), 0x0,
9656 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9657 {&hf_nmea0183_lrf_name,
9658 {"Name of Requestor", "nmea0183.lr2.name",
9659 FT_STRING, BASE_NONE,
9660 NULL((void*)0), 0x0,
9661 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9662 {&hf_nmea0183_lrf_seqnum,
9663 {"Sequence Number (0 to 9)", "nmea0183.lrf.seqnum",
9664 FT_STRING, BASE_NONE,
9665 NULL((void*)0), 0x0,
9666 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9667 {&hf_nmea0183_lri_control,
9668 {"Control Flag", "nmea0183.lri.control",
9669 FT_CHAR, BASE_NONE,
9670 VALS(control_flag_vals)((0 ? (const struct _value_string*)0 : ((control_flag_vals)))
)
, 0x0,
9671 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9672 {&hf_nmea0183_lri_dest_mmsi,
9673 {"MMSI of Destination", "nmea0183.lri.mmsi_dest",
9674 FT_STRING, BASE_NONE,
9675 NULL((void*)0), 0x0,
9676 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9677 {&hf_nmea0183_lri_latitude_ne,
9678 {"Latitude (NE corner)", "nmea0183.lri.latitude_ne",
9679 FT_FLOAT, BASE_NONE,
9680 NULL((void*)0), 0x0,
9681 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9682 {&hf_nmea0183_lri_latitude_sw,
9683 {"Latitude (SW corner)", "nmea0183.lri.latitude_sw",
9684 FT_FLOAT, BASE_NONE,
9685 NULL((void*)0), 0x0,
9686 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9687 {&hf_nmea0183_lri_longitude_ne,
9688 {"Longitude (NE corner)", "nmea0183.lri.longitude_ne",
9689 FT_FLOAT, BASE_NONE,
9690 NULL((void*)0), 0x0,
9691 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9692 {&hf_nmea0183_lri_longitude_sw,
9693 {"Longitude (SW corner)", "nmea0183.lri.longitude_sw",
9694 FT_FLOAT, BASE_NONE,
9695 NULL((void*)0), 0x0,
9696 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9697 {&hf_nmea0183_lri_req_mmsi,
9698 {"MMSI of Requestor", "nmea0183.lri.mmsi_req",
9699 FT_STRING, BASE_NONE,
9700 NULL((void*)0), 0x0,
9701 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9702 {&hf_nmea0183_lri_seqnum,
9703 {"Sequence Number (0 to 9)", "nmea0183.lri.seqnum",
9704 FT_STRING, BASE_NONE,
9705 NULL((void*)0), 0x0,
9706 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9707 {&hf_nmea0183_mla_12lsb_corr_t_scale,
9708 {"12 LSB of System Time Scale Correction", "nmea0183.mla.12lsb",
9709 FT_STRING, BASE_NONE,
9710 NULL((void*)0), 0x0,
9711 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9712 {&hf_nmea0183_mla_16msb_corr_t_scale,
9713 {"16 MSB of System Time Scale Correction", "nmea0183.mla.16msb",
9714 FT_STRING, BASE_NONE,
9715 NULL((void*)0), 0x0,
9716 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9717 {&hf_nmea0183_mla_calday_count,
9718 {"Calendar Day Count", "nmea0183.mla.calday_count",
9719 FT_STRING, BASE_NONE,
9720 NULL((void*)0), 0x0,
9721 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9722 {&hf_nmea0183_mla_corr_circling,
9723 {"Correction to the Avg. Value of Draconitic Circling Time", "nmea0183.mla.corr_circling",
9724 FT_STRING, BASE_NONE,
9725 NULL((void*)0), 0x0,
9726 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9727 {&hf_nmea0183_mla_corr_incl_angle,
9728 {"Correction to the Avg. Value of the Inclination Angle", "nmea0183.mla.inc_angle",
9729 FT_STRING, BASE_NONE,
9730 NULL((void*)0), 0x0,
9731 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9732 {&hf_nmea0183_mla_eccentricity,
9733 {"Eccentricity", "nmea0183.mla.eccentricity",
9734 FT_STRING, BASE_NONE,
9735 NULL((void*)0), 0x0,
9736 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9737 {&hf_nmea0183_mla_long_asc_node,
9738 {"Greenwich Longitude of the Ascension Node", "nmea0183.mla.long_asc_node",
9739 FT_STRING, BASE_NONE,
9740 NULL((void*)0), 0x0,
9741 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9742 {&hf_nmea0183_mla_perigee,
9743 {"Argument of Perigee", "nmea0183.mla.perigee",
9744 FT_STRING, BASE_NONE,
9745 NULL((void*)0), 0x0,
9746 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9747 {&hf_nmea0183_mla_roc_circling,
9748 {"Rate of Change of Draconitic Circling Time", "nmea0183.mla.roc_circling",
9749 FT_STRING, BASE_NONE,
9750 NULL((void*)0), 0x0,
9751 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9752 {&hf_nmea0183_mla_sat_health,
9753 {"Satellite Health & Carrier Frequency", "nmea0183.mla.sat_carrier",
9754 FT_STRING, BASE_NONE,
9755 NULL((void*)0), 0x0,
9756 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9757 {&hf_nmea0183_mla_sat_id,
9758 {"Satellite ID (satellite slot)", "nmea0183.mla.sat_id",
9759 FT_STRING, BASE_NONE,
9760 NULL((void*)0), 0x0,
9761 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9762 {&hf_nmea0183_mla_sentence_number,
9763 {"Sentence Number", "nmea0183.mla.sentence_num",
9764 FT_STRING, BASE_NONE,
9765 NULL((void*)0), 0x0,
9766 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9767 {&hf_nmea0183_mla_t_asc_node,
9768 {"Time of the Ascension Node & Almanac Reference Time", "nmea0183.mla.asc_node",
9769 FT_STRING, BASE_NONE,
9770 NULL((void*)0), 0x0,
9771 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9772 {&hf_nmea0183_mla_t_scale_shift,
9773 {"Course Value of the Time Scale Shift", "nmea0183.mla.scale_shift",
9774 FT_STRING, BASE_NONE,
9775 NULL((void*)0), 0x0,
9776 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9777 {&hf_nmea0183_mla_total_sentences,
9778 {"Total Number of Sentences", "nmea0183.mla.tot_sentences",
9779 FT_STRING, BASE_NONE,
9780 NULL((void*)0), 0x0,
9781 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9782 {&hf_nmea0183_msk_am_bitrate,
9783 {"Auto/Manual Bit Rate", "nmea0183.msk.am_bitrate",
9784 FT_CHAR, BASE_NONE,
9785 VALS(auto_manual_vals)((0 ? (const struct _value_string*)0 : ((auto_manual_vals)))), 0x0,
9786 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9787 {&hf_nmea0183_msk_am_freq,
9788 {"Auto/Manual Frequency", "nmea0183.msk.am_freq",
9789 FT_CHAR, BASE_NONE,
9790 VALS(auto_manual_vals)((0 ? (const struct _value_string*)0 : ((auto_manual_vals)))), 0x0,
9791 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9792 {&hf_nmea0183_msk_beacon_bitrate,
9793 {"Beacon Bit Rate (bps)", "nmea0183.msk.beacon_bitrate",
9794 FT_STRING, BASE_NONE,
9795 NULL((void*)0), 0x0,
9796 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9797 {&hf_nmea0183_msk_beacon_freq,
9798 {"Beacon Frequency (kHz)", "nmea0183.msk.beacon_freq",
9799 FT_STRING, BASE_NONE,
9800 NULL((void*)0), 0x0,
9801 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9802 {&hf_nmea0183_msk_channel,
9803 {"Channel Number", "nmea0183.msk.channel",
9804 FT_STRING, BASE_NONE,
9805 NULL((void*)0), 0x0,
9806 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9807 {&hf_nmea0183_msk_interval,
9808 {"Interval for sending MSS status (seconds)", "nmea0183.msk.interval",
9809 FT_STRING, BASE_NONE,
9810 NULL((void*)0), 0x0,
9811 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9812 {&hf_nmea0183_mss_beacon_bitrate,
9813 {"Beacon Bit Rate (bps)", "nmea0183.mss.bitrate",
9814 FT_STRING, BASE_NONE,
9815 NULL((void*)0), 0x0,
9816 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9817 {&hf_nmea0183_mss_beacon_freq,
9818 {"Beacon Frequency (kHz)", "nmea0183.mss.beacon_freq",
9819 FT_STRING, BASE_NONE,
9820 NULL((void*)0), 0x0,
9821 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9822 {&hf_nmea0183_mss_channel,
9823 {"Channel Number", "nmea0183.mss.channel",
9824 FT_STRING, BASE_NONE,
9825 NULL((void*)0), 0x0,
9826 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9827 {&hf_nmea0183_mss_sig_str,
9828 {"Signal Strength (dB) (re: 1 uV/m)", "nmea0183.mss.sig_strength",
9829 FT_STRING, BASE_NONE,
9830 NULL((void*)0), 0x0,
9831 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9832 {&hf_nmea0183_mss_snr,
9833 {"Signal-to-Noise Ratio (SNR) (dB)", "nmea0183.mss.snr",
9834 FT_STRING, BASE_NONE,
9835 NULL((void*)0), 0x0,
9836 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9837 {&hf_nmea0183_mtw_temp,
9838 {"Water Temperature", "nmea0183.mtw.temp",
9839 FT_STRING, BASE_NONE,
9840 NULL((void*)0), 0x0,
9841 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9842 {&hf_nmea0183_mwd_direction_mag,
9843 {"Wind Direction (degrees Magnetic)", "nmea0183.mwd.dir_mag",
9844 FT_STRING, BASE_NONE,
9845 NULL((void*)0), 0x0,
9846 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9847 {&hf_nmea0183_mwd_direction_true,
9848 {"Wind Direction (degrees True)", "nmea0183.mwd.dir_true",
9849 FT_STRING, BASE_NONE,
9850 NULL((void*)0), 0x0,
9851 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9852 {&hf_nmea0183_mwd_speed_knots,
9853 {"Wind Speed (knots)", "nmea0183.mwd.speed_kts",
9854 FT_STRING, BASE_NONE,
9855 NULL((void*)0), 0x0,
9856 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9857 {&hf_nmea0183_mwd_speed_ms,
9858 {"Wind Speed (meters/second)", "nmea0183.mwd.speed_ms",
9859 FT_STRING, BASE_NONE,
9860 NULL((void*)0), 0x0,
9861 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9862 {&hf_nmea0183_mwv_reference,
9863 {"Reference", "nmea0183.mwv.reference",
9864 FT_CHAR, BASE_NONE,
9865 VALS(mwv_reference)((0 ? (const struct _value_string*)0 : ((mwv_reference)))), 0x0,
9866 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9867 {&hf_nmea0183_mwv_speed_units,
9868 {"Wind Speed Units", "nmea0183.mwv.units",
9869 FT_CHAR, BASE_NONE,
9870 VALS(speed_unit_vals)((0 ? (const struct _value_string*)0 : ((speed_unit_vals)))), 0x0,
9871 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9872 {&hf_nmea0183_mwv_status,
9873 {"Data Status", "nmea0183.mwv.status",
9874 FT_CHAR, BASE_NONE,
9875 VALS(data_status)((0 ? (const struct _value_string*)0 : ((data_status)))), 0x0,
9876 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9877 {&hf_nmea0183_mwv_wind_angle,
9878 {"Wind Angle (0 to 359 deg)", "nmea0183.mwv.angle",
9879 FT_STRING, BASE_NONE,
9880 NULL((void*)0), 0x0,
9881 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9882 {&hf_nmea0183_mwv_wind_speed,
9883 {"Wind Speed", "nmea0183.mwv.speed",
9884 FT_STRING, BASE_NONE,
9885 NULL((void*)0), 0x0,
9886 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9887 {&hf_nmea0183_osd_course_ref,
9888 {"Course Reference", "nmea0183.osd.course_ref",
9889 FT_CHAR, BASE_NONE,
9890 VALS(course_ref_vals)((0 ? (const struct _value_string*)0 : ((course_ref_vals)))), 0x0,
9891 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9892 {&hf_nmea0183_osd_course_true,
9893 {"Vessel Course (degrees True)", "nmea0183.osd.course",
9894 FT_STRING, BASE_NONE,
9895 NULL((void*)0), 0x0,
9896 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9897 {&hf_nmea0183_osd_drift,
9898 {"Vessel Drift (speed)", "nmea0183.osd.drift",
9899 FT_STRING, BASE_NONE,
9900 NULL((void*)0), 0x0,
9901 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9902 {&hf_nmea0183_osd_heading_status,
9903 {"Heading Status", "nmea0183.osd.heading_status",
9904 FT_CHAR, BASE_NONE,
9905 VALS(data_status)((0 ? (const struct _value_string*)0 : ((data_status)))), 0x0,
9906 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9907 {&hf_nmea0183_osd_heading_true,
9908 {"Heading (degrees True)", "nmea0183.osd.heading",
9909 FT_STRING, BASE_NONE,
9910 NULL((void*)0), 0x0,
9911 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9912 {&hf_nmea0183_osd_set_true,
9913 {"Vessel Set (degrees True)", "nmea0183.osd.set",
9914 FT_STRING, BASE_NONE,
9915 NULL((void*)0), 0x0,
9916 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9917 {&hf_nmea0183_osd_speed,
9918 {"Vessel Speed (degrees True)", "nmea0183.osd.speed",
9919 FT_STRING, BASE_NONE,
9920 NULL((void*)0), 0x0,
9921 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9922 {&hf_nmea0183_osd_speed_ref,
9923 {"Speed Reference", "nmea0183.osd.speed_ref",
9924 FT_CHAR, BASE_NONE,
9925 VALS(course_ref_vals)((0 ? (const struct _value_string*)0 : ((course_ref_vals)))), 0x0,
9926 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9927 {&hf_nmea0183_osd_speed_units,
9928 {"Speed Units", "nmea0183.osd.speed_units",
9929 FT_CHAR, BASE_NONE,
9930 VALS(speed_unit_vals)((0 ? (const struct _value_string*)0 : ((speed_unit_vals)))), 0x0,
9931 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9932 {&hf_nmea0183_rma_course,
9933 {"Course Over Ground (degrees True)", "nmea0183.rma.course",
9934 FT_STRING, BASE_NONE,
9935 NULL((void*)0), 0x0,
9936 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9937 {&hf_nmea0183_rma_latitude,
9938 {"Latitude", "nmea0183.rma.latitude",
9939 FT_FLOAT, BASE_NONE,
9940 NULL((void*)0), 0x0,
9941 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9942 {&hf_nmea0183_rma_longitude,
9943 {"Longitude", "nmea0183.rma.longitude",
9944 FT_FLOAT, BASE_NONE,
9945 NULL((void*)0), 0x0,
9946 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9947 {&hf_nmea0183_rma_mag_var,
9948 {"Magnetic Variation (degrees)", "nmea0183.rma.mag_var",
9949 FT_STRING, BASE_NONE,
9950 NULL((void*)0), 0x0,
9951 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9952 {&hf_nmea0183_rma_mode,
9953 {"Mode Indicator", "nmea0183.rma.mode",
9954 FT_CHAR, BASE_NONE,
9955 VALS(mode_indicator)((0 ? (const struct _value_string*)0 : ((mode_indicator)))), 0x0,
9956 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9957 {&hf_nmea0183_rma_speed,
9958 {"Speed Over Ground (knots)", "nmea0183.rma.speed",
9959 FT_STRING, BASE_NONE,
9960 NULL((void*)0), 0x0,
9961 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9962 {&hf_nmea0183_rma_status,
9963 {"Status", "nmea0183.rma.status",
9964 FT_CHAR, BASE_NONE,
9965 VALS(rma_data_status)((0 ? (const struct _value_string*)0 : ((rma_data_status)))), 0x0,
9966 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9967 {&hf_nmea0183_rma_time_diff_a,
9968 {"Time Difference A (microseconds)", "nmea0183.rma.td_a",
9969 FT_STRING, BASE_NONE,
9970 NULL((void*)0), 0x0,
9971 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9972 {&hf_nmea0183_rma_time_diff_b,
9973 {"Time Difference B (microseconds)", "nmea0183.rma.td_b",
9974 FT_STRING, BASE_NONE,
9975 NULL((void*)0), 0x0,
9976 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9977 {&hf_nmea0183_rmb_arrival_status,
9978 {"Arrival Status", "nmea0183.rmb.arrival_status",
9979 FT_CHAR, BASE_NONE,
9980 VALS(arrival_circle_status)((0 ? (const struct _value_string*)0 : ((arrival_circle_status
))))
, 0x0,
9981 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9982 {&hf_nmea0183_rmb_bearing_dest,
9983 {"Bearing to Destination (degrees True)", "nmea0183.rmb.bearing",
9984 FT_STRING, BASE_NONE,
9985 NULL((void*)0), 0x0,
9986 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9987 {&hf_nmea0183_rmb_data_status,
9988 {"Data Status", "nmea0183.rmb.data_status",
9989 FT_CHAR, BASE_NONE,
9990 VALS(navigation_data_status)((0 ? (const struct _value_string*)0 : ((navigation_data_status
))))
, 0x0,
9991 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9992 {&hf_nmea0183_rmb_dest_id,
9993 {"Destination Waypoint ID", "nmea0183.rmb.dest_id",
9994 FT_STRING, BASE_NONE,
9995 NULL((void*)0), 0x0,
9996 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
9997 {&hf_nmea0183_rmb_dest_velocity,
9998 {"Destination Closing Velocity", "nmea0183.rmb.velocity",
9999 FT_STRING, BASE_NONE,
10000 NULL((void*)0), 0x0,
10001 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10002 {&hf_nmea0183_rmb_dest_wp_latitude,
10003 {"Latitude", "nmea0183.rmb.latitude",
10004 FT_FLOAT, BASE_NONE,
10005 NULL((void*)0), 0x0,
10006 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10007 {&hf_nmea0183_rmb_dest_wp_longitude,
10008 {"Longitude", "nmea0183.rmb.longitude",
10009 FT_FLOAT, BASE_NONE,
10010 NULL((void*)0), 0x0,
10011 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10012 {&hf_nmea0183_rmb_mode,
10013 {"Mode Indicator", "nmea0183.rmb.mode",
10014 FT_CHAR, BASE_NONE,
10015 VALS(mode_indicator)((0 ? (const struct _value_string*)0 : ((mode_indicator)))), 0x0,
10016 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10017 {&hf_nmea0183_rmb_orig_id,
10018 {"Origin Waypoint ID", "nmea0183.rmb.orig_id",
10019 FT_STRING, BASE_NONE,
10020 NULL((void*)0), 0x0,
10021 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10022 {&hf_nmea0183_rmb_range_dest,
10023 {"Range to Destination (nm)", "nmea0183.rmb.range",
10024 FT_STRING, BASE_NONE,
10025 NULL((void*)0), 0x0,
10026 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10027 {&hf_nmea0183_rmb_steer,
10028 {"Direction to Steer", "nmea0183.rmb.steer",
10029 FT_CHAR, BASE_NONE,
10030 VALS(steer_direction)((0 ? (const struct _value_string*)0 : ((steer_direction)))), 0x0,
10031 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10032 {&hf_nmea0183_rmb_xte,
10033 {"Cross Track Error (XTE) (nm)", "nmea0183.rmb.xte",
10034 FT_STRING, BASE_NONE,
10035 NULL((void*)0), 0x0,
10036 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10037 {&hf_nmea0183_rmc_course,
10038 {"Course over ground (degrees True)", "nmea0183.rmc.course",
10039 FT_STRING, BASE_NONE,
10040 NULL((void*)0), 0x0,
10041 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10042 {&hf_nmea0183_rmc_date,
10043 {"Date (ddmmyy)", "nmea0183.rmc.date",
10044 FT_STRING, BASE_NONE,
10045 NULL((void*)0), 0x0,
10046 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10047 {&hf_nmea0183_rmc_latitude,
10048 {"Latitude", "nmea0183.rmc.latitude",
10049 FT_FLOAT, BASE_NONE,
10050 NULL((void*)0), 0x0,
10051 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10052 {&hf_nmea0183_rmc_longitude,
10053 {"Longitude", "nmea0183.rmc.longitude",
10054 FT_FLOAT, BASE_NONE,
10055 NULL((void*)0), 0x0,
10056 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10057 {&hf_nmea0183_rmc_magnetic,
10058 {"Magnetic Variation", "nmea0183.rmc.magnetic",
10059 FT_STRING, BASE_NONE,
10060 NULL((void*)0), 0x0,
10061 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10062 {&hf_nmea0183_rmc_mode,
10063 {"Mode Indicator", "nmea0183.rmc.mode",
10064 FT_CHAR, BASE_NONE,
10065 VALS(mode_indicator)((0 ? (const struct _value_string*)0 : ((mode_indicator)))), 0x0,
10066 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10067 {&hf_nmea0183_rmc_speed,
10068 {"Speed over ground (knots)", "nmea0183.rmc.speed",
10069 FT_STRING, BASE_NONE,
10070 NULL((void*)0), 0x0,
10071 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10072 {&hf_nmea0183_rmc_status,
10073 {"Status", "nmea0183.rmc.status",
10074 FT_CHAR, BASE_NONE,
10075 VALS(navigation_data_status)((0 ? (const struct _value_string*)0 : ((navigation_data_status
))))
, 0x0,
10076 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10077 {&hf_nmea0183_rmc_utc,
10078 {"UTC of Position", "nmea0183.rmc.utc",
10079 FT_STRING, BASE_NONE,
10080 NULL((void*)0), 0x0,
10081 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10082 {&hf_nmea0183_rot_rate_of_turn,
10083 {"Rate of turn", "nmea0183.rot_rate_of_turn",
10084 FT_STRING, BASE_NONE,
10085 NULL((void*)0), 0x0,
10086 "NMEA 0183 ROT Rate Of Turn, degrees per minute, negative value means bow turns to port", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10087 {&hf_nmea0183_rot_valid,
10088 {"Validity", "nmea0183.rot_valid",
10089 FT_STRING, BASE_NONE,
10090 NULL((void*)0), 0x0,
10091 "NMEA 0183 ROT Status, A means data is valid", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10092 {&hf_nmea0183_rpm_number,
10093 {"Engine or Shaft Number (from centerline)", "nmea0183.rpm.number",
10094 FT_CHAR, BASE_NONE,
10095 VALS(revolutions_number_vals)((0 ? (const struct _value_string*)0 : ((revolutions_number_vals
))))
, 0x0,
10096 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10097 {&hf_nmea0183_rpm_pitch,
10098 {"Propeller Pitch (% of max)", "nmea0183.rpm.pitch",
10099 FT_STRING, BASE_NONE,
10100 NULL((void*)0), 0x0,
10101 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10102 {&hf_nmea0183_rpm_source,
10103 {"Source", "nmea0183.rpm.source",
10104 FT_CHAR, BASE_NONE,
10105 VALS(revolutions_source_vals)((0 ? (const struct _value_string*)0 : ((revolutions_source_vals
))))
, 0x0,
10106 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10107 {&hf_nmea0183_rpm_speed,
10108 {"Speed (rev/min)", "nmea0183.rpm.speed",
10109 FT_STRING, BASE_NONE,
10110 NULL((void*)0), 0x0,
10111 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10112 {&hf_nmea0183_rpm_status,
10113 {"Data Status", "nmea0183.rpm.status",
10114 FT_CHAR, BASE_NONE,
10115 VALS(data_status)((0 ? (const struct _value_string*)0 : ((data_status)))), 0x0,
10116 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10117 {&hf_nmea0183_rsa_pt_sensor,
10118 {"Port Rudder Sensor", "nmea0183.rsa.pt",
10119 FT_STRING, BASE_NONE,
10120 NULL((void*)0), 0x0,
10121 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10122 {&hf_nmea0183_rsa_pt_status,
10123 {"Data Status", "nmea0183.rsa.pt_status",
10124 FT_CHAR, BASE_NONE,
10125 VALS(data_status)((0 ? (const struct _value_string*)0 : ((data_status)))), 0x0,
10126 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10127 {&hf_nmea0183_rsa_sb_sensor,
10128 {"Starboard (or single) Rudder Sensor", "nmea0183.rsa.sb",
10129 FT_STRING, BASE_NONE,
10130 NULL((void*)0), 0x0,
10131 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10132 {&hf_nmea0183_rsa_sb_status,
10133 {"Data Status", "nmea0183.rsa.sb_status",
10134 FT_CHAR, BASE_NONE,
10135 VALS(data_status)((0 ? (const struct _value_string*)0 : ((data_status)))), 0x0,
10136 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10137 {&hf_nmea0183_rsd_cursor_bearing,
10138 {"Cursor Bearing (degrees clockwise from 0)", "nmea0183.rsd.curs_scale",
10139 FT_STRING, BASE_NONE,
10140 NULL((void*)0), 0x0,
10141 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10142 {&hf_nmea0183_rsd_cursor_range,
10143 {"Cursor Range, from own ship", "nmea0183.rsd.curs_range",
10144 FT_STRING, BASE_NONE,
10145 NULL((void*)0), 0x0,
10146 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10147 {&hf_nmea0183_rsd_display,
10148 {"Display Rotation", "nmea0183.rsd.display",
10149 FT_CHAR, BASE_NONE,
10150 VALS(display_rotation_vals)((0 ? (const struct _value_string*)0 : ((display_rotation_vals
))))
, 0x0,
10151 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10152 {&hf_nmea0183_rsd_ebl1,
10153 {"Bearing Line 1 (EBL1) (degrees from 0)", "nmea0183.rsd.ebl1",
10154 FT_STRING, BASE_NONE,
10155 NULL((void*)0), 0x0,
10156 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10157 {&hf_nmea0183_rsd_ebl2,
10158 {"EBL2 (degrees)", "nmea0183.rsd.ebl2",
10159 FT_STRING, BASE_NONE,
10160 NULL((void*)0), 0x0,
10161 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10162 {&hf_nmea0183_rsd_orig2_range,
10163 {"Origin 2 Bearing (degrees from 0)", "nmea0183.rsd.orig2_range",
10164 FT_STRING, BASE_NONE,
10165 NULL((void*)0), 0x0,
10166 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10167 {&hf_nmea0183_rsd_orig_bearing,
10168 {"Origin 1 Bearing (degrees from 0)", "nmea0183.rsd.orig_bearing",
10169 FT_STRING, BASE_NONE,
10170 NULL((void*)0), 0x0,
10171 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10172 {&hf_nmea0183_rsd_orig_range,
10173 {"Origin 1 Range, from own ship", "nmea0183.rsd.orig_range",
10174 FT_STRING, BASE_NONE,
10175 NULL((void*)0), 0x0,
10176 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10177 {&hf_nmea0183_rsd_scale,
10178 {"Range Scale in use", "nmea0183.rsd.scale",
10179 FT_STRING, BASE_NONE,
10180 NULL((void*)0), 0x0,
10181 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10182 {&hf_nmea0183_rsd_units,
10183 {"Range Units", "nmea0183.rsd.units",
10184 FT_CHAR, BASE_NONE,
10185 VALS(speed_unit_vals)((0 ? (const struct _value_string*)0 : ((speed_unit_vals)))), 0x0,
10186 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10187 {&hf_nmea0183_rsd_vrm1,
10188 {"Variable Range Marker 1 (VRM1)", "nmea0183.rsd.vrm1",
10189 FT_STRING, BASE_NONE,
10190 NULL((void*)0), 0x0,
10191 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10192 {&hf_nmea0183_rsd_vrm2,
10193 {"VRM2", "nmea0183.rsd.vrm2",
10194 FT_STRING, BASE_NONE,
10195 NULL((void*)0), 0x0,
10196 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10197 {&hf_nmea0183_rte_route,
10198 {"Route Identifier", "nmea0183.rte.route",
10199 FT_STRING, BASE_NONE,
10200 NULL((void*)0), 0x0,
10201 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10202 {&hf_nmea0183_rte_sentence_mode,
10203 {"Sentence Mode", "nmea0183.rte.mode",
10204 FT_CHAR, BASE_NONE,
10205 VALS(sentence_mode_vals)((0 ? (const struct _value_string*)0 : ((sentence_mode_vals))
))
, 0x0,
10206 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10207 {&hf_nmea0183_rte_sentence_number,
10208 {"Sentence Number", "nmea0183.rte.sent_number",
10209 FT_STRING, BASE_NONE,
10210 NULL((void*)0), 0x0,
10211 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10212 {&hf_nmea0183_rte_total_sentences,
10213 {"Total Number of Sentences", "nmea0183.rte.num_sentences",
10214 FT_STRING, BASE_NONE,
10215 NULL((void*)0), 0x0,
10216 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10217 {&hf_nmea0183_rte_waypoint,
10218 {"Waypoint Identifier", "nmea0183.rte.waypoint",
10219 FT_STRING, BASE_NONE,
10220 NULL((void*)0), 0x0,
10221 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10222 { &hf_nmea0183_sentence_prefix,
10223 { "Sentence prefix", "nmea0183.sentence_prefix",
10224 FT_STRING, BASE_NONE,
10225 NULL((void*)0), 0x0,
10226 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
10227 {&hf_nmea0183_sfi_frequency,
10228 {"Frequency/ITU Channel (100 Hz increments)", "nmea0183.sfi.freq",
10229 FT_STRING, BASE_NONE,
10230 NULL((void*)0), 0x0,
10231 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10232 {&hf_nmea0183_sfi_mode,
10233 {"Mode of Operation", "nmea0183.sfi.mode",
10234 FT_CHAR, BASE_NONE,
10235 VALS(sfi_operation_mode_vals)((0 ? (const struct _value_string*)0 : ((sfi_operation_mode_vals
))))
, 0x0,
10236 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10237 {&hf_nmea0183_sfi_sentence_number,
10238 {"Sentence Number", "nmea0183.sfi.sent_number",
10239 FT_STRING, BASE_NONE,
10240 NULL((void*)0), 0x0,
10241 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10242 {&hf_nmea0183_sfi_total_sentences,
10243 {"Total Number of Sentences", "nmea0183.sfi.num_sentences",
10244 FT_STRING, BASE_NONE,
10245 NULL((void*)0), 0x0,
10246 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10247 {&hf_nmea0183_ssd_callsign,
10248 {"Ship's Call Sign", "nmea0183.ssd.callsign",
10249 FT_STRING, BASE_NONE,
10250 NULL((void*)0), 0x0,
10251 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10252 {&hf_nmea0183_ssd_dte_flag,
10253 {"DTE Indicator Flag", "nmea0183.ssd.dte",
10254 FT_CHAR, BASE_NONE,
10255 VALS(dte_indicator_vals)((0 ? (const struct _value_string*)0 : ((dte_indicator_vals))
))
, 0x0,
10256 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10257 {&hf_nmea0183_ssd_name,
10258 {"Ship's Name", "nmea0183.ssd.name",
10259 FT_STRING, BASE_NONE,
10260 NULL((void*)0), 0x0,
10261 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10262 {&hf_nmea0183_ssd_ref_a,
10263 {"Pos. Ref. Point distance 'A' (from bow)", "nmea0183.ssd.ref_a",
10264 FT_STRING, BASE_NONE,
10265 NULL((void*)0), 0x0,
10266 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10267 {&hf_nmea0183_ssd_ref_b,
10268 {"Pos. Ref. Point distance 'B' (from stern)", "nmea0183.ssd.ref_b",
10269 FT_STRING, BASE_NONE,
10270 NULL((void*)0), 0x0,
10271 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10272 {&hf_nmea0183_ssd_ref_c,
10273 {"Pos. Ref. Point distance 'C' (from port beam)", "nmea0183.ssd.ref_c",
10274 FT_STRING, BASE_NONE,
10275 NULL((void*)0), 0x0,
10276 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10277 {&hf_nmea0183_ssd_ref_d,
10278 {"Pos. Ref. Point distance 'D' (from starboard beam)", "nmea0183.ssd.ref_d",
10279 FT_STRING, BASE_NONE,
10280 NULL((void*)0), 0x0,
10281 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10282 {&hf_nmea0183_ssd_source,
10283 {"Talker ID Number", "nmea0183.ssd.source",
10284 FT_STRING, BASE_NONE,
10285 NULL((void*)0), 0x0,
10286 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10287 {&hf_nmea0183_stn_talker,
10288 {"Talker ID Number", "nmea0183.stn.talker",
10289 FT_STRING, BASE_NONE,
10290 NULL((void*)0), 0x0,
10291 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10292 { &hf_nmea0183_tag_block,
10293 { "Tag block", "nmea0183.tag_block",
10294 FT_STRING, BASE_NONE,
10295 NULL((void*)0), 0x0,
10296 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
10297 {&hf_nmea0183_tlb_label,
10298 {"Label Assigned to Target", "nmea0183.tlb.label",
10299 FT_STRING, BASE_NONE,
10300 NULL((void*)0), 0x0,
10301 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10302 {&hf_nmea0183_tlb_target,
10303 {"Target Number", "nmea0183.tlb.tgt_num",
10304 FT_STRING, BASE_NONE,
10305 NULL((void*)0), 0x0,
10306 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10307 {&hf_nmea0183_tll_ref_tgt,
10308 {"Reference Target", "nmea0183.tll.ref",
10309 FT_CHAR, BASE_NONE,
10310 VALS(ref_target_vals)((0 ? (const struct _value_string*)0 : ((ref_target_vals)))), 0x0,
10311 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10312 {&hf_nmea0183_tll_tgt_latitude,
10313 {"Target Latitude", "nmea0183.tll.latitude",
10314 FT_FLOAT, BASE_NONE,
10315 NULL((void*)0), 0x0,
10316 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10317 {&hf_nmea0183_tll_tgt_longitude,
10318 {"Target Longitude", "nmea0183.tll.longitude",
10319 FT_FLOAT, BASE_NONE,
10320 NULL((void*)0), 0x0,
10321 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10322 {&hf_nmea0183_tll_tgt_name,
10323 {"Target Name", "nmea0183.tll.tgt_name",
10324 FT_STRING, BASE_NONE,
10325 NULL((void*)0), 0x0,
10326 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10327 {&hf_nmea0183_tll_utc,
10328 {"UTC of Data","nmea0183.tll.utc",
10329 FT_STRING, BASE_NONE,
10330 NULL((void*)0), 0x0,
10331 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10332 {&hf_nmea0183_tll_tgt_num,
10333 {"Target Number", "nmea0183.tll.tgt_num",
10334 FT_STRING, BASE_NONE,
10335 NULL((void*)0), 0x0,
10336 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10337 {&hf_nmea0183_tll_tgt_status,
10338 {"Target Status", "nmea0183.tll.status",
10339 FT_CHAR, BASE_NONE,
10340 VALS(tgt_status_vals)((0 ? (const struct _value_string*)0 : ((tgt_status_vals)))), 0x0,
10341 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10342 {&hf_nmea0183_ttm_acq_type,
10343 {"Type of Acquisition", "nmea0183.ttm.acq",
10344 FT_CHAR, BASE_NONE,
10345 VALS(target_acq_vals)((0 ? (const struct _value_string*)0 : ((target_acq_vals)))), 0x0,
10346 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10347 {&hf_nmea0183_ttm_bearing,
10348 {"Target Number", "nmea0183.ttm.bearing",
10349 FT_STRING, BASE_NONE,
10350 NULL((void*)0), 0x0,
10351 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10352 {&hf_nmea0183_ttm_dist_pt_approach,
10353 {"Target Number", "nmea0183.ttm.dist_approach",
10354 FT_STRING, BASE_NONE,
10355 NULL((void*)0), 0x0,
10356 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10357 {&hf_nmea0183_ttm_ref_tgt,
10358 {"Reference Target", "nmea0183.ttm.ref",
10359 FT_CHAR, BASE_NONE,
10360 VALS(ref_target_vals)((0 ? (const struct _value_string*)0 : ((ref_target_vals)))), 0x0,
10361 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10362 {&hf_nmea0183_ttm_tgt_course,
10363 {"Target Number", "nmea0183.ttm.tgt_course",
10364 FT_STRING, BASE_NONE,
10365 NULL((void*)0), 0x0,
10366 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10367 {&hf_nmea0183_ttm_tgt_dist,
10368 {"Target Number", "nmea0183.ttm.tgt_dist",
10369 FT_STRING, BASE_NONE,
10370 NULL((void*)0), 0x0,
10371 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10372 {&hf_nmea0183_ttm_tgt_name,
10373 {"Target Name", "nmea0183.ttm.tgt_name",
10374 FT_STRING, BASE_NONE,
10375 NULL((void*)0), 0x0,
10376 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10377 {&hf_nmea0183_ttm_tgt_num,
10378 {"Target Number", "nmea0183.ttm.tgt_num",
10379 FT_STRING, BASE_NONE,
10380 NULL((void*)0), 0x0,
10381 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10382 {&hf_nmea0183_ttm_tgt_speed,
10383 {"Target Number", "nmea0183.ttm.tgt_speed",
10384 FT_STRING, BASE_NONE,
10385 NULL((void*)0), 0x0,
10386 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10387 {&hf_nmea0183_ttm_tgt_status,
10388 {"Target Status", "nmea0183.ttm.status",
10389 FT_CHAR, BASE_NONE,
10390 VALS(tgt_status_vals)((0 ? (const struct _value_string*)0 : ((tgt_status_vals)))), 0x0,
10391 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10392 {&hf_nmea0183_ttm_time_cpa,
10393 {"Target Number", "nmea0183.ttm.cpa",
10394 FT_STRING, BASE_NONE,
10395 NULL((void*)0), 0x0,
10396 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10397 {&hf_nmea0183_ttm_units,
10398 {"Speed/Distance Units", "nmea0183.ttm.units",
10399 FT_CHAR, BASE_NONE,
10400 VALS(speed_unit_vals)((0 ? (const struct _value_string*)0 : ((speed_unit_vals)))), 0x0,
10401 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10402 {&hf_nmea0183_ttm_utc,
10403 {"UTC of Data", "nmea0183.ttm.utc",
10404 FT_STRING, BASE_NONE,
10405 NULL((void*)0), 0x0,
10406 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10407 {&hf_nmea0183_tut_sentence_num,
10408 {"Sentence Number", "nmea0183.tut.sent_number",
10409 FT_STRING, BASE_NONE,
10410 NULL((void*)0), 0x0,
10411 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10412 {&hf_nmea0183_tut_seq_msg,
10413 {"Sequential Message Identifier", "nmea0183.tut.seq_msg",
10414 FT_STRING, BASE_NONE,
10415 NULL((void*)0), 0x0,
10416 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10417 {&hf_nmea0183_tut_src_id,
10418 {"Source Identifier", "nmea0183.tut.source",
10419 FT_STRING, BASE_NONE,
10420 NULL((void*)0), 0x0,
10421 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10422 {&hf_nmea0183_tut_text,
10423 {"Text Body", "nmea0183.tut.text",
10424 FT_STRING, BASE_NONE,
10425 NULL((void*)0), 0x0,
10426 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10427 {&hf_nmea0183_tut_total_sentences,
10428 {"Total Number of Sentences", "nmea0183.tut.tot_sentences",
10429 FT_STRING, BASE_NONE,
10430 NULL((void*)0), 0x0,
10431 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10432 {&hf_nmea0183_tut_trans_code,
10433 {"Translation Code for Text Body", "nmea0183.tut.trans_code",
10434 FT_STRING, BASE_NONE,
10435 NULL((void*)0), 0x0,
10436 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10437 { &hf_nmea0183_txt_id,
10438 {"Text identifier", "nmea0183.txt.id",
10439 FT_STRING, BASE_NONE,
10440 NULL((void*)0), 0x0,
10441 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)} },
10442 { &hf_nmea0183_txt_msg,
10443 {"Text message", "nmea0183.txt.msg",
10444 FT_STRING, BASE_NONE,
10445 NULL((void*)0), 0x0,
10446 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)} },
10447 { &hf_nmea0183_txt_num,
10448 {"Total number of sentences", "nmea0183.txt.num",
10449 FT_STRING, BASE_NONE,
10450 NULL((void*)0), 0x0,
10451 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)} },
10452 { &hf_nmea0183_txt_sent_num,
10453 {"Sentence number", "nmea0183.txt.sent_num",
10454 FT_STRING, BASE_NONE,
10455 NULL((void*)0), 0x0,
10456 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)} },
10457 {&hf_nmea0183_vbw_ground_speed_longitudinal,
10458 {"Longitudinal ground speed", "nmea0183.vbw_ground_speed_longitudinal",
10459 FT_STRING, BASE_NONE,
10460 NULL((void*)0), 0x0,
10461 "NMEA 0183 VBW Longitudinal ground speed, negative value means astern, knots", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10462 {&hf_nmea0183_vbw_ground_speed_transverse,
10463 {"Transverse ground speed", "nmea0183.vbw_ground_speed_transverse",
10464 FT_STRING, BASE_NONE,
10465 NULL((void*)0), 0x0,
10466 "NMEA 0183 VBW Transverse ground speed, negative value means port, knots", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10467 {&hf_nmea0183_vbw_ground_speed_valid,
10468 {"Ground speed validity", "nmea0183.vbw_ground_speed_valid",
10469 FT_STRING, BASE_NONE,
10470 NULL((void*)0), 0x0,
10471 "NMEA 0183 VBW Ground speed status, A means data is valid", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10472 {&hf_nmea0183_vbw_stern_ground_speed,
10473 {"Stern ground speed", "nmea0183.vbw_stern_ground_speed",
10474 FT_STRING, BASE_NONE,
10475 NULL((void*)0), 0x0,
10476 "NMEA 0183 VBW Stern traverse ground ground speed, negative value means port, knots", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10477 {&hf_nmea0183_vbw_stern_ground_speed_valid,
10478 {"Stern ground speed validity", "nmea0183.vbw_stern_ground_speed_valid",
10479 FT_STRING, BASE_NONE,
10480 NULL((void*)0), 0x0,
10481 "NMEA 0183 VBW Stern traverse ground speed status, A means data is valid", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10482 {&hf_nmea0183_vbw_stern_water_speed,
10483 {"Stern water speed", "nmea0183.vbw_stern_water_speed",
10484 FT_STRING, BASE_NONE,
10485 NULL((void*)0), 0x0,
10486 "NMEA 0183 VBW Stern traverse water ground speed, negative value means port, knots", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10487 {&hf_nmea0183_vbw_stern_water_speed_valid,
10488 {"Stern water speed validity", "nmea0183.vbw_stern_water_speed_valid",
10489 FT_STRING, BASE_NONE,
10490 NULL((void*)0), 0x0,
10491 "NMEA 0183 VBW Stern traverse water speed status, A means data is valid", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10492 {&hf_nmea0183_vbw_water_speed_longitudinal,
10493 {"Longitudinal water speed", "nmea0183.vbw_water_speed_longitudinal",
10494 FT_STRING, BASE_NONE,
10495 NULL((void*)0), 0x0,
10496 "NMEA 0183 VBW Longitudinal water speed, negative value means astern, knots", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10497 {&hf_nmea0183_vbw_water_speed_transverse,
10498 {"Transverse water speed", "nmea0183.vbw_water_speed_transverse",
10499 FT_STRING, BASE_NONE,
10500 NULL((void*)0), 0x0,
10501 "NMEA 0183 VBW Transverse water speed, negative value means port, knots", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10502 {&hf_nmea0183_vbw_water_speed_valid,
10503 {"Water speed validity", "nmea0183.vbw_water_speed_valid",
10504 FT_STRING, BASE_NONE,
10505 NULL((void*)0), 0x0,
10506 "NMEA 0183 VBW Water speed status, A means data is valid", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10507 {&hf_nmea0183_vdr_heading_magnetic,
10508 {"Direction (degrees Magnetic)", "nmea0183.vdr.magnetic",
10509 FT_STRING, BASE_NONE,
10510 NULL((void*)0), 0x0,
10511 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10512 {&hf_nmea0183_vdr_heading_true,
10513 {"Direction (degrees True)", "nmea0183.vdr.true",
10514 FT_STRING, BASE_NONE,
10515 NULL((void*)0), 0x0,
10516 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10517 {&hf_nmea0183_vdr_speed,
10518 {"Current Speed (knots)", "nmea0183.vdr.speed",
10519 FT_STRING, BASE_NONE,
10520 NULL((void*)0), 0x0,
10521 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10522 {&hf_nmea0183_vhw_magnetic_heading,
10523 {"Magnetic heading", "nmea0183.vhw_magnetic_heading",
10524 FT_STRING, BASE_NONE,
10525 NULL((void*)0), 0x0,
10526 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10527 {&hf_nmea0183_vhw_magnetic_heading_unit,
10528 {"Heading unit", "nmea0183.vhw_magnetic_heading_unit",
10529 FT_STRING, BASE_NONE,
10530 NULL((void*)0), 0x0,
10531 "NMEA 0183 VHW Heading unit, must be M", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10532 {&hf_nmea0183_vhw_true_heading,
10533 {"True heading", "nmea0183.vhw_true_heading",
10534 FT_STRING, BASE_NONE,
10535 NULL((void*)0), 0x0,
10536 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10537 {&hf_nmea0183_vhw_true_heading_unit,
10538 {"Heading unit", "nmea0183.vhw_true_heading_unit",
10539 FT_STRING, BASE_NONE,
10540 NULL((void*)0), 0x0,
10541 "NMEA 0183 VHW Heading unit, must be T", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10542 {&hf_nmea0183_vhw_water_speed_kilometer,
10543 {"Water speed", "nmea0183.vhw_water_speed_kilometer",
10544 FT_STRING, BASE_NONE,
10545 NULL((void*)0), 0x0,
10546 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10547 {&hf_nmea0183_vhw_water_speed_kilometer_unit,
10548 {"Speed unit", "nmea0183.vhw_water_speed_kilometer_unit",
10549 FT_STRING, BASE_NONE,
10550 NULL((void*)0), 0x0,
10551 "NMEA 0183 VHW Water speed unit, must be K", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10552 {&hf_nmea0183_vhw_water_speed_knot,
10553 {"Water speed", "nmea0183.vhw_water_speed_knot",
10554 FT_STRING, BASE_NONE,
10555 NULL((void*)0), 0x0,
10556 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10557 {&hf_nmea0183_vhw_water_speed_knot_unit,
10558 {"Speed unit", "nmea0183.vhw_water_speed_knot_unit",
10559 FT_STRING, BASE_NONE,
10560 NULL((void*)0), 0x0,
10561 "NMEA 0183 VHW Water speed unit, must be N", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10562 {&hf_nmea0183_vlw_cumulative_ground,
10563 {"Cumulative ground distance", "nmea0183.vlw_hf_nmea0183_vlw_cumulative_ground",
10564 FT_STRING, BASE_NONE,
10565 NULL((void*)0), 0x0,
10566 "NMEA 0183 VLW Total cumulative ground distance, nautical miles (NMEA 3 and above)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10567 {&hf_nmea0183_vlw_cumulative_ground_unit,
10568 {"Distance unit", "nmea0183.vlw_cumulative_ground_unit",
10569 FT_STRING, BASE_NONE,
10570 NULL((void*)0), 0x0,
10571 "NMEA 0183 VLW Distance unit, must be N", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10572 {&hf_nmea0183_vlw_cumulative_water,
10573 {"Cumulative water distance", "nmea0183.vlw_hf_nmea0183_vlw_cumulative_water",
10574 FT_STRING, BASE_NONE,
10575 NULL((void*)0), 0x0,
10576 "NMEA 0183 VLW Total cumulative water distance, nautical miles", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10577 {&hf_nmea0183_vlw_cumulative_water_unit,
10578 {"Distance unit", "nmea0183.vlw_cumulative_water_unit",
10579 FT_STRING, BASE_NONE,
10580 NULL((void*)0), 0x0,
10581 "NMEA 0183 VLW Distance unit, must be N", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10582 {&hf_nmea0183_vlw_trip_ground,
10583 {"Trip ground distance", "nmea0183.vlw_hf_nmea0183_vlw_trip_ground",
10584 FT_STRING, BASE_NONE,
10585 NULL((void*)0), 0x0,
10586 "NMEA 0183 VLW Ground distance since Reset, nautical miles (NMEA 3 and above)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10587 {&hf_nmea0183_vlw_trip_ground_unit,
10588 {"Distance unit", "nmea0183.vlw_trip_ground_unit",
10589 FT_STRING, BASE_NONE,
10590 NULL((void*)0), 0x0,
10591 "NMEA 0183 VLW Distance unit, must be N", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10592 {&hf_nmea0183_vlw_trip_water,
10593 {"Trip water distance", "nmea0183.vlw_hf_nmea0183_vlw_trip_water",
10594 FT_STRING, BASE_NONE,
10595 NULL((void*)0), 0x0,
10596 "NMEA 0183 VLW Water distance since Reset, nautical miles", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10597 {&hf_nmea0183_vlw_trip_water_unit,
10598 {"Distance unit", "nmea0183.vlw_trip_water_unit",
10599 FT_STRING, BASE_NONE,
10600 NULL((void*)0), 0x0,
10601 "NMEA 0183 VLW Distance unit, must be N", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10602 {&hf_nmea0183_vpw_speed_knots,
10603 {"Speed (knots)", "nmea0183.vpw.knots",
10604 FT_STRING, BASE_NONE,
10605 NULL((void*)0), 0x0,
10606 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10607 {&hf_nmea0183_vpw_speed_ms,
10608 {"Speed (meters/second)", "nmea0183.vpw.ms",
10609 FT_STRING, BASE_NONE,
10610 NULL((void*)0), 0x0,
10611 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10612 {&hf_nmea0183_vsd_app_flags,
10613 {"Regional Application Flags", "nmea0183.vsd.app_flags",
10614 FT_STRING, BASE_NONE,
10615 NULL((void*)0), 0x0,
10616 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10617 {&hf_nmea0183_vsd_day_arrival,
10618 {"Estimated Day of Arrival at Destination", "nmea0183.vsd.arrival_day",
10619 FT_STRING, BASE_NONE,
10620 NULL((void*)0), 0x0,
10621 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10622 {&hf_nmea0183_vsd_destination,
10623 {"Destination", "nmea0183.vsd.dest",
10624 FT_STRING, BASE_NONE,
10625 NULL((void*)0), 0x0,
10626 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10627 {&hf_nmea0183_vsd_max_draught,
10628 {"Maximum Present Static Draught (m)", "nmea0183.vsd.draft",
10629 FT_STRING, BASE_NONE,
10630 NULL((void*)0), 0x0,
10631 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10632 {&hf_nmea0183_vsd_month_arrival,
10633 {"Estimated Month of Arrival at Destination", "nmea0183.vsd.arrival_month",
10634 FT_STRING, BASE_NONE,
10635 NULL((void*)0), 0x0,
10636 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10637 {&hf_nmea0183_vsd_nav_status,
10638 {"Navigational Status", "nmea0183.vsd.nav_status",
10639 FT_STRING, BASE_NONE,
10640 NULL((void*)0), 0x0,
10641 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10642 {&hf_nmea0183_vsd_persons,
10643 {"Persons On-board", "nmea0183.vsd.persons",
10644 FT_STRING, BASE_NONE,
10645 NULL((void*)0), 0x0,
10646 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10647 {&hf_nmea0183_vsd_ship_cargo,
10648 {"Type of Ship & Cargo Category", "nmea0183.vsd.ship_cargo",
10649 FT_STRING, BASE_NONE,
10650 NULL((void*)0), 0x0,
10651 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10652 {&hf_nmea0183_vsd_utc_arrival,
10653 {"Estimated UTC of Arrival at Destination", "nmea0183.vsd.arrival_utc",
10654 FT_STRING, BASE_NONE,
10655 NULL((void*)0), 0x0,
10656 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10657 {&hf_nmea0183_vtg_ground_speed_kilometer,
10658 {"Speed over ground", "nmea0183.vtg_ground_speed_kilometer",
10659 FT_STRING, BASE_NONE,
10660 NULL((void*)0), 0x0,
10661 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10662 {&hf_nmea0183_vtg_ground_speed_kilometer_unit,
10663 {"Speed unit", "nmea0183.vtg_ground_speed_kilometer_unit",
10664 FT_STRING, BASE_NONE,
10665 NULL((void*)0), 0x0,
10666 "NMEA 0183 VTG Ground speed unit, must be K", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10667 {&hf_nmea0183_vtg_ground_speed_knot,
10668 {"Speed over ground", "nmea0183.vtg_ground_speed_knot",
10669 FT_STRING, BASE_NONE,
10670 NULL((void*)0), 0x0,
10671 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10672 {&hf_nmea0183_vtg_ground_speed_knot_unit,
10673 {"Speed unit", "nmea0183.vtg_ground_speed_knot_unit",
10674 FT_STRING, BASE_NONE,
10675 NULL((void*)0), 0x0,
10676 "NMEA 0183 VTG Ground speed unit, must be N", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10677 {&hf_nmea0183_vtg_magnetic_course,
10678 {"Magnetic course over ground", "nmea0183.vtg_magnetic_course",
10679 FT_STRING, BASE_NONE,
10680 NULL((void*)0), 0x0,
10681 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10682 {&hf_nmea0183_vtg_magnetic_course_unit,
10683 {"Course unit", "nmea0183.vtg_magnetic_course_unit",
10684 FT_STRING, BASE_NONE,
10685 NULL((void*)0), 0x0,
10686 "NMEA 0183 VTG Course unit, must be M", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10687 {&hf_nmea0183_vtg_mode,
10688 {"FAA mode", "nmea0183.vtg_mode",
10689 FT_STRING, BASE_NONE,
10690 NULL((void*)0), 0x0,
10691 "NMEA 0183 VTG FAA mode indicator (NMEA 2.3 and later)", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10692 {&hf_nmea0183_vtg_true_course,
10693 {"True course over ground", "nmea0183.vtg_true_course",
10694 FT_STRING, BASE_NONE,
10695 NULL((void*)0), 0x0,
10696 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10697 {&hf_nmea0183_vtg_true_course_unit,
10698 {"Course unit", "nmea0183.vtg_true_course_unit",
10699 FT_STRING, BASE_NONE,
10700 NULL((void*)0), 0x0,
10701 "NMEA 0183 VTG Course unit, must be T", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10702 {&hf_nmea0183_wcv_mode,
10703 {"Mode Indicator", "nmea0183.wcv.mode",
10704 FT_CHAR, BASE_NONE,
10705 VALS(mode_indicator)((0 ? (const struct _value_string*)0 : ((mode_indicator)))), 0x0,
10706 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10707 {&hf_nmea0183_wcv_velocity,
10708 {"Velocity (knots)", "nmea0183.wcv.velocity",
10709 FT_STRING, BASE_NONE,
10710 NULL((void*)0), 0x0,
10711 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10712 {&hf_nmea0183_wcv_waypoint,
10713 {"Waypoint Identifier", "nmea0183.wcv.waypoint",
10714 FT_STRING, BASE_NONE,
10715 NULL((void*)0), 0x0,
10716 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10717 {&hf_nmea0183_wnc_dist_km,
10718 {"Distance (km)", "nmea0183.wnc.dist_km",
10719 FT_STRING, BASE_NONE,
10720 NULL((void*)0), 0x0,
10721 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10722 {&hf_nmea0183_wnc_dist_nm,
10723 {"Distance (nm)", "nmea0183.wnc.dist_nm",
10724 FT_STRING, BASE_NONE,
10725 NULL((void*)0), 0x0,
10726 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10727 {&hf_nmea0183_wnc_from_id,
10728 {"'FROM' Waypoint ID", "nmea0183.wnc.from_waypoint",
10729 FT_STRING, BASE_NONE,
10730 NULL((void*)0), 0x0,
10731 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10732 {&hf_nmea0183_wnc_to_id,
10733 {"'TO' Waypoint ID", "nmea0183.wnc.to_waypoint",
10734 FT_STRING, BASE_NONE,
10735 NULL((void*)0), 0x0,
10736 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10737 {&hf_nmea0183_wpl_latitude,
10738 {"Waypoint Latitude", "nmea0183.wpl.latitude",
10739 FT_FLOAT, BASE_NONE,
10740 NULL((void*)0), 0x0,
10741 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10742 {&hf_nmea0183_wpl_longitude,
10743 {"Waypoint Longitude", "nmea0183.wpl.longitude",
10744 FT_FLOAT, BASE_NONE,
10745 NULL((void*)0), 0x0,
10746 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10747 {&hf_nmea0183_wpl_waypoint,
10748 {"Waypoint Identifier", "nmea0183.wpl.waypoint",
10749 FT_STRING, BASE_NONE,
10750 NULL((void*)0), 0x0,
10751 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10752 {&hf_nmea0183_xdr_data,
10753 {"Measurement Data", "nmea0183.xdr.data",
10754 FT_STRING, BASE_NONE,
10755 NULL((void*)0), 0x0,
10756 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10757 {&hf_nmea0183_xdr_id,
10758 {"Transducer ID", "nmea0183.xdr.id",
10759 FT_STRING, BASE_NONE,
10760 NULL((void*)0), 0x0,
10761 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10762 {&hf_nmea0183_xdr_type,
10763 {"Transducer Type", "nmea0183.xdr.type",
10764 FT_CHAR, BASE_NONE,
10765 VALS(transducer_type_vals)((0 ? (const struct _value_string*)0 : ((transducer_type_vals
))))
, 0x0,
10766 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10767 {&hf_nmea0183_xdr_units,
10768 {"Units of Measure", "nmea0183.xdr.units",
10769 FT_CHAR, BASE_NONE,
10770 VALS(transducer_unit_vals)((0 ? (const struct _value_string*)0 : ((transducer_unit_vals
))))
, 0x0,
10771 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10772 {&hf_nmea0183_xte_blinksnr_status,
10773 {"Data Status - Loran-C Blink/SNR Warning", "nmea0183.xte.blinksnr",
10774 FT_CHAR, BASE_NONE,
10775 VALS(loranc_blink_snr_warning_vals)((0 ? (const struct _value_string*)0 : ((loranc_blink_snr_warning_vals
))))
, 0x0,
10776 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10777 {&hf_nmea0183_xte_cycle_status,
10778 {"Data Status - Loran-C Cycle Lock Warning", "nmea0183.xte.cycle_lock",
10779 FT_CHAR, BASE_NONE,
10780 VALS(loranc_cycle_lock_warning_vals)((0 ? (const struct _value_string*)0 : ((loranc_cycle_lock_warning_vals
))))
, 0x0,
10781 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10782 {&hf_nmea0183_xte_magnitude,
10783 {"Magnitude of Cross-Track-Error (XTE)", "nmea0183.xte.magnitude",
10784 FT_STRING, BASE_NONE,
10785 NULL((void*)0), 0x0,
10786 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10787 {&hf_nmea0183_xte_direction,
10788 {"Direction to Steer (nm)", "nmea0183.xte.steer",
10789 FT_CHAR, BASE_NONE,
10790 VALS(steer_direction)((0 ? (const struct _value_string*)0 : ((steer_direction)))), 0x0,
10791 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10792 {&hf_nmea0183_xte_mode,
10793 {"Mode Indicator", "nmea0183.xte.mode",
10794 FT_CHAR, BASE_NONE,
10795 VALS(mode_indicator)((0 ? (const struct _value_string*)0 : ((mode_indicator)))), 0x0,
10796 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10797 {&hf_nmea0183_xtr_direction,
10798 {"Direction to Steer (nm)", "nmea0183.xtr.steer",
10799 FT_CHAR, BASE_NONE,
10800 VALS(steer_direction)((0 ? (const struct _value_string*)0 : ((steer_direction)))), 0x0,
10801 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10802 {&hf_nmea0183_xtr_magnitude,
10803 {"Magnitude of Cross-Track-Error (XTE)", "nmea0183.xtr.magnitude",
10804 FT_STRING, BASE_NONE,
10805 NULL((void*)0), 0x0,
10806 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10807 {&hf_nmea0183_zda_date_day,
10808 {"Day", "nmea0183.zda_date_day",
10809 FT_STRING, BASE_NONE,
10810 NULL((void*)0), 0x0,
10811 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10812 {&hf_nmea0183_zda_date_month,
10813 {"Month", "nmea0183.zda_date_month",
10814 FT_STRING, BASE_NONE,
10815 NULL((void*)0), 0x0,
10816 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10817 {&hf_nmea0183_zda_date_year,
10818 {"Year", "nmea0183.zda_date_year",
10819 FT_STRING, BASE_NONE,
10820 NULL((void*)0), 0x0,
10821 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10822 {&hf_nmea0183_zda_local_zone_hour,
10823 {"Local zone hour", "nmea0183.zda_local_zone_hour",
10824 FT_STRING, BASE_NONE,
10825 NULL((void*)0), 0x0,
10826 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10827 { &hf_nmea0183_zda_local_zone_minute,
10828 {"Local zone minute", "nmea0183.zda_local_zone_minute",
10829 FT_STRING, BASE_NONE,
10830 NULL((void*)0), 0x0,
10831 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10832 {&hf_nmea0183_zda_time,
10833 {"UTC Time", "nmea0183.zda_time",
10834 FT_NONE, BASE_NONE,
10835 NULL((void*)0), 0x0,
10836 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10837 {&hf_nmea0183_zda_time_hour,
10838 {"Hour", "nmea0183.zda_time_hour",
10839 FT_STRING, BASE_NONE,
10840 NULL((void*)0), 0x0,
10841 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10842 {&hf_nmea0183_zda_time_minute,
10843 {"Minute", "nmea0183.zda_time_minute",
10844 FT_STRING, BASE_NONE,
10845 NULL((void*)0), 0x0,
10846 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10847 {&hf_nmea0183_zda_time_second,
10848 {"Second", "nmea0183.zda_time_second",
10849 FT_STRING, BASE_NONE,
10850 NULL((void*)0), 0x0,
10851 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10852 {&hf_nmea0183_zdl_dist,
10853 {"Distance to point (nm)", "nmea0183.zdl.dist",
10854 FT_STRING, BASE_NONE,
10855 NULL((void*)0), 0x0,
10856 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10857 {&hf_nmea0183_zdl_time,
10858 {"Time to point (hours)", "nmea0183.zdl.time",
10859 FT_STRING, BASE_NONE,
10860 NULL((void*)0), 0x0,
10861 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10862 {&hf_nmea0183_zdl_type,
10863 {"Type of Point", "nmea0183.zdl.type",
10864 FT_CHAR, BASE_NONE,
10865 VALS(point_type_vals)((0 ? (const struct _value_string*)0 : ((point_type_vals)))), 0x0,
10866 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10867 {&hf_nmea0183_zfo_elapsed,
10868 {"Elapsed Time (hours)", "nmea0183.zfo.elapsed",
10869 FT_STRING, BASE_NONE,
10870 NULL((void*)0), 0x0,
10871 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10872 {&hf_nmea0183_zfo_origin,
10873 {"Origin Waypoint ID", "nmea0183.zfo.waypoint",
10874 FT_STRING, BASE_NONE,
10875 NULL((void*)0), 0x0,
10876 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10877 {&hf_nmea0183_zfo_utc,
10878 {"UTC of Observation", "nmea0183.zfo.utc",
10879 FT_STRING, BASE_NONE,
10880 NULL((void*)0), 0x0,
10881 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10882 {&hf_nmea0183_ztg_dest,
10883 {"Destination Waypoint ID", "nmea0183.ztg.waypoint",
10884 FT_STRING, BASE_NONE,
10885 NULL((void*)0), 0x0,
10886 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10887 {&hf_nmea0183_ztg_time_left,
10888 {"Time-to-go (hours)", "nmea0183.ztg.time_left",
10889 FT_STRING, BASE_NONE,
10890 NULL((void*)0), 0x0,
10891 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}},
10892 {&hf_nmea0183_ztg_utc,
10893 {"UTC of Observation", "nmea0183.ztg.utc",
10894 FT_STRING, BASE_NONE,
10895 NULL((void*)0), 0x0,
10896 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}}
10897};
10898
10899 /* Setup protocol subtree array */
10900 static int *ett[] = {
10901 &ett_nmea0183,
10902 &ett_nmea0183_checksum,
10903 &ett_nmea0183_sentence,
10904 &ett_nmea0183_zda_time,
10905 &ett_nmea0183_alr_time,
10906 &ett_nmea0183_gga_time,
10907 &ett_nmea0183_gga_latitude,
10908 &ett_nmea0183_gga_longitude,
10909 &ett_nmea0183_gll_time,
10910 &ett_nmea0183_gll_latitude,
10911 &ett_nmea0183_gll_longitude,
10912 &ett_nmea0183_gst_time,
10913 &ett_nmea0183_tag_block,
10914 &ett_nmea0183_fd,
10915 &ett_nmea0183_legacy_satellite_info
10916 };
10917
10918 static ei_register_info ei[] = {
10919 {&ei_nmea0183_invalid_first_character,
10920 {"nmea0183.invalid_first_character", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10921 "First character should be '$'", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10922 {&ei_nmea0183_missing_checksum_character,
10923 {"nmea0183.missing_checksum_character", PI_MALFORMED0x07000000, PI_ERROR0x00800000,
10924 "Missing begin of checksum character '*'", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10925 {&ei_nmea0183_invalid_end_of_line,
10926 {"nmea0183.invalid_end_of_line", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10927 "Sentence should end with <CR><LF>", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10928 {&ei_nmea0183_checksum_incorrect,
10929 {"nmea0183.checksum_incorrect", PI_CHECKSUM0x01000000, PI_WARN0x00600000,
10930 "Incorrect checksum", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10931 {&ei_nmea0183_sentence_too_long,
10932 {"nmea0183.sentence_too_long", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10933 "Sentence is too long. Maximum is 82 bytes including $ and <CR><LF>", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10934 {&ei_nmea0183_field_time_too_short,
10935 {"nmea0183.field_time_too_short", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10936 "Field containing time is too short. Field should be at least 6 characters", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10937 {&ei_nmea0183_field_latitude_too_short,
10938 {"nmea0183.field_latitude_too_short", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10939 "Field containing latitude is too short. Field should be at least 4 characters", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10940 {&ei_nmea0183_field_longitude_too_short,
10941 {"nmea0183.field_longitude_too_short", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10942 "Field containing longitude is too short. Field should be at least 5 characters", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10943 {&ei_nmea0183_field_missing,
10944 {"nmea0183.field_missing", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10945 "Field expected, but not found", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10946 {&ei_nmea0183_field_uint_invalid,
10947 {"nmea0183.field_uint_invalid", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10948 "Invalid unsigned integer", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10949 {&ei_nmea0183_sat_prn_invalid,
10950 {"nmea0183.sat_prn_invalid", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10951 "Invalid satellite PRN", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10952 {&ei_nmea0183_gga_altitude_unit_incorrect,
10953 {"nmea0183.gga_altitude_unit_incorrect", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10954 "Incorrect altitude unit (should be 'M')", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10955 {&ei_nmea0183_gga_geoidal_separation_unit_incorrect,
10956 {"nmea0183.gga_geoidal_separation_unit_incorrect", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10957 "Incorrect geoidal separation unit (should be 'M')", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10958 {&ei_nmea0183_hdt_unit_incorrect,
10959 {"nmea0183.hdt_unit_incorrect", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10960 "Incorrect heading unit (should be 'T')", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10961 {&ei_nmea0183_vhw_true_heading_unit_incorrect,
10962 {"nmea0183.vhw_true_heading_unit_incorrect", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10963 "Incorrect heading unit (should be 'T')", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10964 {&ei_nmea0183_vhw_magnetic_heading_unit_incorrect,
10965 {"nmea0183.vhw_magnetic_heading_unit_incorrect", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10966 "Incorrect heading unit (should be 'M')", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10967 {&ei_nmea0183_vhw_water_speed_knot_unit_incorrect,
10968 {"nmea0183.vhw_water_speed_knot_unit_incorrect", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10969 "Incorrect speed unit (should be 'N')", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10970 {&ei_nmea0183_vhw_water_speed_kilometer_unit_incorrect,
10971 {"nmea0183.vhw_water_speed_kilometer_unit_incorrect", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10972 "Incorrect speed unit (should be 'K')", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10973 {&ei_nmea0183_vlw_cumulative_water_unit_incorrect,
10974 {"nmea0183.vlw_cumulative_water_unit_incorrect", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10975 "Incorrect distance unit (should be 'N')", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10976 {&ei_nmea0183_vlw_trip_water_unit_incorrect,
10977 {"nmea0183.vlw_trip_water_unit_incorrect", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10978 "Incorrect distance unit (should be 'N')", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10979 {&ei_nmea0183_vlw_cumulative_ground_unit_incorrect,
10980 {"nmea0183.vlw_cumulative_ground_unit_incorrect", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10981 "Incorrect distance unit (should be 'N')", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10982 {&ei_nmea0183_vlw_trip_ground_unit_incorrect,
10983 {"nmea0183.vlw_trip_ground_unit_incorrect", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10984 "Incorrect distance unit (should be 'N')", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10985 {&ei_nmea0183_vtg_true_course_unit_incorrect,
10986 {"nmea0183.vtg_true_course_unit_incorrect", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10987 "Incorrect course unit (should be 'T')", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10988 {&ei_nmea0183_vtg_magnetic_course_unit_incorrect,
10989 {"nmea0183.vtg_magnetic_course_unit_incorrect", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10990 "Incorrect course unit (should be 'M')", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10991 {&ei_nmea0183_vtg_ground_speed_knot_unit_incorrect,
10992 {"nmea0183.vtg_ground_speed_knot_unit_incorrect", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10993 "Incorrect speed unit (should be 'N')", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10994 {&ei_nmea0183_vtg_ground_speed_kilometer_unit_incorrect,
10995 {"nmea0183.vtg_ground_speed_kilometer_unit_incorrect", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10996 "Incorrect speed unit (should be 'K')", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
10997 {&ei_nmea0183_legacy_nonstandard,
10998 {"nmea0183.legacy.nonstandard", PI_PROTOCOL0x09000000, PI_WARN0x00600000,
10999 "Non-standard field value", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
11000 {&ei_nmea0183_legacy_empty_response,
11001 {"nmea0183.legacy.empty_response", PI_RESPONSE_CODE0x03000000, PI_WARN0x00600000,
11002 "Empty response", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}}};
11003
11004 proto_nmea0183 = proto_register_protocol("NMEA 0183 protocol", "NMEA 0183", "nmea0183");
11005 proto_nmea0183_bin = proto_register_protocol("NMEA 0183 binary protocol", "NMEA 0183 BIN", "nmea0183_bin");
11006
11007 proto_register_field_array(proto_nmea0183, hf, array_length(hf)(sizeof (hf) / sizeof (hf)[0]));
11008 proto_register_subtree_array(ett, array_length(ett)(sizeof (ett) / sizeof (ett)[0]));
11009 expert_nmea0183 = expert_register_protocol(proto_nmea0183);
11010 expert_register_field_array(expert_nmea0183, ei, array_length(ei)(sizeof (ei) / sizeof (ei)[0]));
11011
11012 nmea0183_handle = register_dissector("nmea0183", dissect_nmea0183, proto_nmea0183);
11013}
11014
11015void proto_reg_handoff_nmea0183(void)
11016{
11017 /* Register the UDP PDU NMEA0183 handle for heuristic dissection */
11018 heur_dissector_add("udp", dissect_nmea0183_heur, "NMEA0183 over UDP",
11019 "nmea0183_udp", proto_nmea0183, HEURISTIC_DISABLE);
11020 dissector_add_for_decode_as_with_preference("udp.port", nmea0183_handle);
11021}