diff --git a/radio/releasenotes.txt b/radio/releasenotes.txt
index 05f7efaca..050ac9ae4 100644
--- a/radio/releasenotes.txt
+++ b/radio/releasenotes.txt
@@ -7,6 +7,7 @@
9XE top LDC fixes: added TX battery blinking on battery warning, fixed display problem when battery voltage lower than batlow value. (#2671)
Timers range extended (it was limited to around 9 hours before) (#2702)
Fixed: Playing two background sounds at once causes sound to stop (#2704)
+Several fixes to the SD card manager menu (#2623)
[Sky9x / 9XR-PRO]
diff --git a/radio/src/gui/Taranis/menu_general_sdmanager.cpp b/radio/src/gui/Taranis/menu_general_sdmanager.cpp
index 95257a827..48d02a6a0 100755
--- a/radio/src/gui/Taranis/menu_general_sdmanager.cpp
+++ b/radio/src/gui/Taranis/menu_general_sdmanager.cpp
@@ -36,7 +36,7 @@
#include "../../opentx.h"
-#define REFRESH_FILES() reusableBuffer.sdmanager.offset = 65535
+#define REFRESH_FILES() reusableBuffer.sdmanager.offset = 65535; m_posVert = 0;
void menuGeneralSdManagerInfo(uint8_t event)
{
@@ -172,19 +172,31 @@ void onSdManagerMenu(const char *result)
}
else if (result == STR_PASTE) {
f_getcwd(lfn, _MAX_LFN);
- POPUP_WARNING(fileCopy(clipboard.data.sd.filename, clipboard.data.sd.directory, lfn));
- REFRESH_FILES();
+ // if destination is dir, copy into that dir
+ if (!line[SD_SCREEN_FILE_LENGTH+1]) {
+ strcat(lfn, PSTR("/"));
+ strcat(lfn, line);
+ }
+ if (strcmp(clipboard.data.sd.directory, lfn)) { // prevent copying to the same directory
+ POPUP_WARNING(fileCopy(clipboard.data.sd.filename, clipboard.data.sd.directory, lfn));
+ REFRESH_FILES();
+ }
}
else if (result == STR_RENAME_FILE) {
+ memcpy(reusableBuffer.sdmanager.originalName, line, sizeof(reusableBuffer.sdmanager.originalName));
char *ext = getFileExtension(line, SD_SCREEN_FILE_LENGTH+1);
if (ext) {
- memcpy(reusableBuffer.sdmanager.originalName, line, sizeof(reusableBuffer.sdmanager.originalName));
// write spaces to allow a longer filename
memset(ext, ' ', SD_SCREEN_FILE_LENGTH-LEN_FILE_EXTENSION-(ext-line));
line[SD_SCREEN_FILE_LENGTH-LEN_FILE_EXTENSION] = '\0';
- s_editMode = EDIT_MODIFY_STRING;
- editNameCursorPos = 0;
}
+ else {
+ int len = strlen(line);
+ memset(line + strlen(line), ' ', SD_SCREEN_FILE_LENGTH - len);
+ line[SD_SCREEN_FILE_LENGTH] = '\0';
+ }
+ s_editMode = EDIT_MODIFY_STRING;
+ editNameCursorPos = 0;
}
else if (result == STR_DELETE_FILE) {
getSelectionFullPath(lfn);
@@ -193,9 +205,6 @@ void onSdManagerMenu(const char *result)
strcpy_P(statusLineMsg+min((uint8_t)strlen(statusLineMsg), (uint8_t)13), STR_REMOVED);
showStatusLine();
REFRESH_FILES();
- if (m_posVert == reusableBuffer.sdmanager.count-1) {
- m_posVert--;
- }
}
else if (result == STR_PLAY_FILE) {
getSelectionFullPath(lfn);
@@ -296,6 +305,9 @@ void menuGeneralSdManager(uint8_t _event)
killEvents(_event);
char *line = reusableBuffer.sdmanager.lines[index];
char *ext = getFileExtension(line, SD_SCREEN_FILE_LENGTH+1);
+ if (!strcasecmp(line, "..")) {
+ break; // no menu for parent dir
+ }
if (ext) {
if (!strcasecmp(ext, SOUNDS_EXT)) {
MENU_ADD_ITEM(STR_PLAY_FILE);
@@ -331,7 +343,8 @@ void menuGeneralSdManager(uint8_t _event)
if (clipboard.type == CLIPBOARD_TYPE_SD_FILE)
MENU_ADD_ITEM(STR_PASTE);
MENU_ADD_ITEM(STR_RENAME_FILE);
- MENU_ADD_ITEM(STR_DELETE_FILE);
+ if (line[SD_SCREEN_FILE_LENGTH+1])
+ MENU_ADD_ITEM(STR_DELETE_FILE);
}
menuHandler = onSdManagerMenu;
}
@@ -388,7 +401,7 @@ void menuGeneralSdManager(uint8_t _event)
char *line = reusableBuffer.sdmanager.lines[i];
if (line[0] == '\0' || isFilenameLower(isfile, fn, line)) {
if (i < 6) memmove(reusableBuffer.sdmanager.lines[i+1], line, sizeof(reusableBuffer.sdmanager.lines[i]) * (6-i));
- memset(line, 0, sizeof(reusableBuffer.sdmanager.lines[i]));
+ memset(line, 0, sizeof(reusableBuffer.sdmanager.lines[0]));
strcpy(line, fn);
line[SD_SCREEN_FILE_LENGTH+1] = isfile;
break;
@@ -400,7 +413,7 @@ void menuGeneralSdManager(uint8_t _event)
char *line = reusableBuffer.sdmanager.lines[i];
if (line[0] == '\0' || isFilenameGreater(isfile, fn, line)) {
if (i > 0) memmove(reusableBuffer.sdmanager.lines[0], reusableBuffer.sdmanager.lines[1], sizeof(reusableBuffer.sdmanager.lines[0]) * i);
- memset(line, 0, sizeof(reusableBuffer.sdmanager.lines[i]));
+ memset(line, 0, sizeof(reusableBuffer.sdmanager.lines[0]));
strcpy(line, fn);
line[SD_SCREEN_FILE_LENGTH+1] = isfile;
break;
@@ -441,6 +454,9 @@ void menuGeneralSdManager(uint8_t _event)
if (ext) {
strAppend(&reusableBuffer.sdmanager.lines[i][len], ext);
}
+ else {
+ reusableBuffer.sdmanager.lines[i][len] = 0;
+ }
f_rename(reusableBuffer.sdmanager.originalName, reusableBuffer.sdmanager.lines[i]);
REFRESH_FILES();
}
diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp
index 6f108351b..e2944fbba 100644
--- a/radio/src/targets/simu/simpgmspace.cpp
+++ b/radio/src/targets/simu/simpgmspace.cpp
@@ -929,14 +929,24 @@ FRESULT f_mkdir (const TCHAR*)
return FR_OK;
}
-FRESULT f_unlink (const TCHAR*)
+FRESULT f_unlink (const TCHAR* name)
{
+ char *path = convertSimuPath(name);
+ if (unlink(path)) {
+ TRACE("f_unlink(%s) = error %d (%s)", path, errno, strerror(errno));
+ return FR_INVALID_NAME;
+ }
+ TRACE("f_unlink(%s) = OK", path);
return FR_OK;
}
FRESULT f_rename(const TCHAR *oldname, const TCHAR *newname)
{
- TRACE("f_rename(%s, %s)", oldname, newname);
+ if ( rename(oldname, newname) < 0) {
+ TRACE("f_rename(%s, %s) = error %d (%s)", oldname, newname, errno, strerror(errno));
+ return FR_INVALID_NAME;
+ }
+ TRACE("f_rename(%s, %s) = OK", oldname, newname);
return FR_OK;
}
@@ -966,7 +976,12 @@ int f_printf (FIL *fil, const TCHAR * format, ...)
FRESULT f_getcwd (TCHAR *path, UINT sz_path)
{
- strcpy(path, ".");
+ // remove simuSdDirectory from the cwd
+ char * cwd = get_current_dir_name();
+ std::string c(cwd + strlen(simuSdDirectory));
+ free(cwd);
+ strcpy(path, c.c_str());
+ TRACE("f_getcwd() = %s", path);
return FR_OK;
}