Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add "Enable" button to all CF (#3024) #3038

Closed
wants to merge 15 commits into from
14 changes: 3 additions & 11 deletions companion/src/firmwares/customfunctiondata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -199,18 +199,10 @@ QString CustomFunctionData::repeatToString(const int value)

QString CustomFunctionData::enabledToString() const
{
if ((func >= FuncOverrideCH1 && func <= FuncOverrideCHLast) ||
(func >= FuncAdjustGV1 && func <= FuncAdjustGVLast) ||
(func == FuncReset) ||
(func >= FuncSetTimer1 && func <= FuncSetTimerLast) ||
(func == FuncVolume) ||
(func == FuncBacklight) ||
(func <= FuncInstantTrim)) {
if (!enabled) {
return tr("DISABLED");
}
if (!enabled) {
return tr("DISABLED");
}
return "";
return "ENABLED";
pfeerick marked this conversation as resolved.
Show resolved Hide resolved
}

// static
Expand Down
31 changes: 17 additions & 14 deletions companion/src/firmwares/edgetx/yaml_customfunctiondata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -216,15 +216,15 @@ Node convert<CustomFunctionData>::encode(const CustomFunctionData& rhs)
break;
}

if (fnHasEnable(rhs.func)) {
if (add_comma) {
def += ",";
}
def += std::to_string((int)rhs.enabled);
} else if(fnHasRepeat(rhs.func)) {
if (add_comma) {
def += ",";
}
if (add_comma) {
def += ",";
}

def += std::to_string((int)rhs.enabled);

if(fnHasRepeat(rhs.func)) {
def += ",";

if (rhs.repeatParam == 0) {
def += "1x";
} else if (rhs.repeatParam == -1) {
Expand Down Expand Up @@ -367,11 +367,14 @@ bool convert<CustomFunctionData>::decode(const Node& node,
def.ignore();
}

if (fnHasEnable(rhs.func)) {
int en = 0;
def >> en;
rhs.enabled = en;
} else if(fnHasRepeat(rhs.func)) {
int en = 0;
def >> en;
rhs.enabled = en;

if(fnHasRepeat(rhs.func)) {
if (def.peek() == ',') {
def.ignore();
}
std::string repeat;
getline(def, repeat);
if (repeat == "1x") {
Expand Down
14 changes: 7 additions & 7 deletions companion/src/modeledit/customfunctions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -199,11 +199,13 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model,
repeatLayout->addWidget(fswtchRepeat[i], i + 1);
connect(fswtchRepeat[i], SIGNAL(currentIndexChanged(int)), this, SLOT(customFunctionEdited()));

QHBoxLayout *enableLayout = new QHBoxLayout();
tableLayout->addLayout(i, 5, enableLayout);
fswtchEnable[i] = new QCheckBox(this);
fswtchEnable[i]->setProperty("index", i);
fswtchEnable[i]->setText(tr("ON"));
fswtchEnable[i]->setFixedWidth(200);
repeatLayout->addWidget(fswtchEnable[i], i + 1);
enableLayout->addWidget(fswtchEnable[i], i + 1);
connect(fswtchEnable[i], SIGNAL(stateChanged(int)), this, SLOT(customFunctionEdited()));
}

Expand Down Expand Up @@ -344,10 +346,11 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified)
else {
fswtchSwtch[i]->setCurrentIndex(fswtchSwtch[i]->findData(cfn.swtch.toValue()));
fswtchFunc[i]->setCurrentIndex(fswtchFunc[i]->findData(cfn.func));
fswtchEnable[i]->setChecked(cfn.enabled);
}

if (!cfn.isEmpty()) {
widgetsMask |= CUSTOM_FUNCTION_SHOW_FUNC;
widgetsMask |= CUSTOM_FUNCTION_SHOW_FUNC | CUSTOM_FUNCTION_ENABLE;
pfeerick marked this conversation as resolved.
Show resolved Hide resolved

if (func >= FuncOverrideCH1 && func <= FuncOverrideCH32) {
if (model) {
Expand Down Expand Up @@ -533,7 +536,8 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified)
fswtchParam[i]->setDecimals(0);
fswtchParam[i]->setSingleStep(1);
fswtchParam[i]->setValue(cfn.param);
if (func <= FuncInstantTrim) {
//if (func <= FuncInstantTrim)
{
widgetsMask |= CUSTOM_FUNCTION_ENABLE;
}
}
pfeerick marked this conversation as resolved.
Show resolved Hide resolved
Expand All @@ -546,10 +550,6 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified)
fswtchParamT[i]->setVisible(widgetsMask & CUSTOM_FUNCTION_SOURCE_PARAM);
fswtchParamArmT[i]->setVisible(widgetsMask & CUSTOM_FUNCTION_FILE_PARAM);
fswtchEnable[i]->setVisible(widgetsMask & CUSTOM_FUNCTION_ENABLE);
if (widgetsMask & CUSTOM_FUNCTION_ENABLE)
fswtchEnable[i]->setChecked(cfn.enabled);
else
fswtchEnable[i]->setChecked(false);
fswtchRepeat[i]->setVisible(widgetsMask & CUSTOM_FUNCTION_REPEAT);
fswtchGVmode[i]->setVisible(widgetsMask & CUSTOM_FUNCTION_GV_MODE);
playBT[i]->setVisible(widgetsMask & CUSTOM_FUNCTION_PLAY);
Expand Down
3 changes: 2 additions & 1 deletion radio/src/datastructs_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,8 @@ PACK(struct CustomFunctionData {
NOBACKUP(CFN_SPARE_TYPE val2);
}) clear);
}) NAME(fp) SKIP;
uint8_t active SKIP;
int8_t repeat:7 SKIP;
uint8_t active:1 SKIP;

bool isEmpty() const
{
Expand Down
35 changes: 20 additions & 15 deletions radio/src/gui/128x64/model_special_functions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,17 @@

#include "opentx.h"

#define MODEL_SPECIAL_FUNC_1ST_COLUMN (0)
#define MODEL_SPECIAL_FUNC_2ND_COLUMN (4*FW-1)
#define MODEL_SPECIAL_FUNC_3RD_COLUMN (15*FW-3)
#define MODEL_SPECIAL_FUNC_4TH_COLUMN (20*FW)
#define MODEL_SPECIAL_FUNC_1ST_COLUMN (0)
#define MODEL_SPECIAL_FUNC_2ND_COLUMN (4*FW-1)
#define MODEL_SPECIAL_FUNC_3RD_COLUMN (15*FW-3)
#if defined(GRAPHICS)
#define MODEL_SPECIAL_FUNC_4TH_COLUMN_ONOFF (20*FW)
#define MODEL_SPECIAL_FUNC_4TH_COLUMN (19 * FW - 3)
#define MODEL_SPECIAL_FUNC_4TH_COLUMN_ONOFF (19 * FW - 3)
#define MODEL_SPECIAL_FUNC_5TH_COLUMN_ONOFF (20 * FW + 1)
#else
#define MODEL_SPECIAL_FUNC_4TH_COLUMN_ONOFF (18*FW+2)
#define MODEL_SPECIAL_FUNC_4TH_COLUMN_ONOFF (17 * FW)
#define MODEL_SPECIAL_FUNC_4TH_COLUMN_ONOFF (17 * FW)
#define MODEL_SPECIAL_FUNC_5TH_COLUMN_ONOFF (18 * FW + 3)
#endif

#if defined(SDCARD)
Expand Down Expand Up @@ -179,12 +182,13 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF

CustomFunctionData * cfn = &functions[k];
uint8_t func = CFN_FUNC(cfn);
for (uint8_t j=0; j<5; j++) {
for (uint8_t j=0; j<6; j++) {
uint8_t attr = ((sub==k && menuHorizontalPosition==j) ? ((s_editMode>0) ? BLINK|INVERS : INVERS) : 0);
uint8_t active = (attr && s_editMode > 0);
switch (j) {
case 0:
if (sub==k && menuHorizontalPosition < 1 && CFN_SWITCH(cfn) == SWSRC_NONE) {
CFN_ACTIVE(cfn) = 1;
drawSwitch(MODEL_SPECIAL_FUNC_1ST_COLUMN, y, CFN_SWITCH(cfn), attr | INVERS | ((functionsContext->activeSwitches & ((MASK_CFN_TYPE)1 << k)) ? BOLD : 0));
if (active) CHECK_INCDEC_SWITCH(event, CFN_SWITCH(cfn), SWSRC_FIRST, SWSRC_LAST, eeFlags, isSwitchAvailableInCustomFunctions);
}
Expand Down Expand Up @@ -427,26 +431,27 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF
}

case 4:
if (HAS_ENABLE_PARAM(func)) {
drawCheckBox(MODEL_SPECIAL_FUNC_4TH_COLUMN_ONOFF, y, CFN_ACTIVE(cfn), attr);
if (active) CFN_ACTIVE(cfn) = checkIncDec(event, CFN_ACTIVE(cfn), 0, 1, eeFlags);
}
else if (HAS_REPEAT_PARAM(func)) {
if (HAS_REPEAT_PARAM(func)) {
if (CFN_PLAY_REPEAT(cfn) == 0) {
lcdDrawChar(MODEL_SPECIAL_FUNC_4TH_COLUMN_ONOFF+3, y, '-', attr);
}
else if (CFN_PLAY_REPEAT(cfn) == CFN_PLAY_REPEAT_NOSTART) {
else if (CFN_PLAY_REPEAT(cfn) == (int8_t)CFN_PLAY_REPEAT_NOSTART) {
lcdDrawText(MODEL_SPECIAL_FUNC_4TH_COLUMN_ONOFF+1, y, "!-", attr);
}
else {
lcdDrawNumber(MODEL_SPECIAL_FUNC_4TH_COLUMN+2+FW, y, CFN_PLAY_REPEAT(cfn)*CFN_PLAY_REPEAT_MUL, RIGHT | attr);
}
if (active) CFN_PLAY_REPEAT(cfn) = checkIncDec(event, CFN_PLAY_REPEAT(cfn)==CFN_PLAY_REPEAT_NOSTART?-1:CFN_PLAY_REPEAT(cfn), -1, 60/CFN_PLAY_REPEAT_MUL, eeFlags);
if (active) CFN_PLAY_REPEAT(cfn) = checkIncDec(event, CFN_PLAY_REPEAT(cfn)==(int8_t)CFN_PLAY_REPEAT_NOSTART?-1:CFN_PLAY_REPEAT(cfn), -1, 60/CFN_PLAY_REPEAT_MUL, eeFlags);
}
else if (attr) {
REPEAT_LAST_CURSOR_MOVE();
}
break;

case 5:
drawCheckBox(MODEL_SPECIAL_FUNC_5TH_COLUMN_ONOFF, y, CFN_ACTIVE(cfn), attr);
if (active) CFN_ACTIVE(cfn) = checkIncDec(event, CFN_ACTIVE(cfn), 0, 1, eeFlags);
break;
}
}
#if defined(NAVIGATION_X7)
Expand All @@ -465,7 +470,7 @@ void menuModelSpecialFunctions(event_t event)
menuHorizontalPosition = 0;
}
#endif
MENU(STR_MENUCUSTOMFUNC, menuTabModel, MENU_MODEL_SPECIAL_FUNCTIONS, HEADER_LINE+MAX_SPECIAL_FUNCTIONS, { HEADER_LINE_COLUMNS NAVIGATION_LINE_BY_LINE|4/*repeated*/ });
MENU(STR_MENUCUSTOMFUNC, menuTabModel, MENU_MODEL_SPECIAL_FUNCTIONS, HEADER_LINE+MAX_SPECIAL_FUNCTIONS, { HEADER_LINE_COLUMNS NAVIGATION_LINE_BY_LINE|5/*repeated*/ });

menuSpecialFunctions(event, g_model.customFn, &modelFunctionsContext);

Expand Down
28 changes: 17 additions & 11 deletions radio/src/gui/212x64/model_special_functions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
#define MODEL_SPECIAL_FUNC_1ST_COLUMN (4*FW+2)
#define MODEL_SPECIAL_FUNC_2ND_COLUMN (8*FW+2)
#define MODEL_SPECIAL_FUNC_3RD_COLUMN (21*FW)
#define MODEL_SPECIAL_FUNC_4TH_COLUMN (33*FW-3)
#define MODEL_SPECIAL_FUNC_4TH_COLUMN (31*FW-3)
#define MODEL_SPECIAL_FUNC_4TH_COLUMN_ONOFF (34*FW-3)

void onCustomFunctionsFileSelectionMenu(const char * result)
Expand Down Expand Up @@ -141,8 +141,9 @@ enum CustomFunctionsItems {
ITEM_CUSTOM_FUNCTIONS_PARAM1,
ITEM_CUSTOM_FUNCTIONS_PARAM2,
ITEM_CUSTOM_FUNCTIONS_REPEAT,
ITEM_CUSTOM_FUNCTIONS_ENABLE,
ITEM_CUSTOM_FUNCTIONS_COUNT,
ITEM_CUSTOM_FUNCTIONS_LAST = ITEM_CUSTOM_FUNCTIONS_COUNT-1
ITEM_CUSTOM_FUNCTIONS_LAST = ITEM_CUSTOM_FUNCTIONS_COUNT - 1
};

void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomFunctionsContext * functionsContext)
Expand Down Expand Up @@ -177,11 +178,12 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF

CustomFunctionData * cfn = &functions[k];
uint8_t func = CFN_FUNC(cfn);
for (uint8_t j=0; j<5; j++) {
for (uint8_t j=0; j<6; j++) {
uint8_t attr = ((sub==k && menuHorizontalPosition==j) ? ((s_editMode>0) ? BLINK|INVERS : INVERS) : 0);
uint8_t active = (attr && s_editMode>0);
switch (j) {
case ITEM_CUSTOM_FUNCTIONS_SWITCH:
if(CFN_SWITCH(cfn) == SWSRC_NONE) CFN_ACTIVE(cfn) = 1;
drawSwitch(MODEL_SPECIAL_FUNC_1ST_COLUMN, y, CFN_SWITCH(cfn), attr | ((functionsContext->activeSwitches & ((MASK_CFN_TYPE)1 << k)) ? BOLD : 0));
if (active || AUTOSWITCH_ENTER_LONG()) CHECK_INCDEC_SWITCH(event, CFN_SWITCH(cfn), SWSRC_FIRST, SWSRC_LAST, eeFlags, isSwitchAvailableInCustomFunctions);
if (func == FUNC_OVERRIDE_CHANNEL && functions != g_model.customFn) {
Expand Down Expand Up @@ -405,35 +407,39 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF
}

case ITEM_CUSTOM_FUNCTIONS_REPEAT:
if (HAS_ENABLE_PARAM(func)) {
drawCheckBox(MODEL_SPECIAL_FUNC_4TH_COLUMN_ONOFF, y, CFN_ACTIVE(cfn), attr);
if (active) CFN_ACTIVE(cfn) = checkIncDec(event, CFN_ACTIVE(cfn), 0, 1, eeFlags);
}
else if (HAS_REPEAT_PARAM(func)) {
if (HAS_REPEAT_PARAM(func)) {
if (CFN_PLAY_REPEAT(cfn) == 0) {
lcdDrawText(MODEL_SPECIAL_FUNC_4TH_COLUMN+2, y, "1x", attr);
}
else if (CFN_PLAY_REPEAT(cfn) == CFN_PLAY_REPEAT_NOSTART) {
else if (CFN_PLAY_REPEAT(cfn) == (int8_t)CFN_PLAY_REPEAT_NOSTART) {
lcdDrawChar(MODEL_SPECIAL_FUNC_4TH_COLUMN-1, y, '!', attr);
lcdDrawText(MODEL_SPECIAL_FUNC_4TH_COLUMN+2, y, "1x", attr);
}
else {
lcdDrawNumber(MODEL_SPECIAL_FUNC_4TH_COLUMN+2+FW, y, CFN_PLAY_REPEAT(cfn)*CFN_PLAY_REPEAT_MUL, attr|RIGHT);
lcdDrawChar(MODEL_SPECIAL_FUNC_4TH_COLUMN+2+FW, y, 's', attr);
}
if (active) CFN_PLAY_REPEAT(cfn) = checkIncDec(event, CFN_PLAY_REPEAT(cfn)==CFN_PLAY_REPEAT_NOSTART?-1:CFN_PLAY_REPEAT(cfn), -1, 60/CFN_PLAY_REPEAT_MUL, eeFlags);
if (active) CFN_PLAY_REPEAT(cfn) = checkIncDec(event, CFN_PLAY_REPEAT(cfn)==(int8_t)CFN_PLAY_REPEAT_NOSTART?-1:CFN_PLAY_REPEAT(cfn), -1, 60/CFN_PLAY_REPEAT_MUL, eeFlags);
}
else if (attr) {
REPEAT_LAST_CURSOR_MOVE();
}
break;

case ITEM_CUSTOM_FUNCTIONS_ENABLE:
drawCheckBox(MODEL_SPECIAL_FUNC_4TH_COLUMN_ONOFF, y, CFN_ACTIVE(cfn),
attr);
if (active)
CFN_ACTIVE(cfn) =
checkIncDec(event, CFN_ACTIVE(cfn), 0, 1, eeFlags);
break;
}
}
}
}

void menuModelSpecialFunctions(event_t event)
{
MENU(STR_MENUCUSTOMFUNC, menuTabModel, MENU_MODEL_SPECIAL_FUNCTIONS, MAX_SPECIAL_FUNCTIONS, { NAVIGATION_LINE_BY_LINE|4/*repeated*/ });
MENU(STR_MENUCUSTOMFUNC, menuTabModel, MENU_MODEL_SPECIAL_FUNCTIONS, MAX_SPECIAL_FUNCTIONS, { NAVIGATION_LINE_BY_LINE|5/*repeated*/ });
return menuSpecialFunctions(event, g_model.customFn, &modelFunctionsContext);
}
47 changes: 31 additions & 16 deletions radio/src/gui/colorlcd/special_functions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -352,13 +352,8 @@ class SpecialFunctionEditPage : public Page
line = specialFunctionOneWindow->newLine(&grid);
}
}

if (HAS_ENABLE_PARAM(func)) {
new StaticText(line, rect_t{}, STR_ENABLE, 0, COLOR_THEME_PRIMARY1);
new CheckBox(line, rect_t{},
GET_SET_DEFAULT(CFN_ACTIVE(cfn)));
line = specialFunctionOneWindow->newLine(&grid);
} else if (HAS_REPEAT_PARAM(func)) { // !1x 1x 1s 2s 3s ...

if (HAS_REPEAT_PARAM(func)) { // !1x 1x 1s 2s 3s ...
new StaticText(line, rect_t{}, STR_REPEAT,
0, COLOR_THEME_PRIMARY1);
auto repeat = new NumberEdit(
Expand All @@ -377,6 +372,12 @@ class SpecialFunctionEditPage : public Page
});
line = specialFunctionOneWindow->newLine(&grid);
}

{
new StaticText(line, rect_t{}, STR_ENABLE, 0, COLOR_THEME_PRIMARY1);
new CheckBox(line, rect_t{}, GET_SET_DEFAULT(CFN_ACTIVE(cfn)));
line = specialFunctionOneWindow->newLine(&grid);
}
}

void buildBody(FormWindow *window)
Expand All @@ -387,7 +388,11 @@ class SpecialFunctionEditPage : public Page

CustomFunctionData *cfn = &functions[index];

// Switch
// Set new function to "enabled" by default
if (!CFN_SWITCH(cfn))
CFN_ACTIVE(cfn) = true;

// Switch
auto line = window->newLine(&grid);
new StaticText(line, rect_t{}, STR_SWITCH, 0, COLOR_THEME_PRIMARY1);
auto switchChoice =
Expand Down Expand Up @@ -419,8 +424,10 @@ class SpecialFunctionEditPage : public Page
0, FUNC_MAX - 1,
GET_DEFAULT(CFN_FUNC(cfn)));
functionChoice->setSetValueHandler([=](int32_t newValue) {
int enableState = CFN_ACTIVE(cfn);
CFN_FUNC(cfn) = newValue;
CFN_RESET(cfn);
CFN_ACTIVE(cfn) = enableState;
SET_DIRTY();
updateSpecialFunctionOneWindow();
});
Expand All @@ -439,6 +446,8 @@ static constexpr coord_t line2 = line1 + PAGE_LINE_HEIGHT;
static constexpr coord_t col1 = 20;
static constexpr coord_t col2 = (LCD_W - 100) / 3 + col1;
static constexpr coord_t col3 = ((LCD_W - 100) / 3) * 2 + col1 + 20;
// Special location used only for "enabled" check-box
static constexpr coord_t col4 = (LCD_W - 100);

static const char* _failsafe_module[] = {
"Ext.", "Int.",
Expand Down Expand Up @@ -595,12 +604,13 @@ class SpecialFunctionButton : public Button
}
}
}
if (HAS_ENABLE_PARAM(func)) {
theme->drawCheckBox(dc, CFN_ACTIVE(cfn), col3, line2);
} else if (HAS_REPEAT_PARAM(func)) {

theme->drawCheckBox(dc, CFN_ACTIVE(cfn), col4, line2);

if (HAS_REPEAT_PARAM(func)) {
if (CFN_PLAY_REPEAT(cfn) == 0) {
dc->drawText(col3, line2, "1x", COLOR_THEME_SECONDARY1);
} else if (CFN_PLAY_REPEAT(cfn) == CFN_PLAY_REPEAT_NOSTART) {
} else if (CFN_PLAY_REPEAT(cfn) == int8_t(CFN_PLAY_REPEAT_NOSTART)) {
dc->drawText(col3, line2, "!1x", COLOR_THEME_SECONDARY1);
} else {
dc->drawNumber(col3 + 12, line2, CFN_PLAY_REPEAT(cfn) * CFN_PLAY_REPEAT_MUL, COLOR_THEME_SECONDARY1 | RIGHT, 0, nullptr, "s");
Expand All @@ -610,11 +620,16 @@ class SpecialFunctionButton : public Button

void paint(BitmapBuffer *dc) override
{
if (active)
dc->drawSolidFilledRect(0, 0, rect.w, rect.h, COLOR_THEME_ACTIVE);
else
dc->drawSolidFilledRect(0, 0, rect.w, rect.h, COLOR_THEME_PRIMARY2);
const CustomFunctionData *cfn = &functions[index];

if(CFN_ACTIVE(cfn)) {
if (active)
dc->drawSolidFilledRect(0, 0, rect.w, rect.h, COLOR_THEME_ACTIVE);
else
dc->drawSolidFilledRect(0, 0, rect.w, rect.h, COLOR_THEME_PRIMARY2);
} else {
dc->drawSolidFilledRect(0, 0, rect.w, rect.h, COLOR_THEME_SECONDARY3);
}
paintSpecialFunctionLine(dc);

// The bounding rect
Expand Down
Loading