From 2372eb6e37a40b5b49cf33dc9006c16e7ccd77a6 Mon Sep 17 00:00:00 2001 From: Darren Lines Date: Fri, 9 Jul 2021 14:27:27 +0100 Subject: [PATCH] Finished before flight test...I think There are some hacks in this, due to running out of 0-254 indexed characters in the font, needed for the char array. --- src/main/drivers/osd_symbols.h | 26 ++++++++++----------- src/main/fc/settings.yaml | 2 +- src/main/io/osd.c | 41 +++++++++++++++++++++++++--------- src/main/io/osd.h | 2 +- src/main/io/osd_dji_hd.c | 2 +- src/main/io/osd_hud.c | 2 +- 6 files changed, 48 insertions(+), 27 deletions(-) diff --git a/src/main/drivers/osd_symbols.h b/src/main/drivers/osd_symbols.h index e9b080b5df..edba423522 100644 --- a/src/main/drivers/osd_symbols.h +++ b/src/main/drivers/osd_symbols.h @@ -36,8 +36,8 @@ #define SYM_AH_NM 0x120 // 288 Ah/NM #define SYM_MAH_MI_0 0x0A // 010 mAh/mi left #define SYM_MAH_MI_1 0x0B // 011 mAh/mi right -#define SYM_MAH_NM_0 0x11E // 286 mAh/NM left -#define SYM_MAH_NM_1 0x11F // 287 mAh/NM right +#define SYM_MAH_NM_0 0xDA // 286 mAh/NM left +#define SYM_MAH_NM_1 0xDB // 287 mAh/NM right #define SYM_LQ 0x0C // 012 LQ #define SYM_TEMP_F 0x0D // 013 °F @@ -118,7 +118,7 @@ #define SYM_3D_KMH 0x89 // 137 KM/H 3D #define SYM_3D_MPH 0x8A // 138 MPH 3D -#define SYM_3D_KTS 0x11B // 283 Knots 3D +#define SYM_3D_KTS 0x119 // 281 Knots 3D #define SYM_RPM 0x8B // 139 RPM #define SYM_WAYPOINT 0x8C // 140 Waypoint @@ -138,7 +138,7 @@ #define SYM_AIR 0x97 // 151 Air speed // 0x98 // 152 Home point map #define SYM_FTS 0x99 // 153 FT/S -#define SYM_100FTM 0x11D // 285 100 Feet per Min +#define SYM_100FTM 0xDC // 220 100 Feet per Min #define SYM_AMP 0x9A // 154 A #define SYM_ON_M 0x9B // 155 On MN #define SYM_FLY_M 0x9C // 156 FL MN @@ -165,7 +165,7 @@ #define SYM_WATT 0xAE // 174 W #define SYM_SCALE 0xAF // 175 Map scale #define SYM_MPH 0xB0 // 176 MPH -#define SYM_KTS 0x11C // 284 Knots +#define SYM_KTS 0xDE // 222 Knots #define SYM_ALT_M 0xB1 // 177 ALT M #define SYM_ALT_KM 0xB2 // 178 ALT KM #define SYM_ALT_FT 0xB3 // 179 ALT FT @@ -174,11 +174,11 @@ #define SYM_DIST_KM 0xB6 // 182 DIM KM #define SYM_DIST_FT 0xB7 // 183 DIS FT #define SYM_DIST_MI 0xB8 // 184 DIS MI -#define SYM_DIST_NM 0x119 // 281 DIS NM +#define SYM_DIST_NM 0xFE // 254 DIS NM #define SYM_M 0xB9 // 185 M #define SYM_KM 0xBA // 186 KM #define SYM_MI 0xBB // 187 MI -#define SYM_NM 0x11A // 282 NM +#define SYM_NM 0xDD // 221 NM #define SYM_CLOCK 0xBC // 188 Clock #define SYM_HDP_L 0xBD // 189 HDOP left @@ -197,12 +197,6 @@ #define SYM_ZERO_HALF_LEADING_DOT 0xD0 // 208 to 217 Numbers with leading dot -#define SYM_AH_CH_AIRCRAFT0 0xDA // 218 Crossair aircraft left -#define SYM_AH_CH_AIRCRAFT1 0xDB // 219 Crossair aircraft -#define SYM_AH_CH_AIRCRAFT2 0xDC // 220 Crossair aircraft center -#define SYM_AH_CH_AIRCRAFT3 0xDD // 221 Crossair aircraft -#define SYM_AH_CH_AIRCRAFT4 0xDE // 222 Crossair aircraft right - #define SYM_PITCH_DOWN 0xDF // 223 Pitch down #define SYM_AH_V_START 0xE0 // 224 to 229 Vertical AHI @@ -237,6 +231,12 @@ #define SYM_AH_CH_TYPE6 0x199 // 409 to 411, crosshair 6 #define SYM_AH_CH_TYPE7 0x19C // 412 to 414, crosshair 7 +#define SYM_AH_CH_AIRCRAFT0 0x1AE // 430 Crossair aircraft left +#define SYM_AH_CH_AIRCRAFT1 0x1AF // 431 Crossair aircraft +#define SYM_AH_CH_AIRCRAFT2 0x1B0 // 432 Crossair aircraft center +#define SYM_AH_CH_AIRCRAFT3 0x1B1 // 433 Crossair aircraft +#define SYM_AH_CH_AIRCRAFT4 0x1B2 // 434 Crossair aircraft right + #define SYM_HUD_ARROWS_L1 0x1A2 // 418 1 arrow left #define SYM_HUD_ARROWS_L2 0x1A3 // 419 2 arrows left #define SYM_HUD_ARROWS_L3 0x1A4 // 420 3 arrows left diff --git a/src/main/fc/settings.yaml b/src/main/fc/settings.yaml index 1d821e4467..b2b9488353 100644 --- a/src/main/fc/settings.yaml +++ b/src/main/fc/settings.yaml @@ -64,7 +64,7 @@ tables: - name: nav_rth_alt_mode values: ["CURRENT", "EXTRA", "FIXED", "MAX", "AT_LEAST", "AT_LEAST_LINEAR_DESCENT"] - name: osd_unit - values: ["IMPERIAL", "METRIC", "METRIC_MPH", "UK"] + values: ["IMPERIAL", "METRIC", "METRIC_MPH", "UK", "GA"] enum: osd_unit_e - name: osd_stats_energy_unit values: ["MAH", "WH"] diff --git a/src/main/io/osd.c b/src/main/io/osd.c index 7d45aae3ec..63e8eea991 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -421,7 +421,7 @@ static int32_t osdConvertVelocityToUnit(int32_t vel) * Converts velocity into a string based on the current unit system. * @param alt Raw velocity (i.e. as taken from gpsSol.groundSpeed in centimeters/seconds) */ -void osdFormatVelocityStr(char* buff, int32_t vel, bool _3D) +void osdFormatVelocityStr(char* buff, int32_t vel, bool _3D, uint8_t elemPosX, uint8_t elemPosY) { switch ((osd_unit_e)osdConfig()->units) { case OSD_UNIT_UK: @@ -435,7 +435,12 @@ void osdFormatVelocityStr(char* buff, int32_t vel, bool _3D) tfp_sprintf(buff, "%3d%c", (int)osdConvertVelocityToUnit(vel), (_3D ? SYM_3D_KMH : SYM_KMH)); break; case OSD_UNIT_GA: - tfp_sprintf(buff, "%3d%c", (int)osdConvertVelocityToUnit(vel), (_3D ? SYM_3D_KTS : SYM_KTS)); + if (_3D) { + tfp_sprintf(buff, "%3d", (int)osdConvertVelocityToUnit(vel)); + displayWriteChar(osdDisplayPort, elemPosX + 3, elemPosY, SYM_3D_KTS); + } else { + tfp_sprintf(buff, "%3d%c", (int)osdConvertVelocityToUnit(vel), SYM_KTS); + } break; } } @@ -1569,12 +1574,12 @@ static bool osdDrawSingleElement(uint8_t item) break; case OSD_GPS_SPEED: - osdFormatVelocityStr(buff, gpsSol.groundSpeed, false); + osdFormatVelocityStr(buff, gpsSol.groundSpeed, false, elemPosX, elemPosY); break; case OSD_3D_SPEED: { - osdFormatVelocityStr(buff, osdGet3DSpeed(), true); + osdFormatVelocityStr(buff, osdGet3DSpeed(), true, elemPosX, elemPosY); break; } @@ -1869,13 +1874,27 @@ static bool osdDrawSingleElement(uint8_t item) #endif buff[0] = SYM_TRIP_DIST; if ((!ARMING_FLAG(ARMED)) || (distanceMeters == -1)) { - buff[4] = SYM_DIST_M; + buff[4] = SYM_BLANK; buff[5] = '\0'; strcpy(buff + 1, "---"); } else if (distanceMeters == -2) { // Wind is too strong to come back with cruise throttle buff[1] = buff[2] = buff[3] = SYM_WIND_HORIZONTAL; - buff[4] = SYM_DIST_M; + switch ((osd_unit_e)osdConfig()->units){ + case OSD_UNIT_UK: + FALLTHROUGH; + case OSD_UNIT_IMPERIAL: + buff[4] = SYM_DIST_MI; + break; + case OSD_UNIT_METRIC_MPH: + FALLTHROUGH; + case OSD_UNIT_METRIC: + buff[4] = SYM_DIST_KM; + break; + case OSD_UNIT_GA: + buff[4] = SYM_DIST_NM; + break; + } buff[5] = '\0'; TEXT_ATTRIBUTES_ADD_BLINK(elemAttr); } else { @@ -2391,7 +2410,7 @@ static bool osdDrawSingleElement(uint8_t item) { #ifdef USE_PITOT buff[0] = SYM_AIR; - osdFormatVelocityStr(buff + 1, pitot.airSpeed, false); + osdFormatVelocityStr(buff + 1, pitot.airSpeed, false, elemPosX, elemPosY); #else return false; #endif @@ -2553,7 +2572,8 @@ static bool osdDrawSingleElement(uint8_t item) break; case OSD_UNIT_GA: osdFormatCentiNumber(buff, value * METERS_PER_NAUTICALMILE / 10000, 0, 2, 0, 3); - buff[3] = SYM_WH_NM; + // buff[3] = SYM_WH_NM; + displayWriteChar(osdDisplayPort, elemPosX +3, elemPosY, SYM_WH_NM); break; case OSD_UNIT_METRIC_MPH: FALLTHROUGH; @@ -3367,7 +3387,8 @@ static void osdCompleteAsyncInitialization(void) break; case OSD_UNIT_GA: osdFormatCentiNumber(string_buffer, avg_efficiency / 10, 0, 2, 0, 3); - string_buffer[3] = SYM_WH_NM; + displayWriteChar(osdDisplayPort, STATS_LABEL_X_POS +3, y, SYM_WH_NM); + // string_buffer[3] = SYM_WH_NM; break; default: case OSD_UNIT_METRIC_MPH: @@ -3477,7 +3498,7 @@ static void osdShowStatsPage1(void) if (feature(FEATURE_GPS)) { displayWrite(osdDisplayPort, statNameX, top, "MAX SPEED :"); - osdFormatVelocityStr(buff, stats.max_speed, true); + osdFormatVelocityStr(buff, stats.max_speed, true, statValuesX, top); osdLeftAlignString(buff); displayWrite(osdDisplayPort, statValuesX, top++, buff); diff --git a/src/main/io/osd.h b/src/main/io/osd.h index 9c89308042..efb1021503 100644 --- a/src/main/io/osd.h +++ b/src/main/io/osd.h @@ -412,7 +412,7 @@ int32_t osdGetAltitude(void); void osdCrosshairPosition(uint8_t *x, uint8_t *y); bool osdFormatCentiNumber(char *buff, int32_t centivalue, uint32_t scale, int maxDecimals, int maxScaledDecimals, int length); void osdFormatAltitudeSymbol(char *buff, int32_t alt); -void osdFormatVelocityStr(char* buff, int32_t vel, bool _3D); +void osdFormatVelocityStr(char* buff, int32_t vel, bool _3D, uint8_t elemPosX, uint8_t elemPosY); // Returns a heading angle in degrees normalized to [0, 360). int osdGetHeadingAngle(int angle); diff --git a/src/main/io/osd_dji_hd.c b/src/main/io/osd_dji_hd.c index 4736a1aef8..ceac0e6f67 100644 --- a/src/main/io/osd_dji_hd.c +++ b/src/main/io/osd_dji_hd.c @@ -749,7 +749,7 @@ static void osdDJIFormatDistanceStr(char *buff, int32_t dist) else { // Show miles when dist >= 0.5mi tfp_sprintf(buff, "%d.%02d%s", (int)(centifeet / (100 * FEET_PER_NAUTICALMILE)), - (abs(centifeet) % (int)(100 * FEET_PER_NAUTICALMILE)) / FEET_PER_NAUTICALMILE, "NM"); + (int)((abs(centifeet) % (int)(100 * FEET_PER_NAUTICALMILE)) / FEET_PER_NAUTICALMILE), "NM"); } break; case OSD_UNIT_METRIC_MPH: diff --git a/src/main/io/osd_hud.c b/src/main/io/osd_hud.c index ed131f7496..ae9b30278b 100644 --- a/src/main/io/osd_hud.c +++ b/src/main/io/osd_hud.c @@ -345,7 +345,7 @@ void osdHudDrawExtras(uint8_t poi_id) displayWrite(osdGetDisplayPort(), minX + 4, lineY, buftmp); - osdFormatVelocityStr(buftmp, radar_pois[poi_id].speed, false); + osdFormatVelocityStr(buftmp, radar_pois[poi_id].speed, false, minX + 5, lineY); displayWrite(osdGetDisplayPort(), maxX - 9, lineY, buftmp); tfp_sprintf(buftmp, "%3d%c", radar_pois[poi_id].heading, SYM_HEADING);