Files
edgetx-gx12/radio/src/storage/sdcard_raw.cpp
T

172 lines
4.0 KiB
C++

/*
* Copyright (C) OpenTX
*
* Based on code named
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include "opentx.h"
#include "modelslist.h"
#include "conversions/conversions.h"
const char * writeFile(const char * filename, const uint8_t * data, uint16_t size)
{
TRACE("writeFile(%s)", filename);
FIL file;
unsigned char buf[8];
UINT written;
FRESULT result = f_open(&file, filename, FA_CREATE_ALWAYS | FA_WRITE);
if (result != FR_OK) {
return SDCARD_ERROR(result);
}
*(uint32_t*)&buf[0] = OTX_FOURCC;
buf[4] = EEPROM_VER;
buf[5] = 'M';
*(uint16_t*)&buf[6] = size;
result = f_write(&file, buf, 8, &written);
if (result != FR_OK || written != 8) {
f_close(&file);
return SDCARD_ERROR(result);
}
result = f_write(&file, data, size, &written);
if (result != FR_OK || written != size) {
f_close(&file);
return SDCARD_ERROR(result);
}
f_close(&file);
return NULL;
}
const char * writeModel()
{
char path[256];
getModelPath(path, g_eeGeneral.currModelFilename);
sdCheckAndCreateDirectory(MODELS_PATH);
return writeFile(path, (uint8_t *)&g_model, sizeof(g_model));
}
const char * openFile(const char * fullpath, FIL * file, uint16_t * size, uint8_t * version)
{
FRESULT result = f_open(file, fullpath, FA_OPEN_EXISTING | FA_READ);
if (result != FR_OK) {
return SDCARD_ERROR(result);
}
if (f_size(file) < 8) {
f_close(file);
return STR_INCOMPATIBLE;
}
UINT read;
char buf[8];
result = f_read(file, (uint8_t *)buf, sizeof(buf), &read);
if ((result != FR_OK) || (read != sizeof(buf))) {
f_close(file);
return SDCARD_ERROR(result);
}
//TODO: move this code into some checkCompatibleFormat()
*version = (uint8_t)buf[4];
if (*(uint32_t*)&buf[0] != OTX_FOURCC || *version < FIRST_CONV_EEPROM_VER || *version > EEPROM_VER || buf[5] != 'M') {
f_close(file);
return STR_INCOMPATIBLE;
}
*size = *(uint16_t*)&buf[6];
return nullptr;
}
const char * loadFile(const char * fullpath, uint8_t * data, uint16_t maxsize, uint8_t * version)
{
FIL file;
UINT read;
uint16_t size;
TRACE("loadFile(%s)", fullpath);
const char * err = openFile(fullpath, &file, &size, version);
if (err)
return err;
size = min<uint16_t>(maxsize, size);
FRESULT result = f_read(&file, data, size, &read);
if (result != FR_OK || read != size) {
f_close(&file);
return SDCARD_ERROR(result);
}
f_close(&file);
return nullptr;
}
const char * readModel(const char * filename, uint8_t * buffer, uint32_t size, uint8_t * version)
{
char path[256];
getModelPath(path, filename);
return loadFile(path, buffer, size, version);
}
const char * loadRadioSettings(const char * path)
{
uint8_t version;
const char * error = loadFile(path, (uint8_t *)&g_eeGeneral, sizeof(g_eeGeneral), &version);
if (error) {
TRACE("loadRadioSettings error=%s", error);
return error;
}
#if defined(STORAGE_CONVERSIONS)
if (version < EEPROM_VER) {
convertRadioData(version);
}
#endif
postRadioSettingsLoad();
return nullptr;
}
const char * loadRadioSettings()
{
return loadRadioSettings(RADIO_SETTINGS_PATH);
}
const char * writeGeneralSettings()
{
return writeFile(RADIO_SETTINGS_PATH, (uint8_t *)&g_eeGeneral, sizeof(g_eeGeneral));
}
void storageCreateModelsList()
{
FIL file;
FRESULT result = f_open(&file, RADIO_MODELSLIST_PATH, FA_CREATE_ALWAYS | FA_WRITE);
if (result == FR_OK) {
f_puts("[" DEFAULT_CATEGORY "]\n" DEFAULT_MODEL_FILENAME "\n", &file);
f_close(&file);
}
}