diff --git a/companion/src/eeprominterface.h b/companion/src/eeprominterface.h
index 1c65c9c5d..b982da9d0 100644
--- a/companion/src/eeprominterface.h
+++ b/companion/src/eeprominterface.h
@@ -906,7 +906,8 @@ class SensorData {
char label[4+1];
unsigned int unit;
unsigned int prec;
- unsigned int inputFlags;
+ bool autoOffset;
+ bool filter;
bool logs;
bool persistent;
diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp
index a0531d166..139ea6fe9 100644
--- a/companion/src/firmwares/opentx/opentxeeprom.cpp
+++ b/companion/src/firmwares/opentx/opentxeeprom.cpp
@@ -2696,7 +2696,8 @@ class SensorField: public TransformedField {
internalField.Append(new UnsignedField<1>(sensor.type, "type"));
internalField.Append(new UnsignedField<5>(sensor.unit, "unit"));
internalField.Append(new UnsignedField<2>(sensor.prec, "prec"));
- internalField.Append(new UnsignedField<2>(sensor.inputFlags, "inputFlags"));
+ internalField.Append(new BoolField<1>(sensor.autoOffset));
+ internalField.Append(new BoolField<1>(sensor.filter));
internalField.Append(new BoolField<1>(sensor.logs));
internalField.Append(new BoolField<1>(sensor.persistent));
internalField.Append(new SpareBitsField<4>());
diff --git a/companion/src/modeledit/telemetry.cpp b/companion/src/modeledit/telemetry.cpp
index ee2215640..5eb2fb33f 100644
--- a/companion/src/modeledit/telemetry.cpp
+++ b/companion/src/modeledit/telemetry.cpp
@@ -486,7 +486,8 @@ TelemetrySensorPanel::TelemetrySensorPanel(QWidget *parent, SensorData & sensor,
ui->instance->setField(sensor.instance);
ui->ratio->setField(sensor.ratio);
ui->offset->setField(sensor.offset);
- ui->inputFlags->setField(sensor.inputFlags);
+ ui->autoOffset->setField(sensor.autoOffset);
+ ui->filter->setField(sensor.filter);
ui->logs->setField(sensor.logs);
ui->persistent->setField(sensor.persistent);
ui->gpsSensor->setField(sensor.gps);
diff --git a/companion/src/modeledit/telemetry_sensor.ui b/companion/src/modeledit/telemetry_sensor.ui
index 8d9e03ce1..182159ebb 100644
--- a/companion/src/modeledit/telemetry_sensor.ui
+++ b/companion/src/modeledit/telemetry_sensor.ui
@@ -13,7 +13,7 @@
Form
-
+
0
@@ -521,28 +521,23 @@
-
-
-
-
- 0
- 0
-
+
+
+ Qt::LeftToRight
+
+
+ Auto Offset
+
+
+
+ -
+
+
+ Qt::LeftToRight
+
+
+ Filter
-
-
-
- ---
-
-
- -
-
- Auto Offset
-
-
- -
-
- Filtered
-
-
-
diff --git a/radio/src/functions.cpp b/radio/src/functions.cpp
index 5ec076707..9e2450ef0 100644
--- a/radio/src/functions.cpp
+++ b/radio/src/functions.cpp
@@ -355,6 +355,12 @@ void evalFunctions()
break;
#endif
}
+#if defined(CPUARM)
+ if (CFN_PARAM(cfn)>=FUNC_RESET_PARAM_FIRST_TELEM) {
+ TelemetryItem * telemetryItem = & telemetryItems[CFN_PARAM(cfn)-FUNC_RESET_PARAM_FIRST_TELEM];
+ telemetryItem->clear();
+ }
+#endif
break;
#if defined(CPUARM)
diff --git a/radio/src/gui/9X/menu_model_telemetry.cpp b/radio/src/gui/9X/menu_model_telemetry.cpp
index bbfbaba1b..0750de2f9 100644
--- a/radio/src/gui/9X/menu_model_telemetry.cpp
+++ b/radio/src/gui/9X/menu_model_telemetry.cpp
@@ -192,7 +192,9 @@ enum SensorFields {
SENSOR_FIELD_PARAM2,
SENSOR_FIELD_PARAM3,
SENSOR_FIELD_PARAM4,
- SENSOR_FIELD_INPUT_FLAGS,
+ SENSOR_FIELD_AUTOOFFSET,
+ SENSOR_FIELD_FILTER,
+ SENSOR_FIELD_PERSISTENT,
SENSOR_FIELD_LOGS,
SENSOR_FIELD_MAX
};
@@ -243,18 +245,21 @@ bool isSensorAvailable(int sensor)
#define SENSOR_2ND_COLUMN (12*FW)
#define SENSOR_3RD_COLUMN (18*FW)
-#define SENSOR_UNIT_ROWS (sensor->type == TELEM_TYPE_CALCULATED && sensor->formula >= TELEM_FORMULA_CELL) ? HIDDEN_ROW : ((sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME || sensor->unit == UNIT_CELLS) ? HIDDEN_ROW : (uint8_t)0)
-#define SENSOR_PREC_ROWS (sensor->type == TELEM_TYPE_CALCULATED && sensor->formula >= TELEM_FORMULA_CELL) ? HIDDEN_ROW : ((sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME) ? HIDDEN_ROW : (uint8_t)0)
+#define SENSOR_UNIT_ROWS (sensor->type == TELEM_TYPE_CALCULATED && sensor->formula >= TELEM_FORMULA_CELL) ? HIDDEN_ROW : ((sensor->unit == UNIT_RPMS || sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME || sensor->unit == UNIT_CELLS) ? HIDDEN_ROW : (uint8_t)0)
+#define SENSOR_PREC_ROWS (sensor->type == TELEM_TYPE_CALCULATED && sensor->formula >= TELEM_FORMULA_CELL) ? HIDDEN_ROW : ((sensor->unit == UNIT_RPMS || sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME) ? HIDDEN_ROW : (uint8_t)0)
#define SENSOR_PARAM1_ROWS (sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME || sensor->unit == UNIT_CELLS) ? 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)) ? HIDDEN_ROW : (uint8_t)0
+#define SENSOR_PARAM2_ROWS (sensor->unit == UNIT_RPMS || sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME || sensor->unit == UNIT_CELLS || (sensor->type==TELEM_TYPE_CALCULATED && sensor->formula==TELEM_FORMULA_CONSUMPTION)) ? HIDDEN_ROW : (uint8_t)0
#define SENSOR_PARAM3_ROWS (sensor->type == TELEM_TYPE_CALCULATED && sensor->formula < TELEM_FORMULA_MULTIPLY) ? (uint8_t)0 : HIDDEN_ROW
#define SENSOR_PARAM4_ROWS (sensor->type == TELEM_TYPE_CALCULATED && sensor->formula < TELEM_FORMULA_MULTIPLY) ? (uint8_t)0 : HIDDEN_ROW
+#define SENSOR_AUTOOFFSET_ROWS (sensor->type == TELEM_TYPE_CALCULATED && sensor->formula >= TELEM_FORMULA_CELL) ? HIDDEN_ROW : ((sensor->unit == UNIT_RPMS || sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME || sensor->unit == UNIT_CELLS) ? HIDDEN_ROW : (uint8_t)0)
+#define SENSOR_FILTER_ROWS (sensor->type == TELEM_TYPE_CALCULATED && sensor->formula >= TELEM_FORMULA_CELL) ? HIDDEN_ROW : ((sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME || sensor->unit == UNIT_CELLS) ? HIDDEN_ROW : (uint8_t)0)
+#define SENSOR_PERSISTENT_ROWS (sensor->type == TELEM_TYPE_CALCULATED && sensor->formula >= TELEM_FORMULA_CELL) ? HIDDEN_ROW : ((sensor->unit == UNIT_RPMS || sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME || sensor->unit == UNIT_CELLS) ? HIDDEN_ROW : (uint8_t)0)
void menuModelSensor(uint8_t event)
{
TelemetrySensor * sensor = & g_model.telemetrySensors[s_currIdx];
- SUBMENU(STR_MENUSENSOR, SENSOR_FIELD_MAX, {0, 0, sensor->type == TELEM_TYPE_CALCULATED ? (uint8_t)0 : (uint8_t)1, SENSOR_UNIT_ROWS, SENSOR_PREC_ROWS, SENSOR_PARAM1_ROWS, SENSOR_PARAM2_ROWS, SENSOR_PARAM3_ROWS, SENSOR_PARAM4_ROWS, 0 });
+ SUBMENU(STR_MENUSENSOR, SENSOR_FIELD_MAX, {0, 0, sensor->type == TELEM_TYPE_CALCULATED ? (uint8_t)0 : (uint8_t)1, SENSOR_UNIT_ROWS, SENSOR_PREC_ROWS, SENSOR_PARAM1_ROWS, SENSOR_PARAM2_ROWS, SENSOR_PARAM3_ROWS, SENSOR_PARAM4_ROWS, SENSOR_AUTOOFFSET_ROWS, SENSOR_FILTER_ROWS, SENSOR_PERSISTENT_ROWS, 0 });
lcd_outdezAtt(PSIZE(TR_MENUSENSOR)*FW+1, 0, s_currIdx+1, INVERS|LEFT);
putsTelemetryChannelValue(SENSOR_2ND_COLUMN, 0, s_currIdx, getValue(MIXSRC_FIRST_TELEM+3*s_currIdx), LEFT);
@@ -279,12 +284,13 @@ void menuModelSensor(uint8_t event)
break;
case SENSOR_FIELD_TYPE:
- sensor->type = selectMenuItem(SENSOR_2ND_COLUMN, y, STR_TYPE, "\012Custom\0 Calculated", sensor->type, 0, 1, attr, event);
+ sensor->type = selectMenuItem(SENSOR_2ND_COLUMN, y, STR_TYPE, STR_VSENSORTYPES, sensor->type, 0, 1, attr, event);
if (attr && checkIncDec_Ret) {
sensor->instance = 0;
if (sensor->type == TELEM_TYPE_CALCULATED) {
sensor->param = 0;
- sensor->inputFlags = 0;
+ sensor->autoOffset = 0;
+ sensor->filter = 0;
}
}
break;
@@ -307,7 +313,7 @@ void menuModelSensor(uint8_t event)
}
}
else {
- sensor->formula = selectMenuItem(SENSOR_2ND_COLUMN, y, "Formula", "\010Add\0 Average\0Min\0 Max\0 MultiplyCell\0 ConsumptDistance", sensor->formula, 0, TELEM_FORMULA_DIST, attr, event);
+ sensor->formula = selectMenuItem(SENSOR_2ND_COLUMN, y, STR_FORMULA, STR_VFORMULAS, sensor->formula, 0, TELEM_FORMULA_DIST, attr, event);
if (attr && checkIncDec_Ret) {
sensor->param = 0;
if (sensor->formula == TELEM_FORMULA_CELL) {
@@ -339,7 +345,7 @@ void menuModelSensor(uint8_t event)
break;
case SENSOR_FIELD_PRECISION:
- sensor->prec = selectMenuItem(SENSOR_2ND_COLUMN, y, STR_PRECISION, "\005PREC0PREC1PREC2", sensor->prec, 0, 2, attr, event);
+ sensor->prec = selectMenuItem(SENSOR_2ND_COLUMN, y, STR_PRECISION, STR_VPREC, sensor->prec, 0, 2, attr, event);
if (attr && checkIncDec_Ret) {
telemetryItems[s_currIdx].clear();
}
@@ -348,7 +354,7 @@ void menuModelSensor(uint8_t event)
case SENSOR_FIELD_PARAM1:
if (sensor->type == TELEM_TYPE_CALCULATED) {
if (sensor->formula == TELEM_FORMULA_CELL) {
- lcd_putsLeft(y, "Cells sensor");
+ lcd_putsLeft(y, STR_CELLSENSOR);
putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->cell.source ? MIXSRC_FIRST_TELEM+3*(sensor->cell.source-1) : 0, attr);
if (attr) {
sensor->cell.source = checkIncDec(event, sensor->cell.source, 0, TELEM_VALUES_MAX, EE_MODEL|NO_INCDEC_MARKS, isCellsSensor);
@@ -356,7 +362,7 @@ void menuModelSensor(uint8_t event)
break;
}
else if (sensor->formula == TELEM_FORMULA_DIST) {
- lcd_putsLeft(y, "GPS sensor");
+ lcd_putsLeft(y, STR_GPSSENSOR);
putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->dist.gps ? MIXSRC_FIRST_TELEM+3*(sensor->dist.gps-1) : 0, attr);
if (attr) {
sensor->dist.gps = checkIncDec(event, sensor->dist.gps, 0, TELEM_VALUES_MAX, EE_MODEL|NO_INCDEC_MARKS, isGPSSensor);
@@ -364,7 +370,7 @@ void menuModelSensor(uint8_t event)
break;
}
else if (sensor->formula == TELEM_FORMULA_CONSUMPTION) {
- lcd_putsLeft(y, "Amps sensor");
+ lcd_putsLeft(y, STR_CURRENTSENSOR);
putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->consumption.source ? MIXSRC_FIRST_TELEM+3*(sensor->consumption.source-1) : 0, attr);
if (attr) {
sensor->consumption.source = checkIncDec(event, sensor->consumption.source, 0, TELEM_VALUES_MAX, EE_MODEL|NO_INCDEC_MARKS, isCurrentSensor);
@@ -373,24 +379,32 @@ void menuModelSensor(uint8_t event)
}
}
else {
- lcd_putsLeft(y, "Ratio");
- if (attr) CHECK_INCDEC_MODELVAR(event, sensor->custom.ratio, 0, 30000);
- if (sensor->custom.ratio == 0)
- lcd_putcAtt(SENSOR_2ND_COLUMN, y, '-', attr);
- else
- lcd_outdezAtt(SENSOR_2ND_COLUMN, y, sensor->custom.ratio, LEFT|attr|PREC1);
- break;
+ if (sensor->unit == UNIT_RPMS) {
+ lcd_putsLeft(y, NO_INDENT(STR_BLADES));
+ if (attr) CHECK_INCDEC_MODELVAR(event, sensor->custom.ratio, 1, 30000);
+ lcd_outdezAtt(SENSOR_2ND_COLUMN, y, sensor->custom.ratio, LEFT|attr);
+ break;
+ }
+ else {
+ lcd_putsLeft(y, STR_RATIO);
+ if (attr) CHECK_INCDEC_MODELVAR(event, sensor->custom.ratio, 0, 30000);
+ if (sensor->custom.ratio == 0)
+ lcd_putcAtt(SENSOR_2ND_COLUMN, y, '-', attr);
+ else
+ lcd_outdezAtt(SENSOR_2ND_COLUMN, y, sensor->custom.ratio, LEFT|attr|PREC1);
+ break;
+ }
}
// no break
case SENSOR_FIELD_PARAM2:
if (sensor->type == TELEM_TYPE_CALCULATED) {
if (sensor->formula == TELEM_FORMULA_CELL) {
- sensor->cell.index = selectMenuItem(SENSOR_2ND_COLUMN, y, "Cell index", "\007Lowest\0001\0 2\0 3\0 4\0 5\0 6\0 HighestDelta\0", sensor->cell.index, 0, 8, attr, event);
+ sensor->cell.index = selectMenuItem(SENSOR_2ND_COLUMN, y, STR_CELLINDEX, STR_VCELLINDEX, sensor->cell.index, 0, 8, attr, event);
break;
}
else if (sensor->formula == TELEM_FORMULA_DIST) {
- lcd_putsLeft(y, "Alt sensor");
+ lcd_putsLeft(y, STR_ALTSENSOR);
putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->dist.alt ? MIXSRC_FIRST_TELEM+3*(sensor->dist.alt-1) : 0, attr);
if (attr) {
sensor->dist.alt = checkIncDec(event, sensor->dist.alt, 0, TELEM_VALUES_MAX, EE_MODEL|NO_INCDEC_MARKS, isAltSensor);
@@ -412,7 +426,7 @@ void menuModelSensor(uint8_t event)
case SENSOR_FIELD_PARAM4:
{
- putsStrIdx(0, y, "Source", k-SENSOR_FIELD_PARAM1+1);
+ putsStrIdx(0, y, NO_INDENT(STR_SOURCE), k-SENSOR_FIELD_PARAM1+1);
int8_t & source = sensor->calc.sources[k-SENSOR_FIELD_PARAM1];
if (attr) {
source = checkIncDec(event, source, -TELEM_VALUES_MAX, TELEM_VALUES_MAX, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable);
@@ -427,12 +441,20 @@ void menuModelSensor(uint8_t event)
break;
}
- case SENSOR_FIELD_INPUT_FLAGS:
- sensor->inputFlags = selectMenuItem(SENSOR_2ND_COLUMN, y, "Options", "\013None\0 ""Auto Offset""Filter\0", sensor->inputFlags, 0, TELEM_INPUT_FLAGS_MAX, attr, event);
+ case SENSOR_FIELD_AUTOOFFSET:
+ ON_OFF_MENU_ITEM(sensor->autoOffset, SENSOR_2ND_COLUMN, y, STR_AUTOOFFSET, attr, event);
+ break;
+
+ case SENSOR_FIELD_FILTER:
+ ON_OFF_MENU_ITEM(sensor->filter, SENSOR_2ND_COLUMN, y, STR_FILTER, attr, event);
+ break;
+
+ case SENSOR_FIELD_PERSISTENT:
+ ON_OFF_MENU_ITEM(sensor->persistent, SENSOR_2ND_COLUMN, y, NO_INDENT(STR_PERSISTENT), attr, event);
break;
case SENSOR_FIELD_LOGS:
- ON_OFF_MENU_ITEM(sensor->logs, SENSOR_2ND_COLUMN, y, "Logs", attr, event);
+ ON_OFF_MENU_ITEM(sensor->logs, SENSOR_2ND_COLUMN, y, STR_LOGS, attr, event);
break;
}
@@ -552,6 +574,9 @@ void menuModelTelemetry(uint8_t event)
s_currIdx = res;
pushMenu(menuModelSensor);
}
+ else {
+ POPUP_WARNING(STR_TELEMETRYFULL);
+ }
}
break;
#endif
diff --git a/radio/src/gui/Taranis/menu_model_custom_functions.cpp b/radio/src/gui/Taranis/menu_model_custom_functions.cpp
index 7e142c888..f246762e6 100644
--- a/radio/src/gui/Taranis/menu_model_custom_functions.cpp
+++ b/radio/src/gui/Taranis/menu_model_custom_functions.cpp
@@ -211,8 +211,18 @@ void menuCustomFunctions(uint8_t event, CustomFunctionData * functions, CustomFu
int16_t val_min = 0;
int16_t val_max = 255;
if (func == FUNC_RESET) {
- val_max = FUNC_RESET_PARAM_LAST;
- lcd_putsiAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, STR_VFSWRESET, CFN_PARAM(cfn), attr);
+ val_max = FUNC_RESET_PARAM_FIRST_TELEM+lastUsedTelemetryIndex();
+ int param = CFN_PARAM(cfn);
+ if (param < FUNC_RESET_PARAM_FIRST_TELEM) {
+ lcd_putsiAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, STR_VFSWRESET, param, attr);
+ }
+ else {
+ if (param > FUNC_RESET_PARAM_FIRST_TELEM) {
+ INCDEC_ENABLE_CHECK(isSensorAvailableInResetSpecialFunction);
+ }
+ TelemetrySensor * sensor = & g_model.telemetrySensors[param-FUNC_RESET_PARAM_FIRST_TELEM];
+ lcd_putsnAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, sensor->label, TELEM_LABEL_LEN, attr|ZCHAR);
+ }
}
#if defined(OVERRIDE_CHANNEL_FUNCTION)
else if (func == FUNC_OVERRIDE_CHANNEL) {
diff --git a/radio/src/gui/Taranis/menu_model_telemetry.cpp b/radio/src/gui/Taranis/menu_model_telemetry.cpp
index 1f6bb9860..409674bcd 100644
--- a/radio/src/gui/Taranis/menu_model_telemetry.cpp
+++ b/radio/src/gui/Taranis/menu_model_telemetry.cpp
@@ -149,7 +149,9 @@ enum SensorFields {
SENSOR_FIELD_PARAM2,
SENSOR_FIELD_PARAM3,
SENSOR_FIELD_PARAM4,
- SENSOR_FIELD_INPUT_FLAGS,
+ SENSOR_FIELD_AUTOOFFSET,
+ SENSOR_FIELD_FILTER,
+ SENSOR_FIELD_PERSISTENT,
SENSOR_FIELD_LOGS,
SENSOR_FIELD_MAX
};
@@ -200,18 +202,21 @@ bool isSensorAvailable(int sensor)
#define SENSOR_2ND_COLUMN (12*FW)
#define SENSOR_3RD_COLUMN (18*FW)
-#define SENSOR_UNIT_ROWS (sensor->type == TELEM_TYPE_CALCULATED && sensor->formula >= TELEM_FORMULA_CELL) ? HIDDEN_ROW : ((sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME || sensor->unit == UNIT_CELLS) ? HIDDEN_ROW : (uint8_t)0)
-#define SENSOR_PREC_ROWS (sensor->type == TELEM_TYPE_CALCULATED && sensor->formula >= TELEM_FORMULA_CELL) ? HIDDEN_ROW : ((sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME) ? HIDDEN_ROW : (uint8_t)0)
+#define SENSOR_UNIT_ROWS (sensor->type == TELEM_TYPE_CALCULATED && sensor->formula >= TELEM_FORMULA_CELL) ? HIDDEN_ROW : ((sensor->unit == UNIT_RPMS || sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME || sensor->unit == UNIT_CELLS) ? HIDDEN_ROW : (uint8_t)0)
+#define SENSOR_PREC_ROWS (sensor->type == TELEM_TYPE_CALCULATED && sensor->formula >= TELEM_FORMULA_CELL) ? HIDDEN_ROW : ((sensor->unit == UNIT_RPMS || sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME) ? HIDDEN_ROW : (uint8_t)0)
#define SENSOR_PARAM1_ROWS (sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME || sensor->unit == UNIT_CELLS) ? 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)) ? HIDDEN_ROW : (uint8_t)0
+#define SENSOR_PARAM2_ROWS (sensor->unit == UNIT_RPMS || sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME || sensor->unit == UNIT_CELLS || (sensor->type==TELEM_TYPE_CALCULATED && sensor->formula==TELEM_FORMULA_CONSUMPTION)) ? HIDDEN_ROW : (uint8_t)0
#define SENSOR_PARAM3_ROWS (sensor->type == TELEM_TYPE_CALCULATED && sensor->formula < TELEM_FORMULA_MULTIPLY) ? (uint8_t)0 : HIDDEN_ROW
#define SENSOR_PARAM4_ROWS (sensor->type == TELEM_TYPE_CALCULATED && sensor->formula < TELEM_FORMULA_MULTIPLY) ? (uint8_t)0 : HIDDEN_ROW
+#define SENSOR_AUTOOFFSET_ROWS (sensor->type == TELEM_TYPE_CALCULATED && sensor->formula >= TELEM_FORMULA_CELL) ? HIDDEN_ROW : ((sensor->unit == UNIT_RPMS || sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME || sensor->unit == UNIT_CELLS) ? HIDDEN_ROW : (uint8_t)0)
+#define SENSOR_FILTER_ROWS (sensor->type == TELEM_TYPE_CALCULATED && sensor->formula >= TELEM_FORMULA_CELL) ? HIDDEN_ROW : ((sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME || sensor->unit == UNIT_CELLS) ? HIDDEN_ROW : (uint8_t)0)
+#define SENSOR_PERSISTENT_ROWS (sensor->type == TELEM_TYPE_CALCULATED && sensor->formula >= TELEM_FORMULA_CELL) ? HIDDEN_ROW : ((sensor->unit == UNIT_RPMS || sensor->unit == UNIT_GPS || sensor->unit == UNIT_DATETIME || sensor->unit == UNIT_CELLS) ? HIDDEN_ROW : (uint8_t)0)
void menuModelSensor(uint8_t event)
{
TelemetrySensor * sensor = & g_model.telemetrySensors[s_currIdx];
- SUBMENU(STR_MENUSENSOR, SENSOR_FIELD_MAX, {0, 0, sensor->type == TELEM_TYPE_CALCULATED ? (uint8_t)0 : (uint8_t)1, SENSOR_UNIT_ROWS, SENSOR_PREC_ROWS, SENSOR_PARAM1_ROWS, SENSOR_PARAM2_ROWS, SENSOR_PARAM3_ROWS, SENSOR_PARAM4_ROWS, 0 });
+ SUBMENU(STR_MENUSENSOR, SENSOR_FIELD_MAX, {0, 0, sensor->type == TELEM_TYPE_CALCULATED ? (uint8_t)0 : (uint8_t)1, SENSOR_UNIT_ROWS, SENSOR_PREC_ROWS, SENSOR_PARAM1_ROWS, SENSOR_PARAM2_ROWS, SENSOR_PARAM3_ROWS, SENSOR_PARAM4_ROWS, SENSOR_AUTOOFFSET_ROWS, SENSOR_FILTER_ROWS, SENSOR_PERSISTENT_ROWS, 0 });
lcd_outdezAtt(PSIZE(TR_MENUSENSOR)*FW+1, 0, s_currIdx+1, INVERS|LEFT);
putsTelemetryChannelValue(SENSOR_2ND_COLUMN, 0, s_currIdx, getValue(MIXSRC_FIRST_TELEM+3*s_currIdx), LEFT);
@@ -236,12 +241,13 @@ void menuModelSensor(uint8_t event)
break;
case SENSOR_FIELD_TYPE:
- sensor->type = selectMenuItem(SENSOR_2ND_COLUMN, y, STR_TYPE, "\012Custom\0 Calculated", sensor->type, 0, 1, attr, event);
+ sensor->type = selectMenuItem(SENSOR_2ND_COLUMN, y, STR_TYPE, STR_VSENSORTYPES, sensor->type, 0, 1, attr, event);
if (attr && checkIncDec_Ret) {
sensor->instance = 0;
if (sensor->type == TELEM_TYPE_CALCULATED) {
sensor->param = 0;
- sensor->inputFlags = 0;
+ sensor->filter = 0;
+ sensor->autoOffset = 0;
}
}
break;
@@ -264,7 +270,7 @@ void menuModelSensor(uint8_t event)
}
}
else {
- sensor->formula = selectMenuItem(SENSOR_2ND_COLUMN, y, STR_FORMULA, "\010Add\0 Average\0Min\0 Max\0 MultiplyCell\0 ConsumptDistance", sensor->formula, 0, TELEM_FORMULA_DIST, attr, event);
+ sensor->formula = selectMenuItem(SENSOR_2ND_COLUMN, y, STR_FORMULA, STR_VFORMULAS, sensor->formula, 0, TELEM_FORMULA_DIST, attr, event);
if (attr && checkIncDec_Ret) {
sensor->param = 0;
if (sensor->formula == TELEM_FORMULA_CELL) {
@@ -296,7 +302,7 @@ void menuModelSensor(uint8_t event)
break;
case SENSOR_FIELD_PRECISION:
- sensor->prec = selectMenuItem(SENSOR_2ND_COLUMN, y, STR_PRECISION, "\005PREC0PREC1PREC2", sensor->prec, 0, 2, attr, event);
+ sensor->prec = selectMenuItem(SENSOR_2ND_COLUMN, y, STR_PRECISION, STR_VPREC, sensor->prec, 0, 2, attr, event);
if (attr && checkIncDec_Ret) {
telemetryItems[s_currIdx].clear();
}
@@ -330,20 +336,28 @@ void menuModelSensor(uint8_t event)
}
}
else {
- lcd_putsLeft(y, STR_RATIO);
- if (attr) CHECK_INCDEC_MODELVAR(event, sensor->custom.ratio, 0, 30000);
- if (sensor->custom.ratio == 0)
- lcd_putcAtt(SENSOR_2ND_COLUMN, y, '-', attr);
- else
- lcd_outdezAtt(SENSOR_2ND_COLUMN, y, sensor->custom.ratio, LEFT|attr|PREC1);
- break;
+ if (sensor->unit == UNIT_RPMS) {
+ lcd_putsLeft(y, NO_INDENT(STR_BLADES));
+ if (attr) CHECK_INCDEC_MODELVAR(event, sensor->custom.ratio, 1, 30000);
+ lcd_outdezAtt(SENSOR_2ND_COLUMN, y, sensor->custom.ratio, LEFT|attr);
+ break;
+ }
+ else {
+ lcd_putsLeft(y, STR_RATIO);
+ if (attr) CHECK_INCDEC_MODELVAR(event, sensor->custom.ratio, 0, 30000);
+ if (sensor->custom.ratio == 0)
+ lcd_putcAtt(SENSOR_2ND_COLUMN, y, '-', attr);
+ else
+ lcd_outdezAtt(SENSOR_2ND_COLUMN, y, sensor->custom.ratio, LEFT|attr|PREC1);
+ break;
+ }
}
// no break
case SENSOR_FIELD_PARAM2:
if (sensor->type == TELEM_TYPE_CALCULATED) {
if (sensor->formula == TELEM_FORMULA_CELL) {
- sensor->cell.index = selectMenuItem(SENSOR_2ND_COLUMN, y, STR_CELLINDEX, "\007Lowest\0001\0 2\0 3\0 4\0 5\0 6\0 HighestDelta\0", sensor->cell.index, 0, 8, attr, event);
+ sensor->cell.index = selectMenuItem(SENSOR_2ND_COLUMN, y, STR_CELLINDEX, STR_VCELLINDEX, sensor->cell.index, 0, 8, attr, event);
break;
}
else if (sensor->formula == TELEM_FORMULA_DIST) {
@@ -384,8 +398,16 @@ void menuModelSensor(uint8_t event)
break;
}
- case SENSOR_FIELD_INPUT_FLAGS:
- sensor->inputFlags = selectMenuItem(SENSOR_2ND_COLUMN, y, STR_OPTIONS, "\013None\0 ""Auto Offset""Filter\0", sensor->inputFlags, 0, TELEM_INPUT_FLAGS_MAX, attr, event);
+ case SENSOR_FIELD_AUTOOFFSET:
+ ON_OFF_MENU_ITEM(sensor->autoOffset, SENSOR_2ND_COLUMN, y, STR_AUTOOFFSET, attr, event);
+ break;
+
+ case SENSOR_FIELD_FILTER:
+ ON_OFF_MENU_ITEM(sensor->filter, SENSOR_2ND_COLUMN, y, STR_FILTER, attr, event);
+ break;
+
+ case SENSOR_FIELD_PERSISTENT:
+ ON_OFF_MENU_ITEM(sensor->persistent, SENSOR_2ND_COLUMN, y, NO_INDENT(STR_PERSISTENT), attr, event);
break;
case SENSOR_FIELD_LOGS:
@@ -516,6 +538,9 @@ void menuModelTelemetry(uint8_t event)
s_currIdx = res;
pushMenu(menuModelSensor);
}
+ else {
+ POPUP_WARNING(STR_TELEMETRYFULL);
+ }
}
break;
diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h
index c02fcc6a5..1aaaad001 100644
--- a/radio/src/myeeprom.h
+++ b/radio/src/myeeprom.h
@@ -130,6 +130,7 @@
#define NUM_POTS 5
#define NUM_XPOTS 3
#endif
+ #define TELEM_VALUES_MAX 32
#elif defined(CPUARM)
#define MAX_MODELS 60
#define NUM_CHNOUT 32 // number of real output channels CH1-CH32
@@ -141,6 +142,7 @@
#define NUM_TRAINER 16
#define NUM_POTS 3
#define NUM_XPOTS 0
+ #define TELEM_VALUES_MAX 16
#elif defined(CPUM2560) || defined(CPUM2561)
#define MAX_MODELS 30
#define NUM_CHNOUT 16 // number of real output channels CH1-CH16
@@ -152,6 +154,7 @@
#define NUM_TRAINER 8
#define NUM_POTS 3
#define NUM_XPOTS 0
+ #define TELEM_VALUES_MAX 0
#elif defined(CPUM128)
#define MAX_MODELS 30
#define NUM_CHNOUT 16 // number of real output channels CH1-CH16
@@ -163,6 +166,7 @@
#define NUM_TRAINER 8
#define NUM_POTS 3
#define NUM_XPOTS 0
+ #define TELEM_VALUES_MAX 0
#else
#define MAX_MODELS 16
#define NUM_CHNOUT 16 // number of real output channels CH1-CH16
@@ -174,6 +178,7 @@
#define NUM_TRAINER 8
#define NUM_POTS 3
#define NUM_XPOTS 0
+ #define TELEM_VALUES_MAX 0
#endif
#if defined(CPUARM)
@@ -584,9 +589,13 @@ enum ResetFunctionParam {
#endif
#if ROTARY_ENCODERS > 1
FUNC_RESET_ROTENC2,
+#endif
+#if defined(CPUARM)
+ FUNC_RESET_PARAM_FIRST_TELEM,
+ FUNC_RESET_PARAM_LAST_TELEM = FUNC_RESET_PARAM_FIRST_TELEM + TELEM_VALUES_MAX,
#endif
FUNC_RESET_PARAMS_COUNT,
- FUNC_RESET_PARAM_LAST = FUNC_RESET_PARAMS_COUNT-1
+ FUNC_RESET_PARAM_LAST = FUNC_RESET_PARAMS_COUNT-1,
};
enum AdjustGvarFunctionParam {
@@ -1211,11 +1220,6 @@ PACK(typedef struct {
#endif
#if defined(CPUARM)
-#if defined(PCBTARANIS)
- #define TELEM_VALUES_MAX 32
-#else
- #define TELEM_VALUES_MAX 16
-#endif
#define TELEM_LABEL_LEN 4
//#define TELEM_FLAG_TIMEOUT 0x01
#define TELEM_FLAG_LOG 0x02
@@ -1243,14 +1247,6 @@ enum TelemetrySensorFormula
TELEM_FORMULA_DIST,
};
-enum TelemetrySensorInputFlags
-{
- TELEM_INPUT_FLAGS_NONE,
- TELEM_INPUT_FLAGS_AUTO_OFFSET,
- TELEM_INPUT_FLAGS_FILTERING,
- TELEM_INPUT_FLAGS_MAX=TELEM_INPUT_FLAGS_FILTERING
-};
-
PACK(typedef struct {
union {
uint16_t id; // data identifier, for FrSky we can reuse existing ones. Source unit is derived from type.
@@ -1264,7 +1260,8 @@ PACK(typedef struct {
uint8_t type:1; // 0=custom / 1=calculated
uint8_t unit:5; // user can choose what unit to display each value in
uint8_t prec:2;
- uint8_t inputFlags:2;
+ uint8_t autoOffset:1;
+ uint8_t filter:1;
uint8_t logs:1;
uint8_t persistent:1;
uint8_t spare:4;
diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp
index 16586f305..757eb92b9 100644
--- a/radio/src/telemetry/frsky.cpp
+++ b/radio/src/telemetry/frsky.cpp
@@ -578,6 +578,7 @@ void telemetryReset()
setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, ALT_FIRST_ID, 1, 1000, UNIT_METERS, 2);
setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, CELLS_FIRST_ID, 2, 0x80280220, UNIT_CELLS, 0);
setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, CURR_FIRST_ID, 3, 100, UNIT_AMPS, 2);
+ setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, RPM_FIRST_ID, 5, 3600, UNIT_RPMS, 0);
#endif
}
diff --git a/radio/src/telemetry/frsky_d.cpp b/radio/src/telemetry/frsky_d.cpp
index 1565971da..0ddcd133e 100644
--- a/radio/src/telemetry/frsky_d.cpp
+++ b/radio/src/telemetry/frsky_d.cpp
@@ -643,10 +643,10 @@ void frskyDSetDefault(int index, uint16_t id)
if (id >= D_A1_ID && id <= D_A2_ID) {
telemetrySensor.prec = 1;
telemetrySensor.custom.ratio = 132;
- telemetrySensor.inputFlags = TELEM_INPUT_FLAGS_FILTERING;
+ telemetrySensor.filter = 1;
}
else if (id == D_RSSI_ID) {
- telemetrySensor.inputFlags = TELEM_INPUT_FLAGS_FILTERING;
+ telemetrySensor.filter = 1;
}
}
else {
diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp
index 6fe757915..7dd5e7033 100644
--- a/radio/src/telemetry/frsky_sport.cpp
+++ b/radio/src/telemetry/frsky_sport.cpp
@@ -254,7 +254,10 @@ void frskySportSetDefault(int index, uint16_t id, uint8_t instance)
telemetrySensor.init(sensor->name, unit, prec);
if (id >= ADC1_ID && id <= BATT_ID) {
telemetrySensor.custom.ratio = 132;
- telemetrySensor.inputFlags = TELEM_INPUT_FLAGS_FILTERING;
+ telemetrySensor.filter = 1;
+ }
+ if (unit == UNIT_RPMS) {
+ telemetrySensor.custom.ratio = 1;
}
}
else {
diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp
index bca364d52..cbc68b997 100644
--- a/radio/src/telemetry/telemetry.cpp
+++ b/radio/src/telemetry/telemetry.cpp
@@ -169,30 +169,33 @@ void TelemetryItem::setValue(const TelemetrySensor & sensor, int32_t newVal, uin
datetime.timestate = 1;
newVal = 0;
}
+ else if (unit == UNIT_RPMS) {
+ newVal = newVal / sensor.custom.ratio;
+ }
else {
newVal = sensor.getValue(newVal, unit, prec);
- if (sensor.inputFlags == TELEM_INPUT_FLAGS_AUTO_OFFSET) {
+ if (sensor.autoOffset) {
if (!isAvailable()) {
- offsetAuto = -newVal;
+ std.offsetAuto = -newVal;
}
- newVal += offsetAuto;
+ newVal += std.offsetAuto;
}
- else if (sensor.inputFlags == TELEM_INPUT_FLAGS_FILTERING) {
+ else if (sensor.filter) {
if (!isAvailable()) {
for (int i=0; i= 0) {
- switch (protocol) {
-#if defined(FRSKY_SPORT)
- case TELEM_PROTO_FRSKY_SPORT:
- frskySportSetDefault(available, id, instance);
- break;
-#endif
-#if defined(FRSKY)
- case TELEM_PROTO_FRSKY_D:
- frskyDSetDefault(available, id);
- break;
-#endif
- default:
- break;
- }
- }
-
- return available;
-}
-
void delTelemetryIndex(uint8_t index)
{
memclear(&g_model.telemetrySensors[index], sizeof(TelemetrySensor));
@@ -481,15 +450,56 @@ int availableTelemetryIndex()
return -1;
}
+int lastUsedTelemetryIndex()
+{
+ for (int index=TELEM_VALUES_MAX-1; index>=0; index--) {
+ TelemetrySensor & telemetrySensor = g_model.telemetrySensors[index];
+ if (telemetrySensor.isAvailable()) {
+ return index;
+ }
+ }
+ return -1;
+}
+
+bool isSensorAvailableInResetSpecialFunction(int index)
+{
+ TelemetrySensor & telemetrySensor = g_model.telemetrySensors[index-FUNC_RESET_PARAM_FIRST_TELEM];
+ return telemetrySensor.isAvailable();
+}
+
void setTelemetryValue(TelemetryProtocol protocol, uint16_t id, uint8_t instance, int32_t value, uint32_t unit, uint32_t prec)
{
- int index = getTelemetryIndex(protocol, id, instance);
-
- if (index >= 0) {
- telemetryItems[index].setValue(g_model.telemetrySensors[index], value, unit, prec);
+ bool available = false;
+
+ for (int index=0; index= 0) {
+ switch (protocol) {
+#if defined(FRSKY_SPORT)
+ case TELEM_PROTO_FRSKY_SPORT:
+ frskySportSetDefault(index, id, instance);
+ break;
+#endif
+#if defined(FRSKY)
+ case TELEM_PROTO_FRSKY_D:
+ frskyDSetDefault(index, id);
+ break;
+#endif
+ default:
+ break;
+ }
+ }
+ else {
+ POPUP_WARNING(STR_TELEMETRYFULL);
+ }
}
}
diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h
index ddb9160a7..981d623f2 100644
--- a/radio/src/telemetry/telemetry.h
+++ b/radio/src/telemetry/telemetry.h
@@ -97,8 +97,10 @@ class TelemetryItem
uint8_t lastReceived; // for detection of sensor loss
union {
- int32_t offsetAuto;
- int32_t filterValues[TELEMETRY_AVERAGE_COUNT];
+ struct {
+ int32_t offsetAuto;
+ int32_t filterValues[TELEMETRY_AVERAGE_COUNT];
+ } std;
struct {
uint16_t prescale;
} consumption;
@@ -182,9 +184,13 @@ inline bool isTelemetryFieldComparisonAvailable(int index)
return (sensor.id != 0);
}
+extern TelemetryItem telemetryItems[];
+
void setTelemetryValue(TelemetryProtocol protocol, uint16_t id, uint8_t instance, int32_t value, uint32_t unit, uint32_t prec);
void delTelemetryIndex(uint8_t index);
int availableTelemetryIndex();
+int lastUsedTelemetryIndex();
+bool isSensorAvailableInResetSpecialFunction(int index);
int32_t getTelemetryValue(uint8_t index, uint8_t & prec);
int32_t convertTelemetryValue(int32_t value, uint8_t unit, uint8_t prec, uint8_t destUnit, uint8_t destPrec);
diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp
index 5ad95b3bd..8414e8863 100644
--- a/radio/src/translations.cpp
+++ b/radio/src/translations.cpp
@@ -121,6 +121,10 @@ const pm_char STR_OPEN9X[] PROGMEM =
ISTR(DSM_PROTOCOLS)
ISTR(VOLTSRC)
ISTR(CURVE_TYPES)
+ ISTR(VSENSORTYPES)
+ ISTR(VFORMULAS)
+ ISTR(VPREC)
+ ISTR(VCELLINDEX)
#endif
#if defined(MAVLINK)
ISTR(MAVLINK_BAUDS)
@@ -552,6 +556,9 @@ const pm_char STR_BLCOLOR[] PROGMEM = TR_BLCOLOR;
const pm_char STR_CELLSENSOR[] PROGMEM = TR_CELLSENSOR;
const pm_char STR_GPSSENSOR[] PROGMEM = TR_GPSSENSOR;
const pm_char STR_CURRENTSENSOR[] PROGMEM = TR_CURRENTSENSOR;
+ const pm_char STR_AUTOOFFSET[] PROGMEM = TR_AUTOOFFSET;
+ const pm_char STR_FILTER[] PROGMEM = TR_FILTER;
+ const pm_char STR_TELEMETRYFULL[] PROGMEM = TR_TELEMETRYFULL;
#endif
#if defined(PCBTARANIS)
diff --git a/radio/src/translations.h b/radio/src/translations.h
index 139146342..74eb7f43d 100644
--- a/radio/src/translations.h
+++ b/radio/src/translations.h
@@ -192,7 +192,11 @@ extern const pm_char STR_OPEN9X[];
#define OFS_DSM_PROTOCOLS (OFS_XJT_PROTOCOLS + sizeof(TR_XJT_PROTOCOLS))
#define OFS_VOLTSRC (OFS_DSM_PROTOCOLS + sizeof(TR_DSM_PROTOCOLS))
#define OFS_CURVE_TYPES (OFS_VOLTSRC + sizeof(TR_VOLTSRC))
- #define OFS_MAVLINK_BAUDS (OFS_CURVE_TYPES + sizeof(TR_CURVE_TYPES))
+ #define OFS_VSENSORTYPES (OFS_CURVE_TYPES + sizeof(TR_CURVE_TYPES))
+ #define OFS_VFORMULAS (OFS_VSENSORTYPES + sizeof(TR_VSENSORTYPES))
+ #define OFS_VPREC (OFS_VFORMULAS + sizeof(TR_VFORMULAS))
+ #define OFS_VCELLINDEX (OFS_VPREC + sizeof(TR_VPREC))
+ #define OFS_MAVLINK_BAUDS (OFS_VCELLINDEX + sizeof(TR_VCELLINDEX))
#else
#define OFS_MAVLINK_BAUDS (OFS_VTRAINERMODES)
#endif
@@ -298,6 +302,10 @@ extern const pm_char STR_OPEN9X[];
#define STR_XJT_PROTOCOLS (STR_OPEN9X + OFS_XJT_PROTOCOLS)
#define STR_DSM_PROTOCOLS (STR_OPEN9X + OFS_DSM_PROTOCOLS)
#define STR_CURVE_TYPES (STR_OPEN9X + OFS_CURVE_TYPES)
+ #define STR_VSENSORTYPES (STR_OPEN9X + OFS_VSENSORTYPES)
+ #define STR_VFORMULAS (STR_OPEN9X + OFS_VFORMULAS)
+ #define STR_VPREC (STR_OPEN9X + OFS_VPREC)
+ #define STR_VCELLINDEX (STR_OPEN9X + OFS_VCELLINDEX)
#endif
#if defined(MAVLINK)
@@ -758,6 +766,9 @@ extern const pm_char STR_BLCOLOR[];
extern const pm_char STR_CELLSENSOR[];
extern const pm_char STR_GPSSENSOR[];
extern const pm_char STR_CURRENTSENSOR[];
+ extern const pm_char STR_AUTOOFFSET[];
+ extern const pm_char STR_FILTER[];
+ extern const pm_char STR_TELEMETRYFULL[];
#endif
#if defined(PCBTARANIS)
diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt
index 5d765b36a..f8a31e100 100644
--- a/radio/src/translations/cz.h.txt
+++ b/radio/src/translations/cz.h.txt
@@ -531,6 +531,18 @@
#define TR_MAVLINK_AP_MODES "Manual ""Circle ""Stabilize ""Training ""Fly by Wire A""Fly by Wire A""Auto ""RTL ""Loiter ""Guided ""Initialising ""INVALID "
#endif
+#define LEN_VSENSORTYPES "\012"
+#define TR_VSENSORTYPES "Custom\0 ""Calculated"
+
+#define LEN_VFORMULAS "\010"
+#define TR_VFORMULAS "Add\0 ""Average\0""Min\0 ""Max\0 ""Multiply""Cell\0 ""Consumpt""Distance"
+
+#define LEN_VPREC "\005"
+#define TR_VPREC "PREC0""PREC1""PREC2"
+
+#define LEN_VCELLINDEX "\007"
+#define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0"
+
// ZERO TERMINATED STRINGS
#if defined(COLORLCD)
#define INDENT "\007"
@@ -1049,6 +1061,9 @@
#define TR_CELLSENSOR "Cell sensor"
#define TR_GPSSENSOR "GPS sensor"
#define TR_CURRENTSENSOR "Current sensor"
+#define TR_AUTOOFFSET "Auto Offset"
+#define TR_FILTER "Filter"
+#define TR_TELEMETRYFULL "All telemetry slots full!"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt
index aa2769fa1..6ea81624b 100644
--- a/radio/src/translations/de.h.txt
+++ b/radio/src/translations/de.h.txt
@@ -530,6 +530,18 @@
#define TR_MAVLINK_AP_MODES "Manual ""Circle ""Stabilize ""Training ""Fly by Wire A""Fly by Wire A""Auto ""RTL ""Loiter ""Guided ""Initialising ""INVALID "
#endif
+#define LEN_VSENSORTYPES "\012"
+#define TR_VSENSORTYPES "Custom\0 ""Calculated"
+
+#define LEN_VFORMULAS "\010"
+#define TR_VFORMULAS "Add\0 ""Average\0""Min\0 ""Max\0 ""Multiply""Cell\0 ""Consumpt""Distance"
+
+#define LEN_VPREC "\005"
+#define TR_VPREC "PREC0""PREC1""PREC2"
+
+#define LEN_VCELLINDEX "\007"
+#define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0"
+
// ZERO TERMINATED STRINGS
#if defined(COLORLCD)
#define INDENT "\007"
@@ -1048,6 +1060,9 @@
#define TR_CELLSENSOR "Cell sensor"
#define TR_GPSSENSOR "GPS sensor"
#define TR_CURRENTSENSOR "Current sensor"
+#define TR_AUTOOFFSET "Auto Offset"
+#define TR_FILTER "Filter"
+#define TR_TELEMETRYFULL "All telemetry slots full!"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt
index 6e0a9895f..ec3a2f59d 100644
--- a/radio/src/translations/en.h.txt
+++ b/radio/src/translations/en.h.txt
@@ -530,6 +530,18 @@
#define TR_MAVLINK_AP_MODES "Manual ""Circle ""Stabilize ""Training ""Fly by Wire A""Fly by Wire A""Auto ""RTL ""Loiter ""Guided ""Initialising ""INVALID "
#endif
+#define LEN_VSENSORTYPES "\012"
+#define TR_VSENSORTYPES "Custom\0 ""Calculated"
+
+#define LEN_VFORMULAS "\010"
+#define TR_VFORMULAS "Add\0 ""Average\0""Min\0 ""Max\0 ""Multiply""Cell\0 ""Consumpt""Distance"
+
+#define LEN_VPREC "\005"
+#define TR_VPREC "PREC0""PREC1""PREC2"
+
+#define LEN_VCELLINDEX "\007"
+#define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0"
+
// ZERO TERMINATED STRINGS
#if defined(COLORLCD)
#define INDENT "\007"
@@ -1048,6 +1060,9 @@
#define TR_CELLSENSOR "Cell sensor"
#define TR_GPSSENSOR "GPS sensor"
#define TR_CURRENTSENSOR "Curr. sensor"
+#define TR_AUTOOFFSET "Auto Offset"
+#define TR_FILTER "Filter"
+#define TR_TELEMETRYFULL "All telemetry slots full!"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt
index 460a28f72..0c905f589 100644
--- a/radio/src/translations/es.h.txt
+++ b/radio/src/translations/es.h.txt
@@ -491,6 +491,18 @@
#define TR_MAVLINK_AP_MODES "Manual ""Circulo ""Estabilizar ""Entrenamiento""Fly by Wire A""Fly by Wire A""Auto ""RTL ""Loiter ""Guiado ""Inicialisando""INVALID "
#endif
+#define LEN_VSENSORTYPES "\012"
+#define TR_VSENSORTYPES "Custom\0 ""Calculated"
+
+#define LEN_VFORMULAS "\010"
+#define TR_VFORMULAS "Add\0 ""Average\0""Min\0 ""Max\0 ""Multiply""Cell\0 ""Consumpt""Distance"
+
+#define LEN_VPREC "\005"
+#define TR_VPREC "PREC0""PREC1""PREC2"
+
+#define LEN_VCELLINDEX "\007"
+#define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0"
+
// ZERO TERMINATED STRINGS
#define INDENT "\001"
#define LEN_INDENT 1
@@ -984,6 +996,9 @@
#define TR_CELLSENSOR "Cell sensor"
#define TR_GPSSENSOR "GPS sensor"
#define TR_CURRENTSENSOR "Current sensor"
+#define TR_AUTOOFFSET "Auto Offset"
+#define TR_FILTER "Filter"
+#define TR_TELEMETRYFULL "All telemetry slots full!"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt
index dc55d8478..21b6e91a2 100644
--- a/radio/src/translations/fi.h.txt
+++ b/radio/src/translations/fi.h.txt
@@ -491,6 +491,18 @@
#define TR_MAVLINK_AP_MODES "Manual ""Circle ""Stabilize ""Training ""Fly by Wire A""Fly by Wire A""Auto ""RTL ""Loiter ""Guided ""Initialising ""INVALID "
#endif
+#define LEN_VSENSORTYPES "\012"
+#define TR_VSENSORTYPES "Custom\0 ""Calculated"
+
+#define LEN_VFORMULAS "\010"
+#define TR_VFORMULAS "Add\0 ""Average\0""Min\0 ""Max\0 ""Multiply""Cell\0 ""Consumpt""Distance"
+
+#define LEN_VPREC "\005"
+#define TR_VPREC "PREC0""PREC1""PREC2"
+
+#define LEN_VCELLINDEX "\007"
+#define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0"
+
// ZERO TERMINATED STRINGS
#define INDENT "\001"
#define LEN_INDENT 1
@@ -984,6 +996,9 @@
#define TR_CELLSENSOR "Cell sensor"
#define TR_GPSSENSOR "GPS sensor"
#define TR_CURRENTSENSOR "Current sensor"
+#define TR_AUTOOFFSET "Auto Offset"
+#define TR_FILTER "Filter"
+#define TR_TELEMETRYFULL "All telemetry slots full!"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt
index 6f35d6dc2..dccdeb64b 100644
--- a/radio/src/translations/fr.h.txt
+++ b/radio/src/translations/fr.h.txt
@@ -534,6 +534,18 @@
#define TR_MAVLINK_AP_MODES "Manual ""Circle ""Stabilize ""Training ""Fly by Wire A""Fly by Wire A""Auto ""RTL ""Loiter ""Guided ""Initialising ""INVALID "
#endif
+#define LEN_VSENSORTYPES "\012"
+#define TR_VSENSORTYPES "Perso\0 ""Calculé\0 "
+
+#define LEN_VFORMULAS "\010"
+#define TR_VFORMULAS "Addition""Moyenne\0""Min\0 ""Max\0 ""Multipl.""Elément\0""Consomm.""Distance"
+
+#define LEN_VPREC "\005"
+#define TR_VPREC "PREC0""PREC1""PREC2"
+
+#define LEN_VCELLINDEX "\007"
+#define TR_VCELLINDEX "Mini.\0 ""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Maxi.\0 ""Diff.\0 "
+
// ZERO TERMINATED STRINGS
#if defined(COLORLCD)
#define INDENT "\007"
@@ -1043,7 +1055,10 @@
#define TR_ALTSENSOR "Capteur Alt"
#define TR_CELLSENSOR "Capteur Elém"
#define TR_GPSSENSOR "Capteur GPS"
-#define TR_CURRENTSENSOR "Capteur cour."
+#define TR_CURRENTSENSOR "Capt courant"
+#define TR_AUTOOFFSET "Offset auto"
+#define TR_FILTER "Filtrage"
+#define TR_TELEMETRYFULL "Plus de capteurs libres!"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt
index 6f15cac05..06395e850 100644
--- a/radio/src/translations/it.h.txt
+++ b/radio/src/translations/it.h.txt
@@ -491,6 +491,18 @@
#define TR_MAVLINK_AP_MODES "Manual ""Circle ""Stabilize ""Training ""Fly by Wire A""Fly by Wire A""Auto ""RTL ""Loiter ""Guided ""Inizializza ""INVALID "
#endif
+#define LEN_VSENSORTYPES "\012"
+#define TR_VSENSORTYPES "Custom\0 ""Calculated"
+
+#define LEN_VFORMULAS "\010"
+#define TR_VFORMULAS "Add\0 ""Average\0""Min\0 ""Max\0 ""Multiply""Cell\0 ""Consumpt""Distance"
+
+#define LEN_VPREC "\005"
+#define TR_VPREC "PREC0""PREC1""PREC2"
+
+#define LEN_VCELLINDEX "\007"
+#define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0"
+
// ZERO TERMINATED STRINGS
#define INDENT "\001"
#define LEN_INDENT 1
@@ -984,6 +996,9 @@
#define TR_CELLSENSOR "Cell sensor"
#define TR_GPSSENSOR "GPS sensor"
#define TR_CURRENTSENSOR "Current sensor"
+#define TR_AUTOOFFSET "Auto Offset"
+#define TR_FILTER "Filter"
+#define TR_TELEMETRYFULL "All telemetry slots full!"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt
index f13b8fdb6..89b35da3a 100644
--- a/radio/src/translations/pl.h.txt
+++ b/radio/src/translations/pl.h.txt
@@ -489,6 +489,18 @@
#define TR_MAVLINK_AP_MODES "Ręczny ""Koło ""Stabilizacja ""Trening ""Fly by Wire A""Fly by Wire A""Auto ""RTL ""Loiter ""Sterowany ""Inicjalizacja""BŁĘDNY "
#endif
+#define LEN_VSENSORTYPES "\012"
+#define TR_VSENSORTYPES "Custom\0 ""Calculated"
+
+#define LEN_VFORMULAS "\010"
+#define TR_VFORMULAS "Add\0 ""Average\0""Min\0 ""Max\0 ""Multiply""Cell\0 ""Consumpt""Distance"
+
+#define LEN_VPREC "\005"
+#define TR_VPREC "PREC0""PREC1""PREC2"
+
+#define LEN_VCELLINDEX "\007"
+#define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0"
+
// ZERO TERMINATED STRINGS
#define INDENT "\001"
#define LEN_INDENT 1
@@ -982,6 +994,9 @@
#define TR_CELLSENSOR "Cell sensor"
#define TR_GPSSENSOR "GPS sensor"
#define TR_CURRENTSENSOR "Current sensor"
+#define TR_AUTOOFFSET "Auto Offset"
+#define TR_FILTER "Filter"
+#define TR_TELEMETRYFULL "All telemetry slots full!"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt
index 86fc41cce..bb85bb40b 100644
--- a/radio/src/translations/pt.h.txt
+++ b/radio/src/translations/pt.h.txt
@@ -491,6 +491,18 @@
#define TR_MAVLINK_AP_MODES "Manual ""Circle ""Stabilize ""Training ""Fly by Wire A""Fly by Wire A""Auto ""RTL ""Loiter ""Guided ""Initialising ""INVALID "
#endif
+#define LEN_VSENSORTYPES "\012"
+#define TR_VSENSORTYPES "Custom\0 ""Calculated"
+
+#define LEN_VFORMULAS "\010"
+#define TR_VFORMULAS "Add\0 ""Average\0""Min\0 ""Max\0 ""Multiply""Cell\0 ""Consumpt""Distance"
+
+#define LEN_VPREC "\005"
+#define TR_VPREC "PREC0""PREC1""PREC2"
+
+#define LEN_VCELLINDEX "\007"
+#define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0"
+
// ZERO TERMINATED STRINGS
#define INDENT "\001"
#define LEN_INDENT 1
@@ -984,6 +996,9 @@
#define TR_CELLSENSOR "Cell sensor"
#define TR_GPSSENSOR "GPS sensor"
#define TR_CURRENTSENSOR "Current sensor"
+#define TR_AUTOOFFSET "Auto Offset"
+#define TR_FILTER "Filter"
+#define TR_TELEMETRYFULL "All telemetry slots full!"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt
index ce24e7532..6461e4d6f 100644
--- a/radio/src/translations/se.h.txt
+++ b/radio/src/translations/se.h.txt
@@ -491,6 +491,18 @@
#define TR_MAVLINK_AP_MODES "Manuell ""Cirkla ""Stabilisera ""Övning ""Fly by Wire A""Fly by Wire A""Automatisk ""Flyg Hem ""Hovra ""Guidad ""Initialiserar""OGILTIG "
#endif
+#define LEN_VSENSORTYPES "\012"
+#define TR_VSENSORTYPES "Custom\0 ""Calculated"
+
+#define LEN_VFORMULAS "\010"
+#define TR_VFORMULAS "Add\0 ""Average\0""Min\0 ""Max\0 ""Multiply""Cell\0 ""Consumpt""Distance"
+
+#define LEN_VPREC "\005"
+#define TR_VPREC "PREC0""PREC1""PREC2"
+
+#define LEN_VCELLINDEX "\007"
+#define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0"
+
// ZERO TERMINATED STRINGS
#define INDENT "\001"
#define LEN_INDENT 1
@@ -984,6 +996,9 @@
#define TR_CELLSENSOR "Cell sensor"
#define TR_GPSSENSOR "GPS sensor"
#define TR_CURRENTSENSOR "Current sensor"
+#define TR_AUTOOFFSET "Auto Offset"
+#define TR_FILTER "Filter"
+#define TR_TELEMETRYFULL "All telemetry slots full!"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"