fix(telemetry): temperature UNIT conversion when temperature has decimals (#4728)

This commit is contained in:
Frankie Arzu
2024-04-03 11:57:37 +10:00
committed by GitHub
parent 0d84acef59
commit e3f2914871
4 changed files with 31 additions and 11 deletions
@@ -56,7 +56,7 @@ void menuModelSensor(event_t event)
sensor->type == TELEM_TYPE_CALCULATED ? (uint8_t)0 : (uint8_t)1, // ID / Formula
// sensor->type == TELEM_TYPE_CALCULATED ? HIDDEN_ROW : READONLY_ROW, // Receiver name
((sensor->type == TELEM_TYPE_CALCULATED && (sensor->formula == TELEM_FORMULA_DIST)) || sensor->isConfigurable() ? (uint8_t)0 : HIDDEN_ROW), // Unit
(sensor->isPrecConfigurable() && sensor->unit != UNIT_FAHRENHEIT ? (uint8_t)0 : HIDDEN_ROW), // Precision
(sensor->isPrecConfigurable()? (uint8_t)0 : HIDDEN_ROW), // Precision
(sensor->unit >= UNIT_FIRST_VIRTUAL ? HIDDEN_ROW : (uint8_t)0), // Param1
(sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME || sensor->unit == UNIT_CELLS || (sensor->type==TELEM_TYPE_CALCULATED && (sensor->formula==TELEM_FORMULA_CONSUMPTION || sensor->formula==TELEM_FORMULA_TOTALIZE)) ? HIDDEN_ROW : (uint8_t)0), // Param2
(sensor->type == TELEM_TYPE_CALCULATED && sensor->formula < TELEM_FORMULA_MULTIPLY) ? (uint8_t)0 : HIDDEN_ROW, // Param3
@@ -45,7 +45,7 @@ enum SensorFields {
#define SENSOR_3RD_COLUMN (18*FW)
#define SENSOR_UNIT_ROWS ((sensor->type == TELEM_TYPE_CALCULATED && (sensor->formula == TELEM_FORMULA_DIST)) || sensor->isConfigurable() ? (uint8_t)0 : HIDDEN_ROW)
#define SENSOR_PREC_ROWS (sensor->isPrecConfigurable() && sensor->unit != UNIT_FAHRENHEIT ? (uint8_t)0 : HIDDEN_ROW)
#define SENSOR_PREC_ROWS (sensor->isPrecConfigurable() ? (uint8_t)0 : HIDDEN_ROW)
#define SENSOR_PARAM1_ROWS (sensor->unit >= UNIT_FIRST_VIRTUAL ? HIDDEN_ROW : (uint8_t)0)
#define SENSOR_PARAM2_ROWS (sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME || sensor->unit == UNIT_CELLS || (sensor->type==TELEM_TYPE_CALCULATED && (sensor->formula==TELEM_FORMULA_CONSUMPTION || sensor->formula==TELEM_FORMULA_TOTALIZE)) ? HIDDEN_ROW : (uint8_t)0)
#define SENSOR_PARAM3_ROWS (sensor->type == TELEM_TYPE_CALCULATED && sensor->formula < TELEM_FORMULA_MULTIPLY) ? (uint8_t)0 : HIDDEN_ROW
+1 -1
View File
@@ -465,7 +465,7 @@ class SensorEditWindow : public Page {
}
// Precision
if (sensor->isPrecConfigurable() && sensor->unit != UNIT_FAHRENHEIT) {
if (sensor->isPrecConfigurable()) {
lv_obj_clear_flag(paramLines[P_PREC]->getLvObj(), LV_OBJ_FLAG_HIDDEN);
}
+28 -8
View File
@@ -672,19 +672,30 @@ const UnitConversionRule unitConversionTable[] = {
{ 0, 0, 0, 0} // termination
};
// The MAX precision used in sensors is 3..support up to Prec4.
const int16_t power10[] = { 1, 10, 100, 1000, 10000 };
int32_t convertTelemetryValue(int32_t value, uint8_t unit, uint8_t prec, uint8_t destUnit, uint8_t destPrec)
{
for (int i=prec; i<destPrec; i++)
value *= 10;
// if we need to do Temperature conversions, we need to convert the constant 32 from
// Prec0 to max(prec,destPrec).
int8_t temp_prec = prec;
// Ex: Converting from Prec1 -> Prec2.. need to * 10 the value.
// Ex: Converting from Prec0 -> Prec2.. need to * 100 the value.
if (prec < destPrec) {
value *= power10[destPrec-prec];
temp_prec = destPrec;
}
if (unit == UNIT_CELSIUS) {
if (destUnit == UNIT_FAHRENHEIT) {
// T(°F) = T(°C)×1,8 + 32
value = 32 + (value*18) / 10;
value = (32*power10[temp_prec]) + (value*18) / 10;
}
} else if (unit == UNIT_FAHRENHEIT) {
if (destUnit == UNIT_CELSIUS) {
value = (value - 32) * 10/18;
value = (value - (32*power10[temp_prec])) * 10/18;
}
}
else {
@@ -698,8 +709,11 @@ int32_t convertTelemetryValue(int32_t value, uint8_t unit, uint8_t prec, uint8_t
}
}
for (int i=destPrec; i<prec; i++)
value /= 10;
// Ex: Converting from Prec2 -> Prec1.. need to / 10 the value.
// Ex: Converting from Prec2 -> Prec0.. need to / 100 the value.
if (destPrec < prec) {
value = value / power10[prec - destPrec];
}
return value;
}
@@ -720,7 +734,10 @@ int32_t TelemetrySensor::getValue(int32_t value, uint8_t unit, uint8_t prec) con
value = (custom.ratio * value + 122) / 255; // 122/255 (0.48) is to aproximate up (ceiling)
}
value = convertTelemetryValue(value, unit, prec, this->unit, this->prec);
// Does it needs any conversion ?
if ((unit != this->unit) || (prec != this->prec)) {
value = convertTelemetryValue(value, unit, prec, this->unit, this->prec);
}
if (type == TELEM_TYPE_CUSTOM) {
value += custom.offset;
@@ -749,7 +766,10 @@ bool TelemetrySensor::isConfigurable() const
bool TelemetrySensor::isPrecConfigurable() const
{
if (isConfigurable()) {
if (unit == UNIT_FAHRENHEIT) { // use Prec0
return false;
}
else if (isConfigurable()) {
return true;
}
else if (unit == UNIT_CELLS) {