From aca3d01adc4542ab83117abc8a78e35466eac891 Mon Sep 17 00:00:00 2001 From: bsongis Date: Wed, 21 Jan 2015 21:23:29 +0100 Subject: [PATCH] #1924 fixed with rename function added. Code review needed, I also saved 2kb RAM here ... Needs more tests than only mine, thanks! --- .../gui/Taranis/menu_general_sdmanager.cpp | 109 ++++++++++-------- radio/src/gui/Taranis/menu_model.cpp | 23 +++- radio/src/gui/Taranis/menu_model_select.cpp | 25 ++-- radio/src/gui/Taranis/menu_model_setup.cpp | 1 - radio/src/gui/Taranis/menus.h | 2 +- radio/src/gui/Taranis/view_main.cpp | 4 + radio/src/opentx.h | 7 +- radio/src/strhelpers.cpp | 29 ++++- radio/src/targets/simu/simpgmspace.cpp | 5 + radio/util/font2png.py | 5 +- 10 files changed, 132 insertions(+), 78 deletions(-) diff --git a/radio/src/gui/Taranis/menu_general_sdmanager.cpp b/radio/src/gui/Taranis/menu_general_sdmanager.cpp index 8b327ed63..2fd67aa1d 100755 --- a/radio/src/gui/Taranis/menu_general_sdmanager.cpp +++ b/radio/src/gui/Taranis/menu_general_sdmanager.cpp @@ -36,6 +36,8 @@ #include "../../opentx.h" +#define REFRESH_FILES() reusableBuffer.sdmanager.offset = 65535 + void menuGeneralSdManagerInfo(uint8_t event) { SIMPLE_SUBMENU(STR_SD_INFO_TITLE, 1); @@ -135,7 +137,18 @@ 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)); - reusableBuffer.sdmanager.offset = -1; + REFRESH_FILES(); + } + else if (result == STR_RENAME_FILE) { + 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 if (result == STR_DELETE_FILE) { f_getcwd(lfn, _MAX_LFN); @@ -145,7 +158,7 @@ void onSdManagerMenu(const char *result) strncpy(statusLineMsg, line, 13); strcpy_P(statusLineMsg+min((uint8_t)strlen(statusLineMsg), (uint8_t)13), STR_REMOVED); showStatusLine(); - reusableBuffer.sdmanager.offset = -1; + REFRESH_FILES(); if (m_posVert == reusableBuffer.sdmanager.count) m_posVert--; } @@ -164,7 +177,6 @@ void onSdManagerMenu(const char *result) } else if (result == STR_ASSIGN_BITMAP) { strAppendFilename(g_model.header.bitmap, line, sizeof(g_model.header.bitmap)); - LOAD_MODEL_BITMAP(); memcpy(modelHeaders[g_eeGeneral.currModel].bitmap, g_model.header.bitmap, sizeof(g_model.header.bitmap)); eeDirty(EE_MODEL); } @@ -206,27 +218,28 @@ void menuGeneralSdManager(uint8_t _event) audioQueue.stopSD(); if (f_mkfs(0, 1, 0) == FR_OK) { f_chdir("/"); - reusableBuffer.sdmanager.offset = -1; + REFRESH_FILES(); } else { POPUP_WARNING(STR_SDCARD_ERROR); } } - uint8_t event = ((READ_ONLY() && EVT_KEY_MASK(_event) == KEY_ENTER) ? 0 : _event); + int lastPos = m_posVert; + + uint8_t event = (EVT_KEY_MASK(_event) == KEY_ENTER ? 0 : _event); SIMPLE_MENU(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, menuTabGeneral, e_Sd, 1+reusableBuffer.sdmanager.count); - if (s_editMode > 0) - s_editMode = 0; + int index = m_posVert-1-s_pgOfs; switch(_event) { case EVT_ENTRY: f_chdir(ROOT_PATH); - reusableBuffer.sdmanager.offset = 65535; + REFRESH_FILES(); break; case EVT_KEY_LONG(KEY_MENU): - if (!READ_ONLY()) { + if (!READ_ONLY() && s_editMode == 0) { killEvents(_event); // MENU_ADD_ITEM(STR_SD_INFO); TODO: Implement MENU_ADD_ITEM(STR_SD_FORMAT); @@ -234,32 +247,35 @@ void menuGeneralSdManager(uint8_t _event) } break; + case EVT_KEY_BREAK(KEY_EXIT): + REFRESH_FILES(); + break; + case EVT_KEY_BREAK(KEY_ENTER): - { - if (m_posVert > 0) { - vertpos_t index = m_posVert-1-s_pgOfs; - if (!reusableBuffer.sdmanager.lines[index][SD_SCREEN_FILE_LENGTH+1]) { - f_chdir(reusableBuffer.sdmanager.lines[index]); - s_pgOfs = 0; - m_posVert = 1; - reusableBuffer.sdmanager.offset = 65535; - killEvents(_event); - break; + if (s_editMode > 0) { + break; + } + else { + if (m_posVert > 0) { + if (!reusableBuffer.sdmanager.lines[index][SD_SCREEN_FILE_LENGTH+1]) { + f_chdir(reusableBuffer.sdmanager.lines[index]); + s_pgOfs = 0; + m_posVert = 1; + index = 1; + REFRESH_FILES(); + killEvents(_event); + return; + } } } - if (!IS_ROTARY_BREAK(_event) || m_posVert==0) - break; - // no break; - } + // no break case EVT_KEY_LONG(KEY_ENTER): killEvents(_event); - { - uint8_t index = m_posVert-1-s_pgOfs; - // TODO duplicated code for finding extension + if (s_editMode == 0) { char *line = reusableBuffer.sdmanager.lines[index]; - int len = strlen(line) - 4; - char *ext = line+len; + char *ext = getFileExtension(line, SD_SCREEN_FILE_LENGTH+1); + int len = ext - line; /* TODO if (!strcasecmp(ext, MODELS_EXT)) { s_menu[s_menu_count++] = STR_LOAD_FILE; } @@ -285,7 +301,7 @@ void menuGeneralSdManager(uint8_t _event) MENU_ADD_ITEM(STR_COPY_FILE); if (clipboard.type == CLIPBOARD_TYPE_SD_FILE) MENU_ADD_ITEM(STR_PASTE); - // MENU_ADD_ITEM(STR_RENAME_FILE); TODO: Implement + MENU_ADD_ITEM(STR_RENAME_FILE); MENU_ADD_ITEM(STR_DELETE_FILE); } } @@ -378,29 +394,32 @@ void menuGeneralSdManager(uint8_t _event) for (uint8_t i=0; i 0) { - char * ext = reusableBuffer.sdmanager.lines[index]; - ext += strlen(ext) - 4; - if (!strcasecmp(ext, BITMAPS_EXT)) { - if (sdBitmapIdx != m_posVert) { - sdBitmapIdx = m_posVert; - uint8_t *dest = sdBitmap; - if (bmpLoad(dest, reusableBuffer.sdmanager.lines[index], MODEL_BITMAP_WIDTH, MODEL_BITMAP_HEIGHT)) { - memcpy(sdBitmap, logo_taranis, MODEL_BITMAP_SIZE); - } + char *ext = getFileExtension(reusableBuffer.sdmanager.lines[index], SD_SCREEN_FILE_LENGTH+1); + if (ext && !strcasecmp(ext, BITMAPS_EXT)) { + if (lastPos != m_posVert) { + if (bmpLoad(modelBitmap, reusableBuffer.sdmanager.lines[index], MODEL_BITMAP_WIDTH, MODEL_BITMAP_HEIGHT)) { + memcpy(modelBitmap, logo_taranis, MODEL_BITMAP_SIZE); } - lcd_bmp(22*FW+2, 2*FH+FH/2, sdBitmap); } + lcd_bmp(22*FW+2, 2*FH+FH/2, modelBitmap); } } diff --git a/radio/src/gui/Taranis/menu_model.cpp b/radio/src/gui/Taranis/menu_model.cpp index 627eeaf27..96ef596fc 100755 --- a/radio/src/gui/Taranis/menu_model.cpp +++ b/radio/src/gui/Taranis/menu_model.cpp @@ -138,7 +138,7 @@ static int8_t s_copyTgtOfs; static uint8_t editNameCursorPos = 0; -void editName(coord_t x, coord_t y, char *name, uint8_t size, uint8_t event, uint8_t active) +void editName(coord_t x, coord_t y, char *name, uint8_t size, uint8_t event, uint8_t active, uint8_t attr) { uint8_t mode = 0; if (active) { @@ -148,7 +148,7 @@ void editName(coord_t x, coord_t y, char *name, uint8_t size, uint8_t event, uin mode = FIXEDWIDTH; } - lcd_putsnAtt(x, y, name, size, ZCHAR | mode); + lcd_putsnAtt(x, y, name, size, attr | mode); if (active) { uint8_t cur = editNameCursorPos; @@ -158,8 +158,14 @@ void editName(coord_t x, coord_t y, char *name, uint8_t size, uint8_t event, uin if (IS_ROTARY_RIGHT(event) || IS_ROTARY_LEFT(event) || event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_DOWN) || event==EVT_KEY_REPT(KEY_UP)) { - v = checkIncDec(event, abs(v), 0, ZCHAR_MAX, 0); - if (c <= 0) v = -v; + if (attr == ZCHAR) { + v = checkIncDec(event, abs(v), 0, ZCHAR_MAX, 0); + if (c <= 0) v = -v; + } + else { + v = checkIncDec(event, abs(v), '0', 'z', 0); + } + } switch (event) { @@ -175,7 +181,7 @@ void editName(coord_t x, coord_t y, char *name, uint8_t size, uint8_t event, uin break; case EVT_ROTARY_LONG: - if (v==0) { + if ((attr == ZCHAR && v==0) || (attr == 0 && v==' ')) { s_editMode = 0; killEvents(event); break; @@ -193,7 +199,12 @@ void editName(coord_t x, coord_t y, char *name, uint8_t size, uint8_t event, uin eeDirty(g_menuPos[0] == 0 ? EE_MODEL : EE_GENERAL); } - lcd_putcAtt(x+editNameCursorPos*FW, y, idx2char(v), ERASEBG|INVERS|FIXEDWIDTH); + if (attr == ZCHAR) { + lcd_putcAtt(x+editNameCursorPos*FW, y, idx2char(v), ERASEBG|INVERS|FIXEDWIDTH); + } + else { + lcd_putcAtt(x+editNameCursorPos*FW, y, v, ERASEBG|INVERS|FIXEDWIDTH); + } } else { cur = 0; diff --git a/radio/src/gui/Taranis/menu_model_select.cpp b/radio/src/gui/Taranis/menu_model_select.cpp index c9bf9cc09..51db6f2cb 100644 --- a/radio/src/gui/Taranis/menu_model_select.cpp +++ b/radio/src/gui/Taranis/menu_model_select.cpp @@ -37,10 +37,7 @@ #define MODELSIZE_POS_X 170 -static int8_t modelselBitmapIdx; -static uint8_t modelselBitmap[MODEL_BITMAP_SIZE]; #define MODELSEL_W 133 -#define BMP_DIRTY() modelselBitmapIdx = -1 void onModelSelectMenu(const char *result) { @@ -76,7 +73,6 @@ void onModelSelectMenu(const char *result) else { // The user choosed a file on SD to restore POPUP_WARNING(eeRestoreModel(sub, (char *)result)); - BMP_DIRTY(); if (!s_warning && g_eeGeneral.currModel == sub) eeLoadModel(sub); } @@ -89,7 +85,6 @@ void menuModelSelect(uint8_t event) eeDeleteModel(m_posVert); // delete file s_copyMode = 0; event = EVT_ENTRY_UP; - BMP_DIRTY(); } uint8_t _event_ = (IS_ROTARY_BREAK(event) || IS_ROTARY_LONG(event) ? 0 : event); @@ -112,9 +107,9 @@ void menuModelSelect(uint8_t event) if (sub >= NUM_BODY_LINES) s_pgOfs = sub-(NUM_BODY_LINES-1); s_copyMode = 0; s_editMode = EDIT_MODE_INIT; - BMP_DIRTY(); eeCheck(true); break; + case EVT_KEY_LONG(KEY_EXIT): if (s_copyMode && s_copyTgtOfs == 0 && g_eeGeneral.currModel != sub && eeModelExists(sub)) { POPUP_CONFIRMATION(STR_DELETEMODEL); @@ -130,7 +125,7 @@ void menuModelSelect(uint8_t event) } else { if (m_posVert != g_eeGeneral.currModel) { - m_posVert = g_eeGeneral.currModel; + sub = m_posVert = g_eeGeneral.currModel; s_pgOfs = 0; } else if (event != EVT_KEY_LONG(KEY_EXIT)) { @@ -153,9 +148,7 @@ void menuModelSelect(uint8_t event) uint8_t cur = (MAX_MODELS + sub + s_copyTgtOfs) % MAX_MODELS; if (s_copyMode == COPY_MODE) { - if (eeCopyModel(cur, s_copySrcRow)) - BMP_DIRTY(); - else + if (!eeCopyModel(cur, s_copySrcRow)) cur = sub; } @@ -164,7 +157,6 @@ void menuModelSelect(uint8_t event) uint8_t src = cur; cur = (s_copyTgtOfs > 0 ? cur+MAX_MODELS-1 : cur+1) % MAX_MODELS; eeSwapModels(src, cur); - BMP_DIRTY(); if (src == s_copySrcRow) s_copySrcRow = cur; else if (cur == s_copySrcRow) @@ -289,12 +281,9 @@ void menuModelSelect(uint8_t event) } } - if (modelselBitmapIdx != m_posVert) { - modelselBitmapIdx = m_posVert; - if (modelselBitmapIdx == g_eeGeneral.currModel) - memcpy(modelselBitmap, modelBitmap, MODEL_BITMAP_SIZE); - else - loadModelBitmap(modelHeaders[sub].bitmap, modelselBitmap); + if (event == EVT_ENTRY || sub != oldSub) { + loadModelBitmap(modelHeaders[sub].bitmap, modelBitmap); } - lcd_bmp(22*FW+2, 2*FH+FH/2, modelselBitmap); + + lcd_bmp(22*FW+2, 2*FH+FH/2, modelBitmap); } diff --git a/radio/src/gui/Taranis/menu_model_setup.cpp b/radio/src/gui/Taranis/menu_model_setup.cpp index e06142645..0c9033e5b 100644 --- a/radio/src/gui/Taranis/menu_model_setup.cpp +++ b/radio/src/gui/Taranis/menu_model_setup.cpp @@ -115,7 +115,6 @@ void onModelSetupBitmapMenu(const char *result) else { // The user choosed a bmp file in the list copySelection(g_model.header.bitmap, result, sizeof(g_model.header.bitmap)); - LOAD_MODEL_BITMAP(); memcpy(modelHeaders[g_eeGeneral.currModel].bitmap, g_model.header.bitmap, sizeof(g_model.header.bitmap)); eeDirty(EE_MODEL); } diff --git a/radio/src/gui/Taranis/menus.h b/radio/src/gui/Taranis/menus.h index ea1055a02..1af3b4501 100755 --- a/radio/src/gui/Taranis/menus.h +++ b/radio/src/gui/Taranis/menus.h @@ -290,7 +290,7 @@ int8_t switchMenuItem(coord_t x, coord_t y, int8_t value, LcdFlags attr, uint8_t #define displayGVar(x, y, v, min, max) lcd_outdez8(x, y, v) #endif -void editName(coord_t x, coord_t y, char *name, uint8_t size, uint8_t event, uint8_t active); +void editName(coord_t x, coord_t y, char *name, uint8_t size, uint8_t event, uint8_t active, uint8_t attr=ZCHAR); #define WARNING_TYPE_ASTERISK 0 #define WARNING_TYPE_CONFIRM 1 diff --git a/radio/src/gui/Taranis/view_main.cpp b/radio/src/gui/Taranis/view_main.cpp index 46d9abf2f..64fad251a 100755 --- a/radio/src/gui/Taranis/view_main.cpp +++ b/radio/src/gui/Taranis/view_main.cpp @@ -441,6 +441,10 @@ void menuMainView(uint8_t event) killEvents(KEY_EXIT); killEvents(KEY_UP); killEvents(KEY_DOWN); + // no break + + case EVT_ENTRY_UP: + LOAD_MODEL_BITMAP(); break; case EVT_KEY_CONTEXT_MENU: diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 0b2b208dd..afe1caea7 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1509,7 +1509,7 @@ extern uint8_t requiredSpeakerVolume; #define SD_SCREEN_FILE_LENGTH (32) union ReusableBuffer { - // 263 bytes on Taranis + // 275 bytes struct { char listnames[LCD_LINES-1][LEN_MODEL_NAME]; @@ -1523,7 +1523,7 @@ union ReusableBuffer } modelsel; - // 103 bytes on Taranis + // 103 bytes struct { int16_t midVals[NUM_STICKS+NUM_POTS]; @@ -1541,13 +1541,14 @@ union ReusableBuffer } calib; #if defined(SDCARD) - // 246 bytes on Taranis + // 274 bytes struct { char lines[LCD_LINES-1][SD_SCREEN_FILE_LENGTH+1+1]; // the last char is used to store the flags (directory) of the line uint32_t available; uint16_t offset; uint16_t count; + char originalName[SD_SCREEN_FILE_LENGTH+1]; } sdmanager; #endif }; diff --git a/radio/src/strhelpers.cpp b/radio/src/strhelpers.cpp index 856a67e7b..4211e63a0 100644 --- a/radio/src/strhelpers.cpp +++ b/radio/src/strhelpers.cpp @@ -97,6 +97,16 @@ int zchar2str(char *dest, const char *src, int size) #endif #if defined(CPUARM) +unsigned int effectiveLen(const char *str, unsigned int size) +{ + while (size > 0) { + if (str[size-1] != ' ') + return size; + size--; + } + return 0; +} + bool zexist(const char *str, uint8_t size) { for (int i=0; ifs) fwrite(&c, 1, 1, (FILE*)fil->fs); diff --git a/radio/util/font2png.py b/radio/util/font2png.py index f322dc0e5..a989ef377 100755 --- a/radio/util/font2png.py +++ b/radio/util/font2png.py @@ -37,9 +37,10 @@ def createFontBitmap(filename, foreground, background): if i == 0: rect.setWidth(4) elif i == 14: - rect.setLeft(rect.left()+1) rect.setWidth(1) - painter.drawText(width*i-rect.left(), size+1, c) + painter.drawPoint(width*i, size); + else: + painter.drawText(width*i-rect.left(), size+1, c) for j in range(rect.width(), width): painter.drawLine(width*i+j, 0, width*i+j, size+4) painter.end()