Files
edgetx-gx12/radio/src/sdcard.h
T
Jesper FrickmannandGitHub dcc5cfb352 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.
2022-03-09 11:00:38 +10:00

188 lines
6.7 KiB
C

/*
* Copyright (C) EdgeTX
*
* Based on code named
* opentx - https://github.com/opentx/opentx
* 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.
*/
#ifndef _SDCARD_H_
#define _SDCARD_H_
#include "ff.h"
extern FATFS g_FATFS_Obj;
extern FIL g_oLogFile;
#include "translations.h"
#define FILE_COPY_PREFIX "cp_"
#define PATH_SEPARATOR "/"
#define ROOT_PATH PATH_SEPARATOR
#define MODELS_PATH ROOT_PATH "MODELS" // no trailing slash = important
#define RADIO_PATH ROOT_PATH "RADIO" // no trailing slash = important
#define TEMPLATES_PATH ROOT_PATH "TEMPLATES"
#define PERS_TEMPL_PATH TEMPLATES_PATH "/PERSONAL"
#define LOGS_PATH ROOT_PATH "LOGS"
#define SCREENSHOTS_PATH ROOT_PATH "SCREENSHOTS"
#define SOUNDS_PATH ROOT_PATH "SOUNDS/en"
#define SOUNDS_PATH_LNG_OFS (sizeof(SOUNDS_PATH)-3)
#define SYSTEM_SUBDIR "SYSTEM"
#define BITMAPS_PATH ROOT_PATH "IMAGES"
#define FIRMWARES_PATH ROOT_PATH "FIRMWARE"
#define AUTOUPDATE_FILENAME FIRMWARES_PATH PATH_SEPARATOR "autoupdate.frsk"
#define EEPROMS_PATH ROOT_PATH "EEPROM"
#define BACKUP_PATH ROOT_PATH "BACKUP"
#define SCRIPTS_PATH ROOT_PATH "SCRIPTS"
#define WIZARD_PATH SCRIPTS_PATH PATH_SEPARATOR "WIZARD"
#define THEMES_PATH ROOT_PATH "THEMES"
#define LAYOUTS_PATH ROOT_PATH "LAYOUTS"
#define WIDGETS_PATH ROOT_PATH "WIDGETS"
#define WIZARD_NAME "wizard.lua"
#define SCRIPTS_MIXES_PATH SCRIPTS_PATH PATH_SEPARATOR "MIXES"
#define SCRIPTS_FUNCS_PATH SCRIPTS_PATH PATH_SEPARATOR "FUNCTIONS"
#define SCRIPTS_TELEM_PATH SCRIPTS_PATH PATH_SEPARATOR "TELEMETRY"
#define SCRIPTS_TOOLS_PATH SCRIPTS_PATH PATH_SEPARATOR "TOOLS"
#define LEN_FILE_PATH_MAX (sizeof(SCRIPTS_TELEM_PATH)+1) // longest + "/"
#if defined(SDCARD_YAML) || defined(SDCARD_RAW)
#define RADIO_FILENAME "radio.bin"
const char RADIO_MODELSLIST_PATH[] = RADIO_PATH PATH_SEPARATOR "models.txt";
const char RADIO_SETTINGS_PATH[] = RADIO_PATH PATH_SEPARATOR RADIO_FILENAME;
#if defined(SDCARD_YAML)
const char MODELSLIST_YAML_PATH[] = MODELS_PATH PATH_SEPARATOR "models.yml";
const char FALLBACK_MODELSLIST_YAML_PATH[] = RADIO_PATH PATH_SEPARATOR "models.yml";
const char RADIO_SETTINGS_YAML_PATH[] = RADIO_PATH PATH_SEPARATOR "radio.yml";
#endif
#define SPLASH_FILE "splash.png"
#endif
#define MODELS_EXT ".bin"
#define LOGS_EXT ".csv"
#define SOUNDS_EXT ".wav"
#define BMP_EXT ".bmp"
#define PNG_EXT ".png"
#define JPG_EXT ".jpg"
#define SCRIPT_EXT ".lua"
#define SCRIPT_BIN_EXT ".luac"
#define TEXT_EXT ".txt"
#define FIRMWARE_EXT ".bin"
#define EEPROM_EXT ".bin"
#define SPORT_FIRMWARE_EXT ".frk"
#define FRSKY_FIRMWARE_EXT ".frsk"
#define MULTI_FIRMWARE_EXT ".bin"
#define ELRS_FIRMWARE_EXT ".elrs"
#define YAML_EXT ".yml"
#if defined(COLORLCD)
#define BITMAPS_EXT BMP_EXT JPG_EXT PNG_EXT
#define LEN_BITMAPS_EXT 4
#else
#define BITMAPS_EXT BMP_EXT
#endif
#ifdef LUA_COMPILER
#define SCRIPTS_EXT SCRIPT_BIN_EXT SCRIPT_EXT
#else
#define SCRIPTS_EXT SCRIPT_EXT
#endif
#define GET_FILENAME(filename, path, var, ext) \
char filename[sizeof(path) + sizeof(var) + sizeof(ext)]; \
memcpy(filename, path, sizeof(path) - 1); \
filename[sizeof(path) - 1] = '/'; \
memcpy(&filename[sizeof(path)], var, sizeof(var)); \
filename[sizeof(path)+sizeof(var)] = '\0'; \
strcat(&filename[sizeof(path)], ext)
extern uint8_t logDelay;
void logsInit();
void logsClose();
void logsWrite();
bool sdCardFormat();
uint32_t sdGetNoSectors();
uint32_t sdGetSize();
uint32_t sdGetFreeSectors();
const char * sdCheckAndCreateDirectory(const char * path);
#if !defined(BOOT)
inline const char * SDCARD_ERROR(FRESULT result)
{
if (result == FR_NOT_READY)
return STR_NO_SDCARD;
else
return STR_SDCARD_ERROR;
}
#endif
// NOTE: 'size' must = 0 or be a valid character position within 'filename' array -- it is NOT validated
const char * getBasename(const char * path);
#if defined(PCBX12S)
#define ETX_FOURCC 0x3478746F // etx for X12S
#elif defined(RADIO_T16)
#define ETX_FOURCC 0x3F78746F // etx for Jumper T16
#elif defined(RADIO_T18)
#define ETX_FOURCC 0x4078746F // etx for Jumper T18
#elif defined(RADIO_TX16S)
#define ETX_FOURCC 0x3878746F // etx for Radiomaster TX16S
#elif defined(PCBX10)
#define ETX_FOURCC 0x3778746F // etx for X10
#elif defined(PCBX9E)
#define ETX_FOURCC 0x3578746F // etx for Taranis X9E
#elif defined(PCBXLITES)
#define ETX_FOURCC 0x3B78746F // etx for Taranis X-Lite S
#elif defined(PCBXLITE)
#define ETX_FOURCC 0x3978746F // etx for Taranis X-Lite
#elif defined(RADIO_T12)
#define ETX_FOURCC 0x3D78746F // etx for Jumper T12
#elif defined(RADIO_TLITE)
#define ETX_FOURCC 0x4278746F // etx for Jumper TLite
#elif defined(RADIO_TPRO)
#define ETX_FOURCC 0x4678746F // etx for Jumper TPro
#elif defined(RADIO_TX12)
#define ETX_FOURCC 0x4178746F // etx for Radiomaster TX12
#elif defined(RADIO_ZORRO)
#define ETX_FOURCC 0x4778746F // otx for Radiomaster Zorro
#elif defined(RADIO_T8)
#define ETX_FOURCC 0x4378746F // etx for Radiomaster T8
#elif defined(PCBX7)
#define ETX_FOURCC 0x3678746F // etx for Taranis X7 / X7S / X7 Express / X7S Express
#elif defined(PCBX9LITES)
#define ETX_FOURCC 0x3E78746F // etx for Taranis X9-Lite S
#elif defined(PCBX9LITE)
#define ETX_FOURCC 0x3C78746F // etx for Taranis X9-Lite
#elif defined(PCBX9D) || defined(PCBX9DP)
#define ETX_FOURCC 0x3378746F // etx for Taranis X9D
#elif defined(PCBNV14)
#define ETX_FOURCC 0x3A78746F // etx for NV14
#endif
bool isFileAvailable(const char * filename, bool exclDir = false);
unsigned int findNextFileIndex(char * filename, uint8_t size, const char * directory);
const char * sdCopyFile(const char * src, const char * dest);
const char * sdCopyFile(const char * srcFilename, const char * srcDir, const char * destFilename, const char * destDir);
#define LIST_NONE_SD_FILE 1
#define LIST_SD_FILE_EXT 2
bool sdListFiles(const char * path, const char * extension, const uint8_t maxlen, const char * selection, uint8_t flags=0);
#endif // _SDCARD_H_