Skip to content

Commit fa72363

Browse files
authored
Merge pull request #4386 from iNavFlight/agh_map_scale_and_reference_as_elements
Add dedicated OSD elements for map scale and reference
2 parents 1c22a15 + 7bb0167 commit fa72363

File tree

3 files changed

+69
-28
lines changed

3 files changed

+69
-28
lines changed

src/main/cms/cms_menu_osd.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,8 @@ static const OSD_Entry menuOsdElemsEntries[] =
202202
OSD_ELEMENT_ENTRY("MAP NORTH", OSD_MAP_NORTH),
203203
OSD_ELEMENT_ENTRY("MAP TAKE OFF", OSD_MAP_TAKEOFF),
204204
OSD_ELEMENT_ENTRY("RADAR", OSD_RADAR),
205+
OSD_ELEMENT_ENTRY("MAP SCALE", OSD_MAP_SCALE),
206+
OSD_ELEMENT_ENTRY("MAP REFERENCE", OSD_MAP_REFERENCE),
205207
#endif
206208
OSD_ELEMENT_ENTRY("EXPO", OSD_RC_EXPO),
207209
OSD_ELEMENT_ENTRY("YAW EXPO", OSD_RC_YAW_EXPO),

src/main/io/osd.c

Lines changed: 65 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,13 @@ static bool fullRedraw = false;
170170

171171
static uint8_t armState;
172172

173+
typedef struct osdMapData_s {
174+
uint32_t scale;
175+
char referenceSymbol;
176+
} osdMapData_t;
177+
178+
static osdMapData_t osdMapData;
179+
173180
static displayPort_t *osdDisplayPort;
174181

175182
#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
976983
const int charWidth = 12;
977984
const int charHeight = 18;
978985

979-
char buf[16];
980-
981986
uint8_t minX = hMargin;
982987
uint8_t maxX = osdDisplayPort->cols - 1 - hMargin;
983988
uint8_t minY = vMargin;
@@ -986,11 +991,6 @@ static void osdDrawMap(int referenceHeading, uint8_t referenceSym, uint8_t cente
986991
uint8_t midY = osdDisplayPort->rows / 2;
987992

988993
// 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);
994994
displayWriteChar(osdDisplayPort, midX, midY, centerSym);
995995

996996
// First, erase the previous drawing.
@@ -1000,11 +1000,6 @@ static void osdDrawMap(int referenceHeading, uint8_t referenceSym, uint8_t cente
10001000
}
10011001

10021002
uint32_t initialScale;
1003-
float scaleToUnit;
1004-
int scaleUnitDivisor;
1005-
char symUnscaled;
1006-
char symScaled;
1007-
int maxDecimals;
10081003
const unsigned scaleMultiplier = 2;
10091004
// We try to reduce the scale when the POI will be around half the distance
10101005
// 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
10131008
switch (osdConfig()->units) {
10141009
case OSD_UNIT_IMPERIAL:
10151010
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;
10211011
break;
10221012
case OSD_UNIT_UK:
10231013
FALLTHROUGH;
10241014
case OSD_UNIT_METRIC:
10251015
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;
10311016
break;
10321017
}
10331018

@@ -1110,12 +1095,11 @@ static void osdDrawMap(int referenceHeading, uint8_t referenceSym, uint8_t cente
11101095
}
11111096
}
11121097

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);
11181098
*usedScale = scale;
1099+
1100+
// Update global map data for scale and reference
1101+
osdMapData.scale = scale;
1102+
osdMapData.referenceSymbol = referenceSym;
11191103
}
11201104

11211105
/* Draws a map with the home in the center and the craft moving around.
@@ -2417,6 +2401,59 @@ static bool osdDrawSingleElement(uint8_t item)
24172401
break;
24182402
}
24192403

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+
24202457
default:
24212458
return false;
24222459
}
@@ -2477,7 +2514,7 @@ static uint8_t osdIncElementIndex(uint8_t elementIndex)
24772514
if (elementIndex == OSD_TRIP_DIST) {
24782515
elementIndex = OSD_ATTITUDE_PITCH;
24792516
}
2480-
if (elementIndex == OSD_MAP_NORTH) {
2517+
if (elementIndex == OSD_WIND_SPEED_HORIZONTAL) {
24812518
elementIndex = OSD_SAG_COMPENSATED_MAIN_BATT_VOLTAGE;
24822519
}
24832520
if (elementIndex == OSD_3D_SPEED) {

src/main/io/osd.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ typedef enum {
134134
OSD_TEMP_SENSOR_7_TEMPERATURE,
135135
OSD_ALTITUDE_MSL,
136136
OSD_PLUS_CODE,
137+
OSD_MAP_SCALE,
138+
OSD_MAP_REFERENCE,
137139
OSD_ITEM_COUNT // MUST BE LAST
138140
} osd_items_e;
139141

0 commit comments

Comments
 (0)