feat: Model templates for color radios (update SD card for bundled templates) (#1569)

* Model templates - select and load after Create Model for color radios

* Model templates - save model as template, only for color radios

* Small fix to drawTextLines(...) to handle consecutive spaces

* Change title of button for empty template folder

* I found out why "no trailing slash = important" in path names!

* Reworked file and path name string manipulation
No longer using chdir, as Lua scripts etc. could be messing with the working dir
Use buffers more and std::string less

* Adjusting the size of buffers
I think that I got it right now. Really hard to figure out the right size constants!
Also added storageDirty(EE_MODEL) after reading the template file and renaming the model

* Added storage checks

* Slight simplification - all template buttons are similar

* Added "Blank Model" button

* Wizard Lua script
If there is a Lua script with the same name as the template file in the folder, then it is run after reading the template.
This commit is contained in:
Jesper Frickmann
2022-03-09 11:00:38 +10:00
committed by GitHub
parent e0e196a6e6
commit dcc5cfb352
22 changed files with 399 additions and 32 deletions
+25 -4
View File
@@ -29,11 +29,12 @@
// defined either in sdcard_raw.cpp or sdcard_yaml.cpp
void storageCreateModelsList();
void getModelPath(char * path, const char * filename)
void getModelPath(char * path, const char * filename, const char* pathName)
{
strcpy(path, STR_MODELS_PATH);
path[sizeof(MODELS_PATH)-1] = '/';
strcpy(&path[sizeof(MODELS_PATH)], filename);
unsigned int len = strlen(pathName);
strcpy(path, pathName);
path[len] = '/';
strcpy(&path[len + 1], filename);
}
void storageEraseAll(bool warn)
@@ -142,6 +143,26 @@ const char* loadModel(char* filename, bool alarms)
return nullptr;
}
const char* loadModelTemplate(const char* fileName, const char* filePath)
{
preModelLoad();
// Assuming that the template is located in current working directory
const char* error = readModel(fileName, (uint8_t*)&g_model, sizeof(g_model), filePath);
if (error) {
TRACE("loadModel error=%s", error);
// just get some clean memory state in "g_model" so the mixer can run safely
memset(&g_model, 0, sizeof(g_model));
applyDefaultTemplate();
storageCheck(true);
postModelLoad(false);
return error;
}
postModelLoad(false);
return nullptr;
}
void storageReadAll()
{
TRACE("storageReadAll");