aboutsummaryrefslogtreecommitdiffstats
path: root/asn1/lpp
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2013-11-25 11:16:24 +0000
committerPascal Quantin <pascal.quantin@gmail.com>2013-11-25 11:16:24 +0000
commit17e16ae136cc15fbfe7e1eb29f1ee040a4ff959c (patch)
tree0971988ee890f288a583ae21c44700d9f6c19e81 /asn1/lpp
parent0757ccc5609b7aec11962ccf9c047aa86d7cc49f (diff)
Prettify LTE Positioning Protocol dissection
svn path=/trunk/; revision=53561
Diffstat (limited to 'asn1/lpp')
-rw-r--r--asn1/lpp/lpp.cnf1324
-rw-r--r--asn1/lpp/packet-lpp-template.c1301
2 files changed, 2586 insertions, 39 deletions
diff --git a/asn1/lpp/lpp.cnf b/asn1/lpp/lpp.cnf
index 77fb32d926..00c6be8d31 100644
--- a/asn1/lpp/lpp.cnf
+++ b/asn1/lpp/lpp.cnf
@@ -48,60 +48,28 @@ EllipsoidPointWithUncertaintyEllipse
Polygon
#.END
-#.FN_HDR LPP-Message
-
- proto_tree_add_item(tree, proto_lpp, tvb, 0, -1, ENC_NA);
-
- col_append_sep_str(actx->pinfo->cinfo, COL_PROTOCOL, "/", "LPP");
-#.END
-
-# Handle 64 bit constraint
-#.FN_PARS NavModelCNAV-KeplerianSet/cnavMo FN_VARIANT = _64b
-#.TYPE_ATTR
-NavModelCNAV-KeplerianSet/cnavMo TYPE = FT_INT64
-#.FN_PARS NavModelCNAV-KeplerianSet/cnavE FN_VARIANT = _64b
-#.TYPE_ATTR
-NavModelCNAV-KeplerianSet/cnavE TYPE = FT_UINT64
-#.FN_PARS NavModelCNAV-KeplerianSet/cnavOmega FN_VARIANT = _64b
-#.TYPE_ATTR
-NavModelCNAV-KeplerianSet/cnavOmega TYPE = FT_INT64
-#.FN_PARS NavModelCNAV-KeplerianSet/cnavOMEGA0 FN_VARIANT = _64b
-#.TYPE_ATTR
-NavModelCNAV-KeplerianSet/cnavOMEGA0 TYPE = FT_INT64
-#.FN_PARS NavModelCNAV-KeplerianSet/cnavIo FN_VARIANT = _64b
-#.TYPE_ATTR
-NavModelCNAV-KeplerianSet/cnavIo TYPE = FT_INT64
-
#.FN_HDR RequestCapabilities
-
col_append_sep_str(actx->pinfo->cinfo, COL_INFO, NULL, "Request Capabilities");
#.FN_HDR ProvideCapabilities
-
col_append_sep_str(actx->pinfo->cinfo, COL_INFO, NULL, "Provide Capabilities");
#.FN_HDR RequestAssistanceData
-
col_append_sep_str(actx->pinfo->cinfo, COL_INFO, NULL, "Request Assistance Data");
#.FN_HDR ProvideAssistanceData
-
col_append_sep_str(actx->pinfo->cinfo, COL_INFO, NULL, "Provide Assistance Data");
#.FN_HDR RequestLocationInformation
-
col_append_sep_str(actx->pinfo->cinfo, COL_INFO, NULL, "Request Location Information");
#.FN_HDR ProvideLocationInformation
-
col_append_sep_str(actx->pinfo->cinfo, COL_INFO, NULL, "Provide Location Information");
#.FN_HDR Abort
-
col_append_sep_str(actx->pinfo->cinfo, COL_INFO, NULL, "Abort");
#.FN_HDR Error
-
col_append_sep_str(actx->pinfo->cinfo, COL_INFO, NULL, "Error");
#.FN_BODY EPDU-ID VAL_PTR = &lpp_epdu_id
@@ -124,3 +92,1295 @@ EPDU-ID STRINGS=VALS(lpp_ePDU_ID_vals)
}
lpp_epdu_id = -1;
+#.FN_BODY AccessTypes/accessTypes VAL_PTR = &accessTypes_tvb LEN_PTR = &len
+ tvbuff_t *accessTypes_tvb = NULL;
+ int len;
+
+%(DEFAULT_BODY)s
+ if(accessTypes_tvb){
+ proto_tree *subtree;
+
+ subtree = proto_item_add_subtree(actx->created_item, ett_lpp_bitmap);
+ if (len >= 1) {
+ proto_tree_add_item(subtree, hf_lpp_T_accessTypes_eutra, accessTypes_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 2) {
+ proto_tree_add_item(subtree, hf_lpp_T_accessTypes_utra, accessTypes_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 3) {
+ proto_tree_add_item(subtree, hf_lpp_T_accessTypes_gsm, accessTypes_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ }
+
+#.TYPE_ATTR
+Ellipsoid-Point/degreesLatitude DISPLAY=BASE_CUSTOM STRINGS=&lpp_degreesLatitude_fmt
+
+#.TYPE_ATTR
+Ellipsoid-Point/degreesLongitude DISPLAY=BASE_CUSTOM STRINGS=&lpp_degreesLongitude_fmt
+
+#.TYPE_ATTR
+Ellipsoid-PointWithUncertaintyCircle/degreesLatitude DISPLAY=BASE_CUSTOM STRINGS=&lpp_degreesLatitude_fmt
+
+#.TYPE_ATTR
+Ellipsoid-PointWithUncertaintyCircle/degreesLongitude DISPLAY=BASE_CUSTOM STRINGS=&lpp_degreesLongitude_fmt
+
+#.TYPE_ATTR
+Ellipsoid-PointWithUncertaintyCircle/uncertainty DISPLAY=BASE_CUSTOM STRINGS=&lpp_uncertainty_fmt
+
+#.TYPE_ATTR
+EllipsoidPointWithUncertaintyEllipse/degreesLatitude DISPLAY=BASE_CUSTOM STRINGS=&lpp_degreesLatitude_fmt
+
+#.TYPE_ATTR
+EllipsoidPointWithUncertaintyEllipse/degreesLongitude DISPLAY=BASE_CUSTOM STRINGS=&lpp_degreesLongitude_fmt
+
+#.TYPE_ATTR
+EllipsoidPointWithUncertaintyEllipse/uncertaintySemiMajor DISPLAY=BASE_CUSTOM STRINGS=&lpp_uncertainty_fmt
+
+#.TYPE_ATTR
+EllipsoidPointWithUncertaintyEllipse/uncertaintySemiMinor DISPLAY=BASE_CUSTOM STRINGS=&lpp_uncertainty_fmt
+
+#.TYPE_ATTR
+EllipsoidPointWithUncertaintyEllipse/orientationMajorAxis DISPLAY=BASE_CUSTOM STRINGS=&lpp_angle_fmt
+
+#.TYPE_ATTR
+EllipsoidPointWithUncertaintyEllipse/confidence DISPLAY=BASE_CUSTOM STRINGS=&lpp_confidence_fmt
+
+#.TYPE_ATTR
+EllipsoidPointWithAltitude/degreesLatitude DISPLAY=BASE_CUSTOM STRINGS=&lpp_degreesLatitude_fmt
+
+#.TYPE_ATTR
+EllipsoidPointWithAltitude/degreesLongitude DISPLAY=BASE_CUSTOM STRINGS=&lpp_degreesLongitude_fmt
+
+#.TYPE_ATTR
+EllipsoidPointWithAltitude/altitude DISPLAY=BASE_CUSTOM STRINGS=&lpp_altitude_fmt
+
+#.TYPE_ATTR
+EllipsoidPointWithAltitudeAndUncertaintyEllipsoid/degreesLatitude DISPLAY=BASE_CUSTOM STRINGS=&lpp_degreesLatitude_fmt
+
+#.TYPE_ATTR
+EllipsoidPointWithAltitudeAndUncertaintyEllipsoid/degreesLongitude DISPLAY=BASE_CUSTOM STRINGS=&lpp_degreesLongitude_fmt
+
+#.TYPE_ATTR
+EllipsoidPointWithAltitudeAndUncertaintyEllipsoid/altitude DISPLAY=BASE_CUSTOM STRINGS=&lpp_altitude_fmt
+
+#.TYPE_ATTR
+EllipsoidPointWithAltitudeAndUncertaintyEllipsoid/uncertaintySemiMajor DISPLAY=BASE_CUSTOM STRINGS=&lpp_uncertainty_fmt
+
+#.TYPE_ATTR
+EllipsoidPointWithAltitudeAndUncertaintyEllipsoid/uncertaintySemiMinor DISPLAY=BASE_CUSTOM STRINGS=&lpp_uncertainty_fmt
+
+#.TYPE_ATTR
+EllipsoidPointWithAltitudeAndUncertaintyEllipsoid/orientationMajorAxis DISPLAY=BASE_CUSTOM STRINGS=&lpp_angle_fmt
+
+#.TYPE_ATTR
+EllipsoidPointWithAltitudeAndUncertaintyEllipsoid/uncertaintyAltitude DISPLAY=BASE_CUSTOM STRINGS=&lpp_uncertaintyAltitude_fmt
+
+#.TYPE_ATTR
+EllipsoidPointWithAltitudeAndUncertaintyEllipsoid/confidence DISPLAY=BASE_CUSTOM STRINGS=&lpp_confidence_fmt
+
+#.TYPE_ATTR
+EllipsoidArc/degreesLatitude DISPLAY=BASE_CUSTOM STRINGS=&lpp_degreesLatitude_fmt
+
+#.TYPE_ATTR
+EllipsoidArc/degreesLongitude DISPLAY=BASE_CUSTOM STRINGS=&lpp_degreesLongitude_fmt
+
+#.TYPE_ATTR
+EllipsoidArc/innerRadius DISPLAY=BASE_CUSTOM STRINGS=&lpp_radius_fmt
+
+#.TYPE_ATTR
+EllipsoidArc/uncertaintyRadius DISPLAY=BASE_CUSTOM STRINGS=&lpp_uncertainty_fmt
+
+#.TYPE_ATTR
+EllipsoidArc/offsetAngle DISPLAY=BASE_CUSTOM STRINGS=&lpp_angle_fmt
+
+#.TYPE_ATTR
+EllipsoidArc/includedAngle DISPLAY=BASE_CUSTOM STRINGS=&lpp_angle_fmt
+
+#.TYPE_ATTR
+EllipsoidArc/confidence DISPLAY=BASE_CUSTOM STRINGS=&lpp_confidence_fmt
+
+#.FN_FTR HorizontalVelocity/bearing
+ proto_item_append_text(actx->created_item, " degrees");
+
+#.FN_FTR HorizontalVelocity/horizontalSpeed
+ proto_item_append_text(actx->created_item, " km/h");
+
+#.FN_FTR HorizontalVelocityWithUncertainty/bearing
+ proto_item_append_text(actx->created_item, " degrees");
+
+#.FN_FTR HorizontalVelocityWithUncertainty/horizontalSpeed
+ proto_item_append_text(actx->created_item, " km/h");
+
+#.FN_FTR HorizontalVelocityWithUncertainty/uncertaintySpeed
+ proto_item_append_text(actx->created_item, " km/h");
+
+#.FN_FTR HorizontalWithVerticalVelocityAndUncertainty/bearing
+ proto_item_append_text(actx->created_item, " degrees");
+
+#.FN_FTR HorizontalWithVerticalVelocityAndUncertainty/horizontalSpeed
+ proto_item_append_text(actx->created_item, " km/h");
+
+#.FN_FTR HorizontalWithVerticalVelocityAndUncertainty/verticalSpeed
+ proto_item_append_text(actx->created_item, " km/h");
+
+#.FN_FTR HorizontalWithVerticalVelocityAndUncertainty/horizontalUncertaintySpeed
+ proto_item_append_text(actx->created_item, " km/h");
+
+#.FN_FTR HorizontalWithVerticalVelocityAndUncertainty/verticalUncertaintySpeed
+ proto_item_append_text(actx->created_item, " km/h");
+
+#.TYPE_ATTR
+PolygonPoints/degreesLatitude DISPLAY=BASE_CUSTOM STRINGS=&lpp_degreesLatitude_fmt
+
+#.TYPE_ATTR
+PolygonPoints/degreesLongitude DISPLAY=BASE_CUSTOM STRINGS=&lpp_degreesLongitude_fmt
+
+#.FN_BODY PositioningModes/posModes VAL_PTR = &posModes_tvb LEN_PTR = &len
+ tvbuff_t *posModes_tvb = NULL;
+ int len;
+
+%(DEFAULT_BODY)s
+ if(posModes_tvb){
+ proto_tree *subtree;
+
+ subtree = proto_item_add_subtree(actx->created_item, ett_lpp_bitmap);
+ if (len >= 1) {
+ proto_tree_add_item(subtree, hf_lpp_T_posModes_standalone, posModes_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 2) {
+ proto_tree_add_item(subtree, hf_lpp_T_posModes_ue_based, posModes_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 3) {
+ proto_tree_add_item(subtree, hf_lpp_T_posModes_ue_assisted, posModes_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ }
+
+#.FN_BODY PeriodicalReportingCriteria/reportingInterval VAL_PTR=&index
+ guint32 index;
+ const gchar *interval[10] = {"", ": 1 s", ": 2 s", ": 4 s", ": 8 s", ": 10 s",
+ ": 16 s", ": 20 s", ": 32 s", ": 64 s"};
+
+%(DEFAULT_BODY)s
+
+#.FN_FTR PeriodicalReportingCriteria/reportingInterval
+ proto_item_append_text(actx->created_item, "%s", interval[index]);
+
+#.FN_BODY ReportingDuration VAL_PTR = &duration
+ guint32 duration;
+
+%(DEFAULT_BODY)s
+ proto_item_append_text(actx->created_item, " s");
+ if (duration == 0) {
+ proto_item_append_text(actx->created_item, " (infinite)");
+ }
+
+#.TYPE_ATTR
+HorizontalAccuracy/accuracy DISPLAY=BASE_CUSTOM STRINGS=&lpp_uncertainty_fmt
+
+#.TYPE_ATTR
+HorizontalAccuracy/confidence DISPLAY=BASE_CUSTOM STRINGS=&lpp_confidence_fmt
+
+#.TYPE_ATTR
+VerticalAccuracy/accuracy DISPLAY=BASE_CUSTOM STRINGS=&lpp_uncertainty_fmt
+
+#.TYPE_ATTR
+VerticalAccuracy/confidence DISPLAY=BASE_CUSTOM STRINGS=&lpp_confidence_fmt
+
+#.FN_FTR ResponseTime/time
+ proto_item_append_text(actx->created_item, " s");
+
+#.TYPE_ATTR
+OTDOA-NeighbourCellInfoElement/expectedRSTD DISPLAY=BASE_CUSTOM STRINGS=&lpp_expectedRSTD_fmt
+
+#.TYPE_ATTR
+OTDOA-NeighbourCellInfoElement/expectedRSTD-Uncertainty DISPLAY=BASE_CUSTOM STRINGS=&lpp_expectedRSTD_Uncertainty_fmt
+
+#.TYPE_ATTR
+NeighbourMeasurementElement/rstd DISPLAY=BASE_CUSTOM STRINGS=&lpp_rstd_fmt
+
+#.FN_BODY OTDOA-MeasQuality/error-Resolution VAL_PTR = &error_Resolution_tvb HF_INDEX=-1
+ tvbuff_t *error_Resolution_tvb = NULL;
+%(DEFAULT_BODY)s
+
+#.FN_FTR OTDOA-MeasQuality/error-Resolution
+ if (error_Resolution_tvb) {
+ actx->created_item = proto_tree_add_uint(tree, hf_index, error_Resolution_tvb, 0, 1, tvb_get_bits8(error_Resolution_tvb, 0, 2));
+ }
+
+#.TYPE_ATTR
+OTDOA-MeasQuality/error-Resolution TYPE=FT_UINT8 DISPLAY=BASE_DEC STRINGS=VALS(lpp_error_Resolution_vals)
+
+#.FN_BODY OTDOA-MeasQuality/error-Value VAL_PTR = &error_Value_tvb HF_INDEX=-1
+ tvbuff_t *error_Value_tvb = NULL;
+%(DEFAULT_BODY)s
+
+#.FN_FTR OTDOA-MeasQuality/error-Value
+ if (error_Value_tvb) {
+ actx->created_item = proto_tree_add_uint(tree, hf_index, error_Value_tvb, 0, 1, tvb_get_bits8(error_Value_tvb, 0, 5));
+ }
+
+#.TYPE_ATTR
+OTDOA-MeasQuality/error-Value TYPE=FT_UINT8 DISPLAY=BASE_DEC|BASE_EXT_STRING STRINGS=&lpp_error_Value_vals_ext
+
+#.FN_BODY OTDOA-MeasQuality/error-NumSamples VAL_PTR = &error_NumSamples_tvb HF_INDEX=-1
+ tvbuff_t *error_NumSamples_tvb = NULL;
+%(DEFAULT_BODY)s
+
+#.FN_FTR OTDOA-MeasQuality/error-NumSamples
+ if (error_NumSamples_tvb) {
+ actx->created_item = proto_tree_add_uint(tree, hf_index, error_NumSamples_tvb, 0, 1, tvb_get_bits8(error_NumSamples_tvb, 0, 3));
+ }
+
+#.TYPE_ATTR
+OTDOA-MeasQuality/error-NumSamples TYPE=FT_UINT8 DISPLAY=BASE_DEC STRINGS=VALS(lpp_error_NumSamples_vals)
+
+#.FN_BODY OTDOA-ProvideCapabilities/otdoa-Mode VAL_PTR = &otdoa_Mode_tvb LEN_PTR = &len
+ tvbuff_t *otdoa_Mode_tvb = NULL;
+ int len;
+
+%(DEFAULT_BODY)s
+ if(otdoa_Mode_tvb){
+ proto_tree *subtree;
+
+ subtree = proto_item_add_subtree(actx->created_item, ett_lpp_bitmap);
+ if (len >= 1) {
+ proto_tree_add_item(subtree, hf_lpp_T_otdoa_Mode_ue_assisted, otdoa_Mode_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ }
+
+#.TYPE_ATTR
+GNSS-ReferenceTime/referenceTimeUnc DISPLAY=BASE_CUSTOM STRINGS=&lpp_referenceTimeUnc_fmt
+
+#.TYPE_ATTR
+GNSS-ReferenceTimeForOneCell/referenceTimeUnc DISPLAY=BASE_CUSTOM STRINGS=&lpp_referenceTimeUnc_fmt
+
+#.FN_BODY GNSS-SystemTime/notificationOfLeapSecond VAL_PTR = &notificationOfLeapSecond_tvb HF_INDEX=-1
+ tvbuff_t *notificationOfLeapSecond_tvb = NULL;
+%(DEFAULT_BODY)s
+
+#.FN_FTR GNSS-SystemTime/notificationOfLeapSecond
+ if (notificationOfLeapSecond_tvb) {
+ actx->created_item = proto_tree_add_uint(tree, hf_index, notificationOfLeapSecond_tvb, 0, 1, tvb_get_bits8(notificationOfLeapSecond_tvb, 0, 2));
+ }
+
+#.TYPE_ATTR
+GNSS-SystemTime/notificationOfLeapSecond TYPE=FT_UINT8 DISPLAY=BASE_DEC STRINGS=VALS(lpp_kp_vals)
+
+#.TYPE_ATTR
+NetworkTime/fractionalSecondsFromFrameStructureStart DISPLAY=BASE_CUSTOM STRINGS=&lpp_fractionalSecondsFromFrameStructureStart_fmt
+
+#.TYPE_ATTR
+NetworkTime/frameDrift DISPLAY=BASE_CUSTOM STRINGS=&lpp_frameDrift_fmt
+
+#.FN_BODY KlobucharModelParameter/dataID VAL_PTR = &dataID_tvb HF_INDEX=-1
+ tvbuff_t *dataID_tvb = NULL;
+%(DEFAULT_BODY)s
+
+#.FN_FTR KlobucharModelParameter/dataID
+ if (dataID_tvb) {
+ actx->created_item = proto_tree_add_uint(tree, hf_index, dataID_tvb, 0, 1, tvb_get_bits8(dataID_tvb, 0, 2));
+ }
+
+#.TYPE_ATTR
+KlobucharModelParameter/dataID TYPE=FT_UINT8 DISPLAY=BASE_DEC STRINGS=VALS(lpp_dataID_vals)
+
+#.TYPE_ATTR
+KlobucharModelParameter/alfa0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_alpha0_fmt
+
+#.TYPE_ATTR
+KlobucharModelParameter/alfa1 DISPLAY=BASE_CUSTOM STRINGS=&lpp_alpha1_fmt
+
+#.TYPE_ATTR
+KlobucharModelParameter/alfa2 DISPLAY=BASE_CUSTOM STRINGS=&lpp_alpha2_3_fmt
+
+#.TYPE_ATTR
+KlobucharModelParameter/alfa3 DISPLAY=BASE_CUSTOM STRINGS=&lpp_alpha2_3_fmt
+
+#.TYPE_ATTR
+KlobucharModelParameter/beta0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_beta0_fmt
+
+#.TYPE_ATTR
+KlobucharModelParameter/beta1 DISPLAY=BASE_CUSTOM STRINGS=&lpp_beta1_fmt
+
+#.TYPE_ATTR
+KlobucharModelParameter/beta2 DISPLAY=BASE_CUSTOM STRINGS=&lpp_beta2_3_fmt
+
+#.TYPE_ATTR
+KlobucharModelParameter/beta3 DISPLAY=BASE_CUSTOM STRINGS=&lpp_beta2_3_fmt
+
+#.TYPE_ATTR
+NeQuickModelParameter/ai0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_ai0_fmt
+
+#.TYPE_ATTR
+NeQuickModelParameter/ai1 DISPLAY=BASE_CUSTOM STRINGS=&lpp_ai1_fmt
+
+#.TYPE_ATTR
+NeQuickModelParameter/ai2 DISPLAY=BASE_CUSTOM STRINGS=&lpp_ai2_fmt
+
+#.TYPE_ATTR
+GNSS-EarthOrientationParameters/teop DISPLAY=BASE_CUSTOM STRINGS=&lpp_teop_fmt
+
+#.TYPE_ATTR
+GNSS-EarthOrientationParameters/pmX DISPLAY=BASE_CUSTOM STRINGS=&lpp_pmX_Y_fmt
+
+#.TYPE_ATTR
+GNSS-EarthOrientationParameters/pmXdot DISPLAY=BASE_CUSTOM STRINGS=&lpp_pmX_Ydot_fmt
+
+#.TYPE_ATTR
+GNSS-EarthOrientationParameters/pmY DISPLAY=BASE_CUSTOM STRINGS=&lpp_pmX_Y_fmt
+
+#.TYPE_ATTR
+GNSS-EarthOrientationParameters/pmYdot DISPLAY=BASE_CUSTOM STRINGS=&lpp_pmX_Ydot_fmt
+
+#.TYPE_ATTR
+GNSS-EarthOrientationParameters/deltaUT1 DISPLAY=BASE_CUSTOM STRINGS=&lpp_deltaUT1_fmt
+
+#.TYPE_ATTR
+GNSS-EarthOrientationParameters/deltaUT1dot DISPLAY=BASE_CUSTOM STRINGS=&lpp_deltaUT1dot_fmt
+
+#.TYPE_ATTR
+GNSS-TimeModelElement/gnss-TimeModelRefTime DISPLAY=BASE_CUSTOM STRINGS=&lpp_gnss_TimeModelRefTime_fmt
+
+#.TYPE_ATTR
+GNSS-TimeModelElement/tA0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_tA0_fmt
+
+#.TYPE_ATTR
+GNSS-TimeModelElement/tA1 DISPLAY=BASE_CUSTOM STRINGS=&lpp_tA1_fmt
+
+#.TYPE_ATTR
+GNSS-TimeModelElement/tA2 DISPLAY=BASE_CUSTOM STRINGS=&lpp_tA2_fmt
+
+#.TYPE_ATTR
+GNSS-TimeModelElement/gnss-TO-ID STRINGS=VALS(lpp_gnss_TO_ID_vals)
+
+#.FN_FTR GNSS-TimeModelElement/deltaT
+ proto_item_append_text(actx->created_item, " s");
+
+#.FN_FTR GNSS-DifferentialCorrections/dgnss-RefTime
+ proto_item_append_text(actx->created_item, " s");
+
+#.TYPE_ATTR
+DGNSS-SgnTypeElement/gnss-StatusHealth STRINGS=VALS(lpp_gnss_StatusHealth_vals)
+
+#.TYPE_ATTR
+DGNSS-CorrectionsElement/udre STRINGS=VALS(lpp_udre_vals)
+
+#.TYPE_ATTR
+DGNSS-CorrectionsElement/pseudoRangeCor DISPLAY=BASE_CUSTOM STRINGS=&lpp_pseudoRangeCor_fmt
+
+#.TYPE_ATTR
+DGNSS-CorrectionsElement/rangeRateCor DISPLAY=BASE_CUSTOM STRINGS=&lpp_rangeRateCor_fmt
+
+#.TYPE_ATTR
+DGNSS-CorrectionsElement/udreGrowthRate STRINGS=VALS(lpp_udreGrowthRate_vals)
+
+#.TYPE_ATTR
+DGNSS-CorrectionsElement/udreValidityTime STRINGS=VALS(lpp_udreValidityTime_vals)
+
+#.TYPE_ATTR
+StandardClockModelElement/stanClockToc DISPLAY=BASE_CUSTOM STRINGS=&lpp_stanClockToc_fmt
+
+#.TYPE_ATTR
+StandardClockModelElement/stanClockAF2 DISPLAY=BASE_CUSTOM STRINGS=&lpp_stanClockAF2_fmt
+
+#.TYPE_ATTR
+StandardClockModelElement/stanClockAF1 DISPLAY=BASE_CUSTOM STRINGS=&lpp_stanClockAF1_fmt
+
+#.TYPE_ATTR
+StandardClockModelElement/stanClockAF0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_stanClockAF0_fmt
+
+#.TYPE_ATTR
+StandardClockModelElement/stanClockTgd DISPLAY=BASE_CUSTOM STRINGS=&lpp_stanClockTgd_fmt
+
+#.TYPE_ATTR
+StandardClockModelElement/stanModelID STRINGS=VALS(lpp_stanModelID_vals)
+
+#.TYPE_ATTR
+NAV-ClockModel/navToc DISPLAY=BASE_CUSTOM STRINGS=&lpp_navToc_fmt
+
+#.TYPE_ATTR
+NAV-ClockModel/navaf2 DISPLAY=BASE_CUSTOM STRINGS=&lpp_navaf2_fmt
+
+#.TYPE_ATTR
+NAV-ClockModel/navaf1 DISPLAY=BASE_CUSTOM STRINGS=&lpp_navaf1_fmt
+
+#.TYPE_ATTR
+NAV-ClockModel/navaf0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_navaf0_navTgd_fmt
+
+#.TYPE_ATTR
+NAV-ClockModel/navTgd DISPLAY=BASE_CUSTOM STRINGS=&lpp_navaf0_navTgd_fmt
+
+#.TYPE_ATTR
+CNAV-ClockModel/cnavToc DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavToc_cnavTop_fmt
+
+#.TYPE_ATTR
+CNAV-ClockModel/cnavTop DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavToc_cnavTop_fmt
+
+#.TYPE_ATTR
+CNAV-ClockModel/cnavAf2 DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavAf2_fmt
+
+#.TYPE_ATTR
+CNAV-ClockModel/cnavAf1 DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavAf1_fmt
+
+#.TYPE_ATTR
+CNAV-ClockModel/cnavAf0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavX_fmt
+
+#.TYPE_ATTR
+CNAV-ClockModel/cnavTgd DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavX_fmt
+
+#.TYPE_ATTR
+CNAV-ClockModel/cnavISCl1cp DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavX_fmt
+
+#.TYPE_ATTR
+CNAV-ClockModel/cnavISCl1cd DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavX_fmt
+
+#.TYPE_ATTR
+CNAV-ClockModel/cnavISCl1ca DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavX_fmt
+
+#.TYPE_ATTR
+CNAV-ClockModel/cnavISCl2c DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavX_fmt
+
+#.TYPE_ATTR
+CNAV-ClockModel/cnavISCl5i5 DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavX_fmt
+
+#.TYPE_ATTR
+CNAV-ClockModel/cnavISCl5q5 DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavX_fmt
+
+#.TYPE_ATTR
+GLONASS-ClockModel/gloTau DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloTau_gloDeltaTau_fmt
+
+#.TYPE_ATTR
+GLONASS-ClockModel/gloGamma DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloGamma_fmt
+
+#.TYPE_ATTR
+GLONASS-ClockModel/gloDeltaTau DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloTau_gloDeltaTau_fmt
+
+#.TYPE_ATTR
+SBAS-ClockModel/sbasTo DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasTo_fmt
+
+#.TYPE_ATTR
+SBAS-ClockModel/sbasAgfo DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasAgfo_fmt
+
+#.TYPE_ATTR
+SBAS-ClockModel/sbasAgf1 DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasAgf1_fmt
+
+#.TYPE_ATTR
+NavModelKeplerianSet/keplerToe DISPLAY=BASE_CUSTOM STRINGS=&lpp_keplerToe_fmt
+
+#.TYPE_ATTR
+NavModelKeplerianSet/keplerW DISPLAY=BASE_CUSTOM STRINGS=&lpp_keplerW_M0_I0_Omega0_fmt
+
+#.TYPE_ATTR
+NavModelKeplerianSet/keplerDeltaN DISPLAY=BASE_CUSTOM STRINGS=&lpp_keplerDeltaN_OmegaDot_IDot_fmt
+
+#.TYPE_ATTR
+NavModelKeplerianSet/keplerM0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_keplerW_M0_I0_Omega0_fmt
+
+#.TYPE_ATTR
+NavModelKeplerianSet/keplerOmegaDot DISPLAY=BASE_CUSTOM STRINGS=&lpp_keplerDeltaN_OmegaDot_IDot_fmt
+
+#.TYPE_ATTR
+NavModelKeplerianSet/keplerE DISPLAY=BASE_CUSTOM STRINGS=&lpp_keplerE_fmt
+
+#.TYPE_ATTR
+NavModelKeplerianSet/keplerIDot DISPLAY=BASE_CUSTOM STRINGS=&lpp_keplerDeltaN_OmegaDot_IDot_fmt
+
+#.TYPE_ATTR
+NavModelKeplerianSet/keplerAPowerHalf DISPLAY=BASE_CUSTOM STRINGS=&lpp_keplerAPowerHalf_fmt
+
+#.TYPE_ATTR
+NavModelKeplerianSet/keplerI0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_keplerW_M0_I0_Omega0_fmt
+
+#.TYPE_ATTR
+NavModelKeplerianSet/keplerOmega0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_keplerW_M0_I0_Omega0_fmt
+
+#.TYPE_ATTR
+NavModelKeplerianSet/keplerCrs DISPLAY=BASE_CUSTOM STRINGS=&lpp_keplerCrs_Crc_fmt
+
+#.TYPE_ATTR
+NavModelKeplerianSet/keplerCis DISPLAY=BASE_CUSTOM STRINGS=&lpp_keplerCx_fmt
+
+#.TYPE_ATTR
+NavModelKeplerianSet/keplerCus DISPLAY=BASE_CUSTOM STRINGS=&lpp_keplerCx_fmt
+
+#.TYPE_ATTR
+NavModelKeplerianSet/keplerCrc DISPLAY=BASE_CUSTOM STRINGS=&lpp_keplerCrs_Crc_fmt
+
+#.TYPE_ATTR
+NavModelKeplerianSet/keplerCic DISPLAY=BASE_CUSTOM STRINGS=&lpp_keplerCx_fmt
+
+#.TYPE_ATTR
+NavModelKeplerianSet/keplerCuc DISPLAY=BASE_CUSTOM STRINGS=&lpp_keplerCx_fmt
+
+#.TYPE_ATTR
+NavModelNAV-KeplerianSet/navToe DISPLAY=BASE_CUSTOM STRINGS=&lpp_navToe_fmt
+
+#.TYPE_ATTR
+NavModelNAV-KeplerianSet/navOmega DISPLAY=BASE_CUSTOM STRINGS=&lpp_navOmega_M0_I0_OmegaA0_fmt
+
+#.TYPE_ATTR
+NavModelNAV-KeplerianSet/navDeltaN DISPLAY=BASE_CUSTOM STRINGS=&lpp_navDeltaN_OmegaADot_IDot_fmt
+
+#.TYPE_ATTR
+NavModelNAV-KeplerianSet/navM0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_navOmega_M0_I0_OmegaA0_fmt
+
+#.TYPE_ATTR
+NavModelNAV-KeplerianSet/navOmegaADot DISPLAY=BASE_CUSTOM STRINGS=&lpp_navDeltaN_OmegaADot_IDot_fmt
+
+#.TYPE_ATTR
+NavModelNAV-KeplerianSet/navE DISPLAY=BASE_CUSTOM STRINGS=&lpp_navE_fmt
+
+#.TYPE_ATTR
+NavModelNAV-KeplerianSet/navIDot DISPLAY=BASE_CUSTOM STRINGS=&lpp_navDeltaN_OmegaADot_IDot_fmt
+
+#.TYPE_ATTR
+NavModelNAV-KeplerianSet/navAPowerHalf DISPLAY=BASE_CUSTOM STRINGS=&lpp_navAPowerHalf_fmt
+
+#.TYPE_ATTR
+NavModelNAV-KeplerianSet/navI0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_navOmega_M0_I0_OmegaA0_fmt
+
+#.TYPE_ATTR
+NavModelNAV-KeplerianSet/navOmegaA0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_navOmega_M0_I0_OmegaA0_fmt
+
+#.TYPE_ATTR
+NavModelNAV-KeplerianSet/navCrs DISPLAY=BASE_CUSTOM STRINGS=&lpp_navCrs_Crc_fmt
+
+#.TYPE_ATTR
+NavModelNAV-KeplerianSet/navCis DISPLAY=BASE_CUSTOM STRINGS=&lpp_navCx_fmt
+
+#.TYPE_ATTR
+NavModelNAV-KeplerianSet/navCus DISPLAY=BASE_CUSTOM STRINGS=&lpp_navCx_fmt
+
+#.TYPE_ATTR
+NavModelNAV-KeplerianSet/navCrc DISPLAY=BASE_CUSTOM STRINGS=&lpp_navCrs_Crc_fmt
+
+#.TYPE_ATTR
+NavModelNAV-KeplerianSet/navCic DISPLAY=BASE_CUSTOM STRINGS=&lpp_navCx_fmt
+
+#.TYPE_ATTR
+NavModelNAV-KeplerianSet/navCuc DISPLAY=BASE_CUSTOM STRINGS=&lpp_navCx_fmt
+
+#.TYPE_ATTR
+NavModelCNAV-KeplerianSet/cnavTop DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavToc_cnavTop_fmt
+
+#.TYPE_ATTR
+NavModelCNAV-KeplerianSet/cnavDeltaA DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavDeltaA_fmt
+
+#.TYPE_ATTR
+NavModelCNAV-KeplerianSet/cnavAdot DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavAdot_fmt
+
+#.TYPE_ATTR
+NavModelCNAV-KeplerianSet/cnavDeltaNo DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavDeltaNo_fmt
+
+#.TYPE_ATTR
+NavModelCNAV-KeplerianSet/cnavDeltaNoDot DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavDeltaNoDot_fmt
+
+#.FN_BODY NavModelCNAV-KeplerianSet/cnavMo VAL_PTR=&cnavMo FN_VARIANT=_64b
+ gint64 cnavMo;
+ int curr_offset = offset;
+%(DEFAULT_BODY)s
+
+#.FN_FTR NavModelCNAV-KeplerianSet/cnavMo
+ PROTO_ITEM_SET_HIDDEN(actx->created_item);
+ actx->created_item = proto_tree_add_int64_format_value(tree, hf_index, tvb, curr_offset>>3, (offset+7-curr_offset)>>3,
+ cnavMo, "%e semi-circles (%"G_GINT64_MODIFIER"d)",
+ (double)cnavMo*pow(2, -32), cnavMo);
+
+#.TYPE_ATTR
+NavModelCNAV-KeplerianSet/cnavMo TYPE=FT_INT64
+
+#.FN_BODY NavModelCNAV-KeplerianSet/cnavE VAL_PTR=&cnavE FN_VARIANT=_64b
+ guint64 cnavE;
+ int curr_offset = offset;
+%(DEFAULT_BODY)s
+
+#.FN_FTR NavModelCNAV-KeplerianSet/cnavE
+ PROTO_ITEM_SET_HIDDEN(actx->created_item);
+ actx->created_item = proto_tree_add_uint64_format_value(tree, hf_index, tvb, curr_offset>>3, (offset+7-curr_offset)>>3,
+ cnavE, "%e (%"G_GINT64_MODIFIER"u)",
+ (double)cnavE*pow(2, -34), cnavE);
+
+#.TYPE_ATTR
+NavModelCNAV-KeplerianSet/cnavE TYPE=FT_UINT64
+
+#.FN_BODY NavModelCNAV-KeplerianSet/cnavOmega VAL_PTR=&cnavOmega FN_VARIANT=_64b
+ gint64 cnavOmega;
+ int curr_offset = offset;
+%(DEFAULT_BODY)s
+
+#.FN_FTR NavModelCNAV-KeplerianSet/cnavOmega
+ PROTO_ITEM_SET_HIDDEN(actx->created_item);
+ actx->created_item = proto_tree_add_int64_format_value(tree, hf_index, tvb, curr_offset>>3, (offset+7-curr_offset)>>3,
+ cnavOmega, "%e semi-circles (%"G_GINT64_MODIFIER"d)",
+ (double)cnavOmega*pow(2, -32), cnavOmega);
+
+#.TYPE_ATTR
+NavModelCNAV-KeplerianSet/cnavOmega TYPE=FT_INT64
+
+#.FN_BODY NavModelCNAV-KeplerianSet/cnavOMEGA0 VAL_PTR=&cnavOMEGA0 FN_VARIANT=_64b
+ gint64 cnavOMEGA0;
+ int curr_offset = offset;
+%(DEFAULT_BODY)s
+
+#.FN_FTR NavModelCNAV-KeplerianSet/cnavOMEGA0
+ PROTO_ITEM_SET_HIDDEN(actx->created_item);
+ actx->created_item = proto_tree_add_int64_format_value(tree, hf_index, tvb, curr_offset>>3, (offset+7-curr_offset)>>3,
+ cnavOMEGA0, "%e semi-circles (%"G_GINT64_MODIFIER"d)",
+ (double)cnavOMEGA0*pow(2, -32), cnavOMEGA0);
+
+#.TYPE_ATTR
+NavModelCNAV-KeplerianSet/cnavOMEGA0 TYPE=FT_INT64
+
+#.TYPE_ATTR
+NavModelCNAV-KeplerianSet/cnavDeltaOmegaDot DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavDeltaOmegaDot_IoDot_fmt
+
+#.FN_BODY NavModelCNAV-KeplerianSet/cnavIo VAL_PTR=&cnavIo FN_VARIANT=_64b
+ gint64 cnavIo;
+ int curr_offset = offset;
+%(DEFAULT_BODY)s
+
+#.FN_FTR NavModelCNAV-KeplerianSet/cnavIo
+ PROTO_ITEM_SET_HIDDEN(actx->created_item);
+ actx->created_item = proto_tree_add_int64_format_value(tree, hf_index, tvb, curr_offset>>3, (offset+7-curr_offset)>>3,
+ cnavIo, "%e semi-circles (%"G_GINT64_MODIFIER"d)",
+ (double)cnavIo*pow(2, -32), cnavIo);
+
+#.TYPE_ATTR
+NavModelCNAV-KeplerianSet/cnavIo TYPE=FT_INT64
+
+#.TYPE_ATTR
+NavModelCNAV-KeplerianSet/cnavIoDot DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavDeltaOmegaDot_IoDot_fmt
+
+#.TYPE_ATTR
+NavModelCNAV-KeplerianSet/cnavCis DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavCx_fmt
+
+#.TYPE_ATTR
+NavModelCNAV-KeplerianSet/cnavCic DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavCx_fmt
+
+#.TYPE_ATTR
+NavModelCNAV-KeplerianSet/cnavCrs DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavCrs_Crc_fmt
+
+#.TYPE_ATTR
+NavModelCNAV-KeplerianSet/cnavCrc DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavCrs_Crc_fmt
+
+#.TYPE_ATTR
+NavModelCNAV-KeplerianSet/cnavCus DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavCx_fmt
+
+#.TYPE_ATTR
+NavModelCNAV-KeplerianSet/cnavCuc DISPLAY=BASE_CUSTOM STRINGS=&lpp_cnavCx_fmt
+
+#.FN_FTR NavModel-GLONASS-ECEF/gloEn
+ proto_item_append_text(actx->created_item, " days");
+
+#.FN_BODY NavModel-GLONASS-ECEF/gloP1 VAL_PTR = &gloP1_tvb HF_INDEX=-1
+ tvbuff_t *gloP1_tvb = NULL;
+%(DEFAULT_BODY)s
+
+#.FN_FTR NavModel-GLONASS-ECEF/gloP1
+ if (gloP1_tvb) {
+ actx->created_item = proto_tree_add_uint(tree, hf_index, gloP1_tvb, 0, 1, tvb_get_bits8(gloP1_tvb, 0, 2));
+ proto_item_append_text(actx->created_item, " mn");
+ }
+
+#.TYPE_ATTR
+NavModel-GLONASS-ECEF/gloX DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloX_Y_Z_fmt
+
+#.TYPE_ATTR
+NavModel-GLONASS-ECEF/gloXdot DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloXdot_Ydot_Zdot_fmt
+
+#.TYPE_ATTR
+NavModel-GLONASS-ECEF/gloXdotdot DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloXdotdot_Ydotdot_Zdotdot_fmt
+
+#.TYPE_ATTR
+NavModel-GLONASS-ECEF/gloY DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloX_Y_Z_fmt
+
+#.TYPE_ATTR
+NavModel-GLONASS-ECEF/gloYdot DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloXdot_Ydot_Zdot_fmt
+
+#.TYPE_ATTR
+NavModel-GLONASS-ECEF/gloYdotdot DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloXdotdot_Ydotdot_Zdotdot_fmt
+
+#.TYPE_ATTR
+NavModel-GLONASS-ECEF/gloZ DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloX_Y_Z_fmt
+
+#.TYPE_ATTR
+NavModel-GLONASS-ECEF/gloZdot DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloXdot_Ydot_Zdot_fmt
+
+#.TYPE_ATTR
+NavModel-GLONASS-ECEF/gloZdotdot DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloXdotdot_Ydotdot_Zdotdot_fmt
+
+#.TYPE_ATTR
+NavModel-SBAS-ECEF/sbasTo DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasTo_fmt
+
+#.TYPE_ATTR
+NavModel-SBAS-ECEF/sbasXg DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasXg_Yg_fmt
+
+#.TYPE_ATTR
+NavModel-SBAS-ECEF/sbasYg DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasXg_Yg_fmt
+
+#.TYPE_ATTR
+NavModel-SBAS-ECEF/sbasZg DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasZg_fmt
+
+#.TYPE_ATTR
+NavModel-SBAS-ECEF/sbasXgDot DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasXgDot_YgDot_fmt
+
+#.TYPE_ATTR
+NavModel-SBAS-ECEF/sbasYgDot DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasXgDot_YgDot_fmt
+
+#.TYPE_ATTR
+NavModel-SBAS-ECEF/sbasZgDot DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasZgDot_fmt
+
+#.TYPE_ATTR
+NavModel-SBAS-ECEF/sbasXgDotDot DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasXgDotDot_YgDotDot_fmt
+
+#.TYPE_ATTR
+NavModel-SBAS-ECEF/sbasYgDotDot DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasXgDotDot_YgDotDot_fmt
+
+#.TYPE_ATTR
+NavModel-SBAS-ECEF/sbasZgDotDot DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasZgDotDot_fmt
+
+#.FN_FTR GNSS-DataBitAssistance/gnss-TOD
+ proto_item_append_text(actx->created_item, " s");
+
+#.FN_FTR GNSS-DataBitAssistance/gnss-TODfrac
+ proto_item_append_text(actx->created_item, " ms");
+
+#.FN_FTR GNSS-AcquisitionAssistance/confidence-r10
+ proto_item_append_text(actx->created_item, " %%");
+
+#.TYPE_ATTR
+GNSS-AcquisitionAssistElement/doppler0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_doppler0_fmt
+
+#.TYPE_ATTR
+GNSS-AcquisitionAssistElement/doppler1 DISPLAY=BASE_CUSTOM STRINGS=&lpp_doppler1_fmt
+
+#.TYPE_ATTR
+GNSS-AcquisitionAssistElement/dopplerUncertainty STRINGS=VALS(lpp_dopplerUncertainty_vals)
+
+#.TYPE_ATTR
+GNSS-AcquisitionAssistElement/codePhase DISPLAY=BASE_CUSTOM STRINGS=&lpp_codePhase_fmt
+
+#.FN_FTR GNSS-AcquisitionAssistElement/intCodePhase
+ proto_item_append_text(actx->created_item, " ms");
+
+#.TYPE_ATTR
+GNSS-AcquisitionAssistElement/codePhaseSearchWindow DISPLAY=BASE_DEC|BASE_EXT_STRING STRINGS=&lpp_codePhaseSearchWindow_vals_ext
+
+#.TYPE_ATTR
+GNSS-AcquisitionAssistElement/azimuth DISPLAY=BASE_CUSTOM STRINGS=&lpp_azimuth_elevation_fmt
+
+#.TYPE_ATTR
+GNSS-AcquisitionAssistElement/elevation DISPLAY=BASE_CUSTOM STRINGS=&lpp_azimuth_elevation_fmt
+
+#.TYPE_ATTR
+GNSS-Almanac/toa DISPLAY=BASE_CUSTOM STRINGS=&lpp_toa_fmt
+
+#.TYPE_ATTR
+AlmanacKeplerianSet/kepAlmanacE DISPLAY=BASE_CUSTOM STRINGS=&lpp_kepAlmanacE_fmt
+
+#.TYPE_ATTR
+AlmanacKeplerianSet/kepAlmanacDeltaI DISPLAY=BASE_CUSTOM STRINGS=&lpp_kepAlmanacDeltaI_fmt
+
+#.TYPE_ATTR
+AlmanacKeplerianSet/kepAlmanacOmegaDot DISPLAY=BASE_CUSTOM STRINGS=&lpp_kepAlmanacOmegaDot_fmt
+
+#.TYPE_ATTR
+AlmanacKeplerianSet/kepAlmanacAPowerHalf DISPLAY=BASE_CUSTOM STRINGS=&lpp_kepAlmanacAPowerHalf_fmt
+
+#.TYPE_ATTR
+AlmanacKeplerianSet/kepAlmanacOmega0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_kepAlmanacOmega0_W_M0_fmt
+
+#.TYPE_ATTR
+AlmanacKeplerianSet/kepAlmanacW DISPLAY=BASE_CUSTOM STRINGS=&lpp_kepAlmanacOmega0_W_M0_fmt
+
+#.TYPE_ATTR
+AlmanacKeplerianSet/kepAlmanacM0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_kepAlmanacOmega0_W_M0_fmt
+
+#.TYPE_ATTR
+AlmanacKeplerianSet/kepAlmanacAF0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_kepAlmanacAF0_fmt
+
+#.TYPE_ATTR
+AlmanacKeplerianSet/kepAlmanacAF1 DISPLAY=BASE_CUSTOM STRINGS=&lpp_kepAlmanacAF1_fmt
+
+#.TYPE_ATTR
+AlmanacNAV-KeplerianSet/navAlmE DISPLAY=BASE_CUSTOM STRINGS=&lpp_navAlmE_fmt
+
+#.TYPE_ATTR
+AlmanacNAV-KeplerianSet/navAlmDeltaI DISPLAY=BASE_CUSTOM STRINGS=&lpp_navAlmDeltaI_fmt
+
+#.TYPE_ATTR
+AlmanacNAV-KeplerianSet/navAlmOMEGADOT DISPLAY=BASE_CUSTOM STRINGS=&lpp_navAlmOMEGADOT_fmt
+
+#.TYPE_ATTR
+AlmanacNAV-KeplerianSet/navAlmSqrtA DISPLAY=BASE_CUSTOM STRINGS=&lpp_navAlmSqrtA_fmt
+
+#.TYPE_ATTR
+AlmanacNAV-KeplerianSet/navAlmOMEGAo DISPLAY=BASE_CUSTOM STRINGS=&lpp_navAlmOMEGAo_Omega_Mo_fmt
+
+#.TYPE_ATTR
+AlmanacNAV-KeplerianSet/navAlmOmega DISPLAY=BASE_CUSTOM STRINGS=&lpp_navAlmOMEGAo_Omega_Mo_fmt
+
+#.TYPE_ATTR
+AlmanacNAV-KeplerianSet/navAlmMo DISPLAY=BASE_CUSTOM STRINGS=&lpp_navAlmOMEGAo_Omega_Mo_fmt
+
+#.TYPE_ATTR
+AlmanacNAV-KeplerianSet/navAlmaf0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_navAlmaf0_fmt
+
+#.TYPE_ATTR
+AlmanacNAV-KeplerianSet/navAlmaf1 DISPLAY=BASE_CUSTOM STRINGS=&lpp_navAlmaf1_fmt
+
+#.TYPE_ATTR
+AlmanacReducedKeplerianSet/redAlmDeltaA DISPLAY=BASE_CUSTOM STRINGS=&lpp_redAlmDeltaA_fmt
+
+#.TYPE_ATTR
+AlmanacReducedKeplerianSet/redAlmOmega0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_redAlmOmega0_Phi0_fmt
+
+#.TYPE_ATTR
+AlmanacMidiAlmanacSet/midiAlmE DISPLAY=BASE_CUSTOM STRINGS=&lpp_midiAlmE_fmt
+
+#.TYPE_ATTR
+AlmanacMidiAlmanacSet/midiAlmDeltaI DISPLAY=BASE_CUSTOM STRINGS=&lpp_midiAlmDeltaI_fmt
+
+#.TYPE_ATTR
+AlmanacMidiAlmanacSet/midiAlmOmegaDot DISPLAY=BASE_CUSTOM STRINGS=&lpp_midiAlmOmegaDot_fmt
+
+#.TYPE_ATTR
+AlmanacMidiAlmanacSet/midiAlmSqrtA DISPLAY=BASE_CUSTOM STRINGS=&lpp_midiAlmSqrtA_fmt
+
+#.TYPE_ATTR
+AlmanacMidiAlmanacSet/midiAlmOmega0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_midiAlmOmega0_Omega_Mo_fmt
+
+#.TYPE_ATTR
+AlmanacMidiAlmanacSet/midiAlmOmega DISPLAY=BASE_CUSTOM STRINGS=&lpp_midiAlmOmega0_Omega_Mo_fmt
+
+#.TYPE_ATTR
+AlmanacMidiAlmanacSet/midiAlmMo DISPLAY=BASE_CUSTOM STRINGS=&lpp_midiAlmOmega0_Omega_Mo_fmt
+
+#.TYPE_ATTR
+AlmanacMidiAlmanacSet/midiAlmaf0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_midiAlmaf0_fmt
+
+#.TYPE_ATTR
+AlmanacMidiAlmanacSet/midiAlmaf1 DISPLAY=BASE_CUSTOM STRINGS=&lpp_midiAlmaf1_fmt
+
+#.FN_FTR AlmanacGLONASS-AlmanacSet/gloAlm-NA
+ proto_item_append_text(actx->created_item, " days");
+
+#.TYPE_ATTR
+AlmanacGLONASS-AlmanacSet/gloAlmLambdaA DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloAlmLambdaA_DeltaIa_fmt
+
+#.TYPE_ATTR
+AlmanacGLONASS-AlmanacSet/gloAlmtlambdaA DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloAlmtlambdaA_fmt
+
+#.TYPE_ATTR
+AlmanacGLONASS-AlmanacSet/gloAlmDeltaIa DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloAlmLambdaA_DeltaIa_fmt
+
+#.TYPE_ATTR
+AlmanacGLONASS-AlmanacSet/gloAlmDeltaTA DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloAlmDeltaTA_fmt
+
+#.TYPE_ATTR
+AlmanacGLONASS-AlmanacSet/gloAlmDeltaTdotA DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloAlmDeltaTdotA_fmt
+
+#.TYPE_ATTR
+AlmanacGLONASS-AlmanacSet/gloAlmEpsilonA DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloAlmEpsilonA_fmt
+
+#.TYPE_ATTR
+AlmanacGLONASS-AlmanacSet/gloAlmOmegaA DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloAlmOmegaA_fmt
+
+#.TYPE_ATTR
+AlmanacGLONASS-AlmanacSet/gloAlmTauA DISPLAY=BASE_CUSTOM STRINGS=&lpp_gloAlmTauA_fmt
+
+#.TYPE_ATTR
+AlmanacECEF-SBAS-AlmanacSet/sbasAlmXg DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasAlmXg_Yg_fmt
+
+#.TYPE_ATTR
+AlmanacECEF-SBAS-AlmanacSet/sbasAlmYg DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasAlmXg_Yg_fmt
+
+#.TYPE_ATTR
+AlmanacECEF-SBAS-AlmanacSet/sbasAlmZg DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasAlmZg_fmt
+
+#.TYPE_ATTR
+AlmanacECEF-SBAS-AlmanacSet/sbasAlmXgdot DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasAlmXgdot_YgDot_fmt
+
+#.TYPE_ATTR
+AlmanacECEF-SBAS-AlmanacSet/sbasAlmYgDot DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasAlmXgdot_YgDot_fmt
+
+#.TYPE_ATTR
+AlmanacECEF-SBAS-AlmanacSet/sbasAlmZgDot DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasAlmZgDot_fmt
+
+#.TYPE_ATTR
+AlmanacECEF-SBAS-AlmanacSet/sbasAlmTo DISPLAY=BASE_CUSTOM STRINGS=&lpp_sbasAlmTo_fmt
+
+#.TYPE_ATTR
+UTC-ModelSet1/gnss-Utc-A1 DISPLAY=BASE_CUSTOM STRINGS=&lpp_gnss_Utc_A1_fmt
+
+#.TYPE_ATTR
+UTC-ModelSet1/gnss-Utc-A0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_gnss_Utc_A0_fmt
+
+#.TYPE_ATTR
+UTC-ModelSet1/gnss-Utc-Tot DISPLAY=BASE_CUSTOM STRINGS=&lpp_gnss_Utc_Tot_fmt
+
+#.FN_FTR UTC-ModelSet1/gnss-Utc-WNt
+ proto_item_append_text(actx->created_item, " weeks");
+
+#.FN_FTR UTC-ModelSet1/gnss-Utc-DeltaTls
+ proto_item_append_text(actx->created_item, " s");
+
+#.FN_FTR UTC-ModelSet1/gnss-Utc-WNlsf
+ proto_item_append_text(actx->created_item, " weeks");
+
+#.FN_FTR UTC-ModelSet1/gnss-Utc-DN
+ proto_item_append_text(actx->created_item, " days");
+
+#.FN_FTR UTC-ModelSet1/gnss-Utc-DeltaTlsf
+ proto_item_append_text(actx->created_item, " s");
+
+#.TYPE_ATTR
+UTC-ModelSet2/utcA0 DISPLAY=BASE_CUSTOM STRINGS=&lpp_tA0_fmt
+
+#.TYPE_ATTR
+UTC-ModelSet2/utcA1 DISPLAY=BASE_CUSTOM STRINGS=&lpp_tA1_fmt
+
+#.TYPE_ATTR
+UTC-ModelSet2/utcA2 DISPLAY=BASE_CUSTOM STRINGS=&lpp_tA2_fmt
+
+#.FN_FTR UTC-ModelSet2/utcDeltaTls
+ proto_item_append_text(actx->created_item, " s");
+
+#.TYPE_ATTR
+UTC-ModelSet2/utcTot DISPLAY=BASE_CUSTOM STRINGS=&lpp_gnss_TimeModelRefTime_fmt
+
+#.FN_FTR UTC-ModelSet2/utcWNot
+ proto_item_append_text(actx->created_item, " weeks");
+
+#.FN_FTR UTC-ModelSet2/utcWNlsf
+ proto_item_append_text(actx->created_item, " weeks");
+
+#.FN_FTR UTC-ModelSet2/utcDN
+ proto_item_append_text(actx->created_item, " days");
+
+#.FN_FTR UTC-ModelSet2/utcDeltaTlsf
+ proto_item_append_text(actx->created_item, " s");
+
+#.FN_FTR UTC-ModelSet3/nA
+ proto_item_append_text(actx->created_item, " days");
+
+#.TYPE_ATTR
+UTC-ModelSet3/tauC DISPLAY=BASE_CUSTOM STRINGS=&lpp_tauC_fmt
+
+#.TYPE_ATTR
+UTC-ModelSet3/b1 DISPLAY=BASE_CUSTOM STRINGS=&lpp_b1_fmt
+
+#.TYPE_ATTR
+UTC-ModelSet3/b2 DISPLAY=BASE_CUSTOM STRINGS=&lpp_b2_fmt
+
+#.FN_BODY UTC-ModelSet3/kp VAL_PTR = &kp_tvb HF_INDEX=-1
+ tvbuff_t *kp_tvb = NULL;
+%(DEFAULT_BODY)s
+
+#.FN_FTR UTC-ModelSet3/kp
+ if (kp_tvb) {
+ actx->created_item = proto_tree_add_uint(tree, hf_index, kp_tvb, 0, 1, tvb_get_bits8(kp_tvb, 0, 2));
+ }
+
+#.TYPE_ATTR
+UTC-ModelSet3/kp TYPE=FT_UINT8 DISPLAY=BASE_DEC STRINGS=VALS(lpp_kp_vals)
+
+#.TYPE_ATTR
+UTC-ModelSet4/utcA1wnt DISPLAY=BASE_CUSTOM STRINGS=&lpp_gnss_Utc_A1_fmt
+
+#.TYPE_ATTR
+UTC-ModelSet4/utcA0wnt DISPLAY=BASE_CUSTOM STRINGS=&lpp_gnss_Utc_A0_fmt
+
+#.TYPE_ATTR
+UTC-ModelSet4/utcTot DISPLAY=BASE_CUSTOM STRINGS=&lpp_gnss_Utc_Tot_fmt
+
+#.FN_FTR UTC-ModelSet4/utcWNt
+ proto_item_append_text(actx->created_item, " weeks");
+
+#.FN_FTR UTC-ModelSet4/utcDeltaTls
+ proto_item_append_text(actx->created_item, " s");
+
+#.FN_FTR UTC-ModelSet4/utcWNlsf
+ proto_item_append_text(actx->created_item, " weeks");
+
+#.FN_FTR UTC-ModelSet4/utcDN
+ proto_item_append_text(actx->created_item, " days");
+
+#.FN_FTR UTC-ModelSet4/utcDeltaTlsf
+ proto_item_append_text(actx->created_item, " s");
+
+#.TYPE_ATTR
+UTC-ModelSet4/utcStandardID TYPE=FT_UINT8 DISPLAY=BASE_DEC STRINGS=VALS(lpp_utcStandardID_vals)
+
+#.FN_FTR StoredNavListInfo/gnss-WeekOrDay
+ proto_item_append_text(actx->created_item, " (days for glonass, weeks otherwise)");
+
+#.FN_FTR StoredNavListInfo/gnss-Toe
+ proto_item_append_text(actx->created_item, " (units of 15 mns for glonass, hours otherwise)");
+
+#.FN_FTR StoredNavListInfo/t-toeLimit
+ proto_item_append_text(actx->created_item, " (units of 30 mns for glonass, hours otherwise)");
+
+#.FN_FTR GNSS-DataBitAssistanceReq/gnss-TOD-Req
+ proto_item_append_text(actx->created_item, " s");
+
+#.FN_FTR GNSS-DataBitAssistanceReq/gnss-TOD-FracReq
+ proto_item_append_text(actx->created_item, " ms");
+
+#.TYPE_ATTR
+GNSS-DataBitAssistanceReq/dataBitInterval TYPE=FT_UINT8 DISPLAY=BASE_DEC|BASE_EXT_STRING STRINGS=&lpp_dataBitInterval_vals_ext
+
+#.FN_FTR MeasurementReferenceTime/gnss-TOD-msec
+ proto_item_append_text(actx->created_item, " ms");
+
+#.TYPE_ATTR
+MeasurementReferenceTime/gnss-TOD-frac DISPLAY=BASE_CUSTOM STRINGS=&lpp_fractionalSecondsFromFrameStructureStart_fmt
+
+#.TYPE_ATTR
+MeasurementReferenceTime/gnss-TOD-unc DISPLAY=BASE_CUSTOM STRINGS=&lpp_referenceTimeUnc_fmt
+
+#.FN_FTR MeasurementReferenceTime/networkTime/gSM/deltaGNSS-TOD
+ proto_item_append_text(actx->created_item, " ms");
+
+#.FN_FTR GNSS-SgnMeasElement/gnss-CodePhaseAmbiguity
+ proto_item_append_text(actx->created_item, " ms");
+
+#.FN_FTR GNSS-SatMeasElement/cNo
+ proto_item_append_text(actx->created_item, " dB-Hz");
+
+#.TYPE_ATTR
+GNSS-SatMeasElement/carrierQualityInd TYPE=FT_UINT8 DISPLAY=BASE_DEC STRINGS=VALS(lpp_carrierQualityInd_vals)
+
+#.TYPE_ATTR
+GNSS-SatMeasElement/codePhase DISPLAY=BASE_CUSTOM STRINGS=&lpp_GNSS_SatMeas_codePhase_fmt
+
+#.FN_FTR GNSS-SatMeasElement/integerCodePhase
+ proto_item_append_text(actx->created_item, " ms");
+
+#.TYPE_ATTR
+GNSS-SatMeasElement/codePhaseRMSError DISPLAY=BASE_CUSTOM STRINGS=&lpp_codePhaseRMSError_fmt
+
+#.TYPE_ATTR
+GNSS-SatMeasElement/doppler DISPLAY=BASE_CUSTOM STRINGS=&lpp_doppler_fmt
+
+#.TYPE_ATTR
+GNSS-SatMeasElement/adr DISPLAY=BASE_CUSTOM STRINGS=&lpp_adr_fmt
+
+#.FN_BODY GNSS-IonosphericModelSupport/ionoModel VAL_PTR = &ionoModel_tvb LEN_PTR = &len
+ tvbuff_t *ionoModel_tvb = NULL;
+ int len;
+
+%(DEFAULT_BODY)s
+ if(ionoModel_tvb){
+ proto_tree *subtree;
+
+ subtree = proto_item_add_subtree(actx->created_item, ett_lpp_bitmap);
+ if (len >= 1) {
+ proto_tree_add_item(subtree, hf_lpp_T_ionoModel_klobuchar, ionoModel_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 2) {
+ proto_tree_add_item(subtree, hf_lpp_T_ionoModel_neQuick, ionoModel_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ }
+
+#.FN_BODY GNSS-NavigationModelSupport/clockModel VAL_PTR = &clockModel_tvb LEN_PTR = &len
+ tvbuff_t *clockModel_tvb = NULL;
+ int len;
+
+%(DEFAULT_BODY)s
+ if(clockModel_tvb){
+ proto_tree *subtree;
+
+ subtree = proto_item_add_subtree(actx->created_item, ett_lpp_bitmap);
+ if (len >= 1) {
+ proto_tree_add_item(subtree, hf_lpp_T_clockModel_model_1, clockModel_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 2) {
+ proto_tree_add_item(subtree, hf_lpp_T_clockModel_model_2, clockModel_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 3) {
+ proto_tree_add_item(subtree, hf_lpp_T_clockModel_model_3, clockModel_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 4) {
+ proto_tree_add_item(subtree, hf_lpp_T_clockModel_model_4, clockModel_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 5) {
+ proto_tree_add_item(subtree, hf_lpp_T_clockModel_model_5, clockModel_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ }
+
+#.FN_BODY GNSS-NavigationModelSupport/orbitModel VAL_PTR = &orbitModel_tvb LEN_PTR = &len
+ tvbuff_t *orbitModel_tvb = NULL;
+ int len;
+
+%(DEFAULT_BODY)s
+ if(orbitModel_tvb){
+ proto_tree *subtree;
+
+ subtree = proto_item_add_subtree(actx->created_item, ett_lpp_bitmap);
+ if (len >= 1) {
+ proto_tree_add_item(subtree, hf_lpp_T_orbitModel_model_1, orbitModel_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 2) {
+ proto_tree_add_item(subtree, hf_lpp_T_orbitModel_model_2, orbitModel_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 3) {
+ proto_tree_add_item(subtree, hf_lpp_T_orbitModel_model_3, orbitModel_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 4) {
+ proto_tree_add_item(subtree, hf_lpp_T_orbitModel_model_4, orbitModel_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 5) {
+ proto_tree_add_item(subtree, hf_lpp_T_orbitModel_model_5, orbitModel_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ }
+
+#.FN_BODY GNSS-AlmanacSupport/almanacModel VAL_PTR = &almanacModel_tvb LEN_PTR = &len
+ tvbuff_t *almanacModel_tvb = NULL;
+ int len;
+
+%(DEFAULT_BODY)s
+ if(almanacModel_tvb){
+ proto_tree *subtree;
+
+ subtree = proto_item_add_subtree(actx->created_item, ett_lpp_bitmap);
+ if (len >= 1) {
+ proto_tree_add_item(subtree, hf_lpp_T_almanacModel_model_1, almanacModel_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 2) {
+ proto_tree_add_item(subtree, hf_lpp_T_almanacModel_model_2, almanacModel_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 3) {
+ proto_tree_add_item(subtree, hf_lpp_T_almanacModel_model_3, almanacModel_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 4) {
+ proto_tree_add_item(subtree, hf_lpp_T_almanacModel_model_4, almanacModel_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 5) {
+ proto_tree_add_item(subtree, hf_lpp_T_almanacModel_model_5, almanacModel_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 6) {
+ proto_tree_add_item(subtree, hf_lpp_T_almanacModel_model_6, almanacModel_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ }
+
+#.FN_BODY GNSS-UTC-ModelSupport/utc-Model VAL_PTR = &utc_Model_tvb LEN_PTR = &len
+ tvbuff_t *utc_Model_tvb = NULL;
+ int len;
+
+%(DEFAULT_BODY)s
+ if(utc_Model_tvb){
+ proto_tree *subtree;
+
+ subtree = proto_item_add_subtree(actx->created_item, ett_lpp_bitmap);
+ if (len >= 1) {
+ proto_tree_add_item(subtree, hf_lpp_T_utc_Model_model_1, utc_Model_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 2) {
+ proto_tree_add_item(subtree, hf_lpp_T_utc_Model_model_2, utc_Model_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 3) {
+ proto_tree_add_item(subtree, hf_lpp_T_utc_Model_model_3, utc_Model_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 4) {
+ proto_tree_add_item(subtree, hf_lpp_T_utc_Model_model_4, utc_Model_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ }
+
+#.FN_BODY GNSS-ID-Bitmap/gnss-ids VAL_PTR = &gnss_ids_tvb LEN_PTR = &len
+ tvbuff_t *gnss_ids_tvb = NULL;
+ int len;
+
+%(DEFAULT_BODY)s
+ if(gnss_ids_tvb){
+ proto_tree *subtree;
+
+ subtree = proto_item_add_subtree(actx->created_item, ett_lpp_bitmap);
+ if (len >= 1) {
+ proto_tree_add_item(subtree, hf_lpp_T_gnss_ids_gps, gnss_ids_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 2) {
+ proto_tree_add_item(subtree, hf_lpp_T_gnss_ids_sbas, gnss_ids_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 3) {
+ proto_tree_add_item(subtree, hf_lpp_T_gnss_ids_qzss, gnss_ids_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 4) {
+ proto_tree_add_item(subtree, hf_lpp_T_gnss_ids_galileo, gnss_ids_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 5) {
+ proto_tree_add_item(subtree, hf_lpp_T_gnss_ids_glonass, gnss_ids_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ }
+
+#.FN_BODY SBAS-IDs/sbas-IDs VAL_PTR = &sbas_IDs_tvb LEN_PTR = &len
+ tvbuff_t *sbas_IDs_tvb = NULL;
+ int len;
+
+%(DEFAULT_BODY)s
+ if(sbas_IDs_tvb){
+ proto_tree *subtree;
+
+ subtree = proto_item_add_subtree(actx->created_item, ett_lpp_bitmap);
+ if (len >= 1) {
+ proto_tree_add_item(subtree, hf_lpp_T_sbas_IDs_waas, sbas_IDs_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 2) {
+ proto_tree_add_item(subtree, hf_lpp_T_sbas_IDs_egnos, sbas_IDs_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 3) {
+ proto_tree_add_item(subtree, hf_lpp_T_sbas_IDs_msas, sbas_IDs_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 4) {
+ proto_tree_add_item(subtree, hf_lpp_T_sbas_IDs_gagan, sbas_IDs_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ }
+
+#.TYPE_ATTR
+MeasuredResultsElement/rsrp-Result DISPLAY=BASE_CUSTOM STRINGS=&lpp_rsrp_Result_fmt
+
+#.TYPE_ATTR
+MeasuredResultsElement/rsrq-Result DISPLAY=BASE_CUSTOM STRINGS=&lpp_rsrq_Result_fmt
+
+#.TYPE_ATTR
+MeasuredResultsElement/ue-RxTxTimeDiff DISPLAY=BASE_CUSTOM STRINGS=&lpp_ue_RxTxTimeDiff_fmt
+
+#.FN_BODY ECID-RequestLocationInformation/requestedMeasurements VAL_PTR = &requestedMeasurements_tvb LEN_PTR = &len
+ tvbuff_t *requestedMeasurements_tvb = NULL;
+ int len;
+
+%(DEFAULT_BODY)s
+ if(requestedMeasurements_tvb){
+ proto_tree *subtree;
+
+ subtree = proto_item_add_subtree(actx->created_item, ett_lpp_bitmap);
+ if (len >= 1) {
+ proto_tree_add_item(subtree, hf_lpp_T_requestedMeasurements_rsrpReq, requestedMeasurements_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 2) {
+ proto_tree_add_item(subtree, hf_lpp_T_requestedMeasurements_rsrqReq, requestedMeasurements_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 3) {
+ proto_tree_add_item(subtree, hf_lpp_T_requestedMeasurements_ueRxTxReq, requestedMeasurements_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ }
+
+#.FN_BODY ECID-ProvideCapabilities/ecid-MeasSupported VAL_PTR = &ecid_MeasSupported_tvb LEN_PTR = &len
+ tvbuff_t *ecid_MeasSupported_tvb = NULL;
+ int len;
+
+%(DEFAULT_BODY)s
+ if(ecid_MeasSupported_tvb){
+ proto_tree *subtree;
+
+ subtree = proto_item_add_subtree(actx->created_item, ett_lpp_bitmap);
+ if (len >= 1) {
+ proto_tree_add_item(subtree, hf_lpp_T_ecid_MeasSupported_rsrpSup, ecid_MeasSupported_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 2) {
+ proto_tree_add_item(subtree, hf_lpp_T_ecid_MeasSupported_rsrqSup, ecid_MeasSupported_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ if (len >= 3) {
+ proto_tree_add_item(subtree, hf_lpp_T_ecid_MeasSupported_ueRxTxSup, ecid_MeasSupported_tvb, 0, 1, ENC_BIG_ENDIAN);
+ }
+ }
diff --git a/asn1/lpp/packet-lpp-template.c b/asn1/lpp/packet-lpp-template.c
index b25339a6be..e64081b8de 100644
--- a/asn1/lpp/packet-lpp-template.c
+++ b/asn1/lpp/packet-lpp-template.c
@@ -27,6 +27,7 @@
*/
#include "config.h"
+#include "math.h"
#include <glib.h>
#include <epan/packet.h>
@@ -38,11 +39,6 @@
#define PSNAME "LPP"
#define PFNAME "lpp"
-#ifdef _MSC_VER
-/* disable: "warning C4146: unary minus operator applied to unsigned type, result still unsigned" */
-#pragma warning(disable:4146)
-#endif
-
/* Initialize the protocol and registered fields */
static int proto_lpp = -1;
@@ -54,6 +50,7 @@ static guint32 lpp_epdu_id = -1;
/* Initialize the subtree pointers */
static gint ett_lpp = -1;
+static gint ett_lpp_bitmap = -1;
#include "packet-lpp-ett.c"
/* Include constants */
@@ -64,8 +61,1297 @@ static const value_string lpp_ePDU_ID_vals[] = {
{ 0, NULL}
};
+static void
+lpp_degreesLatitude_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f degrees (%u)",
+ ((float)v/8388607.0)*90, v);
+}
+
+static void
+lpp_degreesLongitude_fmt(gchar *s, guint32 v)
+{
+ gint32 longitude = (gint32) v;
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f degrees (%d)",
+ ((float)longitude/8388608.0)*180, longitude);
+}
+
+static void
+lpp_uncertainty_fmt(gchar *s, guint32 v)
+{
+ double uncertainty = 10*(pow(1.1, (double)v)-1);
+
+ if (uncertainty < 1000) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f m (%u)", uncertainty, v);
+ } else {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f km (%u)", uncertainty/1000, v);
+ }
+}
+
+static void
+lpp_angle_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u degrees (%u)", 2*v, v);
+}
+
+static void
+lpp_confidence_fmt(gchar *s, guint32 v)
+{
+ if (v == 0) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "no information (0)");
+ } else {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u %%", v);
+ }
+}
+
+static void
+lpp_altitude_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u m", v);
+}
+
+static void
+lpp_uncertaintyAltitude_fmt(gchar *s, guint32 v)
+{
+ double uncertainty = 45*(pow(1.025, (double)v)-1);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f m (%u)", uncertainty, v);
+}
+
+static void
+lpp_radius_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u m (%u)", 5*v, v);
+}
+
+static void
+lpp_expectedRSTD_fmt(gchar *s, guint32 v)
+{
+ gint32 rstd = 3*((gint32)v-8192);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%d Ts (%u)", rstd, v);
+}
+
+static void
+lpp_expectedRSTD_Uncertainty_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u Ts (%u)", 3*v, v);
+}
+
+static void
+lpp_rstd_fmt(gchar *s, guint32 v)
+{
+ if (v == 0) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "RSTD < -15391 Ts (0)");
+ } else if (v < 2260) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "-%u Ts <= RSTD < -%u Ts (%u)", 15391-5*(v-1), 15391-5*v, v);
+ } else if (v < 6355) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "-%u Ts <= RSTD < -%u Ts (%u)", 6356-v, 6355-v, v);
+ } else if (v == 6355) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "-1 Ts <= RSTD <= 0 Ts (6355)");
+ } else if (v < 10452) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u Ts < RSTD <= %u Ts (%u)", v-6356, v-6355, v);
+ } else if (v < 12711) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u Ts < RSTD <= %u Ts (%u)", 5*(v-1)-48159, 5*v-48159, v);
+ } else {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "15391 Ts < RSTD (12711)");
+ }
+}
+
+static const value_string lpp_error_Resolution_vals[] = {
+ { 0, "5 meters"},
+ { 1, "10 meters"},
+ { 2, "20 meters"},
+ { 3, "30 meters"},
+ { 0, NULL}
+};
+
+static const value_string lpp_error_Value_vals[] = {
+ { 0, "0 to (R*1-1) meters"},
+ { 1, "R*1 to (R*2-1) meters"},
+ { 2, "R*2 to (R*3-1) meters"},
+ { 3, "R*3 to (R*4-1) meters"},
+ { 4, "R*4 to (R*5-1) meters"},
+ { 5, "R*5 to (R*6-1) meters"},
+ { 6, "R*6 to (R*7-1) meters"},
+ { 7, "R*7 to (R*8-1) meters"},
+ { 8, "R*8 to (R*9-1) meters"},
+ { 9, "R*9 to (R*10-1) meters"},
+ { 10, "R*10 to (R*11-1) meters"},
+ { 11, "R*11 to (R*12-1) meters"},
+ { 12, "R*12 to (R*13-1) meters"},
+ { 13, "R*13 to (R*14-1) meters"},
+ { 14, "R*14 to (R*15-1) meters"},
+ { 15, "R*15 to (R*16-1) meters"},
+ { 16, "R*16 to (R*17-1) meters"},
+ { 17, "R*17 to (R*18-1) meters"},
+ { 18, "R*18 to (R*19-1) meters"},
+ { 19, "R*19 to (R*20-1) meters"},
+ { 20, "R*20 to (R*21-1) meters"},
+ { 21, "R*21 to (R*22-1) meters"},
+ { 22, "R*22 to (R*23-1) meters"},
+ { 23, "R*23 to (R*24-1) meters"},
+ { 24, "R*24 to (R*25-1) meters"},
+ { 25, "R*25 to (R*26-1) meters"},
+ { 26, "R*26 to (R*27-1) meters"},
+ { 27, "R*27 to (R*28-1) meters"},
+ { 28, "R*28 to (R*29-1) meters"},
+ { 29, "R*29 to (R*30-1) meters"},
+ { 30, "R*30 to (R*31-1) meters"},
+ { 31, "R*31 meters or more"},
+ { 0, NULL}
+};
+static value_string_ext lpp_error_Value_vals_ext = VALUE_STRING_EXT_INIT(lpp_error_Value_vals);
+
+static const value_string lpp_error_NumSamples_vals[] = {
+ { 0, "Not the baseline metric"},
+ { 1, "5-9"},
+ { 2, "10-14"},
+ { 3, "15-24"},
+ { 4, "25-34"},
+ { 5, "35-44"},
+ { 6, "45-54"},
+ { 7, "55 or more"},
+ { 0, NULL}
+};
+
+static void
+lpp_referenceTimeUnc_fmt(gchar *s, guint32 v)
+{
+ double referenceTimeUnc = 0.5*(pow(1.14, (double)v)-1);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f us (%u)", referenceTimeUnc, v);
+}
+
+static const value_string lpp_kp_vals[] = {
+ { 0, "No UTC correction at the end of current quarter"},
+ { 1, "UTC correction by plus (+1 s) in the end of current quarter"},
+ { 3, "UTC correction by minus (-1 s) in the end of current quarter"},
+ { 0, NULL}
+};
+
+static void
+lpp_fractionalSecondsFromFrameStructureStart_fmt(gchar *s, guint32 v)
+{
+ float frac = ((float)v)/4;
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f us (%u)", frac, v);
+}
+
+static void
+lpp_frameDrift_fmt(gchar *s, guint32 v)
+{
+ double drift = (double)((gint32)v)*pow(2, -30);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/s (%d)", drift, (gint32)v);
+}
+
+static const value_string lpp_dataID_vals[] = {
+ { 0, "Parameters are applicable worldwide"},
+ { 3, "Parameters have been generated by QZSS"},
+ { 0, NULL}
+};
+
+static void
+lpp_alpha0_fmt(gchar *s, guint32 v)
+{
+ double alpha = (double)((gint32)v)*pow(2, -30);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s (%d)", alpha, (gint32)v);
+}
+
+static void
+lpp_alpha1_fmt(gchar *s, guint32 v)
+{
+ double alpha = (double)((gint32)v)*pow(2, -27);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/semi-circle (%d)", alpha, (gint32)v);
+}
+
+static void
+lpp_alpha2_3_fmt(gchar *s, guint32 v)
+{
+ double alpha = (double)((gint32)v)*pow(2, -24);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/semi-circle (%d)", alpha, (gint32)v);
+}
+
+static void
+lpp_beta0_fmt(gchar *s, guint32 v)
+{
+ double beta = (double)((gint32)v)*pow(2, 11);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s (%d)", beta, (gint32)v);
+}
+
+static void
+lpp_beta1_fmt(gchar *s, guint32 v)
+{
+ double beta = (double)((gint32)v)*pow(2, 14);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/semi-circle (%d)", beta, (gint32)v);
+}
+
+static void
+lpp_beta2_3_fmt(gchar *s, guint32 v)
+{
+ double beta = (double)((gint32)v)*pow(2, 16);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/semi-circle (%d)", beta, (gint32)v);
+}
+
+static void
+lpp_ai0_fmt(gchar *s, guint32 v)
+{
+ double ai = (double)v*pow(2, -2);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e sfu (%u)", ai, v);
+}
+
+static void
+lpp_ai1_fmt(gchar *s, guint32 v)
+{
+ double ai = (double)v*pow(2, -8);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e sfu/degree (%u)", ai, v);
+}
+
+static void
+lpp_ai2_fmt(gchar *s, guint32 v)
+{
+ double ai = (double)v*pow(2, -15);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e sfu/degree (%u)", ai, v);
+}
+
+static void
+lpp_teop_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u s (%u)", 16*v, v);
+}
+
+static void
+lpp_pmX_Y_fmt(gchar *s, guint32 v)
+{
+ double pm = (double)((gint32)v)*pow(2, -20);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e arc-seconds (%d)", pm, (gint32)v);
+}
+
+static void
+lpp_pmX_Ydot_fmt(gchar *s, guint32 v)
+{
+ double pmDot = (double)((gint32)v)*pow(2, -21);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e arc-seconds/day (%d)", pmDot, (gint32)v);
+}
+
+static void
+lpp_deltaUT1_fmt(gchar *s, guint32 v)
+{
+ double deltaUT1 = (double)((gint32)v)*pow(2, -24);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s (%d)", deltaUT1, (gint32)v);
+}
+
+static void
+lpp_deltaUT1dot_fmt(gchar *s, guint32 v)
+{
+ double deltaUT1dot = (double)((gint32)v)*pow(2, -25);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/day (%d)", deltaUT1dot, (gint32)v);
+}
+
+static void
+lpp_gnss_TimeModelRefTime_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u s (%u)", v*16, v);
+}
+
+static void
+lpp_tA0_fmt(gchar *s, guint32 v)
+{
+ double tA0 = (double)((gint32)v)*pow(2, -35);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s (%d)", tA0, (gint32)v);
+}
+
+static void
+lpp_tA1_fmt(gchar *s, guint32 v)
+{
+ double tA1 = (double)((gint32)v)*pow(2, -51);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/s (%d)", tA1, (gint32)v);
+}
+
+static void
+lpp_tA2_fmt(gchar *s, guint32 v)
+{
+ double tA2 = (double)((gint32)v)*pow(2, -68);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/s2 (%d)", tA2, (gint32)v);
+}
+
+static const value_string lpp_gnss_TO_ID_vals[] = {
+ { 1, "GPS"},
+ { 2, "Galileo"},
+ { 3, "QZSS"},
+ { 4, "GLONASS"},
+ { 0, NULL}
+};
+
+static const value_string lpp_gnss_StatusHealth_vals[] = {
+ { 0, "UDRE Scale Factor = 1.0"},
+ { 1, "UDRE Scale Factor = 0.75"},
+ { 2, "UDRE Scale Factor = 0.5"},
+ { 3, "UDRE Scale Factor = 0.3"},
+ { 4, "UDRE Scale Factor = 0.2"},
+ { 5, "UDRE Scale Factor = 0.1"},
+ { 6, "Reference Station Transmission Not Monitored"},
+ { 7, "Data is invalid - disregard"},
+ { 0, NULL}
+};
+
+static const value_string lpp_udre_vals[] = {
+ { 0, "UDRE <= 1.0 m"},
+ { 1, "1.0 m < UDRE <= 4.0 m"},
+ { 2, "4.0 m < UDRE <= 8.0 m"},
+ { 3, "8.0 m < UDRE"},
+ { 0, NULL}
+};
+
+static void
+lpp_pseudoRangeCor_fmt(gchar *s, guint32 v)
+{
+ double pseudoRangeCor = ((double)(gint32)v)*0.32;
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f m (%d)", pseudoRangeCor, (gint32)v);
+}
+
+static void
+lpp_rangeRateCor_fmt(gchar *s, guint32 v)
+{
+ double rangeRateCor = ((double)(gint32)v)*0.032;
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f m/s (%d)", rangeRateCor, (gint32)v);
+}
+
+static const value_string lpp_udreGrowthRate_vals[] = {
+ { 0, "1.5"},
+ { 1, "2"},
+ { 2, "4"},
+ { 3, "6"},
+ { 4, "8"},
+ { 5, "10"},
+ { 6, "12"},
+ { 7, "16"},
+ { 0, NULL}
+};
+
+static const value_string lpp_udreValidityTime_vals[] = {
+ { 0, "20 s"},
+ { 1, "40 s"},
+ { 2, "80 s"},
+ { 3, "160 s"},
+ { 4, "320 s"},
+ { 5, "640 s"},
+ { 6, "1280 s"},
+ { 7, "2560 s"},
+ { 0, NULL}
+};
+
+static void
+lpp_stanClockToc_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u m/s (%u)", 60*v, v);
+}
+
+static void
+lpp_stanClockAF2_fmt(gchar *s, guint32 v)
+{
+ double stanClockAF2 = (double)((gint32)v)*pow(2, -65);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/s2 (%d)", stanClockAF2, (gint32)v);
+}
+
+static void
+lpp_stanClockAF1_fmt(gchar *s, guint32 v)
+{
+ double stanClockAF1 = (double)((gint32)v)*pow(2, -45);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/s (%d)", stanClockAF1, (gint32)v);
+}
+
+static void
+lpp_stanClockAF0_fmt(gchar *s, guint32 v)
+{
+ double stanClockAF0 = (double)((gint32)v)*pow(2, -33);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s (%d)", stanClockAF0, (gint32)v);
+}
+
+static void
+lpp_stanClockTgd_fmt(gchar *s, guint32 v)
+{
+ double stanClockTgd = (double)((gint32)v)*pow(2, -32);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s (%d)", stanClockTgd, (gint32)v);
+}
+
+static const value_string lpp_stanModelID_vals[] = {
+ { 0, "I/Nav"},
+ { 1, "F/Nav"},
+ { 0, NULL}
+};
+
+static void
+lpp_navToc_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u s (%u)", 16*v, v);
+}
+
+static void
+lpp_navaf2_fmt(gchar *s, guint32 v)
+{
+ double navaf2 = (double)((gint32)v)*pow(2, -55);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/s2 (%d)", navaf2, (gint32)v);
+}
+
+static void
+lpp_navaf1_fmt(gchar *s, guint32 v)
+{
+ double navaf1 = (double)((gint32)v)*pow(2, -43);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/s (%d)", navaf1, (gint32)v);
+}
+
+static void
+lpp_navaf0_navTgd_fmt(gchar *s, guint32 v)
+{
+ double navaf0_navTgd = (double)((gint32)v)*pow(2, -31);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/s (%d)", navaf0_navTgd, (gint32)v);
+}
+
+static void
+lpp_cnavToc_cnavTop_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u s (%u)", 300*v, v);
+}
+
+static void
+lpp_cnavAf2_fmt(gchar *s, guint32 v)
+{
+ double cnavAf2 = (double)((gint32)v)*pow(2, -60);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/s2 (%d)", cnavAf2, (gint32)v);
+}
+
+static void
+lpp_cnavAf1_fmt(gchar *s, guint32 v)
+{
+ double cnavAf1 = (double)((gint32)v)*pow(2, -48);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/s (%d)", cnavAf1, (gint32)v);
+}
+
+static void
+lpp_cnavX_fmt(gchar *s, guint32 v)
+{
+ double cnavX = (double)((gint32)v)*pow(2, -35);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s (%d)", cnavX, (gint32)v);
+}
+
+static void
+lpp_gloTau_gloDeltaTau_fmt(gchar *s, guint32 v)
+{
+ double gloTau_gloDeltaTau = (double)((gint32)v)*pow(2, -30);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s (%d)", gloTau_gloDeltaTau, (gint32)v);
+}
+
+static void
+lpp_gloGamma_fmt(gchar *s, guint32 v)
+{
+ double gloGamma = (double)((gint32)v)*pow(2, -40);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e (%d)", gloGamma, (gint32)v);
+}
+
+static void
+lpp_sbasTo_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u s (%u)", 16*v, v);
+}
+
+static void
+lpp_sbasAgfo_fmt(gchar *s, guint32 v)
+{
+ double sbasAgfo = (double)((gint32)v)*pow(2, -31);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s (%d)", sbasAgfo, (gint32)v);
+}
+
+static void
+lpp_sbasAgf1_fmt(gchar *s, guint32 v)
+{
+ double sbasAgf1 = (double)((gint32)v)*pow(2, -40);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/s (%d)", sbasAgf1, (gint32)v);
+}
+
+static void
+lpp_keplerToe_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u s (%u)", 60*v, v);
+}
+
+static void
+lpp_keplerW_M0_I0_Omega0_fmt(gchar *s, guint32 v)
+{
+ double keplerW_M0_I0_Omega0 = (double)((gint32)v)*pow(2, -31);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e semi-circles (%d)", keplerW_M0_I0_Omega0, (gint32)v);
+}
+
+static void
+lpp_keplerDeltaN_OmegaDot_IDot_fmt(gchar *s, guint32 v)
+{
+ double keplerDeltaN_OmegaDot_IDot = (double)((gint32)v)*pow(2, -43);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e semi-circles/s (%d)", keplerDeltaN_OmegaDot_IDot, (gint32)v);
+}
+
+static void
+lpp_keplerE_fmt(gchar *s, guint32 v)
+{
+ double keplerE = (double)v*pow(2, -33);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e (%u)", keplerE, v);
+}
+
+static void
+lpp_keplerAPowerHalf_fmt(gchar *s, guint32 v)
+{
+ double keplerAPowerHalf = (double)v*pow(2, -19);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e m1/2 (%u)", keplerAPowerHalf, v);
+}
+
+static void
+lpp_keplerCrs_Crc_fmt(gchar *s, guint32 v)
+{
+ double keplerCrs_Crc = (double)((gint32)v)*pow(2, -5);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e m (%d)", keplerCrs_Crc, (gint32)v);
+}
+
+static void
+lpp_keplerCx_fmt(gchar *s, guint32 v)
+{
+ double keplerCx = (double)((gint32)v)*pow(2, -29);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e rad (%d)", keplerCx, (gint32)v);
+}
+
+static void
+lpp_navToe_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u s (%u)", 16*v, v);
+}
+
+static void
+lpp_navOmega_M0_I0_OmegaA0_fmt(gchar *s, guint32 v)
+{
+ double navOmega_M0_I0_OmegaA0 = (double)((gint32)v)*pow(2, -31);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e semi-circles (%d)", navOmega_M0_I0_OmegaA0, (gint32)v);
+}
+
+static void
+lpp_navDeltaN_OmegaADot_IDot_fmt(gchar *s, guint32 v)
+{
+ double navDeltaN_OmegaADot_IDot = (double)((gint32)v)*pow(2, -43);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e semi-circles/s (%d)", navDeltaN_OmegaADot_IDot, (gint32)v);
+}
+
+static void
+lpp_navE_fmt(gchar *s, guint32 v)
+{
+ double navE = (double)v*pow(2, -33);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e (%u)", navE, v);
+}
+
+static void
+lpp_navAPowerHalf_fmt(gchar *s, guint32 v)
+{
+ double navAPowerHalf = (double)v*pow(2, -19);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e m1/2 (%u)", navAPowerHalf, v);
+}
+
+static void
+lpp_navCrs_Crc_fmt(gchar *s, guint32 v)
+{
+ double navCrs_Crc = (double)((gint32)v)*pow(2, -5);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e m (%d)", navCrs_Crc, (gint32)v);
+}
+
+static void
+lpp_navCx_fmt(gchar *s, guint32 v)
+{
+ double navCx = (double)((gint32)v)*pow(2, -29);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e rad (%d)", navCx, (gint32)v);
+}
+
+static void
+lpp_cnavDeltaA_fmt(gchar *s, guint32 v)
+{
+ double cnavDeltaA = (double)((gint32)v)*pow(2, -9);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e m (%d)", cnavDeltaA, (gint32)v);
+}
+
+static void
+lpp_cnavAdot_fmt(gchar *s, guint32 v)
+{
+ double cnavAdot = (double)((gint32)v)*pow(2, -21);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e m/s (%d)", cnavAdot, (gint32)v);
+}
+
+static void
+lpp_cnavDeltaNo_fmt(gchar *s, guint32 v)
+{
+ double cnavDeltaNo = (double)((gint32)v)*pow(2, -44);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e semi-circles/s (%d)", cnavDeltaNo, (gint32)v);
+}
+
+static void
+lpp_cnavDeltaNoDot_fmt(gchar *s, guint32 v)
+{
+ double cnavDeltaNoDot = (double)((gint32)v)*pow(2, -57);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e semi-circles/s2 (%d)", cnavDeltaNoDot, (gint32)v);
+}
+
+static void
+lpp_cnavDeltaOmegaDot_IoDot_fmt(gchar *s, guint32 v)
+{
+ double cnavDeltaOmegaDot_IoDot = (double)((gint32)v)*pow(2, -44);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e semi-circles/s (%d)", cnavDeltaOmegaDot_IoDot, (gint32)v);
+}
+
+static void
+lpp_cnavCx_fmt(gchar *s, guint32 v)
+{
+ double cnavCx = (double)((gint32)v)*pow(2, -30);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e rad (%d)", cnavCx, (gint32)v);
+}
+
+static void
+lpp_cnavCrs_Crc_fmt(gchar *s, guint32 v)
+{
+ double cnavCrs_Crc = (double)((gint32)v)*pow(2, -8);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e m (%d)", cnavCrs_Crc, (gint32)v);
+}
+
+static void
+lpp_gloX_Y_Z_fmt(gchar *s, guint32 v)
+{
+ double gloX_Y_Z = (double)((gint32)v)*pow(2, -11);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e km (%d)", gloX_Y_Z, (gint32)v);
+}
+
+static void
+lpp_gloXdot_Ydot_Zdot_fmt(gchar *s, guint32 v)
+{
+ double gloXdot_Ydot_Zdot = (double)((gint32)v)*pow(2, -20);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e km/s (%d)", gloXdot_Ydot_Zdot, (gint32)v);
+}
+
+static void
+lpp_gloXdotdot_Ydotdot_Zdotdot_fmt(gchar *s, guint32 v)
+{
+ double gloXdotdot_Ydotdot_Zdotdot = (double)((gint32)v)*pow(2, -30);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e km/s2 (%d)", gloXdotdot_Ydotdot_Zdotdot, (gint32)v);
+}
+
+static void
+lpp_sbasXg_Yg_fmt(gchar *s, guint32 v)
+{
+ double sbasXg_Yg = (double)((gint32)v)*0.08;
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f m (%d)", sbasXg_Yg, (gint32)v);
+}
+
+static void
+lpp_sbasZg_fmt(gchar *s, guint32 v)
+{
+ double sbasZg = (double)((gint32)v)*0.4;
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f m (%d)", sbasZg, (gint32)v);
+}
+
+static void
+lpp_sbasXgDot_YgDot_fmt(gchar *s, guint32 v)
+{
+ double sbasXgDot_YgDot = (double)((gint32)v)*0.000625;
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f m/s (%d)", sbasXgDot_YgDot, (gint32)v);
+}
+
+static void
+lpp_sbasZgDot_fmt(gchar *s, guint32 v)
+{
+ double sbasZgDot = (double)((gint32)v)*0.004;
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f m/s (%d)", sbasZgDot, (gint32)v);
+}
+
+static void
+lpp_sbasXgDotDot_YgDotDot_fmt(gchar *s, guint32 v)
+{
+ double sbasXgDotDot_YgDotDot = (double)((gint32)v)*0.0000125;
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e m/s2 (%d)", sbasXgDotDot_YgDotDot, (gint32)v);
+}
+
+static void
+lpp_sbasZgDotDot_fmt(gchar *s, guint32 v)
+{
+ double sbasZgDotDot = (double)((gint32)v)*0.0000625;
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e m/s2 (%d)", sbasZgDotDot, (gint32)v);
+}
+
+static void
+lpp_doppler0_fmt(gchar *s, guint32 v)
+{
+ double doppler0 = (double)((gint32)v)*0.5;
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f m/s (%d)", doppler0, (gint32)v);
+}
+
+static void
+lpp_doppler1_fmt(gchar *s, guint32 v)
+{
+ double doppler1 = (double)((gint32)(v-42))/210;
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f m/s2 (%u)", doppler1, v);
+}
+
+static const value_string lpp_dopplerUncertainty_vals[] = {
+ { 0, "40 m/s"},
+ { 1, "20 m/s"},
+ { 2, "10 m/s"},
+ { 3, "5 m/s"},
+ { 4, "2.5 m/s"},
+ { 0, NULL}
+};
+
+static void
+lpp_codePhase_fmt(gchar *s, guint32 v)
+{
+ double codePhase = (double)v*pow(2, -10);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e ms (%u)", codePhase, v);
+}
+
+static const value_string lpp_codePhaseSearchWindow_vals[] = {
+ { 0, "No information"},
+ { 1, "0.002 ms"},
+ { 2, "0.004 ms"},
+ { 3, "0.008 ms"},
+ { 4, "0.012 ms"},
+ { 5, "0.016 ms"},
+ { 6, "0.024 ms"},
+ { 7, "0.032 ms"},
+ { 8, "0.048 ms"},
+ { 9, "0.064 ms"},
+ { 10, "0.096 ms"},
+ { 11, "0.128 ms"},
+ { 12, "0.164 ms"},
+ { 13, "0.200 ms"},
+ { 14, "0.250 ms"},
+ { 15, "0.300 ms"},
+ { 16, "0.360 ms"},
+ { 17, "0.420 ms"},
+ { 18, "0.480 ms"},
+ { 19, "0.540 ms"},
+ { 20, "0.600 ms"},
+ { 21, "0.660 ms"},
+ { 22, "0.720 ms"},
+ { 23, "0.780 ms"},
+ { 24, "0.850 ms"},
+ { 25, "1.000 ms"},
+ { 26, "1.150 ms"},
+ { 27, "1.300 ms"},
+ { 28, "1.450 ms"},
+ { 29, "1.600 ms"},
+ { 30, "1.800 ms"},
+ { 31, "2.000 ms"},
+ { 0, NULL}
+};
+static value_string_ext lpp_codePhaseSearchWindow_vals_ext = VALUE_STRING_EXT_INIT(lpp_codePhaseSearchWindow_vals);
+
+static void
+lpp_azimuth_elevation_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f degrees (%u)", (float)v*0.703125, v);
+}
+
+static void
+lpp_toa_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u s (%u)", 4096*v, v);
+}
+
+static void
+lpp_kepAlmanacE_fmt(gchar *s, guint32 v)
+{
+ double kepAlmanacE = (double)v*pow(2, -16);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e (%u)", kepAlmanacE, v);
+}
+
+static void
+lpp_kepAlmanacDeltaI_fmt(gchar *s, guint32 v)
+{
+ double kepAlmanacDeltaI = (double)((gint32)v)*pow(2, -14);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e semi-circles (%d)", kepAlmanacDeltaI, (gint32)v);
+}
+
+static void
+lpp_kepAlmanacOmegaDot_fmt(gchar *s, guint32 v)
+{
+ double kepAlmanacOmegaDot = (double)((gint32)v)*pow(2, -33);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e semi-circles/s (%d)", kepAlmanacOmegaDot, (gint32)v);
+}
+
+static void
+lpp_kepAlmanacAPowerHalf_fmt(gchar *s, guint32 v)
+{
+ double kepAlmanacAPowerHalf = (double)((gint32)v)*pow(2, -9);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e m1/2 (%d)", kepAlmanacAPowerHalf, (gint32)v);
+}
+
+static void
+lpp_kepAlmanacOmega0_W_M0_fmt(gchar *s, guint32 v)
+{
+ double kepAlmanacOmega0_W_M0 = (double)((gint32)v)*pow(2, -15);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e semi-circles (%d)", kepAlmanacOmega0_W_M0, (gint32)v);
+}
+
+static void
+lpp_kepAlmanacAF0_fmt(gchar *s, guint32 v)
+{
+ double kepAlmanacAF0 = (double)((gint32)v)*pow(2, -19);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s (%d)", kepAlmanacAF0, (gint32)v);
+}
+
+static void
+lpp_kepAlmanacAF1_fmt(gchar *s, guint32 v)
+{
+ double kepAlmanacAF1 = (double)((gint32)v)*pow(2, -38);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/s (%d)", kepAlmanacAF1, (gint32)v);
+}
+
+static void
+lpp_navAlmE_fmt(gchar *s, guint32 v)
+{
+ double navAlmE = (double)v*pow(2, -21);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e (%u)", navAlmE, v);
+}
+
+static void
+lpp_navAlmDeltaI_fmt(gchar *s, guint32 v)
+{
+ double navAlmDeltaI = (double)((gint32)v)*pow(2, -19);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e semi-circles (%d)", navAlmDeltaI, (gint32)v);
+}
+
+static void
+lpp_navAlmOMEGADOT_fmt(gchar *s, guint32 v)
+{
+ double navAlmOMEGADOT = (double)((gint32)v)*pow(2, -38);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e semi-circles/s (%d)", navAlmOMEGADOT, (gint32)v);
+}
+
+static void
+lpp_navAlmSqrtA_fmt(gchar *s, guint32 v)
+{
+ double navAlmSqrtA = (double)v*pow(2, -11);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e m1/2 (%u)", navAlmSqrtA, v);
+}
+
+static void
+lpp_navAlmOMEGAo_Omega_Mo_fmt(gchar *s, guint32 v)
+{
+ double navAlmOMEGAo_Omega_Mo = (double)((gint32)v)*pow(2, -23);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e semi-circles (%d)", navAlmOMEGAo_Omega_Mo, (gint32)v);
+}
+
+static void
+lpp_navAlmaf0_fmt(gchar *s, guint32 v)
+{
+ double navAlmaf0 = (double)((gint32)v)*pow(2, -20);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s (%d)", navAlmaf0, (gint32)v);
+}
+
+static void
+lpp_navAlmaf1_fmt(gchar *s, guint32 v)
+{
+ double navAlmaf1 = (double)((gint32)v)*pow(2, -38);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/s (%d)", navAlmaf1, (gint32)v);
+}
+
+static void
+lpp_redAlmDeltaA_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%d m (%d)", 512*(gint)v, (gint)v);
+}
+
+static void
+lpp_redAlmOmega0_Phi0_fmt(gchar *s, guint32 v)
+{
+ double redAlmOmega0_Phi0 = (double)((gint32)v)*pow(2, -6);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e semi-circles (%d)", redAlmOmega0_Phi0, (gint32)v);
+}
+
+static void
+lpp_midiAlmE_fmt(gchar *s, guint32 v)
+{
+ double midiAlmE = (double)v*pow(2, -16);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e (%u)", midiAlmE, v);
+}
+
+static void
+lpp_midiAlmDeltaI_fmt(gchar *s, guint32 v)
+{
+ double midiAlmDeltaI = (double)((gint32)v)*pow(2, -14);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e semi-circles (%d)", midiAlmDeltaI, (gint32)v);
+}
+
+static void
+lpp_midiAlmOmegaDot_fmt(gchar *s, guint32 v)
+{
+ double midiAlmOmegaDot = (double)((gint32)v)*pow(2, -33);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e semi-circles/s (%d)", midiAlmOmegaDot, (gint32)v);
+}
+
+static void
+lpp_midiAlmSqrtA_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f m1/2 (%u)", (float)v*0.0625, v);
+}
+
+static void
+lpp_midiAlmOmega0_Omega_Mo_fmt(gchar *s, guint32 v)
+{
+ double midiAlmOmega0_Omega_Mo = (double)((gint32)v)*pow(2, -15);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e semi-circles (%d)", midiAlmOmega0_Omega_Mo, (gint32)v);
+}
+
+static void
+lpp_midiAlmaf0_fmt(gchar *s, guint32 v)
+{
+ double midiAlmaf0 = (double)((gint32)v)*pow(2, -20);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s (%d)", midiAlmaf0, (gint32)v);
+}
+
+static void
+lpp_midiAlmaf1_fmt(gchar *s, guint32 v)
+{
+ double midiAlmaf1 = (double)((gint32)v)*pow(2, -37);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/s (%d)", midiAlmaf1, (gint32)v);
+}
+
+static void
+lpp_gloAlmLambdaA_DeltaIa_fmt(gchar *s, guint32 v)
+{
+ double gloAlmLambdaA_DeltaIa = (double)((gint32)v)*pow(2, -20);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e semi-circles (%d)", gloAlmLambdaA_DeltaIa, (gint32)v);
+}
+
+static void
+lpp_gloAlmtlambdaA_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f s (%u)", (float)v*0.03125, v);
+}
+
+static void
+lpp_gloAlmDeltaTA_fmt(gchar *s, guint32 v)
+{
+ double gloAlmDeltaTA = (double)((gint32)v)*pow(2, -9);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/orbit period (%d)", gloAlmDeltaTA, (gint32)v);
+}
+
+static void
+lpp_gloAlmDeltaTdotA_fmt(gchar *s, guint32 v)
+{
+ double gloAlmDeltaTdotA = (double)((gint32)v)*pow(2, -14);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/orbit period (%d)", gloAlmDeltaTdotA, (gint32)v);
+}
+
+static void
+lpp_gloAlmEpsilonA_fmt(gchar *s, guint32 v)
+{
+ double gloAlmEpsilonA = (double)v*pow(2, -20);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e (%u)", gloAlmEpsilonA, (gint32)v);
+}
+
+static void
+lpp_gloAlmOmegaA_fmt(gchar *s, guint32 v)
+{
+ double gloAlmOmegaA = (double)((gint32)v)*pow(2, -15);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e semi-circles (%d)", gloAlmOmegaA, (gint32)v);
+}
+
+static void
+lpp_gloAlmTauA_fmt(gchar *s, guint32 v)
+{
+ double gloAlmTauA = (double)((gint32)v)*pow(2, -18);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s (%d)", gloAlmTauA, (gint32)v);
+}
+
+static void
+lpp_sbasAlmXg_Yg_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f km (%d)", (gint32)v*2.6, (gint32)v);
+}
+
+static void
+lpp_sbasAlmZg_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%d km (%d)", (gint32)v*26, (gint32)v);
+}
+
+static void
+lpp_sbasAlmXgdot_YgDot_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%d m/s (%d)", (gint32)v*10, (gint32)v);
+}
+
+static void
+lpp_sbasAlmZgDot_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f m/s (%d)", (gint32)v*40.96, (gint32)v);
+}
+
+static void
+lpp_sbasAlmTo_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u m/s (%u)", v*64, v);
+}
+
+static void
+lpp_gnss_Utc_A1_fmt(gchar *s, guint32 v)
+{
+ double gnss_Utc_A1 = (double)((gint32)v)*pow(2, -50);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/s (%d)", gnss_Utc_A1, (gint32)v);
+}
+
+static void
+lpp_gnss_Utc_A0_fmt(gchar *s, guint32 v)
+{
+ double gnss_Utc_A0 = (double)((gint32)v)*pow(2, -30);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s (%d)", gnss_Utc_A0, (gint32)v);
+}
+
+static void
+lpp_gnss_Utc_Tot_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u s (%u)", v*4096, v);
+}
+
+static void
+lpp_tauC_fmt(gchar *s, guint32 v)
+{
+ double tauC = (double)((gint32)v)*pow(2, -31);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s (%d)", tauC, (gint32)v);
+}
+
+static void
+lpp_b1_fmt(gchar *s, guint32 v)
+{
+ double b1 = (double)((gint32)v)*pow(2, -10);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s (%d)", b1, (gint32)v);
+}
+
+static void
+lpp_b2_fmt(gchar *s, guint32 v)
+{
+ double b2 = (double)((gint32)v)*pow(2, -16);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e s/msd (%d)", b2, (gint32)v);
+}
+
+static const value_string lpp_utcStandardID_vals[] = {
+ { 0, "UTC as operated by the Communications Research Laboratory (CRL), Tokyo, Japan"},
+ { 1, "UTC as operated by the National Institute of Standards and Technology (NIST)"},
+ { 2, "UTC as operated by the U. S. Naval Observatory (USNO)"},
+ { 3, "UTC as operated by the International Bureau of Weights and Measures (BIPM)"},
+ { 0, NULL}
+};
+
+static const value_string lpp_dataBitInterval_vals[] = {
+ { 0, "0.1"},
+ { 1, "0.2"},
+ { 2, "0.4"},
+ { 3, "0.8"},
+ { 4, "1.6"},
+ { 5, "3.2"},
+ { 6, "6.4"},
+ { 7, "12.8"},
+ { 8, "25.6"},
+ { 9, "51.2"},
+ { 10, "102.4"},
+ { 11, "204.8"},
+ { 12, "409.6"},
+ { 13, "819.2"},
+ { 14, "1638.4"},
+ { 15, "Not specified"},
+ { 0, NULL}
+};
+static value_string_ext lpp_dataBitInterval_vals_ext = VALUE_STRING_EXT_INIT(lpp_dataBitInterval_vals);
+
+static const value_string lpp_carrierQualityInd_vals[] = {
+ { 0, "Data direct, carrier phase not continuous"},
+ { 1, "Data inverted, carrier phase not continuous"},
+ { 2, "Data direct, carrier phase continuous"},
+ { 3, "Data inverted, carrier phase continuous"},
+ { 0, NULL}
+};
+
+static void
+lpp_GNSS_SatMeas_codePhase_fmt(gchar *s, guint32 v)
+{
+ double codePhase = (double)v*pow(2, -21);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e ms (%u)", codePhase, v);
+}
+
+static void
+lpp_codePhaseRMSError_fmt(gchar *s, guint32 v)
+{
+ guint8 mantissa = v & 0x07;
+ guint8 exponent = (v & 0x38) >> 3;
+ guint8 mantissa_1 = (v - 1) & 0x07;
+ guint8 exponent_1 = ((v - 1) & 0x38) >> 3;
+
+ if (v == 0) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "P < 0.5 (0)");
+ } else if (v < 63) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%f <= P < %f (%u)", 0.5*(1+mantissa_1/8)*pow(2, exponent_1),
+ 0.5*(1+mantissa/8)*pow(2, exponent), v);
+ } else {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "112 <= P (63)");
+ }
+}
+
+static void
+lpp_doppler_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e m/s (%d)", (gint32)v*0.04, (gint32)v);
+}
+
+static void
+lpp_adr_fmt(gchar *s, guint32 v)
+{
+ double adr = (double)v*pow(2, -10);
+
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%e m (%u)", adr, v);
+}
+
+static void
+lpp_rsrp_Result_fmt(gchar *s, guint32 v)
+{
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%d dBm (%u)", v-140, v);
+}
+
+static void
+lpp_rsrq_Result_fmt(gchar *s, guint32 v)
+{
+ if (v == 0) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "RSRQ < -19.5 dB (0)");
+ } else if (v < 34) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%.1f dB <= RSRQ < %.1f dB (%u)", ((float)v/2)-20, (((float)v+1)/2)-20, v);
+ } else {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "-3 dB <= RSRQ (34)");
+ }
+}
+
+static void
+lpp_ue_RxTxTimeDiff_fmt(gchar *s, guint32 v)
+{
+ if (v == 0) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "T < 2 Ts (0)");
+ } else if (v < 2048) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u Ts <= T < %u Ts (%u)", v*2, (v+1)*2, v);
+ } else if (v < 4095) {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "%u Ts <= T < %u Ts (%u)", (v*8)-12288, ((v+1)*8)-12288, v);
+ } else {
+ g_snprintf(s, ITEM_LABEL_LENGTH, "20472 Ts <= T (4095)");
+ }
+}
+
#include "packet-lpp-fn.c"
+static int dissect_lpp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) {
+ proto_tree *subtree;
+ proto_item *it;
+
+ it = proto_tree_add_item(tree, proto_lpp, tvb, 0, -1, ENC_NA);
+ col_append_sep_str(pinfo->cinfo, COL_PROTOCOL, "/", "LPP");
+ subtree = proto_item_add_subtree(it, ett_lpp);
+
+ return dissect_LPP_Message_PDU(tvb, pinfo, subtree, NULL);
+}
/*--- proto_register_lpp -------------------------------------------*/
void proto_register_lpp(void) {
@@ -78,14 +1364,15 @@ void proto_register_lpp(void) {
/* List of subtrees */
static gint *ett[] = {
- &ett_lpp,
+ &ett_lpp,
+ &ett_lpp_bitmap,
#include "packet-lpp-ettarr.c"
};
/* Register protocol */
proto_lpp = proto_register_protocol(PNAME, PSNAME, PFNAME);
- new_register_dissector("lpp", dissect_LPP_Message_PDU, proto_lpp);
+ new_register_dissector("lpp", dissect_lpp, proto_lpp);
/* Register fields and subtrees */
proto_register_field_array(proto_lpp, hf, array_length(hf));