Skip to content

Commit a0ff01e

Browse files
authored
Backports: (OpenI6X#287)
- Remove module choice from special function set failsafe (backport opentx#8156) - Fix mixer overflow (backport opentx#7747) - Bars inverse (backport opentx#7709) - Fix scale and telemetry fields (backport opentx#7704) Cosmetics
1 parent 69afe82 commit a0ff01e

21 files changed

+103
-36
lines changed

Diff for: companion/src/firmwares/sensordata.h

+3
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,11 @@ class SensorData {
5858
TELEM_CELL_INDEX_4,
5959
TELEM_CELL_INDEX_5,
6060
TELEM_CELL_INDEX_6,
61+
// TELEM_CELL_INDEX_7, // PCBI6X: uses RAM and I don't think someone will use 8S with i6X
62+
// TELEM_CELL_INDEX_8,
6163
TELEM_CELL_INDEX_HIGHEST,
6264
TELEM_CELL_INDEX_DELTA,
65+
TELEM_CELL_INDEX_LAST = TELEM_CELL_INDEX_DELTA
6366
};
6467

6568
enum

Diff for: radio/src/gui/128x64/model_display.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -242,10 +242,10 @@ void menuModelDisplay(event_t event)
242242
}
243243
break;
244244
case 1:
245-
bar.barMin = checkIncDec(event, bar.barMin, barMin, bar.barMax, EE_MODEL|NO_INCDEC_MARKS);
245+
bar.barMin = checkIncDec(event, bar.barMin, barMin, barMax, EE_MODEL|NO_INCDEC_MARKS);
246246
break;
247247
case 2:
248-
bar.barMax = checkIncDec(event, bar.barMax, bar.barMin, barMax, EE_MODEL|NO_INCDEC_MARKS);
248+
bar.barMax = checkIncDec(event, bar.barMax, barMin, barMax, EE_MODEL|NO_INCDEC_MARKS);
249249
break;
250250
}
251251
}

Diff for: radio/src/gui/128x64/model_flightmodes.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ void menuModelFlightModeOne(event_t event)
8383
int8_t editMode = s_editMode;
8484

8585
#if defined(GVARS) && !defined(PCBSTD)
86-
if (s_currIdx == 0 && sub>=ITEM_MODEL_FLIGHT_MODE_SWITCH) sub += VERTICAL_SHIFT;
86+
if (s_currIdx == 0 && sub>=ITEM_MODEL_FLIGHT_MODE_SWITCH)
87+
sub += VERTICAL_SHIFT;
8788

8889
for (uint8_t k=0; k<LCD_LINES-1; k++) {
8990
coord_t y = MENU_HEADER_HEIGHT + 1 + k*FH;

Diff for: radio/src/gui/128x64/model_input_edit.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ void menuModelExpoOne(event_t event)
118118

119119
case EXPO_FIELD_SCALE:
120120
lcdDrawTextAlignedLeft(y, STR_SCALE);
121-
drawSensorCustomValue(EXPO_ONE_2ND_COLUMN, y, (ed->srcRaw - MIXSRC_FIRST_TELEM)/3, convertTelemValue(ed->srcRaw - MIXSRC_FIRST_TELEM + 1, ed->scale), attr);
121+
drawSensorCustomValue(EXPO_ONE_2ND_COLUMN, y, (ed->srcRaw - MIXSRC_FIRST_TELEM)/3, convertTelemValue(ed->srcRaw - MIXSRC_FIRST_TELEM + 1, ed->scale), RIGHT | attr);
122122
if (attr) ed->scale = checkIncDec(event, ed->scale, 0, maxTelemValue(ed->srcRaw - MIXSRC_FIRST_TELEM + 1), EE_MODEL);
123123
break;
124124

Diff for: radio/src/gui/128x64/model_setup.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ void menuModelSetup(event_t event)
428428
break;
429429
case 2:
430430
qr.rem -= checkIncDecModel(event, qr.rem+2, 1, 62)-2;
431-
timer->start -= qr.rem ;
431+
timer->start -= qr.rem;
432432
if ((int16_t)timer->start < 0) timer->start=0;
433433
if ((int16_t)timer->start > 5999) timer->start=32399; // 8:59:59
434434
break;

Diff for: radio/src/gui/128x64/model_special_functions.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -291,10 +291,12 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF
291291
lcdDrawNumber(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT);
292292
}
293293
#endif // OVERRIDE_CHANNEL_FUNCTION
294-
else if (func >= FUNC_SET_FAILSAFE && func <= FUNC_BIND) {
294+
#if defined(DANGEROUS_MODULE_FUNCTIONS)
295+
else if (func >= FUNC_RANGECHECK && func <= FUNC_BIND) {
295296
val_max = NUM_MODULES-1;
296297
lcdDrawTextAtIndex(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, "\004Int.Ext.", CFN_PARAM(cfn), attr);
297298
}
299+
#endif
298300
else if (func == FUNC_SET_TIMER) {
299301
getMixSrcRange(MIXSRC_FIRST_TIMER, val_min, val_max);
300302
drawTimer(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT, attr);

Diff for: radio/src/gui/128x64/model_telemetry.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ void menuModelSensor(event_t event)
298298
case SENSOR_FIELD_PARAM2:
299299
if (sensor->type == TELEM_TYPE_CALCULATED) {
300300
if (sensor->formula == TELEM_FORMULA_CELL) {
301-
sensor->cell.index = editChoice(SENSOR_2ND_COLUMN, y, STR_CELLINDEX, STR_VCELLINDEX, sensor->cell.index, 0, 8, attr, event);
301+
sensor->cell.index = editChoice(SENSOR_2ND_COLUMN, y, STR_CELLINDEX, STR_VCELLINDEX, sensor->cell.index, TELEM_CELL_INDEX_LOWEST, TELEM_CELL_INDEX_LAST, attr, event);
302302
break;
303303
}
304304
else if (sensor->formula == TELEM_FORMULA_DIST) {

Diff for: radio/src/gui/128x64/view_telemetry.cpp

+2-9
Original file line numberDiff line numberDiff line change
@@ -71,27 +71,20 @@ bool displayGaugesTelemetryScreen(FrSkyScreenData & screen)
7171
barMin = calc100toRESX(barMin);
7272
barMax = calc100toRESX(barMax);
7373
}
74-
if (source && barMax > barMin) {
74+
if (source) {
7575
uint8_t y = barHeight+6+i*(barHeight+6);
7676
drawSource(0, y+barHeight/2-3, source, SMLSIZE);
7777
lcdDrawRect(BAR_LEFT, y, BAR_WIDTH+1, barHeight+2);
7878
getvalue_t value = getValue(source);
79-
8079
uint8_t thresholdX = 0;
81-
82-
83-
uint8_t width = barCoord(value, barMin, barMax);
84-
80+
uint8_t width = (barMin < barMax) ? barCoord(value, barMin, barMax) : 99 - barCoord(value, barMax, barMin);
8581
uint8_t barShade = SOLID;
86-
8782
lcdDrawFilledRect(BAR_LEFT+1, y+1, width, barHeight, barShade);
88-
8983
for (uint8_t j=24; j<99; j+=25) {
9084
if (j>thresholdX || j>width) {
9185
lcdDrawSolidVerticalLine(j*BAR_WIDTH/100+BAR_LEFT+1, y+1, barHeight);
9286
}
9387
}
94-
9588
if (thresholdX) {
9689
lcdDrawVerticalLine(BAR_LEFT+1+thresholdX, y-2, barHeight+3, DOTTED);
9790
lcdDrawSolidHorizontalLine(BAR_LEFT+thresholdX, y-2, 3);

Diff for: radio/src/gui/212x64/model_display.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -245,10 +245,10 @@ void menuModelDisplay(event_t event)
245245
}
246246
break;
247247
case 1:
248-
bar.barMin = checkIncDec(event, bar.barMin, barMin, bar.barMax, EE_MODEL|NO_INCDEC_MARKS);
248+
bar.barMin = checkIncDec(event, bar.barMin, barMin, barMax, EE_MODEL|NO_INCDEC_MARKS);
249249
break;
250250
case 2:
251-
bar.barMax = checkIncDec(event, bar.barMax, bar.barMin, barMax, EE_MODEL|NO_INCDEC_MARKS);
251+
bar.barMax = checkIncDec(event, bar.barMax, barMin, barMax, EE_MODEL|NO_INCDEC_MARKS);
252252
break;
253253
}
254254
}

Diff for: radio/src/gui/212x64/model_special_functions.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -265,10 +265,12 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF
265265
lcdDrawNumber(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT);
266266
}
267267
#endif
268-
else if (func >= FUNC_SET_FAILSAFE && func <= FUNC_BIND) {
268+
#if defined(DANGEROUS_MODULE_FUNCTIONS)
269+
else if (func >= FUNC_RANGECHECK && func <= FUNC_BIND) {
269270
val_max = NUM_MODULES-1;
270271
lcdDrawTextAtIndex(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, "\004Int.Ext.", CFN_PARAM(cfn), attr);
271272
}
273+
#endif
272274
else if (func == FUNC_SET_TIMER) {
273275
getMixSrcRange(MIXSRC_FIRST_TIMER, val_min, val_max);
274276
drawTimer(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT|TIMEHOUR, attr);

Diff for: radio/src/gui/212x64/model_telemetry.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ void menuModelSensor(event_t event)
280280
case SENSOR_FIELD_PARAM2:
281281
if (sensor->type == TELEM_TYPE_CALCULATED) {
282282
if (sensor->formula == TELEM_FORMULA_CELL) {
283-
sensor->cell.index = editChoice(SENSOR_2ND_COLUMN, y, STR_CELLINDEX, STR_VCELLINDEX, sensor->cell.index, 0, 8, attr, event);
283+
sensor->cell.index = editChoice(SENSOR_2ND_COLUMN, y, STR_CELLINDEX, STR_VCELLINDEX, sensor->cell.index, TELEM_CELL_INDEX_LOWEST, TELEM_CELL_INDEX_LAST, attr, event);
284284
break;
285285
}
286286
else if (sensor->formula == TELEM_FORMULA_DIST) {

Diff for: radio/src/gui/212x64/view_telemetry.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,14 @@ void displayGaugesTelemetryScreen(FrSkyScreenData & screen)
6767
barMin = calc100toRESX(barMin);
6868
barMax = calc100toRESX(barMax);
6969
}
70-
if (source && barMax > barMin) {
70+
if (source) {
7171
int y = barHeight+6+i*(barHeight+6);
7272
drawSource(0, y+barHeight-5, source, 0);
7373
lcdDrawRect(BAR_LEFT, y, BAR_WIDTH+1, barHeight+2);
7474
getvalue_t value = getValue(source);
7575
drawSourceValue(BAR_LEFT+2+BAR_WIDTH, y+barHeight-5, source, LEFT);
7676
uint8_t thresholdX = 0;
77-
int width = barCoord(value, barMin, barMax);
77+
uint8_t width = (barMin < barMax) ? barCoord(value, barMin, barMax) : limit(0, 151 - barCoord(value, barMax, barMin), 151);
7878
uint8_t barShade = SOLID;
7979
lcdDrawFilledRect(BAR_LEFT+1, y+1, width, barHeight, barShade);
8080
for (uint8_t j=24; j<99; j+=25) {

Diff for: radio/src/gui/480x272/model_inputs.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ bool menuModelExpoOne(event_t event)
243243
drawSource(EXPO_ONE_2ND_COLUMN, y, ed->srcRaw, menuHorizontalPosition==0 ? attr : 0);
244244
if (attr && menuHorizontalPosition==0) ed->srcRaw = checkIncDec(event, ed->srcRaw, INPUTSRC_FIRST, INPUTSRC_LAST, EE_MODEL|INCDEC_SOURCE|NO_INCDEC_MARKS, isInputSourceAvailable);
245245
if (ed->srcRaw >= MIXSRC_FIRST_TELEM) {
246-
drawSensorCustomValue(EXPO_ONE_2ND_COLUMN+75, y, (ed->srcRaw - MIXSRC_FIRST_TELEM)/3, convertTelemValue(ed->srcRaw - MIXSRC_FIRST_TELEM + 1, ed->scale), LEFT|(menuHorizontalPosition==1?attr:0));
246+
drawSensorCustomValue(EXPO_ONE_2ND_COLUMN+75, y, (ed->srcRaw - MIXSRC_FIRST_TELEM)/3, getValue(ed->srcRaw), LEFT|(menuHorizontalPosition==1?attr:0));
247247
if (attr && menuHorizontalPosition == 1) ed->scale = checkIncDec(event, ed->scale, 0, maxTelemValue(ed->srcRaw - MIXSRC_FIRST_TELEM + 1), EE_MODEL);
248248
}
249249
else if (attr) {

Diff for: radio/src/gui/480x272/model_telemetry.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ bool menuModelSensor(event_t event)
285285
if (sensor->type == TELEM_TYPE_CALCULATED) {
286286
if (sensor->formula == TELEM_FORMULA_CELL) {
287287
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_CELLINDEX);
288-
sensor->cell.index = editChoice(SENSOR_2ND_COLUMN, y, STR_VCELLINDEX, sensor->cell.index, 0, 8, attr, event);
288+
sensor->cell.index = editChoice(SENSOR_2ND_COLUMN, y, STR_VCELLINDEX, sensor->cell.index, TELEM_CELL_INDEX_LOWEST, TELEM_CELL_INDEX_LAST, attr, event);
289289
break;
290290
}
291291
else if (sensor->formula == TELEM_FORMULA_DIST) {

Diff for: radio/src/gui/480x272/widgets/gauge.cpp

+9-7
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,16 @@ void GaugeWidget::refresh()
4949
uint16_t color = persistentData->options[3].unsignedValue;
5050

5151
int32_t value = getValue(index);
52-
int32_t value_in_range = value;
53-
if (value < min)
54-
value_in_range = min;
55-
else if (value > max)
56-
value_in_range = max;
5752

58-
int w = divRoundClosest(zone.w * (value_in_range - min), (max - min));
59-
int percent = divRoundClosest(100 * (value_in_range - min), (max - min));
53+
if (min > max) {
54+
SWAP(min, max);
55+
value = value - min - max;
56+
}
57+
58+
value = limit(min, value, max);
59+
60+
int w = divRoundClosest(zone.w * (value - min), (max - min));
61+
int percent = divRoundClosest(100 * (value - min), (max - min));
6062

6163
// Gauge label
6264
drawSource(zone.x, zone.y, index, SMLSIZE | TEXT_INVERTED_COLOR);

Diff for: radio/src/mixer.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -951,7 +951,7 @@ void evalMixes(uint8_t tick10ms)
951951
mixerCurrentFlightMode = p;
952952
evalFlightModeMixes(p==fm ? e_perout_mode_normal : e_perout_mode_inactive_flight_mode, p==fm ? tick10ms : 0);
953953
for (uint8_t i=0; i<MAX_OUTPUT_CHANNELS; i++)
954-
sum_chans512[i] += (chans[i] >> 4) * fp_act[p];
954+
sum_chans512[i] += limit<int32_t>(-0x6fff, chans[i] >> 4, 0x6fff) * fp_act[p];
955955
weight += fp_act[p];
956956
}
957957
LS_RECURSIVE_EVALUATION_RESET();

Diff for: radio/src/opentx.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -1748,9 +1748,8 @@ volatile rotenc_t rotencValue[1] = {0};
17481748
uint8_t rotencSpeed;
17491749
#endif
17501750

1751-
#define OPENTX_INIT_ARGS
1752-
1753-
void opentxInit(OPENTX_INIT_ARGS) {
1751+
void opentxInit()
1752+
{
17541753
TRACE("opentxInit");
17551754

17561755
#if defined(GUI)

Diff for: radio/src/telemetry/telemetry.h

+3
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,11 @@ enum {
125125
TELEM_CELL_INDEX_4,
126126
TELEM_CELL_INDEX_5,
127127
TELEM_CELL_INDEX_6,
128+
// TELEM_CELL_INDEX_7, // PCBI6X: uses more RAM and I don't think someone will use 8S with i6X
129+
// TELEM_CELL_INDEX_8,
128130
TELEM_CELL_INDEX_HIGHEST,
129131
TELEM_CELL_INDEX_DELTA,
132+
TELEM_CELL_INDEX_LAST = TELEM_CELL_INDEX_DELTA
130133
};
131134

132135
PACK(struct CellValue

Diff for: radio/src/telemetry/telemetry_holders.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
#define TELEMETRY_AVERAGE_COUNT 3 // we actually average one more reading!
2727
#define RAW_FRSKY_MINMAX(v) v.values[TELEMETRY_AVERAGE_COUNT-1]
28-
#define MAX_CELLS 6
28+
#define MAX_CELLS 6 // 8, PCBI6X, uses RAM and I don't think someone will use 8S with i6X
2929

3030
class TelemetryValueWithMin {
3131
public:

Diff for: radio/src/tests/gtests.h

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ inline void MODEL_RESET()
6060
memset(&anaInValues, 0, sizeof(anaInValues));
6161
extern uint8_t s_mixer_first_run_done;
6262
s_mixer_first_run_done = false;
63+
evalMixes(1); // this is needed to reset fp_act
6364
lastFlightMode = 255;
6465
}
6566

Diff for: radio/src/tests/mixer.cpp

+61
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,22 @@ class MixerTest : public OpenTxTest {};
4747
} \
4848
} while (0)
4949

50+
#define CHECK_FLIGHT_MODE_TRANSITION(channel, duration, initValue, endValue) \
51+
do { \
52+
uint32_t delta = 0xffff / duration; \
53+
int32_t weightInit = 0xffff; \
54+
int32_t weightEnd = 0; \
55+
for (int i = 0; i <= (duration); i++) { \
56+
evalMixes(1); \
57+
GTEST_ASSERT_LE( abs(((initValue) * weightInit + (endValue) * weightEnd) / 0xffff - channelOutputs[(channel)]), 1); \
58+
weightInit = weightInit - delta; \
59+
weightEnd = weightEnd + delta; \
60+
} \
61+
for (int i = 0; i < 100; i++) { /* be sure the transition is finished*/ \
62+
evalMixes(1); \
63+
} \
64+
} while (0)
65+
5066
TEST_F(TrimsTest, throttleTrim)
5167
{
5268
g_model.thrTrim = 1;
@@ -660,3 +676,48 @@ TEST(Trainer, UnpluggedTest)
660676
ppmInput[0] = 1024;
661677
CHECK_DELAY(0, 5000);
662678
}
679+
680+
TEST_F(MixerTest, flightModeTransition)
681+
{
682+
SYSTEM_RESET();
683+
MODEL_RESET();
684+
MIXER_RESET();
685+
modelDefault(0);
686+
g_model.flightModeData[1].swtch = TR(SWSRC_ID2, SWSRC_SA2);
687+
g_model.flightModeData[0].fadeIn = 100;
688+
g_model.flightModeData[0].fadeOut = 100;
689+
g_model.flightModeData[1].fadeIn = 100;
690+
g_model.flightModeData[1].fadeOut = 100;
691+
g_model.mixData[0].destCh = 0;
692+
g_model.mixData[0].mltpx = MLTPX_REP;
693+
g_model.mixData[0].srcRaw = MIXSRC_MAX;
694+
g_model.mixData[0].flightModes = 0b11110;
695+
g_model.mixData[0].weight = 100;
696+
g_model.mixData[1].destCh = 0;
697+
g_model.mixData[1].mltpx = MLTPX_REP;
698+
g_model.mixData[1].srcRaw = MIXSRC_MAX;
699+
g_model.mixData[1].flightModes = 0b11101;
700+
g_model.mixData[1].weight = -10;
701+
evalMixes(1);
702+
simuSetSwitch(0, 1);
703+
CHECK_FLIGHT_MODE_TRANSITION(0, 1000, 1024, -102);
704+
}
705+
706+
TEST_F(MixerTest, flightModeOverflow)
707+
{
708+
SYSTEM_RESET();
709+
MODEL_RESET();
710+
MIXER_RESET();
711+
modelDefault(0);
712+
g_model.flightModeData[1].swtch = TR(SWSRC_ID2, SWSRC_SA2);
713+
g_model.flightModeData[0].fadeIn = 100;
714+
g_model.flightModeData[0].fadeOut = 100;
715+
g_model.mixData[0].destCh = 0;
716+
g_model.mixData[0].mltpx = MLTPX_REP;
717+
g_model.mixData[0].srcRaw = MIXSRC_MAX;
718+
g_model.mixData[0].flightModes = 0;
719+
g_model.mixData[0].weight = 250;
720+
evalMixes(1);
721+
simuSetSwitch(0, 1);
722+
CHECK_FLIGHT_MODE_TRANSITION(0, 1000, 1024, 1024);
723+
}

0 commit comments

Comments
 (0)