From 45804b318ac992097f71f35a591770a7edfe4460 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 6 Jun 2018 17:07:27 +0200 Subject: [PATCH] Improve r9m power handling (#5950) * Rework around reusable buffer * small fix * Rework 212 & 480 handling too * Optimize * Compilation fix --- radio/src/gui/128x64/model_setup.cpp | 21 ++++++++++-------- radio/src/gui/212x64/model_setup.cpp | 23 +++++++++++--------- radio/src/gui/480x272/model_setup.cpp | 31 +++++++++++++++------------ radio/src/opentx.cpp | 12 +++++------ radio/src/opentx.h | 7 ++++-- 5 files changed, 53 insertions(+), 41 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 5c79385c6..ab2d1660e 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -256,10 +256,6 @@ void menuModelSetup(event_t event) } #endif -#if defined(CPUARM) - static uint8_t selectedPxxPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; //TODO could go to the reusable struct -#endif - int8_t old_editMode = s_editMode; #if defined(PCBTARANIS) @@ -336,6 +332,12 @@ void menuModelSetup(event_t event) TITLE(STR_MENUSETUP); +#if defined(CPUARM) + if (event == EVT_ENTRY) { + reusableBuffer.modelsetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; + } +#endif + uint8_t sub = menuVerticalPosition - HEADER_LINE; int8_t editMode = s_editMode; @@ -1334,14 +1336,15 @@ void menuModelSetup(event_t event) } else { g_model.moduleData[moduleIdx].pxx.power = min((uint8_t)g_model.moduleData[moduleIdx].pxx.power, (uint8_t)R9M_LBT_POWER_MAX); - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_LBT_POWER_VALUES, selectedPxxPower, LEFT | attr); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_LBT_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); if (attr) { - CHECK_INCDEC_MODELVAR_ZERO(event, selectedPxxPower, R9M_LBT_POWER_MAX); + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.moduleData[moduleIdx].pxx.power, R9M_LBT_POWER_MAX); } - if (attr && editMode == 0 && selectedPxxPower != g_model.moduleData[moduleIdx].pxx.power) { - if((selectedPxxPower + g_model.moduleData[moduleIdx].pxx.power) < 5) //switching between mode 2 and 3 does not require rebind + if (attr && editMode == 0 && reusableBuffer.modelsetup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { + if((reusableBuffer.modelsetup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) { //switching between mode 2 and 3 does not require rebind POPUP_WARNING(STR_REBIND); - g_model.moduleData[moduleIdx].pxx.power = selectedPxxPower; + } + reusableBuffer.modelsetup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; } } } diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index bf061fb0e..627b63012 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -277,7 +277,6 @@ void menuModelSetup(event_t event) { horzpos_t l_posHorz = menuHorizontalPosition; bool CURSOR_ON_CELL = (menuHorizontalPosition >= 0); - static uint8_t selectedPxxPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; //TODO could go to the reusable struct int8_t old_editMode = s_editMode; MENU_TAB({ 0, 0, TIMERS_ROWS, TOPLCD_ROWS 0, 1, 0, 0, @@ -301,6 +300,10 @@ void menuModelSetup(event_t event) MENU_CHECK(STR_MENUSETUP, menuTabModel, MENU_MODEL_SETUP, ITEM_MODEL_SETUP_MAX); + if (event == EVT_ENTRY) { + reusableBuffer.modelsetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; + } + #if (defined(DSM2) || defined(PXX)) if (menuEvent) { moduleFlag[0] = 0; @@ -1139,19 +1142,19 @@ void menuModelSetup(event_t event) if (IS_MODULE_R9M(moduleIdx)) { lcdDrawTextAlignedLeft(y, TR_MULTI_RFPOWER); if(IS_MODULE_R9M_FCC(moduleIdx)) { - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_FCC_POWER_VALUES, selectedPxxPower, LEFT | attr); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_FCC_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); if (attr) - CHECK_INCDEC_MODELVAR(event, selectedPxxPower, 0, R9M_FCC_POWER_MAX); + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, R9M_FCC_POWER_MAX); } else { - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_LBT_POWER_VALUES, selectedPxxPower, LEFT | attr); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_LBT_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); if (attr) - CHECK_INCDEC_MODELVAR(event, selectedPxxPower, 0, R9M_LBT_POWER_MAX); - } - if (attr && s_editMode == 0 && selectedPxxPower != g_model.moduleData[moduleIdx].pxx.power) { - if((selectedPxxPower + g_model.moduleData[moduleIdx].pxx.power) < 5) //switching between mode 2 and 3 does not require rebind - POPUP_WARNING(STR_REBIND); - g_model.moduleData[moduleIdx].pxx.power = selectedPxxPower; + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, R9M_LBT_POWER_MAX); + if (attr && s_editMode == 0 && reusableBuffer.modelsetup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { + if((reusableBuffer.modelsetup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) //switching between mode 2 and 3 does not require rebind + POPUP_WARNING(STR_REBIND); + reusableBuffer.modelsetup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; + } } } #if defined (MULTIMODULE) diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 105a0661c..4fb1752a5 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -101,14 +101,14 @@ enum MenuModelSetupItems { void checkModelIdUnique(uint8_t moduleIdx) { - char* warn_buf = reusableBuffer.msgbuf.msg; + char* warn_buf = reusableBuffer.modelsetup.msg; // cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 - size_t warn_buf_len = sizeof(reusableBuffer.msgbuf.msg) - WARNING_LINE_LEN - 2; + size_t warn_buf_len = sizeof(reusableBuffer.modelsetup.msg) - WARNING_LINE_LEN - 2; if (!modelslist.isModelIdUnique(moduleIdx,warn_buf,warn_buf_len)) { if (warn_buf[0] != 0) { POPUP_WARNING(STR_MODELIDUSED); - SET_WARNING_INFO(warn_buf, sizeof(reusableBuffer.msgbuf.msg), 0); + SET_WARNING_INFO(warn_buf, sizeof(reusableBuffer.modelsetup.msg), 0); } } } @@ -258,7 +258,6 @@ int getSwitchWarningsCount() bool menuModelSetup(event_t event) { bool CURSOR_ON_CELL = (menuHorizontalPosition >= 0); - static uint8_t selectedPxxPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; //TODO could go to the reusable struct // Switch to external antenna confirmation if (warningResult) { @@ -291,6 +290,10 @@ bool menuModelSetup(event_t event) TRAINER_LINE1_ROWS, TRAINER_LINE2_ROWS }); + if (event == EVT_ENTRY) { + reusableBuffer.modelsetup.r9mPower = g_model.moduleData[EXTERNAL_MODULE].pxx.power; + } + if (menuEvent) { moduleFlag[0] = 0; moduleFlag[1] = 0; @@ -1079,21 +1082,21 @@ bool menuModelSetup(event_t event) if (IS_MODULE_R9M(moduleIdx)) { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_RFPOWER); if(IS_MODULE_R9M_FCC(moduleIdx)) { - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_FCC_POWER_VALUES, selectedPxxPower, LEFT | attr); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_FCC_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); if (attr) - CHECK_INCDEC_MODELVAR(event, selectedPxxPower, 0, R9M_FCC_POWER_MAX); + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, R9M_FCC_POWER_MAX); } else { - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_LBT_POWER_VALUES, selectedPxxPower, LEFT | attr); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_LBT_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); if (attr) - CHECK_INCDEC_MODELVAR(event, selectedPxxPower, 0, R9M_LBT_POWER_MAX); - } - if (attr && s_editMode == 0 && selectedPxxPower != g_model.moduleData[moduleIdx].pxx.power) { - if((selectedPxxPower + g_model.moduleData[moduleIdx].pxx.power) < 5) { //switching between mode 2 and 3 does not require rebind - POPUP_WARNING(STR_WARNING); - SET_WARNING_INFO(STR_REBIND, sizeof(TR_REBIND), 0); + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].pxx.power, 0, R9M_LBT_POWER_MAX); + if (attr && s_editMode == 0 && reusableBuffer.modelsetup.r9mPower != g_model.moduleData[moduleIdx].pxx.power) { + if((reusableBuffer.modelsetup.r9mPower + g_model.moduleData[moduleIdx].pxx.power) < 5) { //switching between mode 2 and 3 does not require rebind + POPUP_WARNING(STR_WARNING); + SET_WARNING_INFO(STR_REBIND, sizeof(TR_REBIND), 0); + } + reusableBuffer.modelsetup.r9mPower = g_model.moduleData[moduleIdx].pxx.power; } - g_model.moduleData[moduleIdx].pxx.power = selectedPxxPower; } } #if defined(MULTIMODULE) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 1011467e1..35e5e2d76 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -407,16 +407,16 @@ void checkModelIdUnique(uint8_t index, uint8_t module) { uint8_t modelId = g_model.header.modelId[module]; uint8_t additionalOnes = 0; - char * name = reusableBuffer.msgbuf.msg; + char * name = reusableBuffer.modelsetup.msg; - memset(reusableBuffer.msgbuf.msg, 0, sizeof(reusableBuffer.msgbuf.msg)); + memset(reusableBuffer.modelsetup.msg, 0, sizeof(reusableBuffer.modelsetup.msg)); if (modelId != 0) { for (uint8_t i = 0; i < MAX_MODELS; i++) { if (i != index) { if (modelId == modelHeaders[i].modelId[module]) { - if ((WARNING_LINE_LEN - 4 - (name - reusableBuffer.msgbuf.msg)) > (signed)(modelHeaders[i].name[0] ? zlen(modelHeaders[i].name, LEN_MODEL_NAME) : sizeof(TR_MODEL) + 2)) { // you cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 (-2 for the ",") - if (reusableBuffer.msgbuf.msg[0] != 0) { + if ((WARNING_LINE_LEN - 4 - (name - reusableBuffer.modelsetup.msg)) > (signed)(modelHeaders[i].name[0] ? zlen(modelHeaders[i].name, LEN_MODEL_NAME) : sizeof(TR_MODEL) + 2)) { // you cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 (-2 for the ",") + if (reusableBuffer.modelsetup.msg[0] != 0) { name = strAppend(name, ", "); } if (modelHeaders[i].name[0] == 0) { @@ -441,9 +441,9 @@ void checkModelIdUnique(uint8_t index, uint8_t module) name = strAppend(name, ")"); } - if (reusableBuffer.msgbuf.msg[0] != 0) { + if (reusableBuffer.modelsetup.msg[0] != 0) { POPUP_WARNING(STR_MODELIDUSED); - SET_WARNING_INFO(reusableBuffer.msgbuf.msg, sizeof(reusableBuffer.msgbuf.msg), 0); + SET_WARNING_INFO(reusableBuffer.modelsetup.msg, sizeof(reusableBuffer.modelsetup.msg), 0); } } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 3be78156a..fbf39a28e 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1471,7 +1471,7 @@ void opentxResume(); #endif union ReusableBuffer { - // 275 bytes + // ARM 334 bytes struct { #if !defined(CPUARM) @@ -1488,9 +1488,12 @@ union ReusableBuffer #endif } modelsel; + // 65 bytes struct { char msg[64]; - } msgbuf; // used in modelsel and modelsetup (only in a warning message) + uint8_t r9mPower; + } modelsetup; + // 103 bytes struct