[color] Batch conversions

This commit is contained in:
Raphael Coeffic
2021-06-10 13:17:49 +02:00
parent f7d36cd695
commit 0d344bedd8
28 changed files with 162 additions and 127 deletions
@@ -21,16 +21,107 @@
#include "opentx.h"
#include "conversions.h"
#if defined(SDCARD)
#include "storage/modelslist.h"
#include "storage/sdcard_common.h"
#if defined(COLORLCD)
static void drawProgressScreen(const char* filename, int progress, int total)
{
OpenTxTheme* l_theme = static_cast<OpenTxTheme*>(theme);
lcd->reset();
l_theme->drawBackground(lcd);
lcd->drawText(LCD_W/2, LCD_H/2 - 30, STR_CONVERTING, FONT(XL) | CENTERED | ALARM_COLOR);
lcd->drawText(LCD_W/2, LCD_H/2, filename, FONT(STD) | CENTERED | DEFAULT_COLOR);
l_theme->drawProgressBar(lcd,
LCD_W / 4,
LCD_H / 2 + 40,
LCD_W / 2,
20,
progress, total);
WDG_RESET();
lcdRefresh();
}
#endif
void convertRadioData(int version)
{
TRACE("convertRadioData(%d)", version);
#if defined(COLORLCD)
// the theme has not been loaded before
static_cast<OpenTxTheme*>(theme)->load();
#endif
// Init backlight mode before entering alert screens
requiredBacklightBright = BACKLIGHT_FORCED_ON;
#if defined(PCBHORUS)
g_eeGeneral.blOffBright = 20;
#endif
RAISE_ALERT(STR_STORAGE_WARNING, STR_SDCARD_CONVERSION_REQUIRE, NULL,
AU_NONE);
unsigned converted = 0;
auto to_convert = modelslist.getModelsCount() + 1;
#if defined(COLORLCD)
drawProgressScreen(RADIO_FILENAME, converted, to_convert);
#endif
TRACE("converting '%s' (%d/%d)", RADIO_FILENAME, converted, to_convert);
#if STORAGE_CONVERSIONS < 220
if (version == 219) {
convertRadioData_219_to_220(g_eeGeneral);
}
#endif
converted++;
#if defined(SIMU)
RTOS_WAIT_MS(200);
#endif
const char* error = nullptr;
for (auto category_ptr : modelslist.getCategories()) {
for (auto model_ptr : *category_ptr) {
uint8_t model_version;
const char* filename = model_ptr->modelFilename;
TRACE("converting '%s' (%d/%d)", filename, converted, to_convert);
#if defined(COLORLCD)
drawProgressScreen(filename, converted, to_convert);
#endif
error = readModel(filename, (uint8_t *)&g_model, sizeof(g_model), &model_version);
if (!error) {
convertModelData(model_version);
char path[256];
getModelPath(path, filename);
error = writeFile(path, (uint8_t *)&g_model, sizeof(g_model));
//TODO: what should be done with this error?
}
converted++;
#if defined(SIMU)
RTOS_WAIT_MS(200);
#endif
}
}
// reload models list
modelslist.clear();
modelslist.load();
}
#endif
void convertModelData(int version)
{
@@ -94,6 +94,11 @@ static void convertToStr(char* str, size_t len)
}
}
#if defined(COLORLCD)
extern const LayoutFactory * defaultLayout;
extern OpenTxTheme * defaultTheme;
#endif
void convertModelData_219_to_220(ModelData &model)
{
ModelData* oldModelAllocated = (ModelData*)malloc(sizeof(ModelData));
@@ -101,7 +106,6 @@ void convertModelData_219_to_220(ModelData &model)
memcpy(&oldModel, &model, sizeof(ModelData));
ModelData& newModel = (ModelData&)model;
convertToStr(model.header.name, LEN_MODEL_NAME_219);
for (uint8_t i=0; i<MAX_TIMERS_219; i++) {
@@ -191,21 +195,21 @@ void convertModelData_219_to_220(ModelData &model)
// TelemetryScriptData::file ?
// ModuleData::pxx2.receiverName
#if defined(PCBHORUS)
#if defined(COLORLCD)
// Clear CustomScreenData + TopBarPersistentData
// as they cannot be converted (missing option types)
memset(newModel.screenData, 0,
sizeof(newModel.screenData) +
sizeof(newModel.topbarData));
loadDefaultLayout();
if (defaultLayout) {
strcpy(newModel.screenData[0].LayoutId, defaultLayout->getId());
defaultLayout->initPersistentData(&newModel.screenData[0].layoutData);
}
#endif
free(oldModelAllocated);
}
#if defined(PCBHORUS)
extern OpenTxTheme * defaultTheme;
#endif
void convertRadioData_219_to_220(RadioData & settings)
{
TRACE("Radio conversion from v219 to v220");
@@ -217,7 +221,7 @@ void convertRadioData_219_to_220(RadioData & settings)
RadioData& oldSettings = *oldSettingsAllocated;
memcpy(&oldSettings, &settings, sizeof(RadioData));
#if defined(PCBHORUS)
#if defined(COLORLCD)
// Clear CustomScreenData + TopBarPersistentData
// as they cannot be converted (missing option types)
strcpy(g_eeGeneral.themeName, defaultTheme->getName());
+5 -96
View File
@@ -28,17 +28,14 @@ using std::list;
ModelsList modelslist;
ModelCell::ModelCell(const char * name):
valid_rfData(false)
ModelCell::ModelCell(const char* name) : valid_rfData(false)
{
strncpy(modelFilename, name, sizeof(modelFilename));
}
ModelCell::ModelCell(const char * name, uint8_t len)
: valid_rfData(false)
ModelCell::ModelCell(const char* name, uint8_t len) : valid_rfData(false)
{
if (len > sizeof(modelFilename)-1)
len = sizeof(modelFilename)-1;
if (len > sizeof(modelFilename) - 1) len = sizeof(modelFilename) - 1;
memcpy(modelFilename, name, len);
modelFilename[len] = '\0';
@@ -55,7 +52,7 @@ void ModelCell::setModelName(char * name)
char * tmp;
strncpy(modelName, modelFilename, LEN_MODEL_NAME);
tmp = (char *) memchr(modelName, '.', LEN_MODEL_NAME);
if (tmp)
if (tmp != nullptr)
*tmp = 0;
}
}
@@ -72,11 +69,10 @@ void ModelCell::setModelName(char* name, uint8_t len)
char * tmp;
strncpy(modelName, modelFilename, LEN_MODEL_NAME);
tmp = (char *) memchr(modelName, '.', LEN_MODEL_NAME);
if (tmp != NULL)
if (tmp != nullptr)
*tmp = 0;
}
//resetBuffer();
}
void ModelCell::setModelId(uint8_t moduleIdx, uint8_t id)
@@ -84,93 +80,6 @@ void ModelCell::setModelId(uint8_t moduleIdx, uint8_t id)
modelId[moduleIdx] = id;
}
// void ModelCell::resetBuffer()
// {
// if (buffer) {
// delete buffer;
// buffer = NULL;
// }
// }
// const BitmapBuffer * ModelCell::getBuffer()
// {
// if (!buffer) {
// loadBitmap();
// }
// return buffer;
// }
// void ModelCell::loadBitmap()
// {
// uint8_t version;
// PACK(struct {
// ModelHeader header;
// TimerData timers[MAX_TIMERS];
// }) partialmodel;
// const char * error = NULL;
// BitmapBuffer * tmp_buffer;
// if (strncmp(modelFilename, g_eeGeneral.currModelFilename, LEN_MODEL_FILENAME) == 0) {
// memcpy(&partialmodel.header, &g_model.header, sizeof(partialmodel));
// }
// else {
// #if !defined (SDCARD_YAML)
// error = readModel(modelFilename, (uint8_t *)&partialmodel.header, sizeof(partialmodel), &version);
// // LEN_BITMAP_NAME has now 4 bytes more
// if (version <= 218) {
// memmove(partialmodel.timers, &(partialmodel.header.bitmap[10]), sizeof(TimerData)*MAX_TIMERS);
// memclear(&(partialmodel.header.bitmap[10]), 4);
// }
// #else
// memset(&partialmodel.header,0,sizeof(partialmodel));
// #endif
// }
// if ((modelName[0] == 0) && ! error)
// setModelName(partialmodel.header.name); // resets buffer!!!
// tmp_buffer = new BitmapBuffer(BMP_RGB565, MODELCELL_WIDTH, MODELCELL_HEIGHT);
// if (tmp_buffer == NULL) {
// return;
// }
// tmp_buffer->clear(TEXT_BGCOLOR);
// if (error) {
// tmp_buffer->drawText(5, 2, "(Invalid Model)", TEXT_COLOR);
// tmp_buffer->drawBitmapPattern(5, 23, LBM_LIBRARY_SLOT, TEXT_COLOR);
// }
// else {
// char timer[LEN_TIMER_STRING];
// tmp_buffer->drawSizedText(5, 2, modelName, /*LEN_MODEL_NAME*/strlen(modelName),
// SMLSIZE|TEXT_COLOR);
// getTimerString(timer, 0);
// for (uint8_t i = 0; i < MAX_TIMERS; i++) {
// if (partialmodel.timers[i].mode != 0 && partialmodel.timers[i].persistent) {
// getTimerString(timer, partialmodel.timers[i].value, 1);
// break;
// }
// }
// tmp_buffer->drawText(101, 40, timer, TEXT_COLOR);
// for (int i=0; i<4; i++) {
// tmp_buffer->drawBitmapPattern(104+i*11, 25, LBM_SCORE0, TITLE_BGCOLOR);
// }
// GET_FILENAME(filename, BITMAPS_PATH, partialmodel.header.bitmap, "");
// const BitmapBuffer * bitmap = BitmapBuffer::load(filename);
// if (bitmap) {
// tmp_buffer->drawScaledBitmap(bitmap, 5, 24, 56, 32);
// delete bitmap;
// }
// else {
// tmp_buffer->drawBitmapPattern(5, 23, LBM_LIBRARY_SLOT, TEXT_COLOR);
// }
// }
// tmp_buffer->drawSolidHorizontalLine(5, 19, 143, LINE_COLOR);
// buffer = tmp_buffer;
// }
void ModelCell::save(FIL* file)
{
-2
View File
@@ -65,8 +65,6 @@ class ModelCell
void setRfModuleData(uint8_t moduleIdx, ModuleData* modData);
bool fetchRfData();
// void loadBitmap();
// void resetBuffer();
};
class ModelsCategory: public std::list<ModelCell *>
+7 -7
View File
@@ -145,6 +145,13 @@ void storageReadAll()
{
TRACE("storageReadAll");
// Wipe models list in case
// it's being reloaded after USB connection
modelslist.clear();
// and reload the list
modelslist.load();
if (loadRadioSettings() != nullptr) {
storageEraseAll(true);
}
@@ -172,12 +179,5 @@ void storageReadAll()
if (loadModel(g_eeGeneral.currModelFilename, false) != nullptr) {
TRACE("No current model or SD card error");
}
// Wipe models list in case
// it's being reloaded after USB connection
modelslist.clear();
// and reload the list
modelslist.load();
}
+1
View File
@@ -35,6 +35,7 @@
// opens radio.bin or model file
const char * openFile(const char * fullpath, FIL * file, uint16_t * size, uint8_t * version);
const char * writeFile(const char * fullpath, const uint8_t * data, uint16_t size);
void getModelPath(char * path, const char * filename);