@@ -170,6 +170,13 @@ static bool fullRedraw = false;
170
170
171
171
static uint8_t armState ;
172
172
173
+ typedef struct osdMapData_s {
174
+ uint32_t scale ;
175
+ char referenceSymbol ;
176
+ } osdMapData_t ;
177
+
178
+ static osdMapData_t osdMapData ;
179
+
173
180
static displayPort_t * osdDisplayPort ;
174
181
175
182
#define AH_MAX_PITCH_DEFAULT 20 // Specify default maximum AHI pitch value displayed (degrees)
@@ -976,8 +983,6 @@ static void osdDrawMap(int referenceHeading, uint8_t referenceSym, uint8_t cente
976
983
const int charWidth = 12 ;
977
984
const int charHeight = 18 ;
978
985
979
- char buf [16 ];
980
-
981
986
uint8_t minX = hMargin ;
982
987
uint8_t maxX = osdDisplayPort -> cols - 1 - hMargin ;
983
988
uint8_t minY = vMargin ;
@@ -986,11 +991,6 @@ static void osdDrawMap(int referenceHeading, uint8_t referenceSym, uint8_t cente
986
991
uint8_t midY = osdDisplayPort -> rows / 2 ;
987
992
988
993
// Fixed marks
989
- if (referenceSym ) {
990
- displayWriteChar (osdDisplayPort , maxX , minY , SYM_DIRECTION );
991
- displayWriteChar (osdDisplayPort , maxX , minY + 1 , referenceSym );
992
- }
993
- displayWriteChar (osdDisplayPort , minX , maxY , SYM_SCALE );
994
994
displayWriteChar (osdDisplayPort , midX , midY , centerSym );
995
995
996
996
// First, erase the previous drawing.
@@ -1000,11 +1000,6 @@ static void osdDrawMap(int referenceHeading, uint8_t referenceSym, uint8_t cente
1000
1000
}
1001
1001
1002
1002
uint32_t initialScale ;
1003
- float scaleToUnit ;
1004
- int scaleUnitDivisor ;
1005
- char symUnscaled ;
1006
- char symScaled ;
1007
- int maxDecimals ;
1008
1003
const unsigned scaleMultiplier = 2 ;
1009
1004
// We try to reduce the scale when the POI will be around half the distance
1010
1005
// between the center and the closers map edge, to avoid too much jumping
@@ -1013,21 +1008,11 @@ static void osdDrawMap(int referenceHeading, uint8_t referenceSym, uint8_t cente
1013
1008
switch (osdConfig ()-> units ) {
1014
1009
case OSD_UNIT_IMPERIAL :
1015
1010
initialScale = 16 ; // 16m ~= 0.01miles
1016
- scaleToUnit = 100 / 1609.3440f ; // scale to 0.01mi for osdFormatCentiNumber()
1017
- scaleUnitDivisor = 0 ;
1018
- symUnscaled = SYM_MI ;
1019
- symScaled = SYM_MI ;
1020
- maxDecimals = 2 ;
1021
1011
break ;
1022
1012
case OSD_UNIT_UK :
1023
1013
FALLTHROUGH ;
1024
1014
case OSD_UNIT_METRIC :
1025
1015
initialScale = 10 ; // 10m as initial scale
1026
- scaleToUnit = 100 ; // scale to cm for osdFormatCentiNumber()
1027
- scaleUnitDivisor = 1000 ; // Convert to km when scale gets bigger than 999m
1028
- symUnscaled = SYM_M ;
1029
- symScaled = SYM_KM ;
1030
- maxDecimals = 0 ;
1031
1016
break ;
1032
1017
}
1033
1018
@@ -1110,12 +1095,11 @@ static void osdDrawMap(int referenceHeading, uint8_t referenceSym, uint8_t cente
1110
1095
}
1111
1096
}
1112
1097
1113
- // Draw the used scale
1114
- bool scaled = osdFormatCentiNumber (buf , scale * scaleToUnit , scaleUnitDivisor , maxDecimals , 2 , 3 );
1115
- buf [3 ] = scaled ? symScaled : symUnscaled ;
1116
- buf [4 ] = '\0' ;
1117
- displayWrite (osdDisplayPort , minX + 1 , maxY , buf );
1118
1098
* usedScale = scale ;
1099
+
1100
+ // Update global map data for scale and reference
1101
+ osdMapData .scale = scale ;
1102
+ osdMapData .referenceSymbol = referenceSym ;
1119
1103
}
1120
1104
1121
1105
/* Draws a map with the home in the center and the craft moving around.
@@ -2417,6 +2401,59 @@ static bool osdDrawSingleElement(uint8_t item)
2417
2401
break ;
2418
2402
}
2419
2403
2404
+ case OSD_MAP_SCALE :
2405
+ {
2406
+ float scaleToUnit ;
2407
+ int scaleUnitDivisor ;
2408
+ char symUnscaled ;
2409
+ char symScaled ;
2410
+ int maxDecimals ;
2411
+
2412
+ switch (osdConfig ()-> units ) {
2413
+ case OSD_UNIT_IMPERIAL :
2414
+ scaleToUnit = 100 / 1609.3440f ; // scale to 0.01mi for osdFormatCentiNumber()
2415
+ scaleUnitDivisor = 0 ;
2416
+ symUnscaled = SYM_MI ;
2417
+ symScaled = SYM_MI ;
2418
+ maxDecimals = 2 ;
2419
+ break ;
2420
+ case OSD_UNIT_UK :
2421
+ FALLTHROUGH ;
2422
+ case OSD_UNIT_METRIC :
2423
+ scaleToUnit = 100 ; // scale to cm for osdFormatCentiNumber()
2424
+ scaleUnitDivisor = 1000 ; // Convert to km when scale gets bigger than 999m
2425
+ symUnscaled = SYM_M ;
2426
+ symScaled = SYM_KM ;
2427
+ maxDecimals = 0 ;
2428
+ break ;
2429
+ }
2430
+ buff [0 ] = SYM_SCALE ;
2431
+ if (osdMapData .scale > 0 ) {
2432
+ bool scaled = osdFormatCentiNumber (& buff [1 ], osdMapData .scale * scaleToUnit , scaleUnitDivisor , maxDecimals , 2 , 3 );
2433
+ buff [4 ] = scaled ? symScaled : symUnscaled ;
2434
+ // Make sure this is cleared if the map stops being drawn
2435
+ osdMapData .scale = 0 ;
2436
+ } else {
2437
+ memset (& buff [1 ], '-' , 4 );
2438
+ }
2439
+ buff [5 ] = '\0' ;
2440
+ break ;
2441
+ }
2442
+ case OSD_MAP_REFERENCE :
2443
+ {
2444
+ char referenceSymbol ;
2445
+ if (osdMapData .referenceSymbol ) {
2446
+ referenceSymbol = osdMapData .referenceSymbol ;
2447
+ // Make sure this is cleared if the map stops being drawn
2448
+ osdMapData .referenceSymbol = 0 ;
2449
+ } else {
2450
+ referenceSymbol = '-' ;
2451
+ }
2452
+ displayWriteChar (osdDisplayPort , elemPosX , elemPosY , SYM_DIRECTION );
2453
+ displayWriteChar (osdDisplayPort , elemPosX , elemPosY + 1 , referenceSymbol );
2454
+ return true;
2455
+ }
2456
+
2420
2457
default :
2421
2458
return false;
2422
2459
}
@@ -2477,7 +2514,7 @@ static uint8_t osdIncElementIndex(uint8_t elementIndex)
2477
2514
if (elementIndex == OSD_TRIP_DIST ) {
2478
2515
elementIndex = OSD_ATTITUDE_PITCH ;
2479
2516
}
2480
- if (elementIndex == OSD_MAP_NORTH ) {
2517
+ if (elementIndex == OSD_WIND_SPEED_HORIZONTAL ) {
2481
2518
elementIndex = OSD_SAG_COMPENSATED_MAIN_BATT_VOLTAGE ;
2482
2519
}
2483
2520
if (elementIndex == OSD_3D_SPEED ) {
0 commit comments