Skip to content

Commit 2b920a0

Browse files
authored
feat: dramatically reduce SD card access while in Tools screen (#5721)
1 parent fc642aa commit 2b920a0

File tree

2 files changed

+100
-7
lines changed

2 files changed

+100
-7
lines changed

radio/src/edgetx.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,21 @@ union ReusableBuffer
701701
PXX2HardwareAndSettings hardwareAndSettings; // radio_version
702702
#endif
703703

704+
#if defined(NUM_BODY_LINES)
705+
struct scriptInfo{
706+
uint8_t index;
707+
char label[(LCD_W / FW) + 1];
708+
uint8_t module;
709+
void (* tool)(event_t);
710+
char path[LEN_FILE_PATH_MAX+10+1];
711+
};
712+
#endif
713+
704714
struct {
715+
#if defined(NUM_BODY_LINES)
716+
scriptInfo script[NUM_BODY_LINES];
717+
uint8_t oldOffset;
718+
#endif
705719
#if defined(PXX2)
706720
ModuleInformation modules[NUM_MODULES];
707721
#endif

radio/src/gui/common/stdlcd/radio_tools.cpp

Lines changed: 86 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,39 @@ inline bool LuaScript_compare_nocase(LuaScript first, LuaScript second)
3737
return strcasecmp(first.label.c_str(), second.label.c_str()) < 0;
3838
}
3939

40+
void displayRadioTool(uint8_t index)
41+
{
42+
if (index >= menuVerticalOffset) {
43+
uint8_t lineIndex = index - menuVerticalOffset;
44+
if (lineIndex < NUM_BODY_LINES) {
45+
int8_t sub = menuVerticalPosition - HEADER_LINE;
46+
LcdFlags attr = (sub == index ? INVERS : 0);
47+
coord_t y = MENU_HEADER_HEIGHT + lineIndex * FH;
48+
lcdDrawNumber(3, y, index + 1, LEADING0 | LEFT, 2);
49+
lcdDrawText(3 * FW, y, reusableBuffer.radioTools.script[index].label, (sub == index ? INVERS : 0));
50+
if (attr && s_editMode > 0) {
51+
s_editMode = 0;
52+
killAllEvents();
53+
if (reusableBuffer.radioTools.script[index].tool != nullptr) {
54+
g_moduleIdx = reusableBuffer.radioTools.script[index].module;
55+
pushMenu(reusableBuffer.radioTools.script[index].tool);
56+
}
57+
else if (reusableBuffer.radioTools.script[index].path != nullptr) {
58+
char toolName[RADIO_TOOL_NAME_MAXLEN + 1];
59+
if (!readToolName(toolName, reusableBuffer.radioTools.script[index].path)) {
60+
strAppendFilename(toolName, getBasename(reusableBuffer.radioTools.script[index].path), RADIO_TOOL_NAME_MAXLEN);
61+
}
62+
char toolPath[FF_MAX_LFN];
63+
strcpy(toolPath, reusableBuffer.radioTools.script[index].path);
64+
*((char *)getBasename(toolPath)-1) = '\0';
65+
f_chdir(toolPath);
66+
luaExec(reusableBuffer.radioTools.script[index].path);
67+
}
68+
}
69+
}
70+
}
71+
}
72+
4073
bool addRadioTool(uint8_t index, const char * label)
4174
{
4275
if (index >= menuVerticalOffset) {
@@ -57,6 +90,20 @@ bool addRadioTool(uint8_t index, const char * label)
5790
return false;
5891
}
5992

93+
void addRadioModuleToolHandler(uint8_t index, const char * label, void (* tool)(event_t), uint8_t module)
94+
{
95+
if (index >= menuVerticalOffset) {
96+
uint8_t lineIndex = index - menuVerticalOffset;
97+
if (lineIndex < NUM_BODY_LINES) {
98+
memclear(&reusableBuffer.radioTools.script[index], sizeof(reusableBuffer.radioTools.script[0]));
99+
strncpy(reusableBuffer.radioTools.script[index].label, label, sizeof(reusableBuffer.radioTools.script[0]));
100+
reusableBuffer.radioTools.script[index].tool = tool;
101+
reusableBuffer.radioTools.script[index].module = module;
102+
}
103+
}
104+
addRadioTool(index, label);
105+
}
106+
60107
void addRadioModuleTool(uint8_t index, const char * label, void (* tool)(event_t), uint8_t module)
61108
{
62109
if (addRadioTool(index, label)) {
@@ -97,12 +144,36 @@ void addRadioScriptTool(uint8_t index, const char * path)
97144
luaExec(path);
98145
}
99146
}
147+
148+
void addRadioScriptToolHandler(std::vector<LuaScript> luaScripts)
149+
{
150+
uint8_t index = 0;
151+
for (auto luaScript : luaScripts) {
152+
memclear(&reusableBuffer.radioTools.script[index], sizeof(reusableBuffer.radioTools.script[0]));
153+
strncpy(reusableBuffer.radioTools.script[index].path, luaScript.path.c_str(), sizeof(reusableBuffer.radioTools.script[0].path));
154+
strncpy(reusableBuffer.radioTools.script[index].label, luaScript.label.c_str(), sizeof(reusableBuffer.radioTools.script[0].label));
155+
addRadioTool(index++, luaScript.label.c_str());
156+
}
157+
}
158+
159+
void addRadioScriptToolHandler(uint8_t index, const char * path)
160+
{
161+
if (index >= menuVerticalOffset) {
162+
uint8_t lineIndex = index - menuVerticalOffset;
163+
if (lineIndex < NUM_BODY_LINES) {
164+
memclear(&reusableBuffer.radioTools.script[index], sizeof(reusableBuffer.radioTools.script[0]));
165+
strncpy(reusableBuffer.radioTools.script[index].path, path, sizeof(reusableBuffer.radioTools.script[0].path));
166+
}
167+
addRadioScriptTool(index, path);
168+
}
169+
}
100170
#endif
101171

102172
void menuRadioTools(event_t event)
103173
{
104174
if (event == EVT_ENTRY || event == EVT_ENTRY_UP) {
105175
memclear(&reusableBuffer.radioTools, sizeof(reusableBuffer.radioTools));
176+
reusableBuffer.radioTools.oldOffset = 0xFF;
106177
#if defined(PXX2)
107178
for (uint8_t module = 0; module < NUM_MODULES; module++) {
108179
if (isModulePXX2(module) && (module == INTERNAL_MODULE ? modulePortPowered(INTERNAL_MODULE) : modulePortPowered(EXTERNAL_MODULE))) {
@@ -116,6 +187,13 @@ void menuRadioTools(event_t event)
116187

117188
uint8_t index = 0;
118189

190+
if (reusableBuffer.radioTools.oldOffset == menuVerticalOffset) {
191+
for(uint8_t line =0; line < reusableBuffer.radioTools.linesCount; line++) {
192+
displayRadioTool(line);
193+
}
194+
return;
195+
}
196+
119197
#if defined(LUA)
120198
FILINFO fno;
121199
DIR dir;
@@ -150,22 +228,22 @@ void menuRadioTools(event_t event)
150228
f_closedir(&dir);
151229

152230
std::sort(luaScripts.begin(), luaScripts.end(), LuaScript_compare_nocase);
153-
addRadioScriptTool(luaScripts);
231+
addRadioScriptToolHandler(luaScripts);
154232
index += luaScripts.size();
155233
}
156234
#endif
157235

158236
#if defined(INTERNAL_MODULE_PXX2)
159237
if (isPXX2ModuleOptionAvailable(reusableBuffer.radioTools.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER))
160-
addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE);
238+
addRadioModuleToolHandler(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE);
161239

162240
if (isPXX2ModuleOptionAvailable(reusableBuffer.radioTools.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER))
163-
addRadioModuleTool(index++, STR_POWER_METER_INT, menuRadioPowerMeter, INTERNAL_MODULE);
241+
addRadioModuleToolHandler(index++, STR_POWER_METER_INT, menuRadioPowerMeter, INTERNAL_MODULE);
164242
#endif
165243

166244
#if defined(HARDWARE_INTERNAL_MODULE) && defined(MULTIMODULE)
167245
if (g_eeGeneral.internalModule == MODULE_TYPE_MULTIMODULE)
168-
addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE);
246+
addRadioModuleToolHandler(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE);
169247
#endif
170248

171249
#if defined(HARDWARE_EXTERNAL_MODULE)
@@ -181,16 +259,16 @@ void menuRadioTools(event_t event)
181259
has_spectrum_analyser = true;
182260
#endif
183261
if (has_spectrum_analyser)
184-
addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_EXT, menuRadioSpectrumAnalyser, EXTERNAL_MODULE);
262+
addRadioModuleToolHandler(index++, STR_SPECTRUM_ANALYSER_EXT, menuRadioSpectrumAnalyser, EXTERNAL_MODULE);
185263
#endif
186264
#if defined(PXX2)
187265
if (isPXX2ModuleOptionAvailable(reusableBuffer.radioTools.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER))
188-
addRadioModuleTool(index++, STR_POWER_METER_EXT, menuRadioPowerMeter, EXTERNAL_MODULE);
266+
addRadioModuleToolHandler(index++, STR_POWER_METER_EXT, menuRadioPowerMeter, EXTERNAL_MODULE);
189267
#endif
190268

191269
#if defined(GHOST)
192270
if (isModuleGhost(EXTERNAL_MODULE))
193-
addRadioModuleTool(index++, "Ghost Menu", menuGhostModuleConfig, EXTERNAL_MODULE);
271+
addRadioModuleToolHandler(index++, "Ghost Menu", menuGhostModuleConfig, EXTERNAL_MODULE);
194272
#endif
195273

196274
#endif
@@ -200,4 +278,5 @@ void menuRadioTools(event_t event)
200278
}
201279

202280
reusableBuffer.radioTools.linesCount = index;
281+
reusableBuffer.radioTools.oldOffset = menuVerticalOffset;
203282
}

0 commit comments

Comments
 (0)