diff --git a/simgear/environment/metar.cxx b/simgear/environment/metar.cxx index 4bd5f0e1..3a70842e 100644 --- a/simgear/environment/metar.cxx +++ b/simgear/environment/metar.cxx @@ -646,16 +646,21 @@ bool SGMetar::scanWind() double gust = NaN; if (*m == 'G') { m++; - if (!scanNumber(&m, &i, 2, 3)) + if (!strncmp(m, "//", 2)) // speed not measurable + m += 2, i = -1; + else if (!scanNumber(&m, &i, 2, 3)) return false; - gust = i; + + if (i != -1) + gust = i; } + double factor; if (!strncmp(m, "KT", 2)) m += 2, factor = SG_KT_TO_MPS; - else if (!strncmp(m, "KMH", 3)) + else if (!strncmp(m, "KMH", 3)) // invalid Km/h m += 3, factor = SG_KMH_TO_MPS; - else if (!strncmp(m, "KPH", 3)) // ?? + else if (!strncmp(m, "KPH", 3)) // invalid Km/h m += 3, factor = SG_KMH_TO_MPS; else if (!strncmp(m, "MPS", 3)) m += 3, factor = 1.0; @@ -680,18 +685,28 @@ bool SGMetar::scanVariability() { char *m = _m; int from, to; - if (!scanNumber(&m, &from, 3)) + + if (!strncmp(m, "///", 3)) // direction not measurable + m += 3, from = -1; + else if (!scanNumber(&m, &from, 3)) return false; + if (*m++ != 'V') return false; - if (!scanNumber(&m, &to, 3)) + + if (!strncmp(m, "///", 3)) // direction not measurable + m += 3, to = -1; + else if (!scanNumber(&m, &to, 3)) return false; + if (!scanBoundary(&m)) return false; + _m = m; _wind_range_from = from; _wind_range_to = to; _grpcount++; + return true; } diff --git a/simgear/environment/test_metar.cxx b/simgear/environment/test_metar.cxx index 25b65ad3..ba1765a9 100644 --- a/simgear/environment/test_metar.cxx +++ b/simgear/environment/test_metar.cxx @@ -87,6 +87,15 @@ void test_sensor_failure_wind() SGMetar m1("2020/10/23 16:55 LIVD 231655Z /////KT 9999 OVC025 10/08 Q1020 RMK OVC VIS MIN 9999 BLU"); SG_CHECK_EQUAL(m1.getWindDir(), -1); SG_CHECK_EQUAL_EP2(m1.getWindSpeed_kt(), -1, TEST_EPSILON); + + SGMetar m2("2020/10/21 16:55 LIVD 211655Z /////KT CAVOK 07/03 Q1023 RMK SKC VIS MIN 9999 BLU"); + SG_CHECK_EQUAL(m2.getWindDir(), -1); + SG_CHECK_EQUAL_EP2(m2.getWindSpeed_kt(), -1, TEST_EPSILON); + + SGMetar m3("2020/11/17 16:00 CYAZ 171600Z 14040G//KT 10SM -RA OVC012 12/11 A2895 RMK NS8 VIA CYXY SLP806 DENSITY ALT 900FT"); + SG_CHECK_EQUAL(m3.getWindDir(), 140); + SG_CHECK_EQUAL_EP2(m3.getWindSpeed_kt(), 40, TEST_EPSILON); + SG_CHECK_EQUAL_EP2(m3.getGustSpeed_kt(), SGMetarNaN, TEST_EPSILON); } void test_wind_unit_not_specified()