ITS: use custom value format for CPM elements

This commit is contained in:
Tomas Kukosa 2021-09-01 07:37:25 +02:00 committed by Wireshark GitLab Utility
parent cdfab0d6e9
commit 033068916d
4 changed files with 490 additions and 313 deletions

View File

@ -290,6 +290,10 @@ Node-XY-32b/y n32bY
Longitude DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(its_longitude_fmt)
Latitude DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(its_latitude_fmt)
AltitudeValue DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(its_altitude_fmt)
DeltaLatitude DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(its_delta_longitude_fmt)
DeltaLongitude DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(its_delta_latitude_fmt)
DeltaAltitude DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(its_delta_altitude_fmt)
PathDeltaTime DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(its_path_delta_time_fmt)
SemiAxisLength DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(its_sax_length_fmt)
HeadingValue DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(its_heading_value_fmt)
HeadingConfidence DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(its_heading_confidence_fmt)
@ -316,6 +320,19 @@ Velocity DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(dsrc_velocity_fmt)
Angle DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(dsrc_angle_fmt)
HeadingDSRC DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(dsrc_angle_fmt)
DeltaTime DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(dsrc_delta_time_fmt)
TimeOfMeasurement STRINGS=NULL
ClassConfidence DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(cpm_general_confidence_fmt)
FreeSpaceConfidence DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(cpm_general_confidence_fmt)
ObjectConfidence DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(cpm_general_confidence_fmt)
DistanceValue DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(cpm_distance_value_fmt)
DistanceConfidence DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(cpm_distance_confidence_fmt)
SpeedValueExtended DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(cpm_speed_value_ext_fmt)
CartesianAngleValue DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(cpm_cartesian_angle_value_fmt)
AngleConfidence DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(cpm_angle_confidence_fmt)
ObjectDimensionValue DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(cpm_object_dimension_value_fmt)
ObjectDimensionConfidence DISPLAY=BASE_CUSTOM STRINGS=CF_FUNC(cpm_object_dimension_confidence_fmt)
#.END
#.FIELD_ATTR
@ -766,6 +783,10 @@ addGrpC RegionId
Latitude
Longitude
AltitudeValue
DeltaLatitude
DeltaLongitude
DeltaAltitude
PathDeltaTime
SemiAxisLength
$ITS-ContainerV1$HeadingValue
HeadingConfidence
@ -782,6 +803,17 @@ YawRateValue
SteeringWheelAngleValue
SteeringWheelAngleConfidence
GenerationDeltaTime
TimeOfMeasurement
ClassConfidence
FreeSpaceConfidence
ObjectConfidence
DistanceValue
DistanceConfidence
SpeedValueExtended
CartesianAngleValue
AngleConfidence
ObjectDimensionValue
ObjectDimensionConfidence
#.END
#.NO_EMIT WITHOUT_VALS

View File

@ -363,7 +363,7 @@ its_latitude_fmt(gchar *s, guint32 v)
{
gint32 lat = (gint32)v;
if (lat == 900000001) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", lat);
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", lat);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%u°%u'%.3f\"%c (%d)",
abs(lat) / 10000000,
@ -379,7 +379,7 @@ its_longitude_fmt(gchar *s, guint32 v)
{
gint32 lng = (gint32)v;
if (lng == 1800000001) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", lng);
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", lng);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%u°%u'%.3f\"%c (%d)",
abs(lng) / 10000000,
@ -395,19 +395,70 @@ its_altitude_fmt(gchar *s, guint32 v)
{
gint32 alt = (gint32)v;
if (alt == 800001) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", alt);
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", alt);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%.2fm (%d)", alt * 0.01, alt);
}
}
static void
its_delta_latitude_fmt(gchar *s, guint32 v)
{
gint32 lat = (gint32)v;
if (lat == 131072) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", lat);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%u°%u'%.3f\"%c (%d)",
abs(lat) / 10000000,
abs(lat) % 10000000 * 6 / 1000000,
abs(lat) % 10000000 * 6 % 1000000 * 6.0 / 100000.0,
(lat >= 0) ? 'N' : 'S',
lat);
}
}
static void
its_delta_longitude_fmt(gchar *s, guint32 v)
{
gint32 lng = (gint32)v;
if (lng == 131072) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", lng);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%u°%u'%.3f\"%c (%d)",
abs(lng) / 10000000,
abs(lng) % 10000000 * 6 / 1000000,
abs(lng) % 10000000 * 6 % 1000000 * 6.0 / 100000.0,
(lng >= 0) ? 'E' : 'W',
lng);
}
}
static void
its_delta_altitude_fmt(gchar *s, guint32 v)
{
gint32 alt = (gint32)v;
if (alt == 12800) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", alt);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%.2fm (%d)", alt * 0.01, alt);
}
}
static void
its_path_delta_time_fmt(gchar *s, guint32 v)
{
gint32 dt = (gint32)v;
g_snprintf(s, ITEM_LABEL_LENGTH, "%.2fs (%d)", dt * 0.01, dt);
}
static void
its_sax_length_fmt(gchar *s, guint32 v)
{
if (v == 4095) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", v);
} else if (v == 4094) {
g_snprintf(s, ITEM_LABEL_LENGTH, "outOfRange(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "outOfRange (%d)", v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%.2fm (%d)", v * 0.01, v);
}
@ -418,7 +469,7 @@ its_heading_value_fmt(gchar *s, guint32 v)
{
const gchar *p = try_val_to_str(v, VALS(its_HeadingValue_vals));
if (p) {
g_snprintf(s, ITEM_LABEL_LENGTH, "%s(%d)", p, v);
g_snprintf(s, ITEM_LABEL_LENGTH, "%s (%d)", p, v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%.1f° (%d)", v * 0.1, v);
}
@ -428,9 +479,9 @@ static void
its_heading_confidence_fmt(gchar *s, guint32 v)
{
if (v == 127) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", v);
} else if (v == 126) {
g_snprintf(s, ITEM_LABEL_LENGTH, "outOfRange(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "outOfRange (%d)", v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%.1f° (%d)", v * 0.1, v);
}
@ -440,9 +491,9 @@ static void
its_speed_value_fmt(gchar *s, guint32 v)
{
if (v == 0) {
g_snprintf(s, ITEM_LABEL_LENGTH, "standstill(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "standstill (%d)", v);
} else if (v == 16383) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", v);
} else {
double vms = v * 0.01;
g_snprintf(s, ITEM_LABEL_LENGTH, "%.2fm/s = %.1fkm/h (%d)",
@ -454,9 +505,9 @@ static void
its_speed_confidence_fmt(gchar *s, guint32 v)
{
if (v == 127) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", v);
} else if (v == 126) {
g_snprintf(s, ITEM_LABEL_LENGTH, "outOfRange(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "outOfRange (%d)", v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%.2fm/s (%d)", v * 0.01, v);
}
@ -466,9 +517,9 @@ static void
its_vehicle_length_value_fmt(gchar *s, guint32 v)
{
if (v == 1023) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", v);
} else if (v == 1022) {
g_snprintf(s, ITEM_LABEL_LENGTH, "outOfRange(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "outOfRange (%d)", v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%.1fm (%d)", v * 0.1, v);
}
@ -478,9 +529,9 @@ static void
its_vehicle_width_fmt(gchar *s, guint32 v)
{
if (v == 62) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", v);
} else if (v == 61) {
g_snprintf(s, ITEM_LABEL_LENGTH, "outOfRange(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "outOfRange (%d)", v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%.1fm (%d)", v * 0.1, v);
}
@ -491,7 +542,7 @@ its_acceleration_value_fmt(gchar *s, guint32 v)
{
gint32 acc = (gint32)v;
if (acc == 161) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%.1fm/s² (%d)", acc * 0.1, acc);
}
@ -501,9 +552,9 @@ static void
its_acceleration_confidence_fmt(gchar *s, guint32 v)
{
if (v == 102) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", v);
} else if (v == 101) {
g_snprintf(s, ITEM_LABEL_LENGTH, "outOfRange(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "outOfRange (%d)", v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%.1fm/s² (%d)", v * 0.1, v);
}
@ -514,9 +565,9 @@ its_curvature_value_fmt(gchar *s, guint32 v)
{
gint32 curv = (gint32)v;
if (curv == 0) {
g_snprintf(s, ITEM_LABEL_LENGTH, "straight(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "straight (%d)", v);
} else if (curv == 30001) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%.3fm %s (%d)",
30000.0 / curv,
@ -530,9 +581,9 @@ its_yaw_rate_value_fmt(gchar *s, guint32 v)
{
gint32 yaw = (gint32)v;
if (yaw == 0) {
g_snprintf(s, ITEM_LABEL_LENGTH, "straight(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "straight (%d)", v);
} else if (yaw == 32767) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f°/s %s (%d)",
yaw * 0.01,
@ -546,9 +597,9 @@ its_swa_value_fmt(gchar *s, guint32 v)
{
gint32 swa = (gint32)v;
if (swa == 0) {
g_snprintf(s, ITEM_LABEL_LENGTH, "straight(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "straight (%d)", v);
} else if (swa == 512) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%.1f° %s (%d)",
swa * 1.5,
@ -561,9 +612,9 @@ static void
its_swa_confidence_fmt(gchar *s, guint32 v)
{
if (v == 127) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", v);
} else if (v == 126) {
g_snprintf(s, ITEM_LABEL_LENGTH, "outOfRange(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "outOfRange (%d)", v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%.1f° (%d)", v * 1.5, v);
}
@ -573,7 +624,7 @@ static void
dsrc_moi_fmt(gchar *s, guint32 v)
{
if (v == 527040) {
g_snprintf(s, ITEM_LABEL_LENGTH, "invalid(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "invalid (%d)", v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%ud %02u:%02u (%d)",
v / 1440, v % 1440 / 60, v % 60, v);
@ -584,9 +635,9 @@ static void
dsrc_dsecond_fmt(gchar *s, guint32 v)
{
if (v == 65535) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", v);
} else if ((61000 <= v) && (v <= 65534)) {
g_snprintf(s, ITEM_LABEL_LENGTH, "reserved(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "reserved (%d)", v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%02u.%03u (%d)",
v / 1000, v % 1000, v);
@ -597,9 +648,9 @@ static void
dsrc_time_mark_fmt(gchar *s, guint32 v)
{
if (v == 36001) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unknown(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "unknown (%d)", v);
} else if (v == 36000) {
g_snprintf(s, ITEM_LABEL_LENGTH, "moreThanHour(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "moreThanHour (%d)", v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%02u:%02u.%u (%d)",
v / 600, v % 600 / 10, v % 10, v);
@ -630,7 +681,7 @@ static void
dsrc_velocity_fmt(gchar *s, guint32 v)
{
if (v == 8191) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable(%d)", v);
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", v);
} else {
double vms = v * 0.02;
g_snprintf(s, ITEM_LABEL_LENGTH, "%.2fm/s = %ukm/h (%d)",
@ -649,17 +700,103 @@ dsrc_delta_time_fmt(gchar *s, guint32 v)
{
gint32 dt = (gint32)v;
if (dt == -122) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unknown(%d)", dt);
g_snprintf(s, ITEM_LABEL_LENGTH, "unknown (%d)", dt);
} else if (dt == -121) {
g_snprintf(s, ITEM_LABEL_LENGTH, "moreThanMinus20Minutes(%d)", dt);
g_snprintf(s, ITEM_LABEL_LENGTH, "moreThanMinus20Minutes (%d)", dt);
} else if (dt == 121) {
g_snprintf(s, ITEM_LABEL_LENGTH, "moreThanPlus20Minutes(%d)", dt);
g_snprintf(s, ITEM_LABEL_LENGTH, "moreThanPlus20Minutes (%d)", dt);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%s%d:%02u (%d)",
(dt < 0) ? "-" : "", abs(dt) / 6, abs(dt) % 6 * 10, dt);
}
}
static void
cpm_general_confidence_fmt(gchar *s, guint32 v)
{
if (v == 0) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unknown (%u)", v);
} else if (v == 101) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%u)", v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%u%% (%u)", v, v);
}
}
static void
cpm_distance_value_fmt(gchar *s, guint32 v)
{
gint32 sv = (gint32)v;
g_snprintf(s, ITEM_LABEL_LENGTH, "%.2fm (%d)", sv * 0.01, sv);
}
static void
cpm_distance_confidence_fmt(gchar *s, guint32 v)
{
if (v == 102) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", v);
} else if (v == 101) {
g_snprintf(s, ITEM_LABEL_LENGTH, "outOfRange (%d)", v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%.2fm (%d)", v * 0.01, v);
}
}
static void
cpm_speed_value_ext_fmt(gchar *s, guint32 v)
{
gint32 sv = (gint32)v;
if (sv == 0) {
g_snprintf(s, ITEM_LABEL_LENGTH, "standstill (%d)", sv);
} else if (sv == 16383) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", sv);
} else {
double vms = sv * 0.01;
g_snprintf(s, ITEM_LABEL_LENGTH, "%.2fm/s = %.1fkm/h (%d)",
vms, vms * 3.6, sv);
}
}
static void
cpm_cartesian_angle_value_fmt(gchar *s, guint32 v)
{
if (v == 3601) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%.1f° (%d)", v * 0.1, v);
}
}
static void
cpm_angle_confidence_fmt(gchar *s, guint32 v)
{
if (v == 127) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", v);
} else if (v == 126) {
g_snprintf(s, ITEM_LABEL_LENGTH, "outOfRange (%d)", v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%.1f° (%d)", v * 0.1, v);
}
}
static void
cpm_object_dimension_value_fmt(gchar *s, guint32 v)
{
g_snprintf(s, ITEM_LABEL_LENGTH, "%.1fm (%d)", v * 0.1, v);
}
static void
cpm_object_dimension_confidence_fmt(gchar *s, guint32 v)
{
if (v == 102) {
g_snprintf(s, ITEM_LABEL_LENGTH, "unavailable (%d)", v);
} else if (v == 101) {
g_snprintf(s, ITEM_LABEL_LENGTH, "outOfRange (%d)", v);
} else {
g_snprintf(s, ITEM_LABEL_LENGTH, "%.2fm (%d)", v * 0.01, v);
}
}
static int
dissect_its_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
{

View File

@ -2964,6 +2964,7 @@ void
proto_register_geonw(void)
{
static const value_string bh_next_header_names[] = {
{ 0, "ANY" },
{ 1, "Common Header" },
{ 2, "Secured Packet" },
{ 0, NULL}
@ -2978,6 +2979,7 @@ proto_register_geonw(void)
};
static const value_string ch_next_header_names[] = {
{ 0, "ANY" },
{ CH_NH_BTP_A, "BTP-A Transport protocol" },
{ CH_NH_BTP_B, "BTP-B Transport protocol" },
{ CH_NH_IPV6, "IPv6 header" },

File diff suppressed because it is too large Load Diff