1
0
Fork 0
mirror of https://github.com/iNavFlight/inav.git synced 2025-07-26 01:35:35 +03:00

Final updates

- Converted Maths.h to tabs
- Added leading zeros to odometer and decimal place
This commit is contained in:
Darren Lines 2023-08-28 17:48:55 +01:00
parent de2c439b5d
commit 524b0d0bf4
7 changed files with 133 additions and 124 deletions

View file

@ -29,11 +29,11 @@
//#define VERY_FAST_MATH // order 7 approximation //#define VERY_FAST_MATH // order 7 approximation
// Use floating point M_PI instead explicitly. // Use floating point M_PI instead explicitly.
#define M_PIf 3.14159265358979323846f #define M_PIf 3.14159265358979323846f
#define M_LN2f 0.69314718055994530942f #define M_LN2f 0.69314718055994530942f
#define M_Ef 2.71828182845904523536f #define M_Ef 2.71828182845904523536f
#define RAD (M_PIf / 180.0f) #define RAD (M_PIf / 180.0f)
#define DEGREES_TO_CENTIDEGREES(angle) ((angle) * 100) #define DEGREES_TO_CENTIDEGREES(angle) ((angle) * 100)
#define CENTIDEGREES_TO_DEGREES(angle) ((angle) / 100.0f) #define CENTIDEGREES_TO_DEGREES(angle) ((angle) / 100.0f)
@ -56,47 +56,47 @@
#define RADIANS_TO_CENTIDEGREES(angle) (((angle) * 100.0f) / RAD) #define RADIANS_TO_CENTIDEGREES(angle) (((angle) * 100.0f) / RAD)
#define CENTIDEGREES_TO_RADIANS(angle) (((angle) / 100.0f) * RAD) #define CENTIDEGREES_TO_RADIANS(angle) (((angle) / 100.0f) * RAD)
#define CENTIMETERS_TO_CENTIFEET(cm) (cm / 0.3048f) #define CENTIMETERS_TO_CENTIFEET(cm) (cm / 0.3048f)
#define CENTIMETERS_TO_FEET(cm) (cm / 30.48f) #define CENTIMETERS_TO_FEET(cm) (cm / 30.48f)
#define CENTIMETERS_TO_METERS(cm) (cm / 100.0f) #define CENTIMETERS_TO_METERS(cm) (cm / 100.0f)
#define METERS_TO_CENTIMETERS(m) (m * 100) #define METERS_TO_CENTIMETERS(m) (m * 100)
#define CMSEC_TO_CENTIMPH(cms) (cms * 2.2369363f) #define CMSEC_TO_CENTIMPH(cms) (cms * 2.2369363f)
#define CMSEC_TO_CENTIKPH(cms) (cms * 3.6f) #define CMSEC_TO_CENTIKPH(cms) (cms * 3.6f)
#define CMSEC_TO_CENTIKNOTS(cms) (cms * 1.943845f) #define CMSEC_TO_CENTIKNOTS(cms) (cms * 1.943845f)
#define C_TO_KELVIN(temp) (temp + 273.15f) #define C_TO_KELVIN(temp) (temp + 273.15f)
// Standard Sea Level values // Standard Sea Level values
// Ref:https://en.wikipedia.org/wiki/Standard_sea_level // Ref:https://en.wikipedia.org/wiki/Standard_sea_level
#define SSL_AIR_DENSITY 1.225f // kg/m^3 #define SSL_AIR_DENSITY 1.225f // kg/m^3
#define SSL_AIR_PRESSURE 101325.01576f // Pascal #define SSL_AIR_PRESSURE 101325.01576f // Pascal
#define SSL_AIR_TEMPERATURE 288.15f // K #define SSL_AIR_TEMPERATURE 288.15f // K
// copied from https://code.google.com/p/cxutil/source/browse/include/cxutil/utility.h#70 // copied from https://code.google.com/p/cxutil/source/browse/include/cxutil/utility.h#70
#define _CHOOSE2(binoper, lexpr, lvar, rexpr, rvar) \ #define _CHOOSE2(binoper, lexpr, lvar, rexpr, rvar) \
( __extension__ ({ \ ( __extension__ ({ \
__typeof__(lexpr) lvar = (lexpr); \ __typeof__(lexpr) lvar = (lexpr); \
__typeof__(rexpr) rvar = (rexpr); \ __typeof__(rexpr) rvar = (rexpr); \
lvar binoper rvar ? lvar : rvar; \ lvar binoper rvar ? lvar : rvar; \
})) }))
#define _CHOOSE_VAR2(prefix, unique) prefix##unique #define _CHOOSE_VAR2(prefix, unique) prefix##unique
#define _CHOOSE_VAR(prefix, unique) _CHOOSE_VAR2(prefix, unique) #define _CHOOSE_VAR(prefix, unique) _CHOOSE_VAR2(prefix, unique)
#define _CHOOSE(binoper, lexpr, rexpr) \ #define _CHOOSE(binoper, lexpr, rexpr) \
_CHOOSE2( \ _CHOOSE2( \
binoper, \ binoper, \
lexpr, _CHOOSE_VAR(_left, __COUNTER__), \ lexpr, _CHOOSE_VAR(_left, __COUNTER__), \
rexpr, _CHOOSE_VAR(_right, __COUNTER__) \ rexpr, _CHOOSE_VAR(_right, __COUNTER__) \
) )
#define MIN(a, b) _CHOOSE(<, a, b) #define MIN(a, b) _CHOOSE(<, a, b)
#define MAX(a, b) _CHOOSE(>, a, b) #define MAX(a, b) _CHOOSE(>, a, b)
#define _ABS_II(x, var) \ #define _ABS_II(x, var) \
( __extension__ ({ \ ( __extension__ ({ \
__typeof__(x) var = (x); \ __typeof__(x) var = (x); \
var < 0 ? -var : var; \ var < 0 ? -var : var; \
})) }))
#define _ABS_I(x, var) _ABS_II(x, var) #define _ABS_I(x, var) _ABS_II(x, var)
#define ABS(x) _ABS_I(x, _CHOOSE_VAR(_abs, __COUNTER__)) #define ABS(x) _ABS_I(x, _CHOOSE_VAR(_abs, __COUNTER__))
@ -104,36 +104,35 @@
// Floating point Euler angles. // Floating point Euler angles.
typedef struct fp_angles { typedef struct fp_angles {
float roll; float roll;
float pitch; float pitch;
float yaw; float yaw;
} fp_angles_def; } fp_angles_def;
typedef union { typedef union {
float raw[3]; float raw[3];
fp_angles_def angles; fp_angles_def angles;
} fp_angles_t; } fp_angles_t;
typedef struct stdev_s typedef struct stdev_s {
{ float m_oldM, m_newM, m_oldS, m_newS;
float m_oldM, m_newM, m_oldS, m_newS; int m_n;
int m_n;
} stdev_t; } stdev_t;
typedef struct filterWithBufferSample_s { typedef struct filterWithBufferSample_s {
float value; float value;
uint32_t timestamp; uint32_t timestamp;
} filterWithBufferSample_t; } filterWithBufferSample_t;
typedef struct filterWithBufferState_s { typedef struct filterWithBufferState_s {
uint16_t filter_size; uint16_t filter_size;
uint16_t sample_index; uint16_t sample_index;
filterWithBufferSample_t * samples; filterWithBufferSample_t * samples;
} filterWithBufferState_t; } filterWithBufferState_t;
typedef struct { typedef struct {
float XtY[4]; float XtY[4];
float XtX[4][4]; float XtX[4][4];
} sensorCalibrationState_t; } sensorCalibrationState_t;
void sensorCalibrationResetState(sensorCalibrationState_t * state); void sensorCalibrationResetState(sensorCalibrationState_t * state);

View file

@ -3,8 +3,8 @@
#ifdef USE_STATS #ifdef USE_STATS
typedef struct statsConfig_s { typedef struct statsConfig_s {
uint32_t stats_total_time; // [s] uint32_t stats_total_time; // [Seconds]
uint32_t stats_total_dist; // [m] uint32_t stats_total_dist; // [Metres]
#ifdef USE_ADC #ifdef USE_ADC
uint32_t stats_total_energy; // deciWatt hour (x0.1Wh) uint32_t stats_total_energy; // deciWatt hour (x0.1Wh)
#endif #endif

View file

@ -311,7 +311,7 @@ static void osdFormatDistanceSymbol(char *buff, int32_t dist, uint8_t decimals)
case OSD_UNIT_UK: case OSD_UNIT_UK:
FALLTHROUGH; FALLTHROUGH;
case OSD_UNIT_IMPERIAL: case OSD_UNIT_IMPERIAL:
if (osdFormatCentiNumber(buff, CENTIMETERS_TO_CENTIFEET(dist), FEET_PER_MILE, decimals, 3, digits)) { if (osdFormatCentiNumber(buff, CENTIMETERS_TO_CENTIFEET(dist), FEET_PER_MILE, decimals, 3, digits, false)) {
buff[sym_index] = symbol_mi; buff[sym_index] = symbol_mi;
} else { } else {
buff[sym_index] = symbol_ft; buff[sym_index] = symbol_ft;
@ -321,7 +321,7 @@ static void osdFormatDistanceSymbol(char *buff, int32_t dist, uint8_t decimals)
case OSD_UNIT_METRIC_MPH: case OSD_UNIT_METRIC_MPH:
FALLTHROUGH; FALLTHROUGH;
case OSD_UNIT_METRIC: case OSD_UNIT_METRIC:
if (osdFormatCentiNumber(buff, dist, METERS_PER_KILOMETER, decimals, 3, digits)) { if (osdFormatCentiNumber(buff, dist, METERS_PER_KILOMETER, decimals, 3, digits, false)) {
buff[sym_index] = symbol_km; buff[sym_index] = symbol_km;
} else { } else {
buff[sym_index] = symbol_m; buff[sym_index] = symbol_m;
@ -329,7 +329,7 @@ static void osdFormatDistanceSymbol(char *buff, int32_t dist, uint8_t decimals)
buff[sym_index + 1] = '\0'; buff[sym_index + 1] = '\0';
break; break;
case OSD_UNIT_GA: case OSD_UNIT_GA:
if (osdFormatCentiNumber(buff, CENTIMETERS_TO_CENTIFEET(dist), (uint32_t)FEET_PER_NAUTICALMILE, decimals, 3, digits)) { if (osdFormatCentiNumber(buff, CENTIMETERS_TO_CENTIFEET(dist), (uint32_t)FEET_PER_NAUTICALMILE, decimals, 3, digits, false)) {
buff[sym_index] = symbol_nm; buff[sym_index] = symbol_nm;
} else { } else {
buff[sym_index] = symbol_ft; buff[sym_index] = symbol_ft;
@ -484,7 +484,7 @@ static void osdFormatWindSpeedStr(char *buff, int32_t ws, bool isValid)
break; break;
} }
osdFormatCentiNumber(buff, centivalue, 0, 2, 0, 3); osdFormatCentiNumber(buff, centivalue, 0, 2, 0, 3, false);
if (!isValid && ((millis() / 1000) % 4 < 2)) if (!isValid && ((millis() / 1000) % 4 < 2))
suffix = '*'; suffix = '*';
@ -557,7 +557,7 @@ void osdFormatAltitudeSymbol(char *buff, int32_t alt)
case OSD_UNIT_GA: case OSD_UNIT_GA:
FALLTHROUGH; FALLTHROUGH;
case OSD_UNIT_IMPERIAL: case OSD_UNIT_IMPERIAL:
if (osdFormatCentiNumber(buff + totalDigits - digits, CENTIMETERS_TO_CENTIFEET(alt), 1000, 0, 2, digits)) { if (osdFormatCentiNumber(buff + totalDigits - digits, CENTIMETERS_TO_CENTIFEET(alt), 1000, 0, 2, digits, false)) {
// Scaled to kft // Scaled to kft
buff[symbolIndex++] = symbolKFt; buff[symbolIndex++] = symbolKFt;
} else { } else {
@ -570,7 +570,7 @@ void osdFormatAltitudeSymbol(char *buff, int32_t alt)
FALLTHROUGH; FALLTHROUGH;
case OSD_UNIT_METRIC: case OSD_UNIT_METRIC:
// alt is alredy in cm // alt is alredy in cm
if (osdFormatCentiNumber(buff + totalDigits - digits, alt, 1000, 0, 2, digits)) { if (osdFormatCentiNumber(buff + totalDigits - digits, alt, 1000, 0, 2, digits, false)) {
// Scaled to km // Scaled to km
buff[symbolIndex++] = SYM_ALT_KM; buff[symbolIndex++] = SYM_ALT_KM;
} else { } else {
@ -1142,7 +1142,7 @@ static void osdFormatGVar(char *buff, uint8_t index)
buff[1] = '0'+index; buff[1] = '0'+index;
buff[2] = ':'; buff[2] = ':';
#ifdef USE_PROGRAMMING_FRAMEWORK #ifdef USE_PROGRAMMING_FRAMEWORK
osdFormatCentiNumber(buff + 3, (int32_t)gvGet(index)*(int32_t)100, 1, 0, 0, 5); osdFormatCentiNumber(buff + 3, (int32_t)gvGet(index)*(int32_t)100, 1, 0, 0, 5, false);
#endif #endif
} }
@ -1153,7 +1153,7 @@ static void osdFormatRpm(char *buff, uint32_t rpm)
if (rpm) { if (rpm) {
if ( digitCount(rpm) > osdConfig()->esc_rpm_precision) { if ( digitCount(rpm) > osdConfig()->esc_rpm_precision) {
uint8_t rpmMaxDecimals = (osdConfig()->esc_rpm_precision - 3); uint8_t rpmMaxDecimals = (osdConfig()->esc_rpm_precision - 3);
osdFormatCentiNumber(buff + 1, rpm / 10, 0, rpmMaxDecimals, rpmMaxDecimals, osdConfig()->esc_rpm_precision-1); osdFormatCentiNumber(buff + 1, rpm / 10, 0, rpmMaxDecimals, rpmMaxDecimals, osdConfig()->esc_rpm_precision-1, false);
buff[osdConfig()->esc_rpm_precision] = 'K'; buff[osdConfig()->esc_rpm_precision] = 'K';
buff[osdConfig()->esc_rpm_precision+1] = '\0'; buff[osdConfig()->esc_rpm_precision+1] = '\0';
} }
@ -1477,13 +1477,13 @@ static void osdFormatPidControllerOutput(char *buff, const char *label, const pi
strcpy(buff, label); strcpy(buff, label);
for (uint8_t i = strlen(label); i < 5; ++i) buff[i] = ' '; for (uint8_t i = strlen(label); i < 5; ++i) buff[i] = ' ';
uint8_t decimals = showDecimal ? 1 : 0; uint8_t decimals = showDecimal ? 1 : 0;
osdFormatCentiNumber(buff + 5, pidController->proportional * scale, 0, decimals, 0, 4); osdFormatCentiNumber(buff + 5, pidController->proportional * scale, 0, decimals, 0, 4, false);
buff[9] = ' '; buff[9] = ' ';
osdFormatCentiNumber(buff + 10, pidController->integrator * scale, 0, decimals, 0, 4); osdFormatCentiNumber(buff + 10, pidController->integrator * scale, 0, decimals, 0, 4, false);
buff[14] = ' '; buff[14] = ' ';
osdFormatCentiNumber(buff + 15, pidController->derivative * scale, 0, decimals, 0, 4); osdFormatCentiNumber(buff + 15, pidController->derivative * scale, 0, decimals, 0, 4, false);
buff[19] = ' '; buff[19] = ' ';
osdFormatCentiNumber(buff + 20, pidController->output_constrained * scale, 0, decimals, 0, 4); osdFormatCentiNumber(buff + 20, pidController->output_constrained * scale, 0, decimals, 0, 4, false);
buff[24] = '\0'; buff[24] = '\0';
} }
@ -1499,7 +1499,7 @@ static void osdDisplayBatteryVoltage(uint8_t elemPosX, uint8_t elemPosY, uint16_
elemAttr = TEXT_ATTRIBUTES_NONE; elemAttr = TEXT_ATTRIBUTES_NONE;
digits = MIN(digits, 5); digits = MIN(digits, 5);
osdFormatCentiNumber(buff, voltage, 0, decimals, 0, digits); osdFormatCentiNumber(buff, voltage, 0, decimals, 0, digits, false);
buff[digits] = SYM_VOLT; buff[digits] = SYM_VOLT;
buff[digits+1] = '\0'; buff[digits+1] = '\0';
const batteryState_e batteryVoltageState = checkBatteryVoltageState(); const batteryState_e batteryVoltageState = checkBatteryVoltageState();
@ -1593,7 +1593,7 @@ static void osdDisplayAdjustableDecimalValue(uint8_t elemPosX, uint8_t elemPosY,
displayWrite(osdDisplayPort, elemPosX, elemPosY, str); displayWrite(osdDisplayPort, elemPosX, elemPosY, str);
elemAttr = TEXT_ATTRIBUTES_NONE; elemAttr = TEXT_ATTRIBUTES_NONE;
osdFormatCentiNumber(buff, value * 100, 0, maxDecimals, 0, MIN(valueLength, 8)); osdFormatCentiNumber(buff, value * 100, 0, maxDecimals, 0, MIN(valueLength, 8), false);
if (isAdjustmentFunctionSelected(adjFunc)) if (isAdjustmentFunctionSelected(adjFunc))
TEXT_ATTRIBUTES_ADD_BLINK(elemAttr); TEXT_ATTRIBUTES_ADD_BLINK(elemAttr);
displayWriteWithAttr(osdDisplayPort, elemPosX + strlen(str) + 1 + valueOffset, elemPosY, buff, elemAttr); displayWriteWithAttr(osdDisplayPort, elemPosX + strlen(str) + 1 + valueOffset, elemPosY, buff, elemAttr);
@ -1698,7 +1698,7 @@ static bool osdDrawSingleElement(uint8_t item)
} }
case OSD_CURRENT_DRAW: { case OSD_CURRENT_DRAW: {
osdFormatCentiNumber(buff, getAmperage(), 0, 2, 0, 3); osdFormatCentiNumber(buff, getAmperage(), 0, 2, 0, 3, false);
buff[3] = SYM_AMP; buff[3] = SYM_AMP;
buff[4] = '\0'; buff[4] = '\0';
@ -1725,7 +1725,7 @@ static bool osdDrawSingleElement(uint8_t item)
buff[5] = SYM_MAH; buff[5] = SYM_MAH;
buff[6] = '\0'; buff[6] = '\0';
} else { } else {
if (osdFormatCentiNumber(buff, getMAhDrawn() * 100, 1000, 0, (mah_digits - 2), mah_digits)) { if (osdFormatCentiNumber(buff, getMAhDrawn() * 100, 1000, 0, (mah_digits - 2), mah_digits, false)) {
// Shown in Ah // Shown in Ah
buff[mah_digits] = SYM_AH; buff[mah_digits] = SYM_AH;
} else { } else {
@ -1740,7 +1740,7 @@ static bool osdDrawSingleElement(uint8_t item)
} }
case OSD_WH_DRAWN: case OSD_WH_DRAWN:
osdFormatCentiNumber(buff, getMWhDrawn() / 10, 0, 2, 0, 3); osdFormatCentiNumber(buff, getMWhDrawn() / 10, 0, 2, 0, 3, false);
osdUpdateBatteryCapacityOrVoltageTextAttributes(&elemAttr); osdUpdateBatteryCapacityOrVoltageTextAttributes(&elemAttr);
buff[3] = SYM_WH; buff[3] = SYM_WH;
buff[4] = '\0'; buff[4] = '\0';
@ -1755,7 +1755,7 @@ static bool osdDrawSingleElement(uint8_t item)
else if (currentBatteryProfile->capacity.unit == BAT_CAPACITY_UNIT_MAH) else if (currentBatteryProfile->capacity.unit == BAT_CAPACITY_UNIT_MAH)
tfp_sprintf(buff, "%4lu", (unsigned long)getBatteryRemainingCapacity()); tfp_sprintf(buff, "%4lu", (unsigned long)getBatteryRemainingCapacity());
else // currentBatteryProfile->capacity.unit == BAT_CAPACITY_UNIT_MWH else // currentBatteryProfile->capacity.unit == BAT_CAPACITY_UNIT_MWH
osdFormatCentiNumber(buff + 1, getBatteryRemainingCapacity() / 10, 0, 2, 0, 3); osdFormatCentiNumber(buff + 1, getBatteryRemainingCapacity() / 10, 0, 2, 0, 3, false);
buff[4] = currentBatteryProfile->capacity.unit == BAT_CAPACITY_UNIT_MAH ? SYM_MAH : SYM_WH; buff[4] = currentBatteryProfile->capacity.unit == BAT_CAPACITY_UNIT_MAH ? SYM_MAH : SYM_WH;
buff[5] = '\0'; buff[5] = '\0';
@ -1823,7 +1823,7 @@ static bool osdDrawSingleElement(uint8_t item)
buff[0] = SYM_GLIDESLOPE; buff[0] = SYM_GLIDESLOPE;
if (glideSlope > 0.0f && glideSlope < 100.0f) { if (glideSlope > 0.0f && glideSlope < 100.0f) {
osdFormatCentiNumber(buff + 1, glideSlope * 100.0f, 0, 2, 0, 3); osdFormatCentiNumber(buff + 1, glideSlope * 100.0f, 0, 2, 0, 3, false);
} else { } else {
buff[1] = buff[2] = buff[3] = '-'; buff[1] = buff[2] = buff[3] = '-';
} }
@ -1904,30 +1904,32 @@ static bool osdDrawSingleElement(uint8_t item)
case OSD_ODOMETER: case OSD_ODOMETER:
{ {
displayWriteChar(osdDisplayPort, elemPosX, elemPosY, SYM_ODOMETER); displayWriteChar(osdDisplayPort, elemPosX, elemPosY, SYM_ODOMETER);
uint32_t odometerDist = getTotalTravelDistance() / 100; uint32_t odometerDist = (uint32_t)(getTotalTravelDistance() / 100);
#ifdef USE_STATS #ifdef USE_STATS
odometerDist+= statsConfig()->stats_total_dist; odometerDist+= statsConfig()->stats_total_dist;
#endif #endif
odometerDist = odometerDist / 10;
switch (osdConfig()->units) { switch (osdConfig()->units) {
case OSD_UNIT_UK: case OSD_UNIT_UK:
FALLTHROUGH; FALLTHROUGH;
case OSD_UNIT_IMPERIAL: case OSD_UNIT_IMPERIAL:
tfp_sprintf(buff, "%5d", (int)(odometerDist / METERS_PER_MILE)); osdFormatCentiNumber(buff, CENTIMETERS_TO_CENTIFEET(odometerDist), FEET_PER_MILE, 1, 0, 6, true);
buff[5] = SYM_MI; buff[6] = SYM_MI;
break; break;
default: default:
case OSD_UNIT_GA: case OSD_UNIT_GA:
tfp_sprintf(buff, "%5d", (int)(odometerDist / METERS_PER_NAUTICALMILE)); osdFormatCentiNumber(buff, CENTIMETERS_TO_CENTIFEET(odometerDist), (uint32_t)FEET_PER_NAUTICALMILE, 1, 0, 6, true);
buff[5] = SYM_NM; buff[6] = SYM_NM;
break; break;
case OSD_UNIT_METRIC_MPH: case OSD_UNIT_METRIC_MPH:
FALLTHROUGH; FALLTHROUGH;
case OSD_UNIT_METRIC: case OSD_UNIT_METRIC:
tfp_sprintf(buff, "%5d", (int)(odometerDist / METERS_PER_KILOMETER)); osdFormatCentiNumber(buff, odometerDist, METERS_PER_KILOMETER, 1, 0, 6, true);
buff[5] = SYM_KM; buff[6] = SYM_KM;
break; break;
} }
buff[6] = '\0'; buff[7] = '\0';
elemPosX++; elemPosX++;
} }
break; break;
@ -2014,7 +2016,7 @@ static bool osdDrawSingleElement(uint8_t item)
digits = 3U; digits = 3U;
} }
#endif #endif
osdFormatCentiNumber(&buff[2], centiHDOP, 0, 1, 0, digits); osdFormatCentiNumber(&buff[2], centiHDOP, 0, 1, 0, digits, false);
break; break;
} }
@ -2444,7 +2446,7 @@ static bool osdDrawSingleElement(uint8_t item)
buff[0] = SYM_ROLL_LEVEL; buff[0] = SYM_ROLL_LEVEL;
if (ABS(attitude.values.roll) >= 1) if (ABS(attitude.values.roll) >= 1)
buff[0] += (attitude.values.roll < 0 ? -1 : 1); buff[0] += (attitude.values.roll < 0 ? -1 : 1);
osdFormatCentiNumber(buff + 1, DECIDEGREES_TO_CENTIDEGREES(ABS(attitude.values.roll)), 0, 1, 0, 3); osdFormatCentiNumber(buff + 1, DECIDEGREES_TO_CENTIDEGREES(ABS(attitude.values.roll)), 0, 1, 0, 3, false);
break; break;
case OSD_ATTITUDE_PITCH: case OSD_ATTITUDE_PITCH:
@ -2454,7 +2456,7 @@ static bool osdDrawSingleElement(uint8_t item)
buff[0] = SYM_PITCH_DOWN; buff[0] = SYM_PITCH_DOWN;
else if (attitude.values.pitch < 0) else if (attitude.values.pitch < 0)
buff[0] = SYM_PITCH_UP; buff[0] = SYM_PITCH_UP;
osdFormatCentiNumber(buff + 1, DECIDEGREES_TO_CENTIDEGREES(ABS(attitude.values.pitch)), 0, 1, 0, 3); osdFormatCentiNumber(buff + 1, DECIDEGREES_TO_CENTIDEGREES(ABS(attitude.values.pitch)), 0, 1, 0, 3, false);
break; break;
case OSD_ARTIFICIAL_HORIZON: case OSD_ARTIFICIAL_HORIZON:
@ -2515,7 +2517,7 @@ static bool osdDrawSingleElement(uint8_t item)
break; break;
} }
osdFormatCentiNumber(buff, value, 0, 1, 0, 3); osdFormatCentiNumber(buff, value, 0, 1, 0, 3, false);
buff[3] = sym; buff[3] = sym;
buff[4] = '\0'; buff[4] = '\0';
break; break;
@ -2548,7 +2550,7 @@ static bool osdDrawSingleElement(uint8_t item)
case OSD_UNIT_IMPERIAL: case OSD_UNIT_IMPERIAL:
// mAh/foot // mAh/foot
if (efficiencyValid) { if (efficiencyValid) {
osdFormatCentiNumber(buff, (value * METERS_PER_FOOT), 1, 2, 2, 3); osdFormatCentiNumber(buff, (value * METERS_PER_FOOT), 1, 2, 2, 3, false);
tfp_sprintf(buff, "%s%c%c", buff, SYM_AH_V_FT_0, SYM_AH_V_FT_1); tfp_sprintf(buff, "%s%c%c", buff, SYM_AH_V_FT_0, SYM_AH_V_FT_1);
} else { } else {
buff[0] = buff[1] = buff[2] = '-'; buff[0] = buff[1] = buff[2] = '-';
@ -2562,7 +2564,7 @@ static bool osdDrawSingleElement(uint8_t item)
case OSD_UNIT_METRIC: case OSD_UNIT_METRIC:
// mAh/metre // mAh/metre
if (efficiencyValid) { if (efficiencyValid) {
osdFormatCentiNumber(buff, value, 1, 2, 2, 3); osdFormatCentiNumber(buff, value, 1, 2, 2, 3, false);
tfp_sprintf(buff, "%s%c%c", buff, SYM_AH_V_M_0, SYM_AH_V_M_1); tfp_sprintf(buff, "%s%c%c", buff, SYM_AH_V_M_0, SYM_AH_V_M_1);
} else { } else {
buff[0] = buff[1] = buff[2] = '-'; buff[0] = buff[1] = buff[2] = '-';
@ -2857,7 +2859,7 @@ static bool osdDrawSingleElement(uint8_t item)
case OSD_POWER: case OSD_POWER:
{ {
bool kiloWatt = osdFormatCentiNumber(buff, getPower(), 1000, 2, 2, 3); bool kiloWatt = osdFormatCentiNumber(buff, getPower(), 1000, 2, 2, 3, false);
buff[3] = kiloWatt ? SYM_KILOWATT : SYM_WATT; buff[3] = kiloWatt ? SYM_KILOWATT : SYM_WATT;
buff[4] = '\0'; buff[4] = '\0';
@ -3020,7 +3022,7 @@ static bool osdDrawSingleElement(uint8_t item)
case OSD_UNIT_UK: case OSD_UNIT_UK:
FALLTHROUGH; FALLTHROUGH;
case OSD_UNIT_IMPERIAL: case OSD_UNIT_IMPERIAL:
moreThanAh = osdFormatCentiNumber(buff, value * METERS_PER_MILE / 10, 1000, 0, 2, digits); moreThanAh = osdFormatCentiNumber(buff, value * METERS_PER_MILE / 10, 1000, 0, 2, digits, false);
if (!moreThanAh) { if (!moreThanAh) {
tfp_sprintf(buff, "%s%c%c", buff, SYM_MAH_MI_0, SYM_MAH_MI_1); tfp_sprintf(buff, "%s%c%c", buff, SYM_MAH_MI_0, SYM_MAH_MI_1);
} else { } else {
@ -3034,7 +3036,7 @@ static bool osdDrawSingleElement(uint8_t item)
} }
break; break;
case OSD_UNIT_GA: case OSD_UNIT_GA:
moreThanAh = osdFormatCentiNumber(buff, value * METERS_PER_NAUTICALMILE / 10, 1000, 0, 2, digits); moreThanAh = osdFormatCentiNumber(buff, value * METERS_PER_NAUTICALMILE / 10, 1000, 0, 2, digits, false);
if (!moreThanAh) { if (!moreThanAh) {
tfp_sprintf(buff, "%s%c%c", buff, SYM_MAH_NM_0, SYM_MAH_NM_1); tfp_sprintf(buff, "%s%c%c", buff, SYM_MAH_NM_0, SYM_MAH_NM_1);
} else { } else {
@ -3050,7 +3052,7 @@ static bool osdDrawSingleElement(uint8_t item)
case OSD_UNIT_METRIC_MPH: case OSD_UNIT_METRIC_MPH:
FALLTHROUGH; FALLTHROUGH;
case OSD_UNIT_METRIC: case OSD_UNIT_METRIC:
moreThanAh = osdFormatCentiNumber(buff, value * 100, 1000, 0, 2, digits); moreThanAh = osdFormatCentiNumber(buff, value * 100, 1000, 0, 2, digits, false);
if (!moreThanAh) { if (!moreThanAh) {
tfp_sprintf(buff, "%s%c%c", buff, SYM_MAH_KM_0, SYM_MAH_KM_1); tfp_sprintf(buff, "%s%c%c", buff, SYM_MAH_KM_0, SYM_MAH_KM_1);
} else { } else {
@ -3091,17 +3093,17 @@ static bool osdDrawSingleElement(uint8_t item)
case OSD_UNIT_UK: case OSD_UNIT_UK:
FALLTHROUGH; FALLTHROUGH;
case OSD_UNIT_IMPERIAL: case OSD_UNIT_IMPERIAL:
osdFormatCentiNumber(buff, value * METERS_PER_MILE / 10000, 0, 2, 0, 3); osdFormatCentiNumber(buff, value * METERS_PER_MILE / 10000, 0, 2, 0, 3, false);
buff[3] = SYM_WH_MI; buff[3] = SYM_WH_MI;
break; break;
case OSD_UNIT_GA: case OSD_UNIT_GA:
osdFormatCentiNumber(buff, value * METERS_PER_NAUTICALMILE / 10000, 0, 2, 0, 3); osdFormatCentiNumber(buff, value * METERS_PER_NAUTICALMILE / 10000, 0, 2, 0, 3, false);
buff[3] = SYM_WH_NM; buff[3] = SYM_WH_NM;
break; break;
case OSD_UNIT_METRIC_MPH: case OSD_UNIT_METRIC_MPH:
FALLTHROUGH; FALLTHROUGH;
case OSD_UNIT_METRIC: case OSD_UNIT_METRIC:
osdFormatCentiNumber(buff, value / 10, 0, 2, 0, 3); osdFormatCentiNumber(buff, value / 10, 0, 2, 0, 3, false);
buff[3] = SYM_WH_KM; buff[3] = SYM_WH_KM;
break; break;
} }
@ -3115,7 +3117,7 @@ static bool osdDrawSingleElement(uint8_t item)
case OSD_GFORCE: case OSD_GFORCE:
{ {
buff[0] = SYM_GFORCE; buff[0] = SYM_GFORCE;
osdFormatCentiNumber(buff + 1, GForce, 0, 2, 0, 3); osdFormatCentiNumber(buff + 1, GForce, 0, 2, 0, 3, false);
if (GForce > osdConfig()->gforce_alarm * 100) { if (GForce > osdConfig()->gforce_alarm * 100) {
TEXT_ATTRIBUTES_ADD_BLINK(elemAttr); TEXT_ATTRIBUTES_ADD_BLINK(elemAttr);
} }
@ -3128,7 +3130,7 @@ static bool osdDrawSingleElement(uint8_t item)
{ {
float GForceValue = GForceAxis[item - OSD_GFORCE_X]; float GForceValue = GForceAxis[item - OSD_GFORCE_X];
buff[0] = SYM_GFORCE_X + item - OSD_GFORCE_X; buff[0] = SYM_GFORCE_X + item - OSD_GFORCE_X;
osdFormatCentiNumber(buff + 1, GForceValue, 0, 2, 0, 4); osdFormatCentiNumber(buff + 1, GForceValue, 0, 2, 0, 4, false);
if ((GForceValue < osdConfig()->gforce_axis_alarm_min * 100) || (GForceValue > osdConfig()->gforce_axis_alarm_max * 100)) { if ((GForceValue < osdConfig()->gforce_axis_alarm_min * 100) || (GForceValue > osdConfig()->gforce_axis_alarm_max * 100)) {
TEXT_ATTRIBUTES_ADD_BLINK(elemAttr); TEXT_ATTRIBUTES_ADD_BLINK(elemAttr);
} }
@ -3304,7 +3306,7 @@ static bool osdDrawSingleElement(uint8_t item)
} }
buff[0] = SYM_SCALE; buff[0] = SYM_SCALE;
if (osdMapData.scale > 0) { if (osdMapData.scale > 0) {
bool scaled = osdFormatCentiNumber(&buff[1], osdMapData.scale * scaleToUnit, scaleUnitDivisor, maxDecimals, 2, 3); bool scaled = osdFormatCentiNumber(&buff[1], osdMapData.scale * scaleToUnit, scaleUnitDivisor, maxDecimals, 2, 3, false);
buff[4] = scaled ? symScaled : symUnscaled; buff[4] = scaled ? symScaled : symUnscaled;
// Make sure this is cleared if the map stops being drawn // Make sure this is cleared if the map stops being drawn
osdMapData.scale = 0; osdMapData.scale = 0;
@ -3473,14 +3475,14 @@ static bool osdDrawSingleElement(uint8_t item)
#ifdef USE_POWER_LIMITS #ifdef USE_POWER_LIMITS
case OSD_PLIMIT_REMAINING_BURST_TIME: case OSD_PLIMIT_REMAINING_BURST_TIME:
osdFormatCentiNumber(buff, powerLimiterGetRemainingBurstTime() * 100, 0, 1, 0, 3); osdFormatCentiNumber(buff, powerLimiterGetRemainingBurstTime() * 100, 0, 1, 0, 3, false);
buff[3] = 'S'; buff[3] = 'S';
buff[4] = '\0'; buff[4] = '\0';
break; break;
case OSD_PLIMIT_ACTIVE_CURRENT_LIMIT: case OSD_PLIMIT_ACTIVE_CURRENT_LIMIT:
if (currentBatteryProfile->powerLimits.continuousCurrent) { if (currentBatteryProfile->powerLimits.continuousCurrent) {
osdFormatCentiNumber(buff, powerLimiterGetActiveCurrentLimit(), 0, 2, 0, 3); osdFormatCentiNumber(buff, powerLimiterGetActiveCurrentLimit(), 0, 2, 0, 3, false);
buff[3] = SYM_AMP; buff[3] = SYM_AMP;
buff[4] = '\0'; buff[4] = '\0';
@ -3494,7 +3496,7 @@ static bool osdDrawSingleElement(uint8_t item)
case OSD_PLIMIT_ACTIVE_POWER_LIMIT: case OSD_PLIMIT_ACTIVE_POWER_LIMIT:
{ {
if (currentBatteryProfile->powerLimits.continuousPower) { if (currentBatteryProfile->powerLimits.continuousPower) {
bool kiloWatt = osdFormatCentiNumber(buff, powerLimiterGetActivePowerLimit(), 1000, 2, 2, 3); bool kiloWatt = osdFormatCentiNumber(buff, powerLimiterGetActivePowerLimit(), 1000, 2, 2, 3, false);
buff[3] = kiloWatt ? SYM_KILOWATT : SYM_WATT; buff[3] = kiloWatt ? SYM_KILOWATT : SYM_WATT;
buff[4] = '\0'; buff[4] = '\0';
@ -4017,7 +4019,7 @@ static void osdCompleteAsyncInitialization(void)
#ifdef USE_ADC #ifdef USE_ADC
if (feature(FEATURE_VBAT) && feature(FEATURE_CURRENT_METER)) { if (feature(FEATURE_VBAT) && feature(FEATURE_CURRENT_METER)) {
displayWrite(osdDisplayPort, statNameX, ++y, "TOTAL ENERGY:"); displayWrite(osdDisplayPort, statNameX, ++y, "TOTAL ENERGY:");
osdFormatCentiNumber(string_buffer, statsConfig()->stats_total_energy / 10, 0, 2, 0, 4); osdFormatCentiNumber(string_buffer, statsConfig()->stats_total_energy / 10, 0, 2, 0, 4, false);
strcat(string_buffer, "\xAB"); // SYM_WH strcat(string_buffer, "\xAB"); // SYM_WH
displayWrite(osdDisplayPort, statValueX-4, y, string_buffer); displayWrite(osdDisplayPort, statValueX-4, y, string_buffer);
@ -4028,18 +4030,18 @@ static void osdCompleteAsyncInitialization(void)
case OSD_UNIT_UK: case OSD_UNIT_UK:
FALLTHROUGH; FALLTHROUGH;
case OSD_UNIT_IMPERIAL: case OSD_UNIT_IMPERIAL:
osdFormatCentiNumber(string_buffer, avg_efficiency / 10, 0, 2, 0, 3); osdFormatCentiNumber(string_buffer, avg_efficiency / 10, 0, 2, 0, 3, false);
string_buffer[3] = SYM_WH_MI; string_buffer[3] = SYM_WH_MI;
break; break;
case OSD_UNIT_GA: case OSD_UNIT_GA:
osdFormatCentiNumber(string_buffer, avg_efficiency / 10, 0, 2, 0, 3); osdFormatCentiNumber(string_buffer, avg_efficiency / 10, 0, 2, 0, 3, false);
string_buffer[3] = SYM_WH_NM; string_buffer[3] = SYM_WH_NM;
break; break;
default: default:
case OSD_UNIT_METRIC_MPH: case OSD_UNIT_METRIC_MPH:
FALLTHROUGH; FALLTHROUGH;
case OSD_UNIT_METRIC: case OSD_UNIT_METRIC:
osdFormatCentiNumber(string_buffer, avg_efficiency / 10000 * METERS_PER_MILE, 0, 2, 0, 3); osdFormatCentiNumber(string_buffer, avg_efficiency / 10000 * METERS_PER_MILE, 0, 2, 0, 3, false);
string_buffer[3] = SYM_WH_KM; string_buffer[3] = SYM_WH_KM;
break; break;
} }
@ -4254,22 +4256,22 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page)
if (isSinglePageStatsCompatible || page == 1) { if (isSinglePageStatsCompatible || page == 1) {
if (osdConfig()->stats_min_voltage_unit == OSD_STATS_MIN_VOLTAGE_UNIT_BATTERY) { if (osdConfig()->stats_min_voltage_unit == OSD_STATS_MIN_VOLTAGE_UNIT_BATTERY) {
displayWrite(osdDisplayPort, statNameX, top, "MIN BATTERY VOLT :"); displayWrite(osdDisplayPort, statNameX, top, "MIN BATTERY VOLT :");
osdFormatCentiNumber(buff, stats.min_voltage, 0, osdConfig()->main_voltage_decimals, 0, osdConfig()->main_voltage_decimals + 2); osdFormatCentiNumber(buff, stats.min_voltage, 0, osdConfig()->main_voltage_decimals, 0, osdConfig()->main_voltage_decimals + 2, false);
} else { } else {
displayWrite(osdDisplayPort, statNameX, top, "MIN CELL VOLTAGE :"); displayWrite(osdDisplayPort, statNameX, top, "MIN CELL VOLTAGE :");
osdFormatCentiNumber(buff, stats.min_voltage/getBatteryCellCount(), 0, 2, 0, 3); osdFormatCentiNumber(buff, stats.min_voltage/getBatteryCellCount(), 0, 2, 0, 3, false);
} }
tfp_sprintf(buff, "%s%c", buff, SYM_VOLT); tfp_sprintf(buff, "%s%c", buff, SYM_VOLT);
displayWrite(osdDisplayPort, statValuesX, top++, buff); displayWrite(osdDisplayPort, statValuesX, top++, buff);
if (feature(FEATURE_CURRENT_METER)) { if (feature(FEATURE_CURRENT_METER)) {
displayWrite(osdDisplayPort, statNameX, top, "MAX CURRENT :"); displayWrite(osdDisplayPort, statNameX, top, "MAX CURRENT :");
osdFormatCentiNumber(buff, stats.max_current, 0, 2, 0, 3); osdFormatCentiNumber(buff, stats.max_current, 0, 2, 0, 3, false);
tfp_sprintf(buff, "%s%c", buff, SYM_AMP); tfp_sprintf(buff, "%s%c", buff, SYM_AMP);
displayWrite(osdDisplayPort, statValuesX, top++, buff); displayWrite(osdDisplayPort, statValuesX, top++, buff);
displayWrite(osdDisplayPort, statNameX, top, "MAX POWER :"); displayWrite(osdDisplayPort, statNameX, top, "MAX POWER :");
bool kiloWatt = osdFormatCentiNumber(buff, stats.max_power, 1000, 2, 2, 3); bool kiloWatt = osdFormatCentiNumber(buff, stats.max_power, 1000, 2, 2, 3, false);
buff[3] = kiloWatt ? SYM_KILOWATT : SYM_WATT; buff[3] = kiloWatt ? SYM_KILOWATT : SYM_WATT;
buff[4] = '\0'; buff[4] = '\0';
displayWrite(osdDisplayPort, statValuesX, top++, buff); displayWrite(osdDisplayPort, statValuesX, top++, buff);
@ -4278,7 +4280,7 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page)
if (osdConfig()->stats_energy_unit == OSD_STATS_ENERGY_UNIT_MAH) { if (osdConfig()->stats_energy_unit == OSD_STATS_ENERGY_UNIT_MAH) {
tfp_sprintf(buff, "%d%c", (int)getMAhDrawn(), SYM_MAH); tfp_sprintf(buff, "%d%c", (int)getMAhDrawn(), SYM_MAH);
} else { } else {
osdFormatCentiNumber(buff, getMWhDrawn() / 10, 0, 2, 0, 3); osdFormatCentiNumber(buff, getMWhDrawn() / 10, 0, 2, 0, 3, false);
tfp_sprintf(buff, "%s%c", buff, SYM_WH); tfp_sprintf(buff, "%s%c", buff, SYM_WH);
} }
displayWrite(osdDisplayPort, statValuesX, top++, buff); displayWrite(osdDisplayPort, statValuesX, top++, buff);
@ -4300,7 +4302,7 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page)
FALLTHROUGH; FALLTHROUGH;
case OSD_UNIT_IMPERIAL: case OSD_UNIT_IMPERIAL:
if (osdConfig()->stats_energy_unit == OSD_STATS_ENERGY_UNIT_MAH) { if (osdConfig()->stats_energy_unit == OSD_STATS_ENERGY_UNIT_MAH) {
moreThanAh = osdFormatCentiNumber(buff, (int32_t)(getMAhDrawn() * 10000.0f * METERS_PER_MILE / totalDistance), 1000, 0, 2, digits); moreThanAh = osdFormatCentiNumber(buff, (int32_t)(getMAhDrawn() * 10000.0f * METERS_PER_MILE / totalDistance), 1000, 0, 2, digits, false);
if (!moreThanAh) { if (!moreThanAh) {
tfp_sprintf(buff, "%s%c%c", buff, SYM_MAH_MI_0, SYM_MAH_MI_1); tfp_sprintf(buff, "%s%c%c", buff, SYM_MAH_MI_0, SYM_MAH_MI_1);
} else { } else {
@ -4313,7 +4315,7 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page)
buff[5] = '\0'; buff[5] = '\0';
} }
} else { } else {
osdFormatCentiNumber(buff, (int32_t)(getMWhDrawn() * 10.0f * METERS_PER_MILE / totalDistance), 0, 2, 0, digits); osdFormatCentiNumber(buff, (int32_t)(getMWhDrawn() * 10.0f * METERS_PER_MILE / totalDistance), 0, 2, 0, digits, false);
tfp_sprintf(buff, "%s%c", buff, SYM_WH_MI); tfp_sprintf(buff, "%s%c", buff, SYM_WH_MI);
if (!efficiencyValid) { if (!efficiencyValid) {
buff[0] = buff[1] = buff[2] = '-'; buff[0] = buff[1] = buff[2] = '-';
@ -4322,7 +4324,7 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page)
break; break;
case OSD_UNIT_GA: case OSD_UNIT_GA:
if (osdConfig()->stats_energy_unit == OSD_STATS_ENERGY_UNIT_MAH) { if (osdConfig()->stats_energy_unit == OSD_STATS_ENERGY_UNIT_MAH) {
moreThanAh = osdFormatCentiNumber(buff, (int32_t)(getMAhDrawn() * 10000.0f * METERS_PER_NAUTICALMILE / totalDistance), 1000, 0, 2, digits); moreThanAh = osdFormatCentiNumber(buff, (int32_t)(getMAhDrawn() * 10000.0f * METERS_PER_NAUTICALMILE / totalDistance), 1000, 0, 2, digits, false);
if (!moreThanAh) { if (!moreThanAh) {
tfp_sprintf(buff, "%s%c%c", buff, SYM_MAH_NM_0, SYM_MAH_NM_1); tfp_sprintf(buff, "%s%c%c", buff, SYM_MAH_NM_0, SYM_MAH_NM_1);
} else { } else {
@ -4335,7 +4337,7 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page)
buff[5] = '\0'; buff[5] = '\0';
} }
} else { } else {
osdFormatCentiNumber(buff, (int32_t)(getMWhDrawn() * 10.0f * METERS_PER_NAUTICALMILE / totalDistance), 0, 2, 0, digits); osdFormatCentiNumber(buff, (int32_t)(getMWhDrawn() * 10.0f * METERS_PER_NAUTICALMILE / totalDistance), 0, 2, 0, digits, false);
tfp_sprintf(buff, "%s%c", buff, SYM_WH_NM); tfp_sprintf(buff, "%s%c", buff, SYM_WH_NM);
if (!efficiencyValid) { if (!efficiencyValid) {
buff[0] = buff[1] = buff[2] = '-'; buff[0] = buff[1] = buff[2] = '-';
@ -4346,7 +4348,7 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page)
FALLTHROUGH; FALLTHROUGH;
case OSD_UNIT_METRIC: case OSD_UNIT_METRIC:
if (osdConfig()->stats_energy_unit == OSD_STATS_ENERGY_UNIT_MAH) { if (osdConfig()->stats_energy_unit == OSD_STATS_ENERGY_UNIT_MAH) {
moreThanAh = osdFormatCentiNumber(buff, (int32_t)(getMAhDrawn() * 10000000.0f / totalDistance), 1000, 0, 2, digits); moreThanAh = osdFormatCentiNumber(buff, (int32_t)(getMAhDrawn() * 10000000.0f / totalDistance), 1000, 0, 2, digits, false);
if (!moreThanAh) { if (!moreThanAh) {
tfp_sprintf(buff, "%s%c%c", buff, SYM_MAH_KM_0, SYM_MAH_KM_1); tfp_sprintf(buff, "%s%c%c", buff, SYM_MAH_KM_0, SYM_MAH_KM_1);
} else { } else {
@ -4359,7 +4361,7 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page)
buff[5] = '\0'; buff[5] = '\0';
} }
} else { } else {
osdFormatCentiNumber(buff, (int32_t)(getMWhDrawn() * 10000.0f / totalDistance), 0, 2, 0, digits); osdFormatCentiNumber(buff, (int32_t)(getMWhDrawn() * 10000.0f / totalDistance), 0, 2, 0, digits, false);
tfp_sprintf(buff, "%s%c", buff, SYM_WH_KM); tfp_sprintf(buff, "%s%c", buff, SYM_WH_KM);
if (!efficiencyValid) { if (!efficiencyValid) {
buff[0] = buff[1] = buff[2] = '-'; buff[0] = buff[1] = buff[2] = '-';
@ -4374,19 +4376,19 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page)
const float max_gforce = accGetMeasuredMaxG(); const float max_gforce = accGetMeasuredMaxG();
displayWrite(osdDisplayPort, statNameX, top, "MAX G-FORCE :"); displayWrite(osdDisplayPort, statNameX, top, "MAX G-FORCE :");
osdFormatCentiNumber(buff, max_gforce * 100, 0, 2, 0, 3); osdFormatCentiNumber(buff, max_gforce * 100, 0, 2, 0, 3, false);
displayWrite(osdDisplayPort, statValuesX, top++, buff); displayWrite(osdDisplayPort, statValuesX, top++, buff);
const acc_extremes_t *acc_extremes = accGetMeasuredExtremes(); const acc_extremes_t *acc_extremes = accGetMeasuredExtremes();
const float acc_extremes_min = acc_extremes[Z].min; const float acc_extremes_min = acc_extremes[Z].min;
const float acc_extremes_max = acc_extremes[Z].max; const float acc_extremes_max = acc_extremes[Z].max;
displayWrite(osdDisplayPort, statNameX, top, "MIN/MAX Z G-FORCE:"); displayWrite(osdDisplayPort, statNameX, top, "MIN/MAX Z G-FORCE:");
osdFormatCentiNumber(buff, acc_extremes_min * 100, 0, 2, 0, 4); osdFormatCentiNumber(buff, acc_extremes_min * 100, 0, 2, 0, 4, false);
osdLeftAlignString(buff); osdLeftAlignString(buff);
strcat(osdFormatTrimWhiteSpace(buff),"/"); strcat(osdFormatTrimWhiteSpace(buff),"/");
multiValueLengthOffset = strlen(buff); multiValueLengthOffset = strlen(buff);
displayWrite(osdDisplayPort, statValuesX, top, buff); displayWrite(osdDisplayPort, statValuesX, top, buff);
osdFormatCentiNumber(buff, acc_extremes_max * 100, 0, 2, 0, 3); osdFormatCentiNumber(buff, acc_extremes_max * 100, 0, 2, 0, 3, false);
osdLeftAlignString(buff); osdLeftAlignString(buff);
displayWrite(osdDisplayPort, statValuesX + multiValueLengthOffset, top++, buff); displayWrite(osdDisplayPort, statValuesX + multiValueLengthOffset, top++, buff);
} }

View file

@ -483,7 +483,7 @@ void osdStartedSaveProcess(void);
void osdShowEEPROMSavedNotification(void); void osdShowEEPROMSavedNotification(void);
void osdCrosshairPosition(uint8_t *x, uint8_t *y); void osdCrosshairPosition(uint8_t *x, uint8_t *y);
bool osdFormatCentiNumber(char *buff, int32_t centivalue, uint32_t scale, int maxDecimals, int maxScaledDecimals, int length); bool osdFormatCentiNumber(char *buff, int32_t centivalue, uint32_t scale, int maxDecimals, int maxScaledDecimals, int length, bool leadingZeros);
void osdFormatAltitudeSymbol(char *buff, int32_t alt); void osdFormatAltitudeSymbol(char *buff, int32_t alt);
void osdFormatVelocityStr(char* buff, int32_t vel, bool _3D, bool _max); void osdFormatVelocityStr(char* buff, int32_t vel, bool _3D, bool _max);
// Returns a heading angle in degrees normalized to [0, 360). // Returns a heading angle in degrees normalized to [0, 360).

View file

@ -256,18 +256,18 @@ void osdHudDrawPoi(uint32_t poiDistance, int16_t poiDirection, int32_t poiAltitu
case OSD_UNIT_IMPERIAL: case OSD_UNIT_IMPERIAL:
{ {
if (poiType == 1) { if (poiType == 1) {
osdFormatCentiNumber(buff, CENTIMETERS_TO_CENTIFEET(poiDistance * 100), FEET_PER_MILE, 0, 4, 4); osdFormatCentiNumber(buff, CENTIMETERS_TO_CENTIFEET(poiDistance * 100), FEET_PER_MILE, 0, 4, 4, false);
} else { } else {
osdFormatCentiNumber(buff, CENTIMETERS_TO_CENTIFEET(poiDistance * 100), FEET_PER_MILE, 0, 3, 3); osdFormatCentiNumber(buff, CENTIMETERS_TO_CENTIFEET(poiDistance * 100), FEET_PER_MILE, 0, 3, 3, false);
} }
} }
break; break;
case OSD_UNIT_GA: case OSD_UNIT_GA:
{ {
if (poiType == 1) { if (poiType == 1) {
osdFormatCentiNumber(buff, CENTIMETERS_TO_CENTIFEET(poiDistance * 100), (uint32_t)FEET_PER_NAUTICALMILE, 0, 4, 4); osdFormatCentiNumber(buff, CENTIMETERS_TO_CENTIFEET(poiDistance * 100), (uint32_t)FEET_PER_NAUTICALMILE, 0, 4, 4, false);
} else { } else {
osdFormatCentiNumber(buff, CENTIMETERS_TO_CENTIFEET(poiDistance * 100), (uint32_t)FEET_PER_NAUTICALMILE, 0, 3, 3); osdFormatCentiNumber(buff, CENTIMETERS_TO_CENTIFEET(poiDistance * 100), (uint32_t)FEET_PER_NAUTICALMILE, 0, 3, 3, false);
} }
} }
break; break;
@ -278,9 +278,9 @@ void osdHudDrawPoi(uint32_t poiDistance, int16_t poiDirection, int32_t poiAltitu
case OSD_UNIT_METRIC: case OSD_UNIT_METRIC:
{ {
if (poiType == 1) { if (poiType == 1) {
osdFormatCentiNumber(buff, poiDistance * 100, METERS_PER_KILOMETER, 0, 4, 4); osdFormatCentiNumber(buff, poiDistance * 100, METERS_PER_KILOMETER, 0, 4, 4, false);
} else { } else {
osdFormatCentiNumber(buff, poiDistance * 100, METERS_PER_KILOMETER, 0, 3, 3); osdFormatCentiNumber(buff, poiDistance * 100, METERS_PER_KILOMETER, 0, 3, 3, false);
} }
} }
break; break;

View file

@ -38,7 +38,7 @@ int digitCount(int32_t value)
} }
bool osdFormatCentiNumber(char *buff, int32_t centivalue, uint32_t scale, int maxDecimals, int maxScaledDecimals, int length) bool osdFormatCentiNumber(char *buff, int32_t centivalue, uint32_t scale, int maxDecimals, int maxScaledDecimals, int length, bool leadingZeros)
{ {
char *ptr = buff; char *ptr = buff;
char *dec; char *dec;
@ -86,7 +86,11 @@ bool osdFormatCentiNumber(char *buff, int32_t centivalue, uint32_t scale, int ma
// Done counting. Time to write the characters. // Done counting. Time to write the characters.
// Write spaces at the start // Write spaces at the start
while (remaining > 0) { while (remaining > 0) {
*ptr = SYM_BLANK; if (leadingZeros)
*ptr = '0';
else
*ptr = SYM_BLANK;
ptr++; ptr++;
remaining--; remaining--;
} }
@ -98,7 +102,11 @@ bool osdFormatCentiNumber(char *buff, int32_t centivalue, uint32_t scale, int ma
// Add any needed remaining leading spaces // Add any needed remaining leading spaces
while(rem_spaces > 0) while(rem_spaces > 0)
{ {
*ptr = SYM_BLANK; if (leadingZeros)
*ptr = '0';
else
*ptr = SYM_BLANK;
ptr++; ptr++;
remaining--; remaining--;
rem_spaces--; rem_spaces--;

View file

@ -33,6 +33,6 @@ int digitCount(int32_t value);
* of the same length. If the value doesn't fit into the provided length * of the same length. If the value doesn't fit into the provided length
* it will be divided by scale and true will be returned. * it will be divided by scale and true will be returned.
*/ */
bool osdFormatCentiNumber(char *buff, int32_t centivalue, uint32_t scale, int maxDecimals, int maxScaledDecimals, int length); bool osdFormatCentiNumber(char *buff, int32_t centivalue, uint32_t scale, int maxDecimals, int maxScaledDecimals, int length, bool leadingZeros);
#endif #endif