diff --git a/companion/src/eeprominterface.cpp b/companion/src/eeprominterface.cpp
index ffc3d1726..4cf29b34f 100644
--- a/companion/src/eeprominterface.cpp
+++ b/companion/src/eeprominterface.cpp
@@ -712,92 +712,13 @@ QString LogicalSwitchData::toString(const ModelData & model, const GeneralSettin
return result;
}
-#if 0
-QStringList FuncSwData::toStringList()
+void FuncSwData::clear()
{
- QStringList result;
- QStringList qs;
-
- result << swtch.toString();
- result << funcToString();
-
- if (func < FuncInstantTrim) {
- result << QString("%1").arg(param);
+ memset(this, 0, sizeof(FuncSwData));
+ if (!GetCurrentFirmware()->getCapability(SafetyChannelCustomFunction)) {
+ func = FuncTrainer;
}
- else if (func==FuncPlaySound) {
- qs <<"Beep 1" << "Beep 2" << "Beep 3" << "Warn1" << "Warn2" << "Cheep" << "Ratata" << "Tick" << "Siren" << "Ring" ;
- qs << "SciFi" << "Robot" << "Chirp" << "Tada" << "Crickt" << "AlmClk" ;
- if (param>=0 && param<(int)qs.count())
- result << qs.at(param);
- else
- result << QObject::tr("Inconsistent parameter");
- }
- else if (func==FuncPlayHaptic) {
- qs << "0" << "1" << "2" << "3";
- if (param>=0 && param<(int)qs.count())
- result << qs.at(param);
- else
- result << QObject::tr("Inconsistent parameter");
- }
- else if (func==FuncReset) {
- qs.append( QObject::tr("Timer1"));
- qs.append( QObject::tr("Timer2"));
- qs.append( QObject::tr("All"));
- qs.append( QObject::tr("Telemetry"));
- if (param>=0 && param<(int)qs.count())
- result << qs.at(param);
- else
- result << QObject::tr("Inconsistent parameter");
- }
- else if ((func==FuncVolume)|| (func==FuncPlayValue)) {
- RawSource item(param);
- result << item.toString();
- }
- else if ((func==FuncPlayPrompt) || (func==FuncPlayBoth)) {
- if ( GetCurrentFirmware()->getCapability(VoicesAsNumbers)) {
- result << QString("%1").arg(param);
- } else {
- result << paramarm;
- }
- }
- else if ((func>FuncBackgroundMusicPause) && (funcfuncSw[i].repeatParam),"green"));
- } else {
- str.append(doTC( " ","green"));
- }
- if ((index<=FuncInstantTrim) || (index>FuncBackgroundMusicPause)) {
- str.append(doTC((g_model->funcSw[i].enabled ? "ON" : "OFF"),"green"));
- } else {
- str.append(doTC( "---","green"));
- }
-
- return result;
}
-#endif
QString FuncSwData::funcToString()
{
@@ -1215,6 +1136,8 @@ void ModelData::clear()
expoData[i].clear();
for (int i=0; iaddOption("ppmus", QObject::tr("Channel values displayed in us"));
+ firmware->addOption("sqt5font", QObject::tr("Use alternative SQT5 font"));
+ firmware->addOption("nosafetych", QObject::tr("No SafetyCH functions available"));
+ Option fai_options[] = { { "faichoice", QObject::tr("Possibility to enable FAI MODE at field") }, { "faimode", QObject::tr("FAI MODE always enabled") }, { NULL } };
+ firmware->addOptions(fai_options);
+}
+
void registerOpenTxFirmwares()
{
OpenTxFirmware * openTx;
@@ -1007,7 +1018,6 @@ void registerOpenTxFirmwares()
Option ext_options[] = { { "frsky", QObject::tr("Support for frsky telemetry mod"), FRSKY_VARIANT }, { "telemetrez", QObject::tr("Support for telemetry easy board"), FRSKY_VARIANT }, { "jeti", QObject::tr("Support for jeti telemetry mod"), 0 }, { "ardupilot", QObject::tr("Support for receiving ardupilot data"), 0 }, { "nmea", QObject::tr("Support for receiving NMEA data"), 0 }, { "mavlink", QObject::tr("Support for MAVLINK devices"), MAVLINK_VARIANT }, { NULL } };
Option nav_options[] = { { "rotenc", QObject::tr("Rotary Encoder use in menus navigation") }, { "potscroll", QObject::tr("Pots use in menus navigation") }, { NULL } };
Option extr_options[] = { { "frsky", QObject::tr("Support for frsky telemetry mod"), FRSKY_VARIANT }, { "jeti", QObject::tr("Support for jeti telemetry mod"), 0 }, { "ardupilot", QObject::tr("Support for receiving ardupilot data"), 0 }, { "nmea", QObject::tr("Support for receiving NMEA data"), 0 }, { "mavlink", QObject::tr("Support for MAVLINK devices"), MAVLINK_VARIANT }, { NULL } };
- Option fai_options[] = { { "faichoice", QObject::tr("Possibility to enable FAI MODE at field") }, { "faimode", QObject::tr("FAI MODE always enabled") }, { NULL } };
/* 9x board */
openTx = new OpenTxFirmware("opentx-9x", QObject::tr("OpenTX for 9X board"), BOARD_STOCK);
@@ -1023,7 +1033,6 @@ void registerOpenTxFirmwares()
// NOT TESTED openTx->addOption("PXX", QObject::tr("Support of FrSky PXX protocol"));
openTx->addOption("DSM2", QObject::tr("Support for DSM2 modules"));
openTx->addOption("ppmca", QObject::tr("PPM center adjustment in limits"));
- openTx->addOption("ppmus", QObject::tr("Channel values displayed in us"));
openTx->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT);
openTx->addOption("symlimits", QObject::tr("Symetrical Limits"));
openTx->addOptions(nav_options);
@@ -1034,7 +1043,6 @@ void registerOpenTxFirmwares()
openTx->addOption("nographics", QObject::tr("No graphical check boxes and sliders"));
openTx->addOption("battgraph", QObject::tr("Battery graph"));
openTx->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items"));
- openTx->addOption("sqt5font", QObject::tr("Use alternative SQT5 font"));
openTx->addOption("thrtrace", QObject::tr("Enable the throttle trace in Statistics"));
openTx->addOption("pgbar", QObject::tr("EEprom write progress bar"));
openTx->addOption("imperial", QObject::tr("Imperial units"));
@@ -1042,9 +1050,10 @@ void registerOpenTxFirmwares()
openTx->addOption("novario", QObject::tr("No vario support"));
openTx->addOption("nogps", QObject::tr("No GPS support"));
openTx->addOption("nogauges", QObject::tr("No gauges in the custom telemetry screen"));
+ openTx->addOption("nosafetych", QObject::tr("No SafetyCH functions available"));
openTx->addOption("fasoffset", QObject::tr("Allow compensating for offset errors in FrSky FAS current sensors"));
openTx->addOption("stickrev", QObject::tr("Add support for reversing stick inputs (e.g. needed for FrSky gimbals)"));
- openTx->addOptions(fai_options);
+ addOpenTxCommonOptions(openTx);
firmwares.push_back(openTx);
/* 9x board with M128 chip */
@@ -1061,7 +1070,6 @@ void registerOpenTxFirmwares()
// NOT TESTED openTx->addOption("PXX", QObject::tr("Support of FrSky PXX protocol"));
openTx->addOption("DSM2", QObject::tr("Support for DSM2 modules"));
openTx->addOption("ppmca", QObject::tr("PPM center adjustment in limits"));
- openTx->addOption("ppmus", QObject::tr("Channel values displayed in us"));
openTx->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT);
openTx->addOption("symlimits", QObject::tr("Symetrical Limits"));
openTx->addOptions(nav_options);
@@ -1072,11 +1080,10 @@ void registerOpenTxFirmwares()
openTx->addOption("nographics", QObject::tr("No graphical check boxes and sliders"));
openTx->addOption("battgraph", QObject::tr("Battery graph"));
openTx->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items"));
- openTx->addOption("sqt5font", QObject::tr("Use alternative SQT5 font"));
openTx->addOption("thrtrace", QObject::tr("Enable the throttle trace in Statistics"));
openTx->addOption("pgbar", QObject::tr("EEprom write Progress bar"));
openTx->addOption("imperial", QObject::tr("Imperial units"));
- openTx->addOptions(fai_options);
+ addOpenTxCommonOptions(openTx);
firmwares.push_back(openTx);
/* 9XR board */
@@ -1093,7 +1100,6 @@ void registerOpenTxFirmwares()
// NOT TESTED openTx->addOption("PXX", QObject::tr("Support of FrSky PXX protocol"));
openTx->addOption("DSM2", QObject::tr("Support for DSM2 modules"));
openTx->addOption("ppmca", QObject::tr("PPM center adjustment in limits"));
- openTx->addOption("ppmus", QObject::tr("Channel values displayed in us"));
openTx->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT);
openTx->addOption("symlimits", QObject::tr("Symetrical Limits"));
openTx->addOption("potscroll", QObject::tr("Pots use in menus navigation"));
@@ -1102,7 +1108,6 @@ void registerOpenTxFirmwares()
openTx->addOption("nographics", QObject::tr("No graphical check boxes and sliders"));
openTx->addOption("battgraph", QObject::tr("Battery graph"));
openTx->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items"));
- openTx->addOption("sqt5font", QObject::tr("Use alternative SQT5 font"));
openTx->addOption("thrtrace", QObject::tr("Enable the throttle trace in Statistics"));
openTx->addOption("pgbar", QObject::tr("EEprom write Progress bar"));
openTx->addOption("imperial", QObject::tr("Imperial units"));
@@ -1111,7 +1116,7 @@ void registerOpenTxFirmwares()
openTx->addOption("nogps", QObject::tr("No GPS support"));
openTx->addOption("nogauges", QObject::tr("No gauges in the custom telemetry screen"));
openTx->addOption("stickrev", QObject::tr("Add support for reversing stick inputs (e.g. needed for FrSky gimbals)"));
- openTx->addOptions(fai_options);
+ addOpenTxCommonOptions(openTx);
firmwares.push_back(openTx);
/* 9XR board with M128 chip */
@@ -1128,7 +1133,6 @@ void registerOpenTxFirmwares()
// NOT TESTED openTx->addOption("PXX", QObject::tr("Support of FrSky PXX protocol"));
openTx->addOption("DSM2", QObject::tr("Support for DSM2 modules"));
openTx->addOption("ppmca", QObject::tr("PPM center adjustment in limits"));
- openTx->addOption("ppmus", QObject::tr("Channel values displayed in us"));
openTx->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT);
openTx->addOption("symlimits", QObject::tr("Symetrical Limits"));
openTx->addOption("potscroll", QObject::tr("Pots use in menus navigation"));
@@ -1137,11 +1141,10 @@ void registerOpenTxFirmwares()
openTx->addOption("nographics", QObject::tr("No graphical check boxes and sliders"));
openTx->addOption("battgraph", QObject::tr("Battery graph"));
openTx->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items"));
- openTx->addOption("sqt5font", QObject::tr("Use alternative SQT5 font"));
openTx->addOption("thrtrace", QObject::tr("Enable the throttle trace in Statistics"));
openTx->addOption("pgbar", QObject::tr("EEprom write Progress bar"));
openTx->addOption("imperial", QObject::tr("Imperial units"));
- openTx->addOptions(fai_options);
+ addOpenTxCommonOptions(openTx);
firmwares.push_back(openTx);
/* Gruvin9x board */
@@ -1156,7 +1159,6 @@ void registerOpenTxFirmwares()
Option dsm2_options[] = { { "DSM2", QObject::tr("Support for DSM2 modules"), 0 }, { "DSM2PPM", QObject::tr("Support for DSM2 modules using ppm instead of true serial"), 0 }, { NULL } };
openTx->addOptions(dsm2_options);
openTx->addOption("ppmca", QObject::tr("PPM center adjustment in limits"));
- openTx->addOption("ppmus", QObject::tr("Channel values displayed in us"));
openTx->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT);
openTx->addOption("symlimits", QObject::tr("Symetrical Limits"));
openTx->addOption("potscroll", QObject::tr("Pots use in menus navigation"));
@@ -1166,10 +1168,9 @@ void registerOpenTxFirmwares()
openTx->addOption("nographics", QObject::tr("No graphical check boxes and sliders"));
openTx->addOption("battgraph", QObject::tr("Battery graph"));
openTx->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items"));
- openTx->addOption("sqt5font", QObject::tr("Use alternative SQT5 font"));
openTx->addOption("pgbar", QObject::tr("EEprom write Progress bar"));
openTx->addOption("imperial", QObject::tr("Imperial units"));
- openTx->addOptions(fai_options);
+ addOpenTxCommonOptions(openTx);
firmwares.push_back(openTx);
/* Sky9x board */
@@ -1179,7 +1180,6 @@ void registerOpenTxFirmwares()
openTx->addOption("nofp", QObject::tr("No flight modes"));
openTx->addOption("nocurves", QObject::tr("Disable curves menus"));
openTx->addOption("ppmca", QObject::tr("PPM center adjustment in limits"));
- openTx->addOption("ppmus", QObject::tr("Channel values displayed in us"));
openTx->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT);
openTx->addOption("symlimits", QObject::tr("Symetrical Limits"));
openTx->addOption("potscroll", QObject::tr("Pots use in menus navigation"));
@@ -1189,9 +1189,8 @@ void registerOpenTxFirmwares()
openTx->addOption("nographics", QObject::tr("No graphical check boxes and sliders"));
openTx->addOption("battgraph", QObject::tr("Battery graph"));
openTx->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items"));
- openTx->addOption("sqt5font", QObject::tr("Use alternative SQT5 font"));
openTx->addOption("bluetooth", QObject::tr("Bluetooth interface"));
- openTx->addOptions(fai_options);
+ addOpenTxCommonOptions(openTx);
firmwares.push_back(openTx);
/* 9XR-Pro */
@@ -1201,7 +1200,6 @@ void registerOpenTxFirmwares()
openTx->addOption("nofp", QObject::tr("No flight modes"));
openTx->addOption("nocurves", QObject::tr("Disable curves menus"));
openTx->addOption("ppmca", QObject::tr("PPM center adjustment in limits"));
- openTx->addOption("ppmus", QObject::tr("Channel values displayed in us"));
openTx->addOption("gvars", QObject::tr("Global variables"), GVARS_VARIANT);
openTx->addOption("symlimits", QObject::tr("Symetrical Limits"));
openTx->addOption("potscroll", QObject::tr("Pots use in menus navigation"));
@@ -1210,9 +1208,8 @@ void registerOpenTxFirmwares()
openTx->addOption("nographics", QObject::tr("No graphical check boxes and sliders"));
openTx->addOption("battgraph", QObject::tr("Battery graph"));
openTx->addOption("nobold", QObject::tr("Don't use bold font for highlighting active items"));
- openTx->addOption("sqt5font", QObject::tr("Use alternative SQT5 font"));
openTx->addOption("bluetooth", QObject::tr("Bluetooth interface"));
- openTx->addOptions(fai_options);
+ addOpenTxCommonOptions(openTx);
firmwares.push_back(openTx);
/* Taranis board */
@@ -1221,9 +1218,7 @@ void registerOpenTxFirmwares()
openTx->addOption("nogvars", QObject::tr("Disable Global variables"));
openTx->addOption("haptic", QObject::tr("Haptic module installed"));
openTx->addOption("lua", QObject::tr("Support for Lua model scripts"));
- openTx->addOption("ppmus", QObject::tr("Channel values displayed in us"));
- openTx->addOption("sqt5font", QObject::tr("Use alternative SQT5 font"));
- openTx->addOptions(fai_options);
+ addOpenTxCommonOptions(openTx);
firmwares.push_back(openTx);
/* Taranis Plus board */
@@ -1231,9 +1226,7 @@ void registerOpenTxFirmwares()
openTx->addOption("noheli", QObject::tr("Disable HELI menu and cyclic mix support"));
openTx->addOption("nogvars", QObject::tr("Disable Global variables"));
openTx->addOption("lua", QObject::tr("Support for Lua model scripts"));
- openTx->addOption("ppmus", QObject::tr("Channel values displayed in us"));
- openTx->addOption("sqt5font", QObject::tr("Use alternative SQT5 font"));
- openTx->addOptions(fai_options);
+ addOpenTxCommonOptions(openTx);
firmwares.push_back(openTx);
default_firmware_variant = GetFirmware("opentx-9x-heli-templates-en");
diff --git a/companion/src/modeledit/customfunctions.cpp b/companion/src/modeledit/customfunctions.cpp
index dec530b7c..94f1bf0fb 100644
--- a/companion/src/modeledit/customfunctions.cpp
+++ b/companion/src/modeledit/customfunctions.cpp
@@ -590,7 +590,8 @@ void CustomFunctionsPanel::populateFuncCB(QComboBox *b, unsigned int value)
b->clear();
for (unsigned int i=0; iaddItem(FuncSwData(AssignFunc(i)).funcToString());
- if (((i==FuncVolume || i==FuncBackgroundMusic || i==FuncBackgroundMusicPause) && !firmware->getCapability(HasVolume)) ||
+ if (((i>=FuncSafetyCh1 && i<=FuncSafetyCh32) && !firmware->getCapability(SafetyChannelCustomFunction)) ||
+ ((i==FuncVolume || i==FuncBackgroundMusic || i==FuncBackgroundMusicPause) && !firmware->getCapability(HasVolume)) ||
((i==FuncPlayHaptic) && !firmware->getCapability(Haptic)) ||
((i==FuncPlayBoth) && !firmware->getCapability(HasBeeper)) ||
((i==FuncLogs) && !firmware->getCapability(HasSDLogs)) ||
diff --git a/radio/src/Makefile b/radio/src/Makefile
index 4c0fd8418..92cf0fc00 100644
--- a/radio/src/Makefile
+++ b/radio/src/Makefile
@@ -169,6 +169,10 @@ PPM_LIMITS_SYMETRICAL = NO
# Values = PERCENT_PREC1, PERCENT_PREC0, US
PPM_UNIT = PERCENT_PREC1
+# SafetyCHxx functions enable
+# Values = YES, NO
+SAFETY_CHANNEL_FUNCTION = YES
+
# FrSky Hub
# Values = YES, NO
FRSKY_HUB = YES
@@ -1011,6 +1015,10 @@ ifeq ($(PPM_LIMITS_SYMETRICAL), YES)
CPPDEFS += -DPPM_LIMITS_SYMETRICAL
endif
+ifeq ($(SAFETY_CHANNEL_FUNCTION), YES)
+ CPPDEFS += -DSAFETY_CHANNEL_FUNCTION
+endif
+
ifeq ($(PPM_UNIT), US)
CPPDEFS += -DPPM_UNIT_US
endif
diff --git a/radio/src/gui/menu_model.cpp b/radio/src/gui/menu_model.cpp
index 5551a493b..37c9e93b1 100644
--- a/radio/src/gui/menu_model.cpp
+++ b/radio/src/gui/menu_model.cpp
@@ -5055,10 +5055,13 @@ void menuModelCustomFunctions(uint8_t event)
case 2:
{
int8_t maxParam = NUM_CHNOUT-1;
+#if defined(SAFETY_CHANNEL_FUNCTION)
if (func == FUNC_SAFETY_CHANNEL) {
putsChn(lcdNextPos, y, CFN_CH_INDEX(sd)+1, attr);
}
- else if (func == FUNC_TRAINER) {
+ else
+#endif
+ if (func == FUNC_TRAINER) {
maxParam = 4;
#if defined(CPUARM)
putsMixerSource(lcdNextPos, y, CFN_CH_INDEX(sd)==0 ? 0 : MIXSRC_Rud+CFN_CH_INDEX(sd)-1, attr);
@@ -5100,11 +5103,17 @@ void menuModelCustomFunctions(uint8_t event)
int8_t val_min = 0;
uint8_t val_max = 255;
#endif
- if (func == FUNC_SAFETY_CHANNEL) {
+ if (func == FUNC_RESET) {
+ val_max = FUNC_RESET_PARAM_LAST;
+ lcd_putsiAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, STR_VFSWRESET, CFN_PARAM(sd), attr);
+ }
+#if defined(SAFETY_CHANNEL_FUNCTION)
+ else if (func == FUNC_SAFETY_CHANNEL) {
val_displayed = (int8_t)CFN_PARAM(sd);
val_min = -125; val_max = 125;
lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT);
}
+#endif
#if defined(CPUARM)
else if (func == FUNC_SET_TIMER) {
val_max = 59*60+59;
@@ -5216,10 +5225,6 @@ void menuModelCustomFunctions(uint8_t event)
val_max = 100;
}
#endif
- else if (func == FUNC_RESET) {
- val_max = FUNC_RESET_PARAM_LAST;
- lcd_putsiAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, STR_VFSWRESET, CFN_PARAM(sd), attr);
- }
#if defined(GVARS)
else if (func == FUNC_ADJUST_GVAR) {
switch (CFN_GVAR_MODE(sd)) {
diff --git a/radio/src/gui/menus.cpp b/radio/src/gui/menus.cpp
index 8e7399107..d994fa3a9 100644
--- a/radio/src/gui/menus.cpp
+++ b/radio/src/gui/menus.cpp
@@ -1554,17 +1554,15 @@ bool isLogicalSwitchFunctionAvailable(int function)
bool isAssignableFunctionAvailable(int function)
{
switch (function) {
-
+#if !defined(SAFETY_CHANNEL_FUNCTION)
+ case FUNC_SAFETY_CHANNEL:
+#endif
#if !defined(HAPTIC)
case FUNC_HAPTIC:
- return false;
#endif
-
#if !defined(GVARS)
case FUNC_ADJUST_GVAR:
- return false;
#endif
-
case FUNC_PLAY_DIFF:
case FUNC_RESERVE1:
case FUNC_RESERVE2:
diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp
index 4db7d0723..f25358e18 100755
--- a/radio/src/mixer.cpp
+++ b/radio/src/mixer.cpp
@@ -245,8 +245,10 @@ int16_t applyLimits(uint8_t channel, int32_t value)
if (lim->revert) ofs = -ofs; // finally do the reverse.
+#if defined(SAFETY_CHANNEL_FUNCTION)
if (safetyCh[channel] != -128) // if safety channel available for channel check
ofs = calc100toRESX(safetyCh[channel]);
+#endif
return ofs;
}
diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h
index 0cbdf76fe..ac2e4affe 100644
--- a/radio/src/myeeprom.h
+++ b/radio/src/myeeprom.h
@@ -837,7 +837,11 @@ enum Functions {
FUNC_MAX
};
-#define HAS_ENABLE_PARAM(func) ((func) < FUNC_FIRST_WITHOUT_ENABLE)
+#if defined(SAFETY_CHANNEL_FUNCTION)
+ #define HAS_ENABLE_PARAM(func) ((func) < FUNC_FIRST_WITHOUT_ENABLE)
+#else
+ #define HAS_ENABLE_PARAM(func) ((func) < FUNC_FIRST_WITHOUT_ENABLE && (func) != FUNC_SAFETY_CHANNEL)
+#endif
#if defined(VOICE)
#define IS_PLAY_FUNC(func) ((func) >= FUNC_PLAY_SOUND && func <= FUNC_PLAY_VALUE)
diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp
index 079125989..74b978373 100644
--- a/radio/src/opentx.cpp
+++ b/radio/src/opentx.cpp
@@ -147,7 +147,9 @@ uint8_t heartbeat;
uint8_t stickMode;
+#if defined(SAFETY_CHANNEL_FUNCTION)
int8_t safetyCh[NUM_CHNOUT];
+#endif
union ReusableBuffer reusableBuffer;
@@ -1855,9 +1857,11 @@ void evalFunctions()
static rotenc_t rePreviousValues[ROTARY_ENCODERS];
#endif
+#if defined(SAFETY_CHANNEL_FUNCTION)
for (uint8_t i=0; i