Skip to content

Commit cbe6982

Browse files
authored
Merge pull request #10720 from iNavFlight/MrD_Make-min-ground-speed-more-accessible
Add more flexibility for minimum ground speed
2 parents 4d47ced + 5960aca commit cbe6982

9 files changed

Lines changed: 239 additions & 79 deletions

File tree

docs/OSD.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ Here are the OSD Elements provided by INAV.
199199
| 164 | OSD_H_DIST_TO_FENCE | 8.0.0 | |
200200
| 165 | OSD_V_DIST_TO_FENCE | 8.0.0 | |
201201
| 166 | OSD_NAV_FW_ALT_CONTROL_RESPONSE | 8.0.0 | |
202+
| 167 | OSD_NAV_MIN_GROUND_SPEED | 9.0.0 | |
202203

203204
# Pilot Logos
204205

docs/Programming Framework.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ IPF can be edited using INAV Configurator user interface, or via CLI. To use COn
102102
| 53 | Disable GPS Sensor Fix | Disables the GNSS sensor fix. For testing GNSS failure. |
103103
| 54 | Mag calibration | Trigger a magnetometer calibration. |
104104
| 55 | Set Gimbal Sensitivity | Scales `Operand A` from [`-16` : `15`]
105+
| 56 | Override Minimum Ground Speed | When active, sets the minimum ground speed to the value specified in `Operand A` [m/s]. Minimum allowed value is set in `nav_min_ground_speed`. Maximum value is `150` |
105106

106107
### Operands
107108

@@ -164,6 +165,11 @@ IPF can be edited using INAV Configurator user interface, or via CLI. To use COn
164165
| 41 | FW Land Sate | Integer `1` - `5`, indicates the status of the FW landing, 0 Idle, 1 Downwind, 2 Base Leg, 3 Final Approach, 4 Glide, 5 Flare |
165166
| 42 | Current battery profile | The active battery profile. Integer `[1..MAX_PROFILE_COUNT]` |
166167
| 43 | Flown Loiter Radius [m] | The actual loiter radius flown by a fixed wing during hold modes, in `meters` |
168+
| 44 | Downlink Link Quality | |
169+
| 45 | Uplink RSSI [dBm] | |
170+
| 46 | Minimum Ground Speed [m/s] | The current minimum ground speed allowed in navigation flight modes |
171+
| 47 | Horizontal Wind Speed [cm/s] | Estimated wind speed. If the wind estimator is unavailble or the wind estimation is invalid, -1 is returned |
172+
| 48 | Wind Direction [deg] | Estimated wind direction. If the wind estimator is unavailble or the wind estimation is invalid, -1 is returned |
167173

168174
#### FLIGHT_MODE
169175

src/main/common/maths.h

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -35,49 +35,51 @@
3535

3636
#define RAD (M_PIf / 180.0f)
3737

38-
#define DEGREES_TO_CENTIDEGREES(angle) ((angle) * 100)
39-
#define CENTIDEGREES_TO_DEGREES(angle) ((angle) * 0.01f)
38+
#define DEGREES_TO_CENTIDEGREES(angle) ((angle) * 100)
39+
#define CENTIDEGREES_TO_DEGREES(angle) ((angle) * 0.01f)
4040

41-
#define CENTIDEGREES_TO_DECIDEGREES(angle) ((angle) / 10.0f)
42-
#define DECIDEGREES_TO_CENTIDEGREES(angle) ((angle) * 10)
41+
#define CENTIDEGREES_TO_DECIDEGREES(angle) ((angle) / 10.0f)
42+
#define DECIDEGREES_TO_CENTIDEGREES(angle) ((angle) * 10)
4343

44-
#define DEGREES_TO_DECIDEGREES(angle) ((angle) * 10)
45-
#define DECIDEGREES_TO_DEGREES(angle) ((angle) / 10.0f)
44+
#define DEGREES_TO_DECIDEGREES(angle) ((angle) * 10)
45+
#define DECIDEGREES_TO_DEGREES(angle) ((angle) / 10.0f)
4646

47-
#define DEGREES_PER_DEKADEGREE 10
48-
#define DEGREES_TO_DEKADEGREES(angle) ((angle) / DEGREES_PER_DEKADEGREE)
49-
#define DEKADEGREES_TO_DEGREES(angle) ((angle) * DEGREES_PER_DEKADEGREE)
47+
#define DEGREES_PER_DEKADEGREE 10
48+
#define DEGREES_TO_DEKADEGREES(angle) ((angle) / DEGREES_PER_DEKADEGREE)
49+
#define DEKADEGREES_TO_DEGREES(angle) ((angle) * DEGREES_PER_DEKADEGREE)
5050

51-
#define DEGREES_TO_RADIANS(angle) ((angle) * RAD)
52-
#define RADIANS_TO_DEGREES(angle) ((angle) / RAD)
53-
#define DECIDEGREES_TO_RADIANS(angle) (((angle) / 10.0f) * RAD)
54-
#define RADIANS_TO_DECIDEGREES(angle) (((angle) * 10.0f) / RAD)
51+
#define DEGREES_TO_RADIANS(angle) ((angle) * RAD)
52+
#define RADIANS_TO_DEGREES(angle) ((angle) / RAD)
53+
#define DECIDEGREES_TO_RADIANS(angle) (((angle) / 10.0f) * RAD)
54+
#define RADIANS_TO_DECIDEGREES(angle) (((angle) * 10.0f) / RAD)
5555

56-
#define RADIANS_TO_CENTIDEGREES(angle) (((angle) * 100.0f) / RAD)
57-
#define CENTIDEGREES_TO_RADIANS(angle) (((angle) * 0.01f) * RAD)
56+
#define RADIANS_TO_CENTIDEGREES(angle) (((angle) * 100.0f) / RAD)
57+
#define CENTIDEGREES_TO_RADIANS(angle) (((angle) * 0.01f) * RAD)
5858

59-
#define MILLIMETERS_TO_CENTIMETERS(mm) (mm / 10.0f)
59+
#define MILLIMETERS_TO_CENTIMETERS(mm) (mm / 10.0f)
6060

61-
#define CENTIMETERS_TO_CENTIFEET(cm) (cm / 0.3048f)
62-
#define CENTIMETERS_TO_FEET(cm) (cm / 30.48f)
63-
#define CENTIMETERS_TO_METERS(cm) (cm * 0.01f)
61+
#define CENTIMETERS_TO_CENTIFEET(cm) (cm / 0.3048f)
62+
#define CENTIMETERS_TO_FEET(cm) (cm / 30.48f)
63+
#define CENTIMETERS_TO_METERS(cm) (cm * 0.01f)
6464

65-
#define METERS_TO_CENTIMETERS(m) (m * 100)
66-
#define METERS_TO_KILOMETERS(m) (m / 1000.0f)
67-
#define METERS_TO_MILES(m) (m / 1609.344f)
68-
#define METERS_TO_NAUTICALMILES(m) (m / 1852.00f)
65+
#define METERS_TO_CENTIMETERS(m) (m * 100)
66+
#define METERS_TO_KILOMETERS(m) (m / 1000.0f)
67+
#define METERS_TO_MILES(m) (m / 1609.344f)
68+
#define METERS_TO_NAUTICALMILES(m) (m / 1852.00f)
6969

70-
#define MWH_TO_WH(mWh) (mWh / 1000.0f)
70+
#define MWH_TO_WH(mWh) (mWh / 1000.0f)
7171

72-
#define CMSEC_TO_CENTIMPH(cms) (cms * 2.2369363f)
73-
#define CMSEC_TO_CENTIKPH(cms) (cms * 3.6f)
74-
#define CMSEC_TO_CENTIKNOTS(cms) (cms * 1.943845f)
72+
#define CMSEC_TO_CENTIMPH(cms) (cms * 2.2369363f)
73+
#define CMSEC_TO_CENTIKPH(cms) (cms * 3.6f)
74+
#define CMSEC_TO_CENTIKNOTS(cms) (cms * 1.943845f)
7575

76-
#define CMSEC_TO_MPH(cms) (CMSEC_TO_CENTIMPH(cms) / 100.0f)
77-
#define CMSEC_TO_KPH(cms) (CMSEC_TO_CENTIKPH(cms) / 100.0f)
78-
#define CMSEC_TO_KNOTS(cms) (CMSEC_TO_CENTIKNOTS(cms) / 100.0f)
76+
#define CMSEC_TO_MPH(cms) (CMSEC_TO_CENTIMPH(cms) / 100.0f)
77+
#define CMSEC_TO_KPH(cms) (CMSEC_TO_CENTIKPH(cms) / 100.0f)
78+
#define CMSEC_TO_KNOTS(cms) (CMSEC_TO_CENTIKNOTS(cms) / 100.0f)
7979

80-
#define C_TO_KELVIN(temp) (temp + 273.15f)
80+
#define KMH_TO_MS(kmh) (kmh / 3.6f)
81+
82+
#define C_TO_KELVIN(temp) (temp + 273.15f)
8183

8284
// Standard Sea Level values
8385
// Ref:https://en.wikipedia.org/wiki/Standard_sea_level

src/main/drivers/osd_symbols.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,14 +176,13 @@
176176
#define SYM_FLIGHT_HOURS_REMAINING 0xDB // 219 Flight time (hours) remaining
177177
#define SYM_GROUND_COURSE 0xDC // 220 Ground course
178178
#define SYM_ALERT 0xDD // 221 General alert symbol
179+
#define SYM_MIN_GROUND_SPEED 0xDE // 222 Minimum Ground Speed
179180
#define SYM_TERRAIN_FOLLOWING 0xFB // 251 Terrain following (also Alt adjust)
180181
#define SYM_CROSS_TRACK_ERROR 0xFC // 252 Cross track error
181-
#define SYM_ADSB 0xFD // 253 ADBS
182+
#define SYM_ADSB 0xFD // 253 ADSB
182183
#define SYM_BLACKBOX 0xFE // 254 Blackbox
183184

184185

185-
#define SYM_ADSB 0xFD // 253 ADSB
186-
187186
#define SYM_LOGO_START 0x101 // 257 to 297, INAV logo
188187
#define SYM_LOGO_WIDTH 10
189188
#define SYM_LOGO_HEIGHT 4

src/main/io/osd.c

Lines changed: 120 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -390,46 +390,124 @@ static int32_t osdConvertVelocityToUnit(int32_t vel)
390390
* @param vel Raw velocity (i.e. as taken from gpsSol.groundSpeed in centimeters/seconds)
391391
* @param _3D is a 3D velocity
392392
* @param _max is a maximum velocity
393+
* @return length of the formatted string
393394
*/
394-
int osdFormatVelocityStr(char* buff, int32_t vel, bool _3D, bool _max)
395+
int osdFormatVelocityStr(char* buff, int32_t vel, osd_SpeedTypes_e speedType, bool _max)
395396
{
397+
int strLen = 0;
398+
396399
switch ((osd_unit_e)osdConfig()->units) {
397-
case OSD_UNIT_UK:
398-
FALLTHROUGH;
399-
case OSD_UNIT_METRIC_MPH:
400-
FALLTHROUGH;
401-
case OSD_UNIT_IMPERIAL:
402-
if (_max) {
403-
return tfp_sprintf(buff, "%c%3d%c", SYM_MAX, (int)osdConvertVelocityToUnit(vel), (_3D ? SYM_3D_MPH : SYM_MPH));
404-
} else {
405-
return tfp_sprintf(buff, "%3d%c", (int)osdConvertVelocityToUnit(vel), (_3D ? SYM_3D_MPH : SYM_MPH));
406-
}
407-
break;
408-
case OSD_UNIT_METRIC:
409-
if (_max) {
410-
return tfp_sprintf(buff, "%c%3d%c", SYM_MAX, (int)osdConvertVelocityToUnit(vel), (_3D ? SYM_3D_KMH : SYM_KMH));
411-
} else {
412-
return tfp_sprintf(buff, "%3d%c", (int)osdConvertVelocityToUnit(vel), (_3D ? SYM_3D_KMH : SYM_KMH));
413-
}
414-
break;
415-
case OSD_UNIT_GA:
416-
if (_max) {
417-
return tfp_sprintf(buff, "%c%3d%c", SYM_MAX, (int)osdConvertVelocityToUnit(vel), (_3D ? SYM_3D_KT : SYM_KT));
418-
} else {
419-
return tfp_sprintf(buff, "%3d%c", (int)osdConvertVelocityToUnit(vel), (_3D ? SYM_3D_KT : SYM_KT));
420-
}
421-
break;
400+
case OSD_UNIT_UK:
401+
FALLTHROUGH;
402+
case OSD_UNIT_METRIC_MPH:
403+
FALLTHROUGH;
404+
case OSD_UNIT_IMPERIAL:
405+
if (_max) {
406+
switch (speedType) {
407+
case OSD_SPEED_TYPE_GROUND:
408+
strLen = tfp_sprintf(buff, "%c%3d%c", SYM_MAX, (int)osdConvertVelocityToUnit(vel), SYM_MPH);
409+
break;
410+
case OSD_SPEED_TYPE_AIR:
411+
strLen = tfp_sprintf(buff, "%c%c%3d%c", SYM_MAX, SYM_AIR, (int)osdConvertVelocityToUnit(vel), SYM_MPH);
412+
break;
413+
case OSD_SPEED_TYPE_3D:
414+
strLen = tfp_sprintf(buff, "%c%3d%c", SYM_MAX, (int)osdConvertVelocityToUnit(vel), SYM_3D_MPH);
415+
break;
416+
case OSD_SPEED_TYPE_MIN_GROUND:
417+
break;
418+
}
419+
} else {
420+
switch (speedType){
421+
case OSD_SPEED_TYPE_GROUND:
422+
strLen = tfp_sprintf(buff, "%3d%c", (int)osdConvertVelocityToUnit(vel), SYM_MPH);
423+
break;
424+
case OSD_SPEED_TYPE_AIR:
425+
strLen = tfp_sprintf(buff, "%c%3d%c", SYM_AIR, (int)osdConvertVelocityToUnit(vel), SYM_MPH);
426+
break;
427+
case OSD_SPEED_TYPE_3D:
428+
strLen = tfp_sprintf(buff, "%3d%c", (int)osdConvertVelocityToUnit(vel), SYM_3D_MPH);
429+
break;
430+
case OSD_SPEED_TYPE_MIN_GROUND:
431+
strLen = tfp_sprintf(buff, "%c%3d%c", SYM_MIN_GROUND_SPEED, (int)osdConvertVelocityToUnit(vel), SYM_MPH);
432+
break;
433+
}
434+
}
435+
break;
436+
case OSD_UNIT_METRIC:
437+
if (_max) {
438+
switch (speedType) {
439+
case OSD_SPEED_TYPE_GROUND:
440+
strLen = tfp_sprintf(buff, "%c%3d%c", SYM_MAX, (int)osdConvertVelocityToUnit(vel), SYM_KMH);
441+
break;
442+
case OSD_SPEED_TYPE_AIR:
443+
strLen = tfp_sprintf(buff, "%c%c%3d%c", SYM_MAX, SYM_AIR, (int)osdConvertVelocityToUnit(vel), SYM_KMH);
444+
break;
445+
case OSD_SPEED_TYPE_3D:
446+
strLen = tfp_sprintf(buff, "%c%3d%c", SYM_MAX, (int)osdConvertVelocityToUnit(vel), SYM_3D_KMH);
447+
break;
448+
case OSD_SPEED_TYPE_MIN_GROUND:
449+
break;
450+
}
451+
} else {
452+
switch (speedType) {
453+
case OSD_SPEED_TYPE_GROUND:
454+
strLen = tfp_sprintf(buff, "%3d%c", (int)osdConvertVelocityToUnit(vel), SYM_KMH);
455+
break;
456+
case OSD_SPEED_TYPE_AIR:
457+
strLen = tfp_sprintf(buff, "%c%3d%c", SYM_AIR, (int)osdConvertVelocityToUnit(vel), SYM_KMH);
458+
break;
459+
case OSD_SPEED_TYPE_3D:
460+
strLen = tfp_sprintf(buff, "%3d%c", (int)osdConvertVelocityToUnit(vel), SYM_3D_KMH);
461+
break;
462+
case OSD_SPEED_TYPE_MIN_GROUND:
463+
strLen = tfp_sprintf(buff, "%c%3d%c", SYM_MIN_GROUND_SPEED, (int)osdConvertVelocityToUnit(vel), SYM_KMH);
464+
break;
465+
}
466+
}
467+
break;
468+
case OSD_UNIT_GA:
469+
if (_max) {
470+
switch (speedType) {
471+
case OSD_SPEED_TYPE_GROUND:
472+
strLen = tfp_sprintf(buff, "%c%3d%c", SYM_MAX, (int)osdConvertVelocityToUnit(vel), SYM_KT);
473+
break;
474+
case OSD_SPEED_TYPE_AIR:
475+
strLen = tfp_sprintf(buff, "%c%c%3d%c", SYM_MAX, SYM_AIR, (int)osdConvertVelocityToUnit(vel), SYM_KT);
476+
break;
477+
case OSD_SPEED_TYPE_3D:
478+
strLen = tfp_sprintf(buff, "%c%3d%c", SYM_MAX, (int)osdConvertVelocityToUnit(vel), SYM_3D_KT);
479+
break;
480+
case OSD_SPEED_TYPE_MIN_GROUND:
481+
break;
482+
}
483+
} else {
484+
switch (speedType) {
485+
case OSD_SPEED_TYPE_GROUND:
486+
strLen = tfp_sprintf(buff, "%3d%c", (int)osdConvertVelocityToUnit(vel), SYM_KT);
487+
break;
488+
case OSD_SPEED_TYPE_AIR:
489+
strLen = tfp_sprintf(buff, "%c%3d%c", SYM_AIR, (int)osdConvertVelocityToUnit(vel), SYM_KT);
490+
break;
491+
case OSD_SPEED_TYPE_3D:
492+
strLen = tfp_sprintf(buff, "%3d%c", (int)osdConvertVelocityToUnit(vel), SYM_3D_KT);
493+
break;
494+
case OSD_SPEED_TYPE_MIN_GROUND:
495+
strLen = tfp_sprintf(buff, "%c%3d%c", SYM_MIN_GROUND_SPEED, (int)osdConvertVelocityToUnit(vel), SYM_KT);
496+
break;
497+
}
498+
}
499+
break;
422500
}
423501

424-
return 0;
502+
return strLen;
425503
}
426504

427505
/**
428506
* Returns the average velocity. This always uses stats, so can be called as an OSD element later if wanted, to show a real time average
429507
*/
430508
static void osdGenerateAverageVelocityStr(char* buff) {
431509
uint32_t cmPerSec = getTotalTravelDistance() / getFlightTime();
432-
osdFormatVelocityStr(buff, cmPerSec, false, false);
510+
osdFormatVelocityStr(buff, cmPerSec, OSD_SPEED_TYPE_GROUND, false);
433511
}
434512

435513
/**
@@ -1919,19 +1997,23 @@ static bool osdDrawSingleElement(uint8_t item)
19191997
break;
19201998

19211999
case OSD_GPS_SPEED:
1922-
osdFormatVelocityStr(buff, gpsSol.groundSpeed, false, false);
2000+
osdFormatVelocityStr(buff, gpsSol.groundSpeed, OSD_SPEED_TYPE_GROUND, false);
2001+
break;
2002+
2003+
case OSD_NAV_MIN_GROUND_SPEED:
2004+
osdFormatVelocityStr(buff, getMinGroundSpeed(navConfig()->general.min_ground_speed) * 100, OSD_SPEED_TYPE_MIN_GROUND, false);
19232005
break;
19242006

19252007
case OSD_GPS_MAX_SPEED:
1926-
osdFormatVelocityStr(buff, stats.max_speed, false, true);
2008+
osdFormatVelocityStr(buff, stats.max_speed, OSD_SPEED_TYPE_GROUND, true);
19272009
break;
19282010

19292011
case OSD_3D_SPEED:
1930-
osdFormatVelocityStr(buff, osdGet3DSpeed(), true, false);
2012+
osdFormatVelocityStr(buff, osdGet3DSpeed(), OSD_SPEED_TYPE_3D, false);
19312013
break;
19322014

19332015
case OSD_3D_MAX_SPEED:
1934-
osdFormatVelocityStr(buff, stats.max_3D_speed, true, true);
2016+
osdFormatVelocityStr(buff, stats.max_3D_speed, OSD_SPEED_TYPE_3D, true);
19352017
break;
19362018

19372019
case OSD_GLIDESLOPE:
@@ -2238,7 +2320,7 @@ static bool osdDrawSingleElement(uint8_t item)
22382320
tfp_sprintf(buff, "%s", getAdsbEmitterTypeString(vehicle->vehicleValues.emitterType));
22392321

22402322
// Vehicle speed
2241-
adsbLengthForClearSecondLine = osdFormatVelocityStr(buff + 7, vehicle->vehicleValues.horVelocity, false, false);
2323+
adsbLengthForClearSecondLine = osdFormatVelocityStr(buff + 7, vehicle->vehicleValues.horVelocity, OSD_SPEED_TYPE_GROUND, false);
22422324

22432325
// draw values
22442326
buff[6] = SYM_BLANK; // space for direction arrow
@@ -3326,19 +3408,18 @@ static bool osdDrawSingleElement(uint8_t item)
33263408
case OSD_AIR_SPEED:
33273409
{
33283410
#ifdef USE_PITOT
3329-
buff[0] = SYM_AIR;
3330-
33313411
if (pitotIsHealthy())
33323412
{
33333413
const float airspeed_estimate = getAirspeedEstimate();
3334-
osdFormatVelocityStr(buff + 1, airspeed_estimate, false, false);
3414+
osdFormatVelocityStr(buff, airspeed_estimate, OSD_SPEED_TYPE_AIR, false);
33353415
if ((osdConfig()->airspeed_alarm_min != 0 && airspeed_estimate < osdConfig()->airspeed_alarm_min) ||
33363416
(osdConfig()->airspeed_alarm_max != 0 && airspeed_estimate > osdConfig()->airspeed_alarm_max)) {
33373417
TEXT_ATTRIBUTES_ADD_BLINK(elemAttr);
33383418
}
33393419
}
33403420
else
33413421
{
3422+
buff[0] = SYM_AIR;
33423423
strcpy(buff + 1, " X!");
33433424
TEXT_ATTRIBUTES_ADD_BLINK(elemAttr);
33443425
}
@@ -3351,9 +3432,7 @@ static bool osdDrawSingleElement(uint8_t item)
33513432
case OSD_AIR_MAX_SPEED:
33523433
{
33533434
#ifdef USE_PITOT
3354-
buff[0] = SYM_MAX;
3355-
buff[1] = SYM_AIR;
3356-
osdFormatVelocityStr(buff + 2, stats.max_air_speed, false, false);
3435+
osdFormatVelocityStr(buff, stats.max_air_speed, OSD_SPEED_TYPE_AIR, true);
33573436
#else
33583437
return false;
33593438
#endif
@@ -4919,7 +4998,7 @@ uint8_t drawStat_Speed(uint8_t col, uint8_t row, uint8_t statValX)
49194998

49204999
displayWrite(osdDisplayPort, col, row, "MAX/AVG SPEED");
49215000

4922-
osdFormatVelocityStr(buff2, stats.max_3D_speed, true, false);
5001+
osdFormatVelocityStr(buff2, stats.max_3D_speed, OSD_SPEED_TYPE_3D, false);
49235002
tfp_sprintf(buff, ": %s/", osdFormatTrimWhiteSpace(buff2));
49245003
multiValueXOffset = strlen(buff);
49255004
displayWrite(osdDisplayPort, statValX, row, buff);
@@ -6220,7 +6299,7 @@ textAttributes_t osdGetSystemMessage(char *buff, size_t buff_size, bool isCenter
62206299
if (FLIGHT_MODE(NAV_COURSE_HOLD_MODE)) {
62216300
if (posControl.cruise.multicopterSpeed >= 50.0f) {
62226301
char buf[6];
6223-
osdFormatVelocityStr(buf, posControl.cruise.multicopterSpeed, false, false);
6302+
osdFormatVelocityStr(buf, posControl.cruise.multicopterSpeed, OSD_SPEED_TYPE_GROUND, false);
62246303
tfp_sprintf(messageBuf, "(SPD %s)", buf);
62256304
} else {
62266305
strcpy(messageBuf, "(HOLD)");

src/main/io/osd.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ typedef enum {
338338
OSD_H_DIST_TO_FENCE,
339339
OSD_V_DIST_TO_FENCE,
340340
OSD_NAV_FW_ALT_CONTROL_RESPONSE,
341+
OSD_NAV_MIN_GROUND_SPEED,
341342
OSD_ITEM_COUNT // MUST BE LAST
342343
} osd_items_e;
343344

@@ -396,6 +397,13 @@ typedef enum {
396397
OSD_CRSF_LQ_TYPE3
397398
} osd_crsf_lq_format_e;
398399

400+
typedef enum {
401+
OSD_SPEED_TYPE_GROUND,
402+
OSD_SPEED_TYPE_AIR,
403+
OSD_SPEED_TYPE_3D,
404+
OSD_SPEED_TYPE_MIN_GROUND,
405+
} osd_SpeedTypes_e;
406+
399407
typedef struct osdLayoutsConfig_s {
400408
// Layouts
401409
uint16_t item_pos[OSD_LAYOUT_COUNT][OSD_ITEM_COUNT];
@@ -568,7 +576,7 @@ void osdShowEEPROMSavedNotification(void);
568576
void osdCrosshairPosition(uint8_t *x, uint8_t *y);
569577
bool osdFormatCentiNumber(char *buff, int32_t centivalue, uint32_t scale, int maxDecimals, int maxScaledDecimals, int length, bool leadingZeros);
570578
void osdFormatAltitudeSymbol(char *buff, int32_t alt);
571-
int osdFormatVelocityStr(char* buff, int32_t vel, bool _3D, bool _max);
579+
int osdFormatVelocityStr(char* buff, int32_t vel, osd_SpeedTypes_e speedType, bool _max);
572580
// Returns a heading angle in degrees normalized to [0, 360).
573581
int osdGetHeadingAngle(int angle);
574582

0 commit comments

Comments
 (0)