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:
parent
de2c439b5d
commit
524b0d0bf4
7 changed files with 133 additions and 124 deletions
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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).
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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--;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue