Auto Offset / Filter now independent

This commit is contained in:
Andre Bernet
2015-03-22 20:13:18 +04:00
parent f735597210
commit 91f5205c4f
19 changed files with 89 additions and 42 deletions
+27 -13
View File
@@ -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
};
@@ -249,12 +251,15 @@ bool isSensorAvailable(int sensor)
#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_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_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_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);
@@ -284,7 +289,8 @@ void menuModelSensor(uint8_t event)
sensor->instance = 0;
if (sensor->type == TELEM_TYPE_CALCULATED) {
sensor->param = 0;
sensor->inputFlags = 0;
sensor->autoOffset = 0;
sensor->filter = 0;
}
}
break;
@@ -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,7 +379,7 @@ void menuModelSensor(uint8_t event)
}
}
else {
lcd_putsLeft(y, "Ratio");
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);
@@ -386,11 +392,11 @@ void menuModelSensor(uint8_t event)
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, "\007Lowest\0001\0 2\0 3\0 4\0 5\0 6\0 HighestDelta\0", 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 +418,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 +433,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;
}
+19 -5
View File
@@ -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
};
@@ -206,12 +208,15 @@ bool isSensorAvailable(int sensor)
#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_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_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_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);
@@ -241,7 +246,8 @@ void menuModelSensor(uint8_t event)
sensor->instance = 0;
if (sensor->type == TELEM_TYPE_CALCULATED) {
sensor->param = 0;
sensor->inputFlags = 0;
sensor->filter = 0;
sensor->autoOffset = 0;
}
}
break;
@@ -384,8 +390,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:
+2 -9
View File
@@ -1247,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.
@@ -1268,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;
+2 -2
View File
@@ -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 {
+1 -1
View File
@@ -254,7 +254,7 @@ 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;
}
}
else {
+9 -9
View File
@@ -143,28 +143,28 @@ void TelemetryItem::setValue(const TelemetrySensor & sensor, int32_t newVal, uin
}
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);
}
+4 -2
View File
@@ -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;
+2
View File
@@ -550,6 +550,8 @@ 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;
#endif
#if defined(PCBTARANIS)
+2
View File
@@ -756,6 +756,8 @@ 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[];
#endif
#if defined(PCBTARANIS)
+2
View File
@@ -1047,6 +1047,8 @@
#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 ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
+2
View File
@@ -1046,6 +1046,8 @@
#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 ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
+2
View File
@@ -1046,6 +1046,8 @@
#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 ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
+2
View File
@@ -982,6 +982,8 @@
#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 ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
+2
View File
@@ -982,6 +982,8 @@
#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 ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
+3 -1
View File
@@ -1041,7 +1041,9 @@
#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 ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
+2
View File
@@ -982,6 +982,8 @@
#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 ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
+2
View File
@@ -980,6 +980,8 @@
#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 ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
+2
View File
@@ -982,6 +982,8 @@
#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 ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
+2
View File
@@ -982,6 +982,8 @@
#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 ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"