diff --git a/companion/src/constants.h b/companion/src/constants.h index 5e7a2d9d265..7cc423dbcdb 100644 --- a/companion/src/constants.h +++ b/companion/src/constants.h @@ -50,6 +50,8 @@ #define CPN_MAX_SCRIPTS 9 #define CPN_MAX_SCRIPT_INPUTS 10 +#define CPN_STR_MODELNOTES_EXT ".txt" + #define CPN_STR_APP_NAME QCoreApplication::translate("Companion", "EdgeTX Companion") #define CPN_STR_TTL_INFO QCoreApplication::translate("Companion", "Information") // shared Title Case words, eg. for a window title or section heading #define CPN_STR_TTL_WARNING QCoreApplication::translate("Companion", "Warning") diff --git a/companion/src/firmwares/edgetx/yaml_modeldata.cpp b/companion/src/firmwares/edgetx/yaml_modeldata.cpp index a69275118b1..82ace148d0d 100644 --- a/companion/src/firmwares/edgetx/yaml_modeldata.cpp +++ b/companion/src/firmwares/edgetx/yaml_modeldata.cpp @@ -953,6 +953,7 @@ Node convert::encode(const ModelData& rhs) } node["modelRegistrationID"] = rhs.registrationId; + node["modelNotesFileName"] = rhs.modelNotesFileName; if (Boards::getCapability(getCurrentBoard(), Board::FunctionSwitches)) { node["functionSwitchConfig"] = rhs.functionSwitchConfig; @@ -1130,6 +1131,7 @@ bool convert::decode(const Node& node, ModelData& rhs) node["view"] >> rhs.view; node["modelRegistrationID"] >> rhs.registrationId; + node["modelNotesFileName"] >> rhs.modelNotesFileName; node["functionSwitchConfig"] >> rhs.functionSwitchConfig; node["functionSwitchGroup"] >> rhs.functionSwitchGroup; diff --git a/companion/src/firmwares/modeldata.h b/companion/src/firmwares/modeldata.h index 3d63a65e25e..f76a5046a13 100644 --- a/companion/src/firmwares/modeldata.h +++ b/companion/src/firmwares/modeldata.h @@ -175,7 +175,8 @@ class ModelData { unsigned int view; char registrationId[8+1]; - + char modelNotesFileName[15+1]; + enum FunctionSwitchConfig { FUNC_SWITCH_CONFIG_NONE, FUNC_SWITCH_CONFIG_FIRST = FUNC_SWITCH_CONFIG_NONE, diff --git a/companion/src/helpers.cpp b/companion/src/helpers.cpp index e4701aea6f1..e8d6f6d8cdf 100644 --- a/companion/src/helpers.cpp +++ b/companion/src/helpers.cpp @@ -685,17 +685,24 @@ QString Helpers::getChecklistsPath() return QDir::toNativeSeparators(g.profile[g.id()].sdPath() + "/MODELS/"); // TODO : add sub folder to constants } -QString Helpers::getChecklistFilename(const ModelData * model) +QString Helpers::getChecklistFilename(const ModelData * model, bool appendExtension) { - QString name = model->name; - name.replace(" ", "_"); - name.append(".txt"); // TODO : add to constants + QString name; + if (!strlen(model->modelNotesFileName) == 0) { + name = model->modelNotesFileName; + } else { + name = model->name; + name.replace(" ", "_"); + } + if (appendExtension) { + name.append(CPN_STR_MODELNOTES_EXT); + } return name; } QString Helpers::getChecklistFilePath(const ModelData * model) { - return getChecklistsPath() + getChecklistFilename(model); + return getChecklistsPath() + getChecklistFilename(model, true); } QString Helpers::removeAccents(const QString & str) diff --git a/companion/src/helpers.h b/companion/src/helpers.h index fc349254600..673f18d19e9 100644 --- a/companion/src/helpers.h +++ b/companion/src/helpers.h @@ -110,7 +110,7 @@ namespace Helpers void exportAppSettings(QWidget * dlgParent = nullptr); QString getChecklistsPath(); - QString getChecklistFilename(const ModelData * model); + QString getChecklistFilename(const ModelData * model, bool appendExtension); QString getChecklistFilePath(const ModelData * model); QString removeAccents(const QString & str); unsigned int getBitmappedValue(const unsigned int & field, const unsigned int index, const unsigned int numbits = 1, const unsigned int offset = 0); diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index 1154467184a..81073d09768 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -1596,6 +1596,17 @@ void SetupPanel::on_name_editingFinished() } } +void SetupPanel::on_notesFile_editingFinished() +{ + if (QString(model->modelNotesFileName) != ui->notesFile->text()) + { + int length = ui->notesFile->maxLength(); + strncpy(model->modelNotesFileName, ui->notesFile->text().toLatin1(), + length); + emit modified(); + } +} + void SetupPanel::on_image_currentIndexChanged(int index) { if (!lock) { @@ -1663,6 +1674,7 @@ void SetupPanel::update() ui->displayText->setChecked(model->displayChecklist); ui->gfEnabled->setChecked(!model->noGlobalFunctions); ui->jitterFilter->setCurrentIndex(model->jitterFilter); + ui->notesFile->setText(Helpers::getChecklistFilename(model, false)); updateBeepCenter(); updateStartupSwitches(); diff --git a/companion/src/modeledit/setup.h b/companion/src/modeledit/setup.h index cdc7302cdb7..cf7e3fb89ba 100644 --- a/companion/src/modeledit/setup.h +++ b/companion/src/modeledit/setup.h @@ -213,6 +213,7 @@ class SetupPanel : public ModelPanel void onModuleUpdateItemModels(); void onFunctionSwitchesUpdateItemModels(); void on_jitterFilter_currentIndexChanged(int index); + void on_notesFile_editingFinished(); private: Ui::Setup *ui; diff --git a/companion/src/modeledit/setup.ui b/companion/src/modeledit/setup.ui index 010ce675806..54d5edcd2c4 100644 --- a/companion/src/modeledit/setup.ui +++ b/companion/src/modeledit/setup.ui @@ -6,7 +6,7 @@ 0 0 - 1024 + 1007 435 @@ -32,6 +32,88 @@ + + + + Qt::Horizontal + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 50 + false + + + + Timer 2 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::Horizontal + + + + + + + + 75 + true + + + + Model + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 50 + false + + + + Timer 3 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + @@ -133,8 +215,14 @@ - - + + + + + 0 + 0 + + 75 @@ -142,15 +230,15 @@ - Model + Warnings Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + + 50 @@ -158,13 +246,23 @@ - Timer 3 + Top LCD Timer Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + 0 + 0 + + + + @@ -233,99 +331,8 @@ - - - - - 50 - false - - - - Top LCD Timer - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 75 - true - - - - Warnings - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Qt::Horizontal - - - - - - - - 50 - false - - - - Timer 2 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - + + Qt::Horizontal @@ -378,7 +385,7 @@ - Pot/Slider Warnings + Pot Warnings @@ -435,13 +442,6 @@ - - - - Qt::Horizontal - - - @@ -466,83 +466,20 @@ - - - - - 0 - 0 - - - - - Exponential - - - - - Extra Fine - - - - - Fine - - - - - Medium - - - - - Coarse - - - - - - - - - 0 - 0 - - - - - Never - - - - - On change - - - - - Always - - - - - - + + Qt::LeftToRight - Throttle Warning + Custom Throttle Warning - - - - Qt::LeftToRight - + + - Custom Throttle Warning + Global Functions @@ -562,23 +499,6 @@ - - - - Qt::LeftToRight - - - Display Checklist - - - - - - - Global Functions - - - @@ -592,8 +512,18 @@ - - + + + + Qt::LeftToRight + + + Display Checklist + + + + + 0 @@ -602,32 +532,64 @@ - Global + Never - Off + On change - On + Always - - + + + + Qt::LeftToRight + + + Throttle Warning + + + + + - + 0 0 - - Edit Checklist... - + + + Exponential + + + + + Extra Fine + + + + + Fine + + + + + Medium + + + + + Coarse + + @@ -640,6 +602,13 @@ + + + + Throttle trim switch + + + @@ -656,11 +625,29 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi - - - - Throttle trim switch + + + + + 0 + 0 + + + + Global + + + + + Off + + + + + On + + @@ -673,6 +660,16 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi + + + + + 0 + 0 + + + + @@ -683,17 +680,14 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi - - - - - 0 - 0 - + + + + Checklist file name - + Qt::Horizontal @@ -706,6 +700,32 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi + + + + + 0 + 0 + + + + Edit Checklist... + + + + + + + + 0 + 0 + + + + 15 + + + diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 489f9a3be48..d8d7da47a2c 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -93,6 +93,8 @@ enum CurveType { CURVE_TYPE_LAST = CURVE_TYPE_CUSTOM }; +#define LEN_NOTES_FILE_NAME 15 + #define MIN_POINTS_PER_CURVE 3 #define MAX_POINTS_PER_CURVE 17 diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index c90cf723a55..ff658b37526 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -118,33 +118,33 @@ static inline void check_struct() #if defined(PCBXLITES) CHKSIZE(RadioData, 861); - CHKSIZE(ModelData, 6161); + CHKSIZE(ModelData, 6176); #elif defined(PCBXLITE) CHKSIZE(RadioData, 859); - CHKSIZE(ModelData, 6161); + CHKSIZE(ModelData, 6176); #elif defined(RADIO_TPRO) CHKSIZE(RadioData, 842); - CHKSIZE(ModelData, 6186); + CHKSIZE(ModelData, 6201); #elif defined(PCBX7) CHKSIZE(RadioData, 865); - CHKSIZE(ModelData, 6161); + CHKSIZE(ModelData, 6176); #elif defined(PCBX9E) CHKSIZE(RadioData, 955); - CHKSIZE(ModelData, 6613); + CHKSIZE(ModelData, 6628); #elif defined(PCBX9D) || defined(PCBX9DP) CHKSIZE(RadioData, 897); - CHKSIZE(ModelData, 6605); + CHKSIZE(ModelData, 6620); #elif defined(PCBHORUS) #if defined(PCBX10) CHKSIZE(RadioData, 923); - CHKSIZE(ModelData, 11025); + CHKSIZE(ModelData, 11040); #else CHKSIZE(RadioData, 905); - CHKSIZE(ModelData, 11023); + CHKSIZE(ModelData, 11038); #endif #elif defined(PCBNV14) CHKSIZE(RadioData, 851); - CHKSIZE(ModelData, 10839); + CHKSIZE(ModelData, 10854); #endif #undef CHKSIZE diff --git a/radio/src/datastructs_private.h b/radio/src/datastructs_private.h index 22a2a09fd10..975a4dd9b9b 100644 --- a/radio/src/datastructs_private.h +++ b/radio/src/datastructs_private.h @@ -697,6 +697,7 @@ PACK(struct ModelData { CUSTOM_SCREENS_DATA char modelRegistrationID[PXX2_LEN_REGISTRATION_ID]; + char modelNotesFileName[LEN_NOTES_FILE_NAME]; FUNCTION_SWITCHS_FIELDS diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 5d69b77a693..fc24ab8e373 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -93,6 +93,7 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_THROTTLE_TRIM_SWITCH, ITEM_MODEL_SETUP_PREFLIGHT_LABEL, ITEM_MODEL_SETUP_CHECKLIST_DISPLAY, + ITEM_MODEL_NOTES_FILE, ITEM_MODEL_SETUP_THROTTLE_WARNING, ITEM_MODEL_SETUP_CUSTOM_THROTTLE_WARNING, ITEM_MODEL_SETUP_CUSTOM_THROTTLE_WARNING_VALUE, @@ -188,7 +189,7 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_TRAINER_LABEL, ITEM_MODEL_SETUP_TRAINER_MODE, #if defined(BLUETOOTH) - ITEM_MODEL_SETUP_TRAINER_BLUETOOTH, + ITEM_MODEL_SETUP_TRAINER_BLUETOOTH, #endif ITEM_MODEL_SETUP_TRAINER_CHANNELS, ITEM_MODEL_SETUP_TRAINER_PPM_PARAMS, @@ -356,6 +357,29 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event) } } +void copySelection(char *dst, const char *src, uint8_t size) +{ + if (memcmp(src, "---", 3) == 0) + memset(dst, 0, size); + else + memcpy(dst, src, size); +} + +void onModelNotesMenu(const char *result) +{ + if (result == STR_UPDATE_LIST) { + if (!sdListFiles(MODELS_PATH, TEXT_EXT, sizeof(g_model.modelNotesFileName), + nullptr)) { + POPUP_WARNING(STR_NO_NOTES_ON_SD); + } + } else if (result != STR_EXIT) { + // The user choose a file in the list + copySelection(g_model.modelNotesFileName, result, + sizeof(g_model.modelNotesFileName)); + storageDirty(EE_MODEL); + } +} + #include "common/stdlcd/model_setup_pxx1.cpp" #if defined(PXX2) @@ -759,6 +783,27 @@ void menuModelSetup(event_t event) g_model.displayChecklist = editCheckBox(g_model.displayChecklist, MODEL_SETUP_2ND_COLUMN, y, STR_CHECKLIST, attr, event); break; + case ITEM_MODEL_NOTES_FILE: + lcdDrawTextAlignedLeft(y, STR_NOTES_FILE); + if (ZEXIST(g_model.modelNotesFileName)) + lcdDrawSizedText(MODEL_SETUP_2ND_COLUMN, y, + g_model.modelNotesFileName, + sizeof(g_model.modelNotesFileName), attr); + else + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VCSWFUNC, 0, attr); + if (attr && event == EVT_KEY_BREAK(KEY_ENTER) && READ_ONLY_UNLOCKED()) { + s_editMode = 0; + if (sdListFiles(MODELS_PATH, TEXT_EXT, + sizeof(g_model.modelNotesFileName), + g_model.modelNotesFileName, LIST_NONE_SD_FILE)) { + POPUP_MENU_START(onModelNotesMenu); + TRACE("Notes: %s", g_model.modelNotesFileName); + } else { + POPUP_WARNING(STR_NO_NOTES_ON_SD); + } + } + break; + case ITEM_MODEL_SETUP_THROTTLE_WARNING: g_model.disableThrottleWarning = !editCheckBox(!g_model.disableThrottleWarning, MODEL_SETUP_2ND_COLUMN, y, STR_THROTTLE_WARNING, attr, event); break; diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 7a74c5220b7..af1f16d8b72 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -78,6 +78,7 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_THROTTLE_TRIM_SWITCH, ITEM_MODEL_SETUP_PREFLIGHT_LABEL, ITEM_MODEL_SETUP_CHECKLIST_DISPLAY, + ITEM_MODEL_NOTES_FILE, ITEM_MODEL_SETUP_THROTTLE_WARNING, ITEM_MODEL_SETUP_CUSTOM_THROTTLE_WARNING, ITEM_MODEL_SETUP_CUSTOM_THROTTLE_WARNING_VALUE, @@ -183,6 +184,21 @@ void onModelSetupBitmapMenu(const char * result) } } +void onModelNotesMenu(const char *result) +{ + if (result == STR_UPDATE_LIST) { + if (!sdListFiles(MODELS_PATH, TEXT_EXT, sizeof(g_model.modelNotesFileName), + nullptr)) { + POPUP_WARNING(STR_NO_NOTES_ON_SD); + } + } else if (result != STR_EXIT) { + // The user chose a file in the list + copySelection(g_model.modelNotesFileName, result, + sizeof(g_model.modelNotesFileName)); + storageDirty(EE_MODEL); + } +} + void editTimerMode(int timerIdx, coord_t y, LcdFlags attr, event_t event) { TimerData &timer = g_model.timers[timerIdx]; @@ -468,9 +484,9 @@ void menuModelSetup(event_t event) #endif int sub = menuVerticalPosition; - - for (int i = 0; i < NUM_BODY_LINES; ++i) { - coord_t y = MENU_HEADER_HEIGHT + 1 + i*FH; + for (int i = 0; i < NUM_BODY_LINES; ++i) + { + coord_t y = MENU_HEADER_HEIGHT + 1 + i* FH; uint8_t k = i + menuVerticalOffset; for (int j = 0; j <= k; j++) { if (mstate_tab[j] == HIDDEN_ROW) @@ -667,6 +683,26 @@ void menuModelSetup(event_t event) g_model.displayChecklist = editCheckBox(g_model.displayChecklist, MODEL_SETUP_2ND_COLUMN, y, STR_CHECKLIST, attr, event); break; + case ITEM_MODEL_NOTES_FILE: + lcdDrawTextAlignedLeft(y, STR_NOTES_FILE); + if (ZEXIST(g_model.modelNotesFileName)) lcdDrawSizedText( + MODEL_SETUP_2ND_COLUMN, y, g_model.modelNotesFileName, + sizeof(g_model.modelNotesFileName), attr); + else + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VCSWFUNC, 0, attr); + if (attr && event == EVT_KEY_BREAK(KEY_ENTER) && READ_ONLY_UNLOCKED()) { + s_editMode = 0; + if (sdListFiles(MODELS_PATH, TEXT_EXT, + sizeof(g_model.modelNotesFileName), + g_model.modelNotesFileName, LIST_NONE_SD_FILE)) { + POPUP_MENU_START(onModelNotesMenu); + TRACE("Notes: %s", g_model.modelNotesFileName); + } else { + POPUP_WARNING(STR_NO_NOTES_ON_SD); + } + } + break; + case ITEM_MODEL_SETUP_THROTTLE_WARNING: g_model.disableThrottleWarning = !editCheckBox(!g_model.disableThrottleWarning, MODEL_SETUP_2ND_COLUMN, y, STR_THROTTLE_WARNING, attr, event); break; diff --git a/radio/src/gui/colorlcd/preflight_checks.cpp b/radio/src/gui/colorlcd/preflight_checks.cpp index e5b9c619fe5..698787da1d8 100644 --- a/radio/src/gui/colorlcd/preflight_checks.cpp +++ b/radio/src/gui/colorlcd/preflight_checks.cpp @@ -108,7 +108,30 @@ PreflightChecks::PreflightChecks() : Page(ICON_MODEL_SETUP) // Display checklist auto line = form->newLine(&grid); new StaticText(line, rect_t{}, STR_CHECKLIST, 0, COLOR_THEME_PRIMARY1); - new CheckBox(line, rect_t{}, GET_SET_DEFAULT(g_model.displayChecklist)); + auto fn = new CheckBox(line, rect_t{}, GET_SET_DEFAULT(g_model.displayChecklist)); + + // Checklist filename + line = form->newLine(&grid); + new StaticText(line, rect_t{}, STR_NOTES_FILE, 0, COLOR_THEME_PRIMARY1); + new FileChoice( + line, rect_t{}, MODELS_PATH, TEXT_EXT, sizeof(g_model.modelNotesFileName), + []() { + std::string notes(g_model.modelNotesFileName, + sizeof(g_model.modelNotesFileName)); + notes += TEXT_EXT; + return notes; + }, + [](std::string newValue) { + uint8_t nameLength; + uint8_t extLength; + getFileExtension(newValue.data(), 0, 0, &nameLength, &extLength); + nameLength -= extLength; + newValue = newValue.substr(0, nameLength); + strncpy(g_model.modelNotesFileName, newValue.c_str(), + sizeof(g_model.modelNotesFileName)); + SET_DIRTY(); + }); + make_conditional(line, fn); // Throttle warning line = form->newLine(&grid); diff --git a/radio/src/gui/colorlcd/radio_sdmanager.cpp b/radio/src/gui/colorlcd/radio_sdmanager.cpp index a6306abd95d..a31acd54a28 100644 --- a/radio/src/gui/colorlcd/radio_sdmanager.cpp +++ b/radio/src/gui/colorlcd/radio_sdmanager.cpp @@ -248,6 +248,16 @@ void RadioSdManagerPage::fileAction(const char* path, const char* name, } } }); + if (!strcasecmp(MODELS_PATH, path)) { + menu->addLine(TR_ASSIGN_NOTES, [=]() { + int nameLength = std::min(sizeof(g_model.modelNotesFileName) - 1, + strlen(name) - sizeof(TEXT_EXT) + 1); + memcpy(g_model.modelNotesFileName, name, nameLength); + g_model.modelNotesFileName[nameLength] = 0; + g_model.displayChecklist = 1; + storageDirty(EE_MODEL); + }); + } } if (!READ_ONLY() && !strcasecmp(ext, FIRMWARE_EXT)) { if (isBootloader(fullpath)) { diff --git a/radio/src/gui/colorlcd/view_text.cpp b/radio/src/gui/colorlcd/view_text.cpp index 799509ea865..0dbebded43c 100644 --- a/radio/src/gui/colorlcd/view_text.cpp +++ b/radio/src/gui/colorlcd/view_text.cpp @@ -208,13 +208,22 @@ void readModelNotes() bool notesFound = false; LED_ERROR_BEGIN(); - std::string modelNotesName(g_model.header.name); + std::string modelNotesName(g_model.modelNotesFileName); modelNotesName.append(TEXT_EXT); const char buf[] = {MODELS_PATH}; f_chdir((TCHAR *)buf); notesFound = openNotes(buf, modelNotesName); + if (!notesFound) { + modelNotesName.assign(g_model.header.name); + modelNotesName.append(TEXT_EXT); + const char buf[] = {MODELS_PATH}; + f_chdir((TCHAR*)buf); + + notesFound = openNotes(buf, modelNotesName); + } + if(!notesFound) { replaceSpaceWithUnderscore(modelNotesName); notesFound = openNotes(buf, modelNotesName); } diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index 6b1a4e1683b..79163da76e1 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -205,6 +205,14 @@ void onSdManagerMenu(const char * result) storageDirty(EE_MODEL); } #endif + else if (result == STR_ASSIGN_NOTES) { + int nameLength = std::min((int)sizeof(g_model.modelNotesFileName) - 1, + (int)(strlen(line) - sizeof(TEXT_EXT) + 1)); + memcpy(g_model.modelNotesFileName, line, nameLength); + g_model.modelNotesFileName[nameLength] = 0; + g_model.displayChecklist = 1; + storageDirty(EE_MODEL); + } else if (result == STR_VIEW_TEXT) { getSelectionFullPath(lfn); pushMenuTextView(lfn); @@ -395,6 +403,11 @@ void menuRadioSdManager(event_t _event) if (ext) { if (!strcasecmp(ext, SOUNDS_EXT)) { POPUP_MENU_ADD_ITEM(STR_PLAY_FILE); + } else if (isExtensionMatching(ext, TEXT_EXT) && + (ext - line) <= (int)sizeof(g_model.modelNotesFileName) - 1) { + f_getcwd(lfn, FF_MAX_LFN); + if (!strcmp(lfn, MODELS_PATH)) + POPUP_MENU_ADD_ITEM(STR_ASSIGN_NOTES); } #if LCD_DEPTH > 1 else if (isExtensionMatching(ext, BITMAPS_EXT)) { diff --git a/radio/src/gui/common/stdlcd/view_text.cpp b/radio/src/gui/common/stdlcd/view_text.cpp index 35dbea976fe..d7910e2f206 100644 --- a/radio/src/gui/common/stdlcd/view_text.cpp +++ b/radio/src/gui/common/stdlcd/view_text.cpp @@ -105,8 +105,15 @@ void readModelNotes() LED_ERROR_BEGIN(); strcpy(reusableBuffer.viewText.filename, MODELS_PATH "/"); - char *buf = strcat_currentmodelname(&reusableBuffer.viewText.filename[sizeof(MODELS_PATH)], 0); - strcpy(buf, TEXT_EXT); + strcat(reusableBuffer.viewText.filename, g_model.modelNotesFileName); + char* buf = strcat(reusableBuffer.viewText.filename, TEXT_EXT); + + if (!isFileAvailable(buf)) { + strcpy(reusableBuffer.viewText.filename, MODELS_PATH "/"); + buf = strcat_currentmodelname( + &reusableBuffer.viewText.filename[sizeof(MODELS_PATH)], 0); + strcpy(buf, TEXT_EXT); + } waitKeysReleased(); event_t event = EVT_ENTRY; @@ -118,7 +125,7 @@ void readModelNotes() menuTextView(event); lcdRefresh(); } - if (power == e_power_off){ + if (power == e_power_off) { drawSleepBitmap(); boardOff(); break; diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 3e37d2688f3..cd548811ec7 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -884,6 +884,14 @@ bool modelHasNotes() return true; } + filename[sizeof(MODELS_PATH)] = 0; + strncat(filename, g_model.modelNotesFileName, + sizeof(g_model.modelNotesFileName)); + strcat(filename, TEXT_EXT); + if (isFileAvailable(filename)) { + return true; + } + buf = strcat_currentmodelname(&filename[sizeof(MODELS_PATH)], ' '); strcpy(buf, TEXT_EXT); if (isFileAvailable(filename)) { diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 24f6e3dc0a8..03246fdc899 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -884,6 +884,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("topbarData", 1248, struct_TopBarPersistentData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), + YAML_STRING("modelNotesFileName", 15), YAML_END }; static const struct YamlNode struct_PartialModel[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index 7d6cea5c3cd..496a8b73647 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -854,6 +854,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), + YAML_STRING("modelNotesFileName", 15), YAML_END }; static const struct YamlNode struct_PartialModel[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index 2c7432054b0..e3168d05399 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -854,6 +854,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), + YAML_STRING("modelNotesFileName", 15), YAML_END }; static const struct YamlNode struct_PartialModel[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index 2c7432054b0..e3168d05399 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -854,6 +854,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), + YAML_STRING("modelNotesFileName", 15), YAML_END }; static const struct YamlNode struct_PartialModel[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp index cb80626a5fe..41403dc690c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp @@ -860,6 +860,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), + YAML_STRING("modelNotesFileName", 15), YAML_UNSIGNED( "functionSwitchConfig", 16 ), YAML_UNSIGNED( "functionSwitchGroup", 16 ), YAML_UNSIGNED( "functionSwitchStartConfig", 16 ), diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index a75335d90fb..bf0d3cb53fb 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -854,6 +854,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), + YAML_STRING("modelNotesFileName", 15), YAML_END }; static const struct YamlNode struct_PartialModel[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 98cd5e44bdb..1d8ae342706 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -908,6 +908,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("topbarData", 2400, struct_TopBarPersistentData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), + YAML_STRING("modelNotesFileName", 15), YAML_END }; static const struct YamlNode struct_PartialModel[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index b06ae1d4472..a91d83871cb 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -906,6 +906,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_STRUCT("topbarData", 2400, struct_TopBarPersistentData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), + YAML_STRING("modelNotesFileName", 15), YAML_END }; static const struct YamlNode struct_PartialModel[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index 2c7432054b0..e3168d05399 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -854,6 +854,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), + YAML_STRING("modelNotesFileName", 15), YAML_END }; static const struct YamlNode struct_PartialModel[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 5f9f3cec7f7..fef78ad3a8c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -869,6 +869,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), + YAML_STRING("modelNotesFileName", 15), YAML_END }; static const struct YamlNode struct_PartialModel[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 0fcc29345a6..efefb109db2 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -909,6 +909,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), + YAML_STRING("modelNotesFileName", 15), YAML_END }; static const struct YamlNode struct_PartialModel[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index b47c9de97f5..0b22b376dd0 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -839,6 +839,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), + YAML_STRING("modelNotesFileName", 15), YAML_END }; static const struct YamlNode struct_PartialModel[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index de3cbed4494..e9b7a325670 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -849,6 +849,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), + YAML_STRING("modelNotesFileName", 15), YAML_END }; static const struct YamlNode struct_PartialModel[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index 3ae0a7c5b55..5481e2bc4fc 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -846,6 +846,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), + YAML_STRING("modelNotesFileName", 15), YAML_END }; static const struct YamlNode struct_PartialModel[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index c89c637537f..7481c06d863 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -850,6 +850,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), + YAML_STRING("modelNotesFileName", 15), YAML_END }; static const struct YamlNode struct_PartialModel[] = { diff --git a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp index af5b6fa0feb..bf032849dc7 100644 --- a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp @@ -854,6 +854,7 @@ static const struct YamlNode struct_ModelData[] = { YAML_ARRAY("screens", 192, 4, struct_TelemetryScreenData, NULL), YAML_UNSIGNED( "view", 8 ), YAML_STRING("modelRegistrationID", 8), + YAML_STRING("modelNotesFileName", 15), YAML_END }; static const struct YamlNode struct_PartialModel[] = { diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 0a4fd937622..eba1ad33237 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -441,6 +441,7 @@ const char STR_SDHC_CARD[] = TR_SDHC_CARD; const char STR_NO_SOUNDS_ON_SD[] = TR_NO_SOUNDS_ON_SD; const char STR_NO_MODELS_ON_SD[] = TR_NO_MODELS_ON_SD; const char STR_NO_BITMAPS_ON_SD[] = TR_NO_BITMAPS_ON_SD; +const char STR_NO_NOTES_ON_SD[] = TR_NO_NOTES_ON_SD; const char STR_NO_SCRIPTS_ON_SD[] = TR_NO_SCRIPTS_ON_SD; const char STR_SCRIPT_SYNTAX_ERROR[] = TR_SCRIPT_SYNTAX_ERROR; const char STR_SCRIPT_PANIC[] = TR_SCRIPT_PANIC; @@ -448,6 +449,7 @@ const char STR_SCRIPT_KILLED[] = TR_SCRIPT_KILLED; const char STR_SCRIPT_ERROR[] = TR_SCRIPT_ERROR; const char STR_PLAY_FILE[] = TR_PLAY_FILE; const char STR_ASSIGN_BITMAP[] = TR_ASSIGN_BITMAP; +const char STR_ASSIGN_NOTES[] = TR_ASSIGN_NOTES; const char STR_EXECUTE_FILE[] = TR_EXECUTE_FILE; const char STR_DELETE_FILE[] = TR_DELETE_FILE; const char STR_COPY_FILE[] = TR_COPY_FILE; @@ -653,6 +655,7 @@ const char STR_MODULE_PROTOCOL_WARN_LINE2[] = TR_MODULE_PROTOCOL_WARN_LINE2; const char STR_SET[] = TR_SET; const char STR_PREFLIGHT[] = TR_PREFLIGHT; const char STR_CHECKLIST[] = TR_CHECKLIST; +const char STR_NOTES_FILE[] = TR_NOTES_FILE; const char STR_VIEW_NOTES[] = TR_VIEW_NOTES; const char STR_MODEL_SELECT[] = TR_MODEL_SELECT; const char STR_RESET_SUBMENU[] = TR_RESET_SUBMENU; diff --git a/radio/src/translations.h b/radio/src/translations.h index 34d3a630f54..f553b3913e6 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -668,6 +668,7 @@ extern const char STR_SDHC_CARD[]; extern const char STR_NO_SOUNDS_ON_SD[]; extern const char STR_NO_MODELS_ON_SD[]; extern const char STR_NO_BITMAPS_ON_SD[]; +extern const char STR_NO_NOTES_ON_SD[] ; extern const char STR_NO_SCRIPTS_ON_SD[]; extern const char STR_SCRIPT_SYNTAX_ERROR[]; extern const char STR_SCRIPT_PANIC[]; @@ -675,6 +676,7 @@ extern const char STR_SCRIPT_KILLED[]; extern const char STR_SCRIPT_ERROR[]; extern const char STR_PLAY_FILE[]; extern const char STR_ASSIGN_BITMAP[]; +extern const char STR_ASSIGN_NOTES[]; #if defined(COLORLCD) extern const char STR_ASSIGN_SPLASH[]; extern const char STR_FIRST_CHANNEL[]; @@ -999,6 +1001,7 @@ extern const char STR_MODULE_PROTOCOL_WARN_LINE2[]; extern const char STR_SET[]; extern const char STR_PREFLIGHT[]; extern const char STR_CHECKLIST[]; +extern const char STR_NOTES_FILE[]; extern const char STR_VIEW_NOTES[]; extern const char STR_MODEL_SELECT[]; extern const char STR_RESET_SUBMENU[]; diff --git a/radio/src/translations/cn.h b/radio/src/translations/cn.h index 6f47838f62d..aa9abe6c579 100644 --- a/radio/src/translations/cn.h +++ b/radio/src/translations/cn.h @@ -684,6 +684,7 @@ #define TR_NO_SOUNDS_ON_SD "存储卡中无音频" #define TR_NO_MODELS_ON_SD "存储卡中无模型" #define TR_NO_BITMAPS_ON_SD "存储卡中无图片" +#define TR_NO_NOTES_ON_SD "No notes file" BREAKSPACE "on SD" #define TR_NO_SCRIPTS_ON_SD "存储卡中无脚本" #define TR_SCRIPT_SYNTAX_ERROR "脚本程序语法错误" #define TR_SCRIPT_PANIC "Script panic" @@ -695,6 +696,7 @@ #define TR_RENAME_FILE "重命名" #define TR_ASSIGN_BITMAP "设置为模型图片" #define TR_ASSIGN_SPLASH "设置为开机图片" +#define TR_ASSIGN_NOTES "Assign as notes" #define TR_EXECUTE_FILE "执行" #define TR_REMOVED "已删除" #define TR_SD_INFO "信息" @@ -930,6 +932,7 @@ #define TR_PERSISTENT_MAH TR(INDENT "关机保持mAh", INDENT "关机保持 mAh") #define TR_PREFLIGHT "初始位置检查" #define TR_CHECKLIST TR(INDENT "显示列表", INDENT "显示列表") +#define TR_NOTES_FILE TR(INDENT "Notes", INDENT "Notes File") #define TR_FAS_OFFSET TR(INDENT "FAS偏移", INDENT "FAS 偏移量") #define TR_AUX_SERIAL_MODE "串口" #define TR_AUX2_SERIAL_MODE "串口 2" diff --git a/radio/src/translations/cz.h b/radio/src/translations/cz.h index 69846ed346b..c680377f25e 100644 --- a/radio/src/translations/cz.h +++ b/radio/src/translations/cz.h @@ -700,6 +700,7 @@ #define TR_NO_SOUNDS_ON_SD "žádný zvuk" BREAKSPACE "na SD" #define TR_NO_MODELS_ON_SD "žádný model" BREAKSPACE "na SD" #define TR_NO_BITMAPS_ON_SD "žádné obrázky" BREAKSPACE "na SD" +#define TR_NO_NOTES_ON_SD "No notes file" BREAKSPACE "na SD" #define TR_NO_SCRIPTS_ON_SD "žádný skript" BREAKSPACE "na SD" #define TR_SCRIPT_SYNTAX_ERROR TR("Syntaktická chyba", "Syntaktická chyba skriptu") #define TR_SCRIPT_PANIC "Script zmaten" @@ -711,6 +712,7 @@ #define TR_RENAME_FILE "Přejmenovat" #define TR_ASSIGN_BITMAP "Zvolit obrázek" #define TR_ASSIGN_SPLASH "Úvodní obrazovka" +#define TR_ASSIGN_NOTES "Assign as notes" #define TR_EXECUTE_FILE "Spustit" #define TR_REMOVED "odstraněn" #define TR_SD_INFO "Informace" @@ -945,6 +947,7 @@ #define TR_PERSISTENT_MAH TR(INDENT "Ulož mAh", INDENT "Ukládat mAh") #define TR_PREFLIGHT "Předletová kontrola" #define TR_CHECKLIST TR(INDENT "Poznámky", INDENT "Zobrazit poznámky") +#define TR_NOTES_FILE TR(INDENT "Notes", INDENT "Notes File") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Ofset") #define TR_AUX_SERIAL_MODE "Seriový port" #define TR_AUX2_SERIAL_MODE "Seriový port 2" diff --git a/radio/src/translations/da.h b/radio/src/translations/da.h index 7e9af5a78d7..15323e86104 100644 --- a/radio/src/translations/da.h +++ b/radio/src/translations/da.h @@ -697,6 +697,7 @@ #define TR_RENAME_FILE "Omdøb" #define TR_ASSIGN_BITMAP "Tildel billede" #define TR_ASSIGN_SPLASH "Start billde" +#define TR_ASSIGN_NOTES "Assign as notes" #define TR_EXECUTE_FILE "Udfør" #define TR_REMOVED " slettet" #define TR_SD_INFO "Information" diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h index ec9aa1c16f6..26ebdf9b34a 100644 --- a/radio/src/translations/de.h +++ b/radio/src/translations/de.h @@ -682,6 +682,7 @@ #define TR_NO_SOUNDS_ON_SD "Keine Töne" BREAKSPACE "auf SD" #define TR_NO_MODELS_ON_SD "Kein Modelle" BREAKSPACE "auf SD" #define TR_NO_BITMAPS_ON_SD "Keine Bitmaps" BREAKSPACE "auf SD" +#define TR_NO_NOTES_ON_SD "No notes file" BREAKSPACE "on SD" #define TR_NO_SCRIPTS_ON_SD "Keine Skripte" BREAKSPACE "auf SD" #define TR_SCRIPT_SYNTAX_ERROR TR("Syntaxfehler", "Skript Syntaxfehler") #define TR_SCRIPT_PANIC "Skript Panik" @@ -693,6 +694,7 @@ #define TR_RENAME_FILE "Umbenennen" #define TR_ASSIGN_BITMAP "Bitmap zuordnen" #define TR_ASSIGN_SPLASH "Als Startbild" +#define TR_ASSIGN_NOTES "Assign as notes" #define TR_EXECUTE_FILE "Execute" #define TR_REMOVED " gelöscht" #define TR_SD_INFO "Information" @@ -933,6 +935,7 @@ #define TR_PERSISTENT_MAH TR(INDENT "Spr. mAh", INDENT "Speichern mAh") //9XR-Pro #define TR_PREFLIGHT "Vorflug-Checkliste" #define TR_CHECKLIST TR(INDENT "Checkliste", INDENT "Checkliste anzeigen") //9XR-Pro +#define TR_NOTES_FILE TR(INDENT "Notes", INDENT "Notes File") #define TR_FAS_OFFSET TR(INDENT "FAS-Ofs", INDENT "FAS-Offset") #define TR_AUX_SERIAL_MODE "Serieller Port" #define TR_AUX2_SERIAL_MODE "Serieller Port 2" diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index bc91f817520..2e9b6071783 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -684,6 +684,7 @@ #define TR_NO_SOUNDS_ON_SD "No sounds" BREAKSPACE "on SD" #define TR_NO_MODELS_ON_SD "No models" BREAKSPACE "on SD" #define TR_NO_BITMAPS_ON_SD "No bitmaps" BREAKSPACE "on SD" +#define TR_NO_NOTES_ON_SD "No notes file" BREAKSPACE "on SD" #define TR_NO_SCRIPTS_ON_SD "No scripts" BREAKSPACE "on SD" #define TR_SCRIPT_SYNTAX_ERROR TR("Syntax error", "Script syntax error") #define TR_SCRIPT_PANIC "Script panic" @@ -695,6 +696,7 @@ #define TR_RENAME_FILE "Rename" #define TR_ASSIGN_BITMAP "Assign bitmap" #define TR_ASSIGN_SPLASH "Splash screen" +#define TR_ASSIGN_NOTES "Assign as notes" #define TR_EXECUTE_FILE "Execute" #define TR_REMOVED " removed" #define TR_SD_INFO "Information" @@ -930,6 +932,7 @@ #define TR_PERSISTENT_MAH TR(INDENT "Str mAh", INDENT "Persistent mAh") #define TR_PREFLIGHT "Preflight Checks" #define TR_CHECKLIST TR(INDENT "Checklist", INDENT "Display checklist") +#define TR_NOTES_FILE TR(INDENT "Notes", INDENT "Notes File") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS offset") #define TR_AUX_SERIAL_MODE "Serial port" #define TR_AUX2_SERIAL_MODE "Serial port 2" diff --git a/radio/src/translations/es.h b/radio/src/translations/es.h index f39915b5060..517820cbd07 100644 --- a/radio/src/translations/es.h +++ b/radio/src/translations/es.h @@ -684,6 +684,7 @@ #define TR_NO_SOUNDS_ON_SD "Sin sonidos en SD" #define TR_NO_MODELS_ON_SD "Sin modelos en SD" #define TR_NO_BITMAPS_ON_SD "Sin imágenes en SD" +#define TR_NO_NOTES_ON_SD "Sin notes file en SD" #define TR_NO_SCRIPTS_ON_SD "No scripts en SD" #define TR_SCRIPT_SYNTAX_ERROR TR("Syntax error", "Script syntax error") #define TR_SCRIPT_PANIC "Script panic" @@ -695,6 +696,7 @@ #define TR_RENAME_FILE "Renombrar" #define TR_ASSIGN_BITMAP "Asignar imagen" #define TR_ASSIGN_SPLASH "Pant. bienvenida" +#define TR_ASSIGN_NOTES "Assign as notes" #define TR_EXECUTE_FILE "Ejecutar" #define TR_REMOVED "Borrado" #define TR_SD_INFO "Información" @@ -932,6 +934,7 @@ #define TR_PERSISTENT_MAH INDENT "Valor mAh" #define TR_PREFLIGHT "Chequeos prevuelo" #define TR_CHECKLIST TR(INDENT "Lista verif", INDENT "Lista verificación") +#define TR_NOTES_FILE TR(INDENT "Notes", INDENT "Notes File") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") #define TR_AUX_SERIAL_MODE "Puerto serie" #define TR_AUX2_SERIAL_MODE "Puerto serie 2" diff --git a/radio/src/translations/fi.h b/radio/src/translations/fi.h index 30f8ea27fc1..fc6a3579d62 100644 --- a/radio/src/translations/fi.h +++ b/radio/src/translations/fi.h @@ -696,6 +696,7 @@ #define TR_NO_SOUNDS_ON_SD "Ei ääniä SD:llä" #define TR_NO_MODELS_ON_SD "No Models on SD" #define TR_NO_BITMAPS_ON_SD "Ei bittikarttoja SD:llä" +#define TR_NO_NOTES_ON_SD "No notes file" BREAKSPACE "on SD" #define TR_NO_SCRIPTS_ON_SD "Ei skriptejä SD:llä" #define TR_SCRIPT_SYNTAX_ERROR TR("Syntax error", "Script syntax error") #define TR_SCRIPT_PANIC "Skriptipaniikki" @@ -707,6 +708,7 @@ #define TR_RENAME_FILE "Nimeä uudelleen" #define TR_ASSIGN_BITMAP "Määritä bittikartta" #define TR_ASSIGN_SPLASH "Aloitusruutu" +#define TR_ASSIGN_NOTES "Assign as notes" #define TR_EXECUTE_FILE "Suorittaa" #define TR_REMOVED "poistettu" #define TR_SD_INFO "Tiedot" @@ -930,6 +932,7 @@ #define TR_PERSISTENT_MAH INDENT "Store mAh" #define TR_PREFLIGHT "Preflight Checks" #define TR_CHECKLIST INDENT "Display Checklist" +#define TR_NOTES_FILE TR(INDENT "Notes", INDENT "Notes File") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") #define TR_AUX_SERIAL_MODE "Sarjaportti" #define TR_AUX2_SERIAL_MODE "Sarjaportti 2" diff --git a/radio/src/translations/fr.h b/radio/src/translations/fr.h index 7c6d9bd18d5..e4d1b0aabe0 100644 --- a/radio/src/translations/fr.h +++ b/radio/src/translations/fr.h @@ -703,6 +703,7 @@ #define TR_NO_SOUNDS_ON_SD "Aucun son sur SD" #define TR_NO_MODELS_ON_SD "Aucun modèle SD" #define TR_NO_BITMAPS_ON_SD "Aucun Bitmap SD" +#define TR_NO_NOTES_ON_SD "No notes file on SD" #define TR_NO_SCRIPTS_ON_SD "Aucun Script SD" #define TR_SCRIPT_SYNTAX_ERROR TR("Erreur syntaxe", "Erreur syntaxe script") #define TR_SCRIPT_PANIC "Script bloqué" @@ -714,6 +715,7 @@ #define TR_RENAME_FILE "Renommer" #define TR_ASSIGN_BITMAP "Sélectionner image" #define TR_ASSIGN_SPLASH "Logo d'accueil" +#define TR_ASSIGN_NOTES "Assign as notes" #define TR_EXECUTE_FILE "Exécuter" #define TR_REMOVED " supprimé" #define TR_SD_INFO "Information" @@ -948,6 +950,7 @@ #define TR_PERSISTENT_MAH TR(INDENT "Enr. mAh", INDENT "Enregistrer mAh") #define TR_PREFLIGHT "Vérifications avant vol" #define TR_CHECKLIST TR(INDENT "Notes", INDENT "Afficher notes") +#define TR_NOTES_FILE TR(INDENT "Notes", INDENT "Notes File") #define TR_FAS_OFFSET TR(INDENT "Corr FAS", INDENT "Correction FAS") #define TR_AUX_SERIAL_MODE "Port série" #define TR_AUX2_SERIAL_MODE "Port série 2" diff --git a/radio/src/translations/it.h b/radio/src/translations/it.h index f464235b71d..b7c0148d106 100644 --- a/radio/src/translations/it.h +++ b/radio/src/translations/it.h @@ -684,6 +684,7 @@ #define TR_NO_SOUNDS_ON_SD "No Suoni" BREAKSPACE "su SD" #define TR_NO_MODELS_ON_SD "No Model." BREAKSPACE "su SD" #define TR_NO_BITMAPS_ON_SD "No Immag." BREAKSPACE "su SD" +#define TR_NO_NOTES_ON_SD "No notes file" BREAKSPACE "on SD" #define TR_NO_SCRIPTS_ON_SD "No Scripts" BREAKSPACE "su SD" #define TR_SCRIPT_SYNTAX_ERROR TR("Errore sintassi", "Script errore sintassi") #define TR_SCRIPT_PANIC "Script panico" @@ -695,6 +696,7 @@ #define TR_RENAME_FILE "Rinomina" #define TR_ASSIGN_BITMAP "Assegna immagine" #define TR_ASSIGN_SPLASH "Splash screen" +#define TR_ASSIGN_NOTES "Assign as notes" #define TR_EXECUTE_FILE "Esegui" #define TR_REMOVED " rimosso" #define TR_SD_INFO "Informazioni" @@ -930,6 +932,7 @@ #define TR_PERSISTENT_MAH INDENT "Memo mAh" #define TR_PREFLIGHT "Controlli Prevolo" #define TR_CHECKLIST INDENT "Mostra Checklist" +#define TR_NOTES_FILE TR(INDENT "Notes", INDENT "Notes File") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") #define TR_AUX_SERIAL_MODE "Porta Seriale" #define TR_AUX2_SERIAL_MODE "Porta Seriale 2" diff --git a/radio/src/translations/nl.h b/radio/src/translations/nl.h index 862407d3a7b..30a733a9e31 100644 --- a/radio/src/translations/nl.h +++ b/radio/src/translations/nl.h @@ -690,6 +690,7 @@ #define TR_NO_SOUNDS_ON_SD "Geen Geluiden" BREAKSPACE "op SD" #define TR_NO_MODELS_ON_SD "Geen Modellen" BREAKSPACE "op SD" #define TR_NO_BITMAPS_ON_SD "Geen Bitmaps" BREAKSPACE "op SD" +#define TR_NO_NOTES_ON_SD "Geen Notes file" BREAKSPACE "op SD" #define TR_NO_SCRIPTS_ON_SD "Geen Scripts" BREAKSPACE "op SD" #define TR_SCRIPT_SYNTAX_ERROR TR("Syntax error", "Script syntax error") #define TR_SCRIPT_PANIC "Script panic" @@ -701,6 +702,7 @@ #define TR_RENAME_FILE "Hernoemen" #define TR_ASSIGN_BITMAP "Bitmap toekennen" #define TR_ASSIGN_SPLASH "Splash screen" +#define TR_ASSIGN_NOTES "Assign as notes" #define TR_EXECUTE_FILE "Uitvoeren" #define TR_REMOVED " verwijderd" #define TR_SD_INFO "Informatie" @@ -936,6 +938,7 @@ #define TR_PERSISTENT_MAH TR(INDENT "Str mAh", INDENT "Vasthouden mAh") #define TR_PREFLIGHT "Preflight Checks" #define TR_CHECKLIST TR(INDENT "Checklist", INDENT "Toon Checklist") +#define TR_NOTES_FILE TR(INDENT "Notes", INDENT "Notes File") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") #define TR_AUX_SERIAL_MODE "Seriele poort" #define TR_AUX2_SERIAL_MODE "Seriele poort 2" diff --git a/radio/src/translations/pl.h b/radio/src/translations/pl.h index 62bc2f9b93d..240fc3ba1b4 100644 --- a/radio/src/translations/pl.h +++ b/radio/src/translations/pl.h @@ -680,6 +680,7 @@ #define TR_NO_SOUNDS_ON_SD "Brak dźwięków na SD" #define TR_NO_MODELS_ON_SD "Brak modelu na SD" #define TR_NO_BITMAPS_ON_SD "Brak obrazków na SD" +#define TR_NO_NOTES_ON_SD "Brak notes file na SD" #define TR_NO_SCRIPTS_ON_SD "Brak skryptów na SD" #define TR_SCRIPT_SYNTAX_ERROR TR("Syntax error", "Skrypt:syntax error") #define TR_SCRIPT_PANIC "Skrypt:panic" @@ -691,6 +692,7 @@ #define TR_RENAME_FILE "Zmień nazwę" #define TR_ASSIGN_BITMAP "Wybierz obrazek" #define TR_ASSIGN_SPLASH "Splash screen" +#define TR_ASSIGN_NOTES "Assign as notes" #define TR_EXECUTE_FILE "Wykonaj" #define TR_REMOVED " skasowane" #define TR_SD_INFO "Informacje" @@ -925,6 +927,7 @@ #define TR_PERSISTENT_MAH TR(INDENT "Zap. mAh", INDENT "Zapisz mAh") #define TR_PREFLIGHT "Lista Ostrzeżeń" #define TR_CHECKLIST TR(INDENT "Czeklista",INDENT "Pokaż Listę Ostrzeżeń") +#define TR_NOTES_FILE TR(INDENT "Notes", INDENT "Notes File") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") #define TR_AUX_SERIAL_MODE "Port szreg." #define TR_AUX2_SERIAL_MODE "Port szreg. 2" diff --git a/radio/src/translations/pt.h b/radio/src/translations/pt.h index a627c6bec00..fe544116204 100644 --- a/radio/src/translations/pt.h +++ b/radio/src/translations/pt.h @@ -685,6 +685,7 @@ #define TR_NO_SOUNDS_ON_SD "Sem Som no SD" #define TR_NO_MODELS_ON_SD "Sem Modelo no SD" #define TR_NO_BITMAPS_ON_SD "No Bitmaps on SD" +#define TR_NO_NOTES_ON_SD "No notes file" BREAKSPACE "on SD" #define TR_NO_SCRIPTS_ON_SD "No Scripts on SD" #define TR_SCRIPT_SYNTAX_ERROR TR("Syntax error", "Script syntax error") #define TR_SCRIPT_PANIC "Script panic" @@ -696,6 +697,7 @@ #define TR_RENAME_FILE "Renomear" #define TR_ASSIGN_BITMAP "Assign Bitmap" #define TR_ASSIGN_SPLASH "Splash screen" +#define TR_ASSIGN_NOTES "Assign as notes" #define TR_EXECUTE_FILE "Execute" #define TR_REMOVED "Remover" #define TR_SD_INFO "Dados SD" @@ -930,6 +932,7 @@ #define TR_PERSISTENT_MAH INDENT "Store mAh" #define TR_PREFLIGHT "Preflight Checks" #define TR_CHECKLIST INDENT "Display Checklist" +#define TR_NOTES_FILE TR(INDENT "Notes", INDENT "Notes File") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") #define TR_AUX_SERIAL_MODE "Serial port" #define TR_AUX2_SERIAL_MODE "Serial port 2" diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h index 7c2fd88c0b7..d93522339a8 100644 --- a/radio/src/translations/se.h +++ b/radio/src/translations/se.h @@ -713,6 +713,7 @@ #define TR_NO_SOUNDS_ON_SD "Inga ljud på SD" #define TR_NO_MODELS_ON_SD "Inga modeller på SD" #define TR_NO_BITMAPS_ON_SD "Ikoner saknas på SD" +#define TR_NO_NOTES_ON_SD "No notes file" BREAKSPACE "on SD" #define TR_NO_SCRIPTS_ON_SD "Programkod saknas på SD" #define TR_SCRIPT_SYNTAX_ERROR TR("Syntaxfel", "Skriptsyntaxfel") #define TR_SCRIPT_PANIC "Script panic" @@ -724,6 +725,7 @@ #define TR_RENAME_FILE "Byt namn" #define TR_ASSIGN_BITMAP "Tilldela ikon" #define TR_ASSIGN_SPLASH "Startbild" +#define TR_ASSIGN_NOTES "Assign as notes" #define TR_EXECUTE_FILE "Utför" #define TR_REMOVED " raderad" #define TR_SD_INFO "Information" @@ -962,6 +964,7 @@ #define TR_PERSISTENT_MAH INDENT "Lagra mAh" #define TR_PREFLIGHT "Startkontroller" #define TR_CHECKLIST TR(INDENT "Checklista", INDENT "Visa checklista") +#define TR_NOTES_FILE TR(INDENT "Notes", INDENT "Notes File") #define TR_FAS_OFFSET TR(INDENT "FAS ofs", INDENT "FAS offset") #define TR_AUX_SERIAL_MODE "Serieport" #define TR_AUX2_SERIAL_MODE "Serieport 2" diff --git a/radio/src/translations/tw.h b/radio/src/translations/tw.h index 2eb67833964..c82ba7de5ed 100644 --- a/radio/src/translations/tw.h +++ b/radio/src/translations/tw.h @@ -684,6 +684,7 @@ #define TR_NO_SOUNDS_ON_SD "存儲卡中無音頻" #define TR_NO_MODELS_ON_SD "存儲卡中無模型" #define TR_NO_BITMAPS_ON_SD "存儲卡中無圖片" +#define TR_NO_NOTES_ON_SD "No notes file on SD" #define TR_NO_SCRIPTS_ON_SD "存儲卡中無腳本" #define TR_SCRIPT_SYNTAX_ERROR "腳本程序語法錯誤" #define TR_SCRIPT_PANIC "Script panic" @@ -695,6 +696,7 @@ #define TR_RENAME_FILE "重取名" #define TR_ASSIGN_BITMAP "設置為模型圖片" #define TR_ASSIGN_SPLASH "設置為開機圖片" +#define TR_ASSIGN_NOTES "Assign as notes" #define TR_EXECUTE_FILE "執行" #define TR_REMOVED "已刪除" #define TR_SD_INFO "信息" @@ -930,6 +932,7 @@ #define TR_PERSISTENT_MAH TR(INDENT "關機保持mAh", INDENT "關機保持 mAh") #define TR_PREFLIGHT "初始位置檢查" #define TR_CHECKLIST TR(INDENT "顯示列表", INDENT "顯示列表") +#define TR_NOTES_FILE TR(INDENT "Notes", INDENT "Notes File") #define TR_FAS_OFFSET TR(INDENT "FAS偏移", INDENT "FAS 偏移量") #define TR_AUX_SERIAL_MODE "端口" #define TR_AUX2_SERIAL_MODE "端口 2"