diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp
index cbce14f3e..1b7afbbc3 100644
--- a/companion/src/modeledit/setup.cpp
+++ b/companion/src/modeledit/setup.cpp
@@ -306,6 +306,11 @@ void ModulePanel::update()
ui->failsafesLayoutLabel->setVisible(mask & MASK_FAILSAFES);
ui->failsafesFrame->setVisible(mask & MASK_FAILSAFES);
+
+ if (mask & MASK_CHANNELS_RANGE) {
+ ui->channelsStart->setMaximum(32 - ui->channelsCount->value());
+ ui->channelsCount->setMaximum(qMin(16, 32-ui->channelsStart->value()));
+ }
}
void ModulePanel::on_trainerMode_currentIndexChanged(int index)
diff --git a/companion/src/modeledit/setup_module.ui b/companion/src/modeledit/setup_module.ui
index df8e420e0..ed8c4c0c3 100644
--- a/companion/src/modeledit/setup_module.ui
+++ b/companion/src/modeledit/setup_module.ui
@@ -67,12 +67,12 @@
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
- 6
-
0
+
+ 6
+
-
@@ -353,7 +353,7 @@
- 1
+ 4
16
diff --git a/radio/src/gui/Taranis/menu_model_setup.cpp b/radio/src/gui/Taranis/menu_model_setup.cpp
index 2d1970c09..4d5a6c2f5 100644
--- a/radio/src/gui/Taranis/menu_model_setup.cpp
+++ b/radio/src/gui/Taranis/menu_model_setup.cpp
@@ -876,9 +876,10 @@ void menuModelFailsafe(uint8_t event)
killEvents(event);
event = 0;
if (s_editMode) {
- g_model.moduleData[g_moduleIdx].failsafeChannels[m_posVert] = channelOutputs[m_posVert];
+ g_model.moduleData[g_moduleIdx].failsafeChannels[m_posVert] = channelOutputs[m_posVert+g_model.moduleData[g_moduleIdx].channelsStart];
eeDirty(EE_MODEL);
AUDIO_WARNING1();
+ s_editMode = 0;
SEND_FAILSAFE_NOW(g_moduleIdx);
}
else {
@@ -888,14 +889,14 @@ void menuModelFailsafe(uint8_t event)
else if (failsafe == FAILSAFE_CHANNEL_HOLD)
failsafe = FAILSAFE_CHANNEL_NOPULSE;
else
- failsafe = channelOutputs[m_posVert];
+ failsafe = 0;
eeDirty(EE_MODEL);
AUDIO_WARNING1();
SEND_FAILSAFE_NOW(g_moduleIdx);
}
}
- SIMPLE_SUBMENU_NOTITLE(NUM_CHNOUT);
+ SIMPLE_SUBMENU_NOTITLE(NUM_CHANNELS(g_moduleIdx));
SET_SCROLLBAR_X(0);
@@ -904,10 +905,6 @@ void menuModelFailsafe(uint8_t event)
// Column separator
lcd_vline(LCD_W/2, FH, LCD_H-FH);
- if (m_posVert >= 16) {
- ch = 16;
- }
-
lcd_putsCenter(0*FH, FAILSAFESET);
lcd_invert_line(0);
@@ -919,77 +916,78 @@ void menuModelFailsafe(uint8_t event)
// Channels
for (uint8_t line=0; line<8; line++) {
coord_t y = 9+line*7;
- int32_t channelValue = channelOutputs[ch];
+ int32_t channelValue = channelOutputs[ch+g_model.moduleData[g_moduleIdx].channelsStart];
int32_t failsafeValue = 0;
bool failsafeEditable = false;
uint8_t ofs = (col ? 0 : 1);
- if (ch >= g_model.moduleData[g_moduleIdx].channelsStart && ch < NUM_CHANNELS(g_moduleIdx) + g_model.moduleData[g_moduleIdx].channelsStart) {
+ if (ch < NUM_CHANNELS(g_moduleIdx)) {
failsafeValue = g_model.moduleData[g_moduleIdx].failsafeChannels[8*col+line];
failsafeEditable = true;
}
- // Channel name if present, number if not
- uint8_t lenLabel = ZLEN(g_model.limitData[ch].name);
- if (lenLabel > 4) {
- newLongNames = longNames = true;
- }
-
- if (lenLabel > 0)
- lcd_putsnAtt(x+1-ofs, y, g_model.limitData[ch].name, sizeof(g_model.limitData[ch].name), ZCHAR | SMLSIZE);
- else
- putsChn(x+1-ofs, y, ch+1, SMLSIZE);
-
- // Value
- LcdFlags flags = TINSIZE;
- if (m_posVert == ch) {
- flags |= INVERS;
- if (s_editMode) {
- if (!failsafeEditable || failsafeValue == FAILSAFE_CHANNEL_HOLD || failsafeValue == FAILSAFE_CHANNEL_NOPULSE) {
- s_editMode = 0;
- }
- else {
- flags |= BLINK;
- CHECK_INCDEC_MODELVAR(event, g_model.moduleData[g_moduleIdx].failsafeChannels[8*col+line], -lim, +lim);
+ if (failsafeEditable) {
+ // Channel name if present, number if not
+ uint8_t lenLabel = ZLEN(g_model.limitData[ch].name);
+ if (lenLabel > 4) {
+ newLongNames = longNames = true;
+ }
+
+ if (lenLabel > 0)
+ lcd_putsnAtt(x+1-ofs, y, g_model.limitData[ch].name, sizeof(g_model.limitData[ch].name), ZCHAR | SMLSIZE);
+ else
+ putsChn(x+1-ofs, y, ch+1, SMLSIZE);
+
+ // Value
+ LcdFlags flags = TINSIZE;
+ if (m_posVert == ch) {
+ flags |= INVERS;
+ if (s_editMode) {
+ if (failsafeValue == FAILSAFE_CHANNEL_HOLD || failsafeValue == FAILSAFE_CHANNEL_NOPULSE) {
+ s_editMode = 0;
+ }
+ else {
+ flags |= BLINK;
+ CHECK_INCDEC_MODELVAR(event, g_model.moduleData[g_moduleIdx].failsafeChannels[8*col+line], -lim, +lim);
+ }
}
}
- }
#if defined(PPM_UNIT_PERCENT_PREC1)
- uint8_t wbar = (longNames ? SLIDER_W-16 : SLIDER_W-6);
+ uint8_t wbar = (longNames ? SLIDER_W-16 : SLIDER_W-6);
#else
- uint8_t wbar = (longNames ? SLIDER_W-10 : SLIDER_W);
+ uint8_t wbar = (longNames ? SLIDER_W-10 : SLIDER_W);
#endif
-
- if (failsafeValue == FAILSAFE_CHANNEL_HOLD) {
- lcd_putsAtt(x+COL_W-4-wbar-ofs-16, y, "HOLD", flags);
- failsafeValue = 0;
- }
- else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) {
- lcd_putsAtt(x+COL_W-4-wbar-ofs-16, y, "NONE", flags);
- failsafeValue = 0;
- }
- else {
+
+ if (failsafeValue == FAILSAFE_CHANNEL_HOLD) {
+ lcd_putsAtt(x+COL_W-4-wbar-ofs-16, y, "HOLD", flags);
+ failsafeValue = 0;
+ }
+ else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) {
+ lcd_putsAtt(x+COL_W-4-wbar-ofs-16, y, "NONE", flags);
+ failsafeValue = 0;
+ }
+ else {
#if defined(PPM_UNIT_US)
- lcd_outdezAtt(x+COL_W-4-wbar-ofs, y, PPM_CH_CENTER(ch)+failsafeValue/2, flags);
+ lcd_outdezAtt(x+COL_W-4-wbar-ofs, y, PPM_CH_CENTER(ch)+failsafeValue/2, flags);
#elif defined(PPM_UNIT_PERCENT_PREC1)
- lcd_outdezAtt(x+COL_W-4-wbar-ofs, y, calcRESXto1000(failsafeValue), PREC1|flags);
+ lcd_outdezAtt(x+COL_W-4-wbar-ofs, y, calcRESXto1000(failsafeValue), PREC1|flags);
#else
- lcd_outdezAtt(x+COL_W-4-wbar-ofs, y, calcRESXto1000(failsafeValue)/10, flags);
+ lcd_outdezAtt(x+COL_W-4-wbar-ofs, y, calcRESXto1000(failsafeValue)/10, flags);
#endif
+ }
+
+ // Gauge
+ lcd_rect(x+COL_W-3-wbar-ofs, y, wbar+1, 6);
+ unsigned int lenChannel = limit((uint8_t)1, uint8_t((abs(channelValue) * wbar/2 + lim/2) / lim), uint8_t(wbar/2));
+ unsigned int lenFailsafe = limit((uint8_t)1, uint8_t((abs(failsafeValue) * wbar/2 + lim/2) / lim), uint8_t(wbar/2));
+ coord_t xChannel = (channelValue>0) ? x+COL_W-ofs-3-wbar/2 : x+COL_W-ofs-2-wbar/2-lenChannel;
+ coord_t xFailsafe = (failsafeValue>0) ? x+COL_W-ofs-3-wbar/2 : x+COL_W-ofs-2-wbar/2-lenFailsafe;
+ lcd_hlineStip(xChannel, y+1, lenChannel, DOTTED, 0);
+ lcd_hlineStip(xChannel, y+2, lenChannel, DOTTED, 0);
+ lcd_hline(xFailsafe, y+3, lenFailsafe);
+ lcd_hline(xFailsafe, y+4, lenFailsafe);
}
-
- // Gauge
- lcd_rect(x+COL_W-3-wbar-ofs, y, wbar+1, 6);
- unsigned int lenChannel = limit((uint8_t)1, uint8_t((abs(channelValue) * wbar/2 + lim/2) / lim), uint8_t(wbar/2));
- unsigned int lenFailsafe = limit((uint8_t)1, uint8_t((abs(failsafeValue) * wbar/2 + lim/2) / lim), uint8_t(wbar/2));
- coord_t xChannel = (channelValue>0) ? x+COL_W-ofs-3-wbar/2 : x+COL_W-ofs-2-wbar/2-lenChannel;
- coord_t xFailsafe = (failsafeValue>0) ? x+COL_W-ofs-3-wbar/2 : x+COL_W-ofs-2-wbar/2-lenFailsafe;
- lcd_hlineStip(xChannel, y+1, lenChannel, DOTTED, 0);
- lcd_hlineStip(xChannel, y+2, lenChannel, DOTTED, 0);
- lcd_hline(xFailsafe, y+3, lenFailsafe);
- lcd_hline(xFailsafe, y+4, lenFailsafe);
-
ch++;
}
}
diff --git a/radio/src/pulses/pxx_arm.cpp b/radio/src/pulses/pxx_arm.cpp
index 0109cbc26..f2ef092cb 100644
--- a/radio/src/pulses/pxx_arm.cpp
+++ b/radio/src/pulses/pxx_arm.cpp
@@ -231,7 +231,7 @@ void setupPulsesPXX(unsigned int port)
}
else {
if (i < sendUpperChannels) {
- int16_t failsafeValue = g_model.moduleData[port].failsafeChannels[8+g_model.moduleData[port].channelsStart+i];
+ int16_t failsafeValue = g_model.moduleData[port].failsafeChannels[8+i];
if (failsafeValue == FAILSAFE_CHANNEL_HOLD)
chan = 4095;
else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE)
@@ -240,7 +240,7 @@ void setupPulsesPXX(unsigned int port)
chan = limit(2049, PPM_CH_CENTER(8+g_model.moduleData[port].channelsStart+i) - PPM_CENTER + (failsafeValue * 512 / 682) + 3072, 4094);
}
else {
- int16_t failsafeValue = g_model.moduleData[port].failsafeChannels[g_model.moduleData[port].channelsStart+i];
+ int16_t failsafeValue = g_model.moduleData[port].failsafeChannels[i];
if (failsafeValue == FAILSAFE_CHANNEL_HOLD)
chan = 2047;
else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE)