feat(radio): modify Sensor Edit screens to show Ratio + Percentage (#4649)

This commit is contained in:
Frankie Arzu
2024-05-29 13:08:42 +10:00
committed by GitHub
parent 5d20c81126
commit c19f6402d0
5 changed files with 119 additions and 10 deletions
@@ -41,8 +41,8 @@ enum SensorFields {
SENSOR_FIELD_MAX
};
constexpr coord_t SENSOR_2ND_COLUMN = 12 * FW;
constexpr coord_t SENSOR_3RD_COLUMN = 18 * FW;
constexpr coord_t SENSOR_2ND_COLUMN = 12 * FW;
constexpr coord_t SENSOR_3RD_COLUMN = 17 * FW - 2;
void menuModelSensor(event_t event)
{
@@ -220,10 +220,47 @@ void menuModelSensor(event_t event)
else {
lcdDrawTextAlignedLeft(y, STR_RATIO);
if (attr) CHECK_INCDEC_MODELVAR(event, sensor->custom.ratio, 0, 30000);
if (sensor->custom.ratio == 0)
if (sensor->custom.ratio == 0) {
lcdDrawChar(SENSOR_2ND_COLUMN, y, '-', attr);
else
lcdDrawNumber(SENSOR_2ND_COLUMN, y, sensor->custom.ratio, LEFT|attr|PREC1);
} else { // Ratio + Ratio Percent
uint32_t ratio = (sensor->custom.ratio * 1000) / 255;
int ratioLen = countDigits(sensor->custom.ratio);
int ratioPercLen = countDigits(ratio);
int suffixOffset = 0;
int ratioColAdj = 0;
int ratioPercColAdj = 0;
if (ratioLen <= 3) {
ratioColAdj = 0;
} else if (ratioLen <= 4) {
ratioColAdj = (FWNUM * 1);
} else if (ratioLen >= 5) {
ratioColAdj = (FWNUM * 2);
}
if (ratioPercLen < 2) {
ratioPercColAdj = 0;
suffixOffset = (FWNUM * (ratioPercLen + 1)) + 2;
} else if (ratioPercLen <= 4 ) {
ratioPercColAdj = 0;
suffixOffset = (FWNUM * ratioPercLen) + 2;
} else if (ratioPercLen <= 5) {
ratioColAdj += (FWNUM * 1); // move first column to maintain separation
ratioPercColAdj = (FWNUM * 1);
suffixOffset = (FWNUM * (ratioPercLen - 1)) + 2;
} else if (ratioPercLen >= 6) {
ratioColAdj += (FWNUM * 2); // move first column to maintain separation
ratioPercColAdj = (FWNUM * 2);
suffixOffset = (FWNUM * (ratioPercLen - 2)) + 2;
}
lcdDrawNumber(SENSOR_2ND_COLUMN - ratioColAdj, y,
sensor->custom.ratio, LEFT | attr | PREC1);
lcdDrawNumber(SENSOR_3RD_COLUMN - ratioPercColAdj, y,
ratio, LEFT | PREC1);
lcdDrawChar(SENSOR_3RD_COLUMN + suffixOffset, y, '%', 0);
}
break;
}
}
@@ -234,10 +234,15 @@ void menuModelSensor(event_t event)
else {
lcdDrawTextAlignedLeft(y, STR_RATIO);
if (attr) sensor->custom.ratio = checkIncDec(event, sensor->custom.ratio, 0, 30000, EE_MODEL|NO_INCDEC_MARKS|INCDEC_REP10);
if (sensor->custom.ratio == 0)
if (sensor->custom.ratio == 0) {
lcdDrawChar(SENSOR_2ND_COLUMN, y, '-', attr);
else
} else { // Ratio + Ratio Percent
lcdDrawNumber(SENSOR_2ND_COLUMN, y, sensor->custom.ratio, LEFT|attr|PREC1);
uint32_t ratio = (sensor->custom.ratio * 1000) / 255;
int ratio_len = countDigits(ratio);
lcdDrawNumber(SENSOR_3RD_COLUMN, y, ratio, LEFT|PREC1);
lcdDrawChar(SENSOR_3RD_COLUMN+(FWNUM*ratio_len)+3, y, '%', 0);
}
break;
}
}
+50 -3
View File
@@ -390,6 +390,54 @@ class SensorSourceChoice : public SourceChoice
}
};
class SensorRatioEdit : Window
{
public:
SensorRatioEdit(Window* parent, const rect_t& rect, int vmin, int vmax,
std::function<int()> _getValue,
std::function<void(int)> _setValue) :
Window(parent, rect),
m_getValue(std::move(_getValue)),
m_setValue(std::move(_setValue))
{
setFlexLayout(LV_FLEX_FLOW_ROW, 75);
lv_obj_set_flex_align(lvobj, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER,
LV_FLEX_ALIGN_SPACE_AROUND);
editRatio = new NumberEdit(
this, rect_t{}, vmin, vmax, m_getValue,
[=](int32_t newValue) {
m_setValue(newValue);
setPercent();
},
PREC1);
editRatio->setZeroText("-");
percentText = new StaticText(this, rect_t{}, "");
setPercent();
}
protected:
int32_t ratioPercent;
NumberEdit* editRatio;
StaticText* percentText;
std::function<int()> m_getValue;
std::function<void(int)> m_setValue;
private:
void setPercent()
{
int32_t value = m_getValue();
if (value == 0) {
percentText->setText("");
} else {
std::string str =
formatNumberAsString((value * 1000) / 255, PREC1, 0, "", "%");
percentText->setText(str);
}
}
};
class SensorEditWindow : public Page
{
public:
@@ -697,9 +745,8 @@ class SensorEditWindow : public Page
paramLines[P_RATIO] = window->newLine(grid);
new StaticText(paramLines[P_RATIO], rect_t{}, STR_RATIO);
auto edit = new NumberEdit(paramLines[P_RATIO], rect_t{}, 0, 30000,
GET_SET_DEFAULT(sensor->custom.ratio), PREC1);
edit->setZeroText("-");
new SensorRatioEdit(paramLines[P_RATIO], rect_t{}, 0, 30000,
GET_SET_DEFAULT(sensor->custom.ratio));
paramLines[P_CELLINDEX] = window->newLine(grid);
new StaticText(paramLines[P_CELLINDEX], rect_t{}, STR_CELLINDEX);
+18
View File
@@ -1183,6 +1183,24 @@ char *strAppendDate(char *str, bool time)
#if !defined(BOOT)
#endif
/**
* @brief Count the number of digits in a string.
* Works with negative numbers, and zero is considered to have 1 digit.
* @param number Integer whose digits are to be counted.
* @return The number of digits in the integer.
*/
int countDigits(int number)
{
number = std::abs(number); // Handle negative numbers if any
if (number == 0) return 1; // Special case for 0
int count = 0;
while (number > 0) {
number /= 10;
count++;
}
return count;
}
// Manage timezones
// For backward compatibility timezone is stored as two separate values:
// timezone = hour value
+2
View File
@@ -174,6 +174,8 @@ std::string getGPSSensorValue(TelemetryItem &telemetryItem, LcdFlags flags);
std::string getTelemDate(TelemetryItem &telemetryItem);
std::string getTelemTime(TelemetryItem &telemetryItem);
int countDigits(int number);
// Timezone handling
extern int8_t minTimezone();
extern int8_t maxTimezone();