From 28b9a70e6b799877616ab472ccb215622aa70d5c Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Mon, 10 Aug 2015 21:42:51 +0200 Subject: [PATCH] Fixes #2623: several fixes: Disable menu for [..], Refresh file list after delete, Copy destination can be a directory, Prevent copy/paste into the same directory, Enabled renaming of directories and files without extension, Removed delete menu option for directories, Several simulator filesystem functions improved --- radio/releasenotes.txt | 1 + .../gui/Taranis/menu_general_sdmanager.cpp | 40 +++++++++++++------ radio/src/targets/simu/simpgmspace.cpp | 21 ++++++++-- 3 files changed, 47 insertions(+), 15 deletions(-) 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; }