Merge pull request #2161 from opentx/kilrah/telemetry_enhancements
Kilrah/telemetry enhancements
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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>());
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1,0,0,0,1,1,1,1,0,0,1,0,1,0,1,1,1,1,1,1,0,1,0,1,0,1,1,0,1">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1,0,0,0,1,1,1,1,0,0,1,0,1,0,1,1,1,1,1,1,0,1,0,1,0,1,0,0,0,1">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
@@ -521,28 +521,23 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="AutoComboBox" name="inputFlags">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
<widget class="AutoCheckBox" name="autoOffset">
|
||||
<property name="layoutDirection">
|
||||
<enum>Qt::LeftToRight</enum>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Auto Offset</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="AutoCheckBox" name="filter">
|
||||
<property name="layoutDirection">
|
||||
<enum>Qt::LeftToRight</enum>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Filter</string>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>---</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Auto Offset</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Filtered</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
+12
-15
@@ -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;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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<TELEMETRY_AVERAGE_COUNT; i++) {
|
||||
filterValues[i] = newVal;
|
||||
std.filterValues[i] = newVal;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// calculate the average from values[] and value
|
||||
// also shift readings in values [] array
|
||||
unsigned int sum = filterValues[0];
|
||||
unsigned int sum = std.filterValues[0];
|
||||
for (int i=0; i<TELEMETRY_AVERAGE_COUNT-1; i++) {
|
||||
int32_t tmp = filterValues[i+1];
|
||||
filterValues[i] = tmp;
|
||||
int32_t tmp = std.filterValues[i+1];
|
||||
std.filterValues[i] = tmp;
|
||||
sum += tmp;
|
||||
}
|
||||
filterValues[TELEMETRY_AVERAGE_COUNT-1] = newVal;
|
||||
std.filterValues[TELEMETRY_AVERAGE_COUNT-1] = newVal;
|
||||
sum += newVal;
|
||||
newVal = sum/(TELEMETRY_AVERAGE_COUNT+1);
|
||||
}
|
||||
@@ -429,40 +432,6 @@ void TelemetryItem::eval(const TelemetrySensor & sensor)
|
||||
}
|
||||
}
|
||||
|
||||
int getTelemetryIndex(TelemetryProtocol protocol, uint16_t id, uint8_t instance)
|
||||
{
|
||||
int available = -1;
|
||||
|
||||
for (int index=0; index<TELEM_VALUES_MAX; index++) {
|
||||
TelemetrySensor & telemetrySensor = g_model.telemetrySensors[index];
|
||||
if (telemetrySensor.id == id && telemetrySensor.instance == instance) {
|
||||
return index;
|
||||
}
|
||||
else if (available < 0 && telemetrySensor.id == 0) {
|
||||
available = index;
|
||||
}
|
||||
}
|
||||
|
||||
if (available >= 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<TELEM_VALUES_MAX; index++) {
|
||||
TelemetrySensor & telemetrySensor = g_model.telemetrySensors[index];
|
||||
if (telemetrySensor.id == id && telemetrySensor.instance == instance) {
|
||||
telemetryItems[index].setValue(g_model.telemetrySensors[index], value, unit, prec);
|
||||
available = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// TODO error too many sensors
|
||||
|
||||
if (!available) {
|
||||
int index = availableTelemetryIndex();
|
||||
if (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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user