From aad83f57053a6a3f0bf2788ca9f1ae44305fe7bc Mon Sep 17 00:00:00 2001 From: Tony Cabello Miguel <> Date: Tue, 4 May 2021 17:29:01 +0200 Subject: [PATCH 1/4] OSD Fix: show hyphen when no sats --- src/main/osd/osd_elements.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/osd/osd_elements.c b/src/main/osd/osd_elements.c index 5c2da49533..b21393d650 100644 --- a/src/main/osd/osd_elements.c +++ b/src/main/osd/osd_elements.c @@ -1057,16 +1057,24 @@ static void osdElementGpsCoordinate(osdElementParms_t *element) static void osdElementGpsSats(osdElementParms_t *element) { - int pos = tfp_sprintf(element->buff, "%c%c%2d", SYM_SAT_L, SYM_SAT_R, gpsSol.numSat); - if (osdConfig()->gps_sats_show_hdop) { // add on the GPS module HDOP estimate - element->buff[pos++] = ' '; - osdPrintFloat(element->buff + pos, SYM_NONE, gpsSol.hdop / 100.0f, "", 1, true, SYM_NONE); + if (!gpsIsHealthy()) { + tfp_sprintf(element->buff, "%c%c%c", SYM_SAT_L, SYM_SAT_R, SYM_HYPHEN); + } else { + int pos = tfp_sprintf(element->buff, "%c%c%2d", SYM_SAT_L, SYM_SAT_R, gpsSol.numSat); + if (osdConfig()->gps_sats_show_hdop) { // add on the GPS module HDOP estimate + element->buff[pos++] = ' '; + osdPrintFloat(element->buff + pos, SYM_NONE, gpsSol.hdop / 100.0f, "", 1, true, SYM_NONE); + } } } static void osdElementGpsSpeed(osdElementParms_t *element) { - tfp_sprintf(element->buff, "%c%3d%c", SYM_SPEED, osdGetSpeedToSelectedUnit(gpsConfig()->gps_use_3d_speed ? gpsSol.speed3d : gpsSol.groundSpeed), osdGetSpeedToSelectedUnitSymbol()); + if (STATE(GPS_FIX)) { + tfp_sprintf(element->buff, "%c%3d%c", SYM_SPEED, osdGetSpeedToSelectedUnit(gpsConfig()->gps_use_3d_speed ? gpsSol.speed3d : gpsSol.groundSpeed), osdGetSpeedToSelectedUnitSymbol()); + } else { + tfp_sprintf(element->buff, "%c%c%c", SYM_SPEED, SYM_HYPHEN, osdGetSpeedToSelectedUnitSymbol()); + } } static void osdElementEfficiency(osdElementParms_t *element) From c56d81457f24aee9dff008fb0df4af5b90e5facd Mon Sep 17 00:00:00 2001 From: Tony Cabello Miguel <> Date: Wed, 5 May 2021 08:55:50 +0200 Subject: [PATCH 2/4] Fixed tests, replaced hyphen with NC --- src/main/osd/osd_elements.c | 2 +- src/test/unit/link_quality_unittest.cc | 1 + src/test/unit/osd_unittest.cc | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/osd/osd_elements.c b/src/main/osd/osd_elements.c index b21393d650..952eb3bb66 100644 --- a/src/main/osd/osd_elements.c +++ b/src/main/osd/osd_elements.c @@ -1058,7 +1058,7 @@ static void osdElementGpsCoordinate(osdElementParms_t *element) static void osdElementGpsSats(osdElementParms_t *element) { if (!gpsIsHealthy()) { - tfp_sprintf(element->buff, "%c%c%c", SYM_SAT_L, SYM_SAT_R, SYM_HYPHEN); + tfp_sprintf(element->buff, "%c%cNC", SYM_SAT_L, SYM_SAT_R); } else { int pos = tfp_sprintf(element->buff, "%c%c%2d", SYM_SAT_L, SYM_SAT_R, gpsSol.numSat); if (osdConfig()->gps_sats_show_hdop) { // add on the GPS module HDOP estimate diff --git a/src/test/unit/link_quality_unittest.cc b/src/test/unit/link_quality_unittest.cc index 26441c40bb..6bca72fe7a 100644 --- a/src/test/unit/link_quality_unittest.cc +++ b/src/test/unit/link_quality_unittest.cc @@ -445,6 +445,7 @@ extern "C" { bool areMotorsRunning(void){ return true; } bool pidOsdAntiGravityActive(void) { return false; } bool failsafeIsActive(void) { return false; } + bool gpsIsHealthy(void) { return true; } bool gpsRescueIsConfigured(void) { return false; } int8_t calculateThrottlePercent(void) { return 0; } uint32_t persistentObjectRead(persistentObjectId_e) { return 0; } diff --git a/src/test/unit/osd_unittest.cc b/src/test/unit/osd_unittest.cc index 66b78bc345..98f4afcafd 100644 --- a/src/test/unit/osd_unittest.cc +++ b/src/test/unit/osd_unittest.cc @@ -1242,6 +1242,7 @@ extern "C" { bool pidOsdAntiGravityActive(void) { return false; } bool failsafeIsActive(void) { return false; } bool gpsRescueIsConfigured(void) { return false; } + bool gpsIsHealthy(void) { return true; } int8_t calculateThrottlePercent(void) { return 0; } uint32_t persistentObjectRead(persistentObjectId_e) { return 0; } void persistentObjectWrite(persistentObjectId_e, uint32_t) {} From 561b15be707883bc21ba915fa9dc397f7dd77e62 Mon Sep 17 00:00:00 2001 From: Tony Cabello Miguel <> Date: Wed, 5 May 2021 10:27:03 +0200 Subject: [PATCH 3/4] WIP: Unit test for OSD Sats element --- src/test/unit/osd_unittest.cc | 44 ++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/src/test/unit/osd_unittest.cc b/src/test/unit/osd_unittest.cc index 98f4afcafd..9b92c454b5 100644 --- a/src/test/unit/osd_unittest.cc +++ b/src/test/unit/osd_unittest.cc @@ -104,6 +104,7 @@ extern "C" { int32_t simulationAltitude; int32_t simulationVerticalSpeed; uint16_t simulationCoreTemperature; + bool simulationGpsHealthy; } uint32_t simulationFeatureFlags = FEATURE_GPS; @@ -130,6 +131,7 @@ void setDefaultSimulationState() simulationAltitude = 0; simulationVerticalSpeed = 0; simulationCoreTemperature = 0; + simulationGpsHealthy = false; rcData[PITCH] = 1500; @@ -1134,6 +1136,46 @@ TEST_F(OsdTest, TestConvertTemperatureUnits) EXPECT_EQ(osdConvertTemperatureToSelectedUnit(41), 106); } +TEST_F(OsdTest, TestGpsElements) +{ + // given + osdElementConfigMutable()->item_pos[OSD_GPS_SATS] = OSD_POS(2, 4) | OSD_PROFILE_1_FLAG; + + sensorsSet(SENSOR_GPS); + osdAnalyzeActiveElements(); + + // when + simulationGpsHealthy = false; + gpsSol.numSat = 0; + + displayClearScreen(&testDisplayPort); + osdRefresh(simulationTime); + + // then + displayPortTestBufferSubstring(2, 4, "%c%cNC", SYM_SAT_L, SYM_SAT_R); + + // when + simulationGpsHealthy = true; + gpsSol.numSat = 0; + + displayClearScreen(&testDisplayPort); + osdRefresh(simulationTime); + + // then + displayPortTestBufferSubstring(2, 4, "%c%c%2d", SYM_SAT_L, SYM_SAT_R, 0); + + // when + simulationGpsHealthy = true; + gpsSol.numSat = 10; + + displayClearScreen(&testDisplayPort); + osdRefresh(simulationTime); + + // then + displayPortTestBufferSubstring(2, 4, "%c%c%2d", SYM_SAT_L, SYM_SAT_R, 10); + +} + // STUBS extern "C" { bool featureIsEnabled(uint32_t f) { return simulationFeatureFlags & f; } @@ -1242,7 +1284,7 @@ extern "C" { bool pidOsdAntiGravityActive(void) { return false; } bool failsafeIsActive(void) { return false; } bool gpsRescueIsConfigured(void) { return false; } - bool gpsIsHealthy(void) { return true; } + bool gpsIsHealthy(void) { return simulationGpsHealthy; } int8_t calculateThrottlePercent(void) { return 0; } uint32_t persistentObjectRead(persistentObjectId_e) { return 0; } void persistentObjectWrite(persistentObjectId_e, uint32_t) {} From 56cb320be0718e2b8b883149a7f878c8741eb00f Mon Sep 17 00:00:00 2001 From: Tony Cabello Miguel <> Date: Wed, 5 May 2021 15:26:41 +0200 Subject: [PATCH 4/4] OSD Test for Sats indicator fixed --- src/test/unit/osd_unittest.cc | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/test/unit/osd_unittest.cc b/src/test/unit/osd_unittest.cc index 9b92c454b5..d397afdcbc 100644 --- a/src/test/unit/osd_unittest.cc +++ b/src/test/unit/osd_unittest.cc @@ -1152,7 +1152,18 @@ TEST_F(OsdTest, TestGpsElements) osdRefresh(simulationTime); // then - displayPortTestBufferSubstring(2, 4, "%c%cNC", SYM_SAT_L, SYM_SAT_R); + // Sat indicator should blink and show "NC" + for (int i = 0; i < 15; i++) { + // Blinking should happen at 5Hz + simulationTime += 0.2e6; + osdRefresh(simulationTime); + + if (i % 2 == 0) { + displayPortTestBufferSubstring(2, 4, "%c%cNC", SYM_SAT_L, SYM_SAT_R); + } else { + displayPortTestBufferIsEmpty(); + } + } // when simulationGpsHealthy = true; @@ -1162,7 +1173,18 @@ TEST_F(OsdTest, TestGpsElements) osdRefresh(simulationTime); // then - displayPortTestBufferSubstring(2, 4, "%c%c%2d", SYM_SAT_L, SYM_SAT_R, 0); + // Sat indicator should blink and show "0" + for (int i = 0; i < 15; i++) { + // Blinking should happen at 5Hz + simulationTime += 0.2e6; + osdRefresh(simulationTime); + + if (i % 2 == 0) { + displayPortTestBufferSubstring(2, 4, "%c%c 0", SYM_SAT_L, SYM_SAT_R); + } else { + displayPortTestBufferIsEmpty(); + } + } // when simulationGpsHealthy = true; @@ -1172,8 +1194,14 @@ TEST_F(OsdTest, TestGpsElements) osdRefresh(simulationTime); // then - displayPortTestBufferSubstring(2, 4, "%c%c%2d", SYM_SAT_L, SYM_SAT_R, 10); + // Sat indicator should show "10" without flashing + for (int i = 0; i < 15; i++) { + // Blinking should happen at 5Hz + simulationTime += 0.2e6; + osdRefresh(simulationTime); + displayPortTestBufferSubstring(2, 4, "%c%c10", SYM_SAT_L, SYM_SAT_R); + } } // STUBS