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

View file

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

View file

@ -311,7 +311,7 @@ static void osdFormatDistanceSymbol(char *buff, int32_t dist, uint8_t decimals)
case OSD_UNIT_UK:
FALLTHROUGH;
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;
} else {
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:
FALLTHROUGH;
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;
} else {
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';
break;
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;
} else {
buff[sym_index] = symbol_ft;
@ -484,7 +484,7 @@ static void osdFormatWindSpeedStr(char *buff, int32_t ws, bool isValid)
break;
}
osdFormatCentiNumber(buff, centivalue, 0, 2, 0, 3);
osdFormatCentiNumber(buff, centivalue, 0, 2, 0, 3, false);
if (!isValid && ((millis() / 1000) % 4 < 2))
suffix = '*';
@ -557,7 +557,7 @@ void osdFormatAltitudeSymbol(char *buff, int32_t alt)
case OSD_UNIT_GA:
FALLTHROUGH;
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
buff[symbolIndex++] = symbolKFt;
} else {
@ -570,7 +570,7 @@ void osdFormatAltitudeSymbol(char *buff, int32_t alt)
FALLTHROUGH;
case OSD_UNIT_METRIC:
// 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
buff[symbolIndex++] = SYM_ALT_KM;
} else {
@ -1142,7 +1142,7 @@ static void osdFormatGVar(char *buff, uint8_t index)
buff[1] = '0'+index;
buff[2] = ':';
#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
}
@ -1153,7 +1153,7 @@ static void osdFormatRpm(char *buff, uint32_t rpm)
if (rpm) {
if ( digitCount(rpm) > osdConfig()->esc_rpm_precision) {
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+1] = '\0';
}
@ -1477,13 +1477,13 @@ static void osdFormatPidControllerOutput(char *buff, const char *label, const pi
strcpy(buff, label);
for (uint8_t i = strlen(label); i < 5; ++i) buff[i] = ' ';
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] = ' ';
osdFormatCentiNumber(buff + 10, pidController->integrator * scale, 0, decimals, 0, 4);
osdFormatCentiNumber(buff + 10, pidController->integrator * scale, 0, decimals, 0, 4, false);
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] = ' ';
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';
}
@ -1499,7 +1499,7 @@ static void osdDisplayBatteryVoltage(uint8_t elemPosX, uint8_t elemPosY, uint16_
elemAttr = TEXT_ATTRIBUTES_NONE;
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+1] = '\0';
const batteryState_e batteryVoltageState = checkBatteryVoltageState();
@ -1593,7 +1593,7 @@ static void osdDisplayAdjustableDecimalValue(uint8_t elemPosX, uint8_t elemPosY,
displayWrite(osdDisplayPort, elemPosX, elemPosY, str);
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))
TEXT_ATTRIBUTES_ADD_BLINK(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: {
osdFormatCentiNumber(buff, getAmperage(), 0, 2, 0, 3);
osdFormatCentiNumber(buff, getAmperage(), 0, 2, 0, 3, false);
buff[3] = SYM_AMP;
buff[4] = '\0';
@ -1725,7 +1725,7 @@ static bool osdDrawSingleElement(uint8_t item)
buff[5] = SYM_MAH;
buff[6] = '\0';
} 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
buff[mah_digits] = SYM_AH;
} else {
@ -1740,7 +1740,7 @@ static bool osdDrawSingleElement(uint8_t item)
}
case OSD_WH_DRAWN:
osdFormatCentiNumber(buff, getMWhDrawn() / 10, 0, 2, 0, 3);
osdFormatCentiNumber(buff, getMWhDrawn() / 10, 0, 2, 0, 3, false);
osdUpdateBatteryCapacityOrVoltageTextAttributes(&elemAttr);
buff[3] = SYM_WH;
buff[4] = '\0';
@ -1755,7 +1755,7 @@ static bool osdDrawSingleElement(uint8_t item)
else if (currentBatteryProfile->capacity.unit == BAT_CAPACITY_UNIT_MAH)
tfp_sprintf(buff, "%4lu", (unsigned long)getBatteryRemainingCapacity());
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[5] = '\0';
@ -1823,7 +1823,7 @@ static bool osdDrawSingleElement(uint8_t item)
buff[0] = SYM_GLIDESLOPE;
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 {
buff[1] = buff[2] = buff[3] = '-';
}
@ -1904,30 +1904,32 @@ static bool osdDrawSingleElement(uint8_t item)
case OSD_ODOMETER:
{
displayWriteChar(osdDisplayPort, elemPosX, elemPosY, SYM_ODOMETER);
uint32_t odometerDist = getTotalTravelDistance() / 100;
uint32_t odometerDist = (uint32_t)(getTotalTravelDistance() / 100);
#ifdef USE_STATS
odometerDist+= statsConfig()->stats_total_dist;
#endif
odometerDist = odometerDist / 10;
switch (osdConfig()->units) {
case OSD_UNIT_UK:
FALLTHROUGH;
case OSD_UNIT_IMPERIAL:
tfp_sprintf(buff, "%5d", (int)(odometerDist / METERS_PER_MILE));
buff[5] = SYM_MI;
osdFormatCentiNumber(buff, CENTIMETERS_TO_CENTIFEET(odometerDist), FEET_PER_MILE, 1, 0, 6, true);
buff[6] = SYM_MI;
break;
default:
case OSD_UNIT_GA:
tfp_sprintf(buff, "%5d", (int)(odometerDist / METERS_PER_NAUTICALMILE));
buff[5] = SYM_NM;
osdFormatCentiNumber(buff, CENTIMETERS_TO_CENTIFEET(odometerDist), (uint32_t)FEET_PER_NAUTICALMILE, 1, 0, 6, true);
buff[6] = SYM_NM;
break;
case OSD_UNIT_METRIC_MPH:
FALLTHROUGH;
case OSD_UNIT_METRIC:
tfp_sprintf(buff, "%5d", (int)(odometerDist / METERS_PER_KILOMETER));
buff[5] = SYM_KM;
osdFormatCentiNumber(buff, odometerDist, METERS_PER_KILOMETER, 1, 0, 6, true);
buff[6] = SYM_KM;
break;
}
buff[6] = '\0';
buff[7] = '\0';
elemPosX++;
}
break;
@ -2014,7 +2016,7 @@ static bool osdDrawSingleElement(uint8_t item)
digits = 3U;
}
#endif
osdFormatCentiNumber(&buff[2], centiHDOP, 0, 1, 0, digits);
osdFormatCentiNumber(&buff[2], centiHDOP, 0, 1, 0, digits, false);
break;
}
@ -2444,7 +2446,7 @@ static bool osdDrawSingleElement(uint8_t item)
buff[0] = SYM_ROLL_LEVEL;
if (ABS(attitude.values.roll) >= 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;
case OSD_ATTITUDE_PITCH:
@ -2454,7 +2456,7 @@ static bool osdDrawSingleElement(uint8_t item)
buff[0] = SYM_PITCH_DOWN;
else if (attitude.values.pitch < 0)
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;
case OSD_ARTIFICIAL_HORIZON:
@ -2515,7 +2517,7 @@ static bool osdDrawSingleElement(uint8_t item)
break;
}
osdFormatCentiNumber(buff, value, 0, 1, 0, 3);
osdFormatCentiNumber(buff, value, 0, 1, 0, 3, false);
buff[3] = sym;
buff[4] = '\0';
break;
@ -2548,7 +2550,7 @@ static bool osdDrawSingleElement(uint8_t item)
case OSD_UNIT_IMPERIAL:
// mAh/foot
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);
} else {
buff[0] = buff[1] = buff[2] = '-';
@ -2562,7 +2564,7 @@ static bool osdDrawSingleElement(uint8_t item)
case OSD_UNIT_METRIC:
// mAh/metre
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);
} else {
buff[0] = buff[1] = buff[2] = '-';
@ -2857,7 +2859,7 @@ static bool osdDrawSingleElement(uint8_t item)
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[4] = '\0';
@ -3020,7 +3022,7 @@ static bool osdDrawSingleElement(uint8_t item)
case OSD_UNIT_UK:
FALLTHROUGH;
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) {
tfp_sprintf(buff, "%s%c%c", buff, SYM_MAH_MI_0, SYM_MAH_MI_1);
} else {
@ -3034,7 +3036,7 @@ static bool osdDrawSingleElement(uint8_t item)
}
break;
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) {
tfp_sprintf(buff, "%s%c%c", buff, SYM_MAH_NM_0, SYM_MAH_NM_1);
} else {
@ -3050,7 +3052,7 @@ static bool osdDrawSingleElement(uint8_t item)
case OSD_UNIT_METRIC_MPH:
FALLTHROUGH;
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) {
tfp_sprintf(buff, "%s%c%c", buff, SYM_MAH_KM_0, SYM_MAH_KM_1);
} else {
@ -3091,17 +3093,17 @@ static bool osdDrawSingleElement(uint8_t item)
case OSD_UNIT_UK:
FALLTHROUGH;
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;
break;
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;
break;
case OSD_UNIT_METRIC_MPH:
FALLTHROUGH;
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;
break;
}
@ -3115,7 +3117,7 @@ static bool osdDrawSingleElement(uint8_t item)
case OSD_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) {
TEXT_ATTRIBUTES_ADD_BLINK(elemAttr);
}
@ -3128,7 +3130,7 @@ static bool osdDrawSingleElement(uint8_t item)
{
float GForceValue = GForceAxis[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)) {
TEXT_ATTRIBUTES_ADD_BLINK(elemAttr);
}
@ -3304,7 +3306,7 @@ static bool osdDrawSingleElement(uint8_t item)
}
buff[0] = SYM_SCALE;
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;
// Make sure this is cleared if the map stops being drawn
osdMapData.scale = 0;
@ -3473,14 +3475,14 @@ static bool osdDrawSingleElement(uint8_t item)
#ifdef USE_POWER_LIMITS
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[4] = '\0';
break;
case OSD_PLIMIT_ACTIVE_CURRENT_LIMIT:
if (currentBatteryProfile->powerLimits.continuousCurrent) {
osdFormatCentiNumber(buff, powerLimiterGetActiveCurrentLimit(), 0, 2, 0, 3);
osdFormatCentiNumber(buff, powerLimiterGetActiveCurrentLimit(), 0, 2, 0, 3, false);
buff[3] = SYM_AMP;
buff[4] = '\0';
@ -3494,7 +3496,7 @@ static bool osdDrawSingleElement(uint8_t item)
case OSD_PLIMIT_ACTIVE_POWER_LIMIT:
{
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[4] = '\0';
@ -4017,7 +4019,7 @@ static void osdCompleteAsyncInitialization(void)
#ifdef USE_ADC
if (feature(FEATURE_VBAT) && feature(FEATURE_CURRENT_METER)) {
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
displayWrite(osdDisplayPort, statValueX-4, y, string_buffer);
@ -4028,18 +4030,18 @@ static void osdCompleteAsyncInitialization(void)
case OSD_UNIT_UK:
FALLTHROUGH;
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;
break;
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;
break;
default:
case OSD_UNIT_METRIC_MPH:
FALLTHROUGH;
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;
break;
}
@ -4254,22 +4256,22 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page)
if (isSinglePageStatsCompatible || page == 1) {
if (osdConfig()->stats_min_voltage_unit == OSD_STATS_MIN_VOLTAGE_UNIT_BATTERY) {
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 {
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);
displayWrite(osdDisplayPort, statValuesX, top++, buff);
if (feature(FEATURE_CURRENT_METER)) {
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);
displayWrite(osdDisplayPort, statValuesX, top++, buff);
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[4] = '\0';
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) {
tfp_sprintf(buff, "%d%c", (int)getMAhDrawn(), SYM_MAH);
} 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);
}
displayWrite(osdDisplayPort, statValuesX, top++, buff);
@ -4300,7 +4302,7 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page)
FALLTHROUGH;
case OSD_UNIT_IMPERIAL:
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) {
tfp_sprintf(buff, "%s%c%c", buff, SYM_MAH_MI_0, SYM_MAH_MI_1);
} else {
@ -4313,7 +4315,7 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page)
buff[5] = '\0';
}
} 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);
if (!efficiencyValid) {
buff[0] = buff[1] = buff[2] = '-';
@ -4322,7 +4324,7 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page)
break;
case OSD_UNIT_GA:
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) {
tfp_sprintf(buff, "%s%c%c", buff, SYM_MAH_NM_0, SYM_MAH_NM_1);
} else {
@ -4335,7 +4337,7 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page)
buff[5] = '\0';
}
} 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);
if (!efficiencyValid) {
buff[0] = buff[1] = buff[2] = '-';
@ -4346,7 +4348,7 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page)
FALLTHROUGH;
case OSD_UNIT_METRIC:
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) {
tfp_sprintf(buff, "%s%c%c", buff, SYM_MAH_KM_0, SYM_MAH_KM_1);
} else {
@ -4359,7 +4361,7 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page)
buff[5] = '\0';
}
} 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);
if (!efficiencyValid) {
buff[0] = buff[1] = buff[2] = '-';
@ -4374,19 +4376,19 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page)
const float max_gforce = accGetMeasuredMaxG();
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);
const acc_extremes_t *acc_extremes = accGetMeasuredExtremes();
const float acc_extremes_min = acc_extremes[Z].min;
const float acc_extremes_max = acc_extremes[Z].max;
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);
strcat(osdFormatTrimWhiteSpace(buff),"/");
multiValueLengthOffset = strlen(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);
displayWrite(osdDisplayPort, statValuesX + multiValueLengthOffset, top++, buff);
}

View file

@ -483,7 +483,7 @@ void osdStartedSaveProcess(void);
void osdShowEEPROMSavedNotification(void);
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 osdFormatVelocityStr(char* buff, int32_t vel, bool _3D, bool _max);
// 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:
{
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 {
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;
case OSD_UNIT_GA:
{
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 {
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;
@ -278,9 +278,9 @@ void osdHudDrawPoi(uint32_t poiDistance, int16_t poiDirection, int32_t poiAltitu
case OSD_UNIT_METRIC:
{
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 {
osdFormatCentiNumber(buff, poiDistance * 100, METERS_PER_KILOMETER, 0, 3, 3);
osdFormatCentiNumber(buff, poiDistance * 100, METERS_PER_KILOMETER, 0, 3, 3, false);
}
}
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 *dec;
@ -86,7 +86,11 @@ bool osdFormatCentiNumber(char *buff, int32_t centivalue, uint32_t scale, int ma
// Done counting. Time to write the characters.
// Write spaces at the start
while (remaining > 0) {
*ptr = SYM_BLANK;
if (leadingZeros)
*ptr = '0';
else
*ptr = SYM_BLANK;
ptr++;
remaining--;
}
@ -98,7 +102,11 @@ bool osdFormatCentiNumber(char *buff, int32_t centivalue, uint32_t scale, int ma
// Add any needed remaining leading spaces
while(rem_spaces > 0)
{
*ptr = SYM_BLANK;
if (leadingZeros)
*ptr = '0';
else
*ptr = SYM_BLANK;
ptr++;
remaining--;
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
* 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