diff --git a/radio/src/gui/480x272/model_receiver_options.cpp b/radio/src/gui/480x272/model_receiver_options.cpp index b1ab35036..90db6f7e3 100644 --- a/radio/src/gui/480x272/model_receiver_options.cpp +++ b/radio/src/gui/480x272/model_receiver_options.cpp @@ -46,14 +46,18 @@ void onRxOptionsUpdateConfirm(const char * result) enum { ITEM_RECEIVER_SETTINGS_PWM_RATE, ITEM_RECEIVER_SETTINGS_TELEMETRY, + ITEM_RECEIVER_SETTINGS_TELEMETRY_25MW, ITEM_RECEIVER_SETTINGS_SPORT_FPORT, ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED1, ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED2, ITEM_RECEIVER_SETTINGS_PINMAP_FIRST }; +#define IS_RECEIVER_CAPABILITY_ENABLED(capability) (reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilities & (1 << capability)) +#define IF_RECEIVER_CAPABILITY(capability, count) uint8_t(IS_RECEIVER_CAPABILITY_ENABLED(capability) ? count : HIDDEN_ROW) -#define IF_RECEIVER_CAPABILITY(capability, count) uint8_t((reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilities & (1 << capability)) ? count : HIDDEN_ROW) +#define CH_ENABLE_SPORT 4 +#define CH_ENABLE_SBUS 5 bool menuModelReceiverOptions(event_t event) { @@ -76,6 +80,7 @@ bool menuModelReceiverOptions(event_t event) SUBMENU(STR_RECEIVER_OPTIONS, ICON_MODEL_SETUP, ITEM_RECEIVER_SETTINGS_PINMAP_FIRST + outputsCount, { 0, // PWM rate isModuleR9MAccess(g_moduleIdx) && receiverVariant == PXX2_VARIANT_EU && reusableBuffer.hardwareAndSettings.moduleSettings.txPower > 14 /*25mW*/ ? READONLY_ROW : (uint8_t)0, // Telemetry + IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_TELEMETRY_25MW, 0), IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_FPORT, 0), uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW), uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW), @@ -156,6 +161,14 @@ bool menuModelReceiverOptions(event_t event) } break; + case ITEM_RECEIVER_SETTINGS_TELEMETRY_25MW: + lcdDrawText(MENUS_MARGIN_LEFT, y, "25mw Tele"); + reusableBuffer.hardwareAndSettings.receiverSettings.telemetry25mw = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.telemetry25mw, RECEIVER_OPTIONS_2ND_COLUMN, y, attr, event); + if (attr && checkIncDec_Ret) { + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; + } + break; + case ITEM_RECEIVER_SETTINGS_SPORT_FPORT: lcdDrawText(MENUS_MARGIN_LEFT, y, "F.Port"); reusableBuffer.hardwareAndSettings.receiverSettings.fport = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.fport, RECEIVER_OPTIONS_2ND_COLUMN, y, attr, event); @@ -182,21 +195,43 @@ bool menuModelReceiverOptions(event_t event) int32_t channelValue = channelOutputs[channel]; lcdDrawText(MENUS_MARGIN_LEFT, y, STR_PIN); lcdDrawNumber(lcdNextPos + 1, y, pin + 1); - putsChn(100, y, channel + 1, attr); + + uint8_t channelMax = sentModuleChannels(g_moduleIdx) - 1; + uint8_t selectionMax = channelMax; + + if (IS_RECEIVER_CAPABILITY_ENABLED(RECEIVER_CAPABILITY_ENABLE_PWM_CH5_CH6)) { + if (CH_ENABLE_SPORT == pin || CH_ENABLE_SBUS == pin) { + selectionMax += 1; + } + if (CH_ENABLE_SPORT == pin && selectionMax == channel) { + lcdDrawText(100, y, "S.PORT", attr); + } + else if (CH_ENABLE_SBUS == pin && selectionMax == channel) { + lcdDrawText(100, y, "SBUS", attr); + } + else { + putsChn(100, y, channel + 1, attr); + } + } + else { + putsChn(100, y, channel + 1, attr); + } // Channel if (attr) { - mapping = checkIncDec(event, mapping, 0, sentModuleChannels(g_moduleIdx) - 1); + mapping = checkIncDec(event, mapping, 0, selectionMax); if (checkIncDec_Ret) { reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; } } // Bargraph - lcdDrawRect(RECEIVER_OPTIONS_2ND_COLUMN, y + 4, wbar + 1, 10); - const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); - const coord_t xChannel = (channelValue > 0) ? RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 : RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 + 1 - lenChannel; - lcdDrawSolidFilledRect(xChannel, y + 5, lenChannel, 8, TEXT_INVERTED_BGCOLOR); + if (channel <= channelMax) { + lcdDrawRect(RECEIVER_OPTIONS_2ND_COLUMN, y + 4, wbar + 1, 10); + auto lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); + auto xChannel = (channelValue > 0) ? RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 : RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 + 1 - lenChannel; + lcdDrawSolidFilledRect(xChannel, y + 5, lenChannel, 8, TEXT_INVERTED_BGCOLOR); + } } break; } diff --git a/radio/src/gui/480x272/radio_sdmanager.cpp b/radio/src/gui/480x272/radio_sdmanager.cpp index 9a44203a5..b744eac17 100644 --- a/radio/src/gui/480x272/radio_sdmanager.cpp +++ b/radio/src/gui/480x272/radio_sdmanager.cpp @@ -18,7 +18,6 @@ * GNU General Public License for more details. */ -#include #include "io/frsky_firmware_update.h" #include "io/multi_firmware_update.h" #include "opentx.h" @@ -91,6 +90,49 @@ void onSdFormatConfirm(const char * result) } } +#if defined(PXX2) +void onUpdateConfirmation(const char * result) +{ + if (result == STR_OK) { + OtaUpdateInformation * destination = moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].otaUpdateInformation; + Pxx2OtaUpdate otaUpdate(reusableBuffer.sdManager.otaUpdateInformation.module, destination->candidateReceiversNames[destination->selectedReceiverIndex]); + otaUpdate.flashFirmware(destination->filename); + } + else { + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; + } +} + +void onUpdateStateChanged() +{ + if (reusableBuffer.sdManager.otaUpdateInformation.step == BIND_INFO_REQUEST) { + uint8_t modelId = reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.modelID; + if (modelId > 0 && modelId < DIM(PXX2ReceiversNames)) { + if (isPXX2ReceiverOptionAvailable(modelId, RECEIVER_OPTION_OTA)) { + POPUP_CONFIRMATION(getPXX2ReceiverName(modelId), onUpdateConfirmation); + char *tmp = strAppend(reusableBuffer.sdManager.otaReceiverVersion, TR_CURRENT_VERSION); + tmp = strAppendUnsigned(tmp, 1 + reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.swVersion.major); + *tmp++ = '.'; + tmp = strAppendUnsigned(tmp, reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.swVersion.minor); + *tmp++ = '.'; + tmp = strAppendUnsigned(tmp, reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.swVersion.revision); + SET_WARNING_INFO(reusableBuffer.sdManager.otaReceiverVersion, tmp - reusableBuffer.sdManager.otaReceiverVersion, 0); + } + else { + POPUP_WARNING(STR_OTA_UPDATE_ERROR); + SET_WARNING_INFO(STR_UNSUPPORTED_RX, sizeof(TR_UNSUPPORTED_RX) - 1, 0); + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; + } + } + else { + POPUP_WARNING(STR_OTA_UPDATE_ERROR); + SET_WARNING_INFO(STR_UNKNOWN_RX, sizeof(TR_UNKNOWN_RX) - 1, 0); + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; + } + } +} +#endif + void onSdManagerMenu(const char * result) { TCHAR lfn[_MAX_LFN+1]; @@ -203,6 +245,14 @@ void onSdManagerMenu(const char * result) multiFlashFirmware(EXTERNAL_MODULE, lfn); } #endif +#if defined(PXX2) + else if (result == STR_FLASH_RECEIVER_OTA_BY_INTERNAL || result == STR_FLASH_RECEIVER_OTA_BY_EXTERNAL) { + memclear(&reusableBuffer.sdManager.otaUpdateInformation, sizeof(OtaUpdateInformation)); + getSelectionFullPath(reusableBuffer.sdManager.otaUpdateInformation.filename); + reusableBuffer.sdManager.otaUpdateInformation.module = result == STR_FLASH_RECEIVER_OTA_BY_INTERNAL ? INTERNAL_MODULE : EXTERNAL_MODULE; + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].startBind(&reusableBuffer.sdManager.otaUpdateInformation, onUpdateStateChanged); + } +#endif #if defined(LUA) else if (result == STR_EXECUTE_FILE) { getSelectionFullPath(lfn); @@ -211,8 +261,33 @@ void onSdManagerMenu(const char * result) #endif } +#if defined(PXX2) +void onUpdateReceiverSelection(const char * result) +{ + if (result != STR_EXIT) { + reusableBuffer.sdManager.otaUpdateInformation.selectedReceiverIndex = (result - reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversNames[0]) / sizeof(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversNames[0]); + reusableBuffer.sdManager.otaUpdateInformation.step = BIND_INFO_REQUEST; +#if defined(SIMU) + reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.modelID = 0x01; + onUpdateStateChanged(); +#endif + } + else { + // the user pressed [Exit] + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; + } +} +#endif + bool menuRadioSdManager(event_t _event) { + if (moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND && EVT_KEY_MASK(_event) == KEY_EXIT) { + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; + CLEAR_POPUP(); + killEvents(KEY_EXIT); + _event = 0; + } + event_t event = (EVT_KEY_MASK(_event) == KEY_ENTER ? 0 : _event); SIMPLE_MENU(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, RADIO_ICONS, menuTabGeneral, MENU_RADIO_SD_MANAGER, reusableBuffer.sdManager.count); @@ -300,8 +375,12 @@ bool menuRadioSdManager(event_t _event) if (HAS_SPORT_UPDATE_CONNECTOR() && (information.productFamily == FIRMWARE_FAMILY_RECEIVER || information.productFamily == FIRMWARE_FAMILY_SENSOR)) POPUP_MENU_ADD_ITEM(STR_FLASH_EXTERNAL_DEVICE); #if defined(PXX2) - if (information.productFamily == FIRMWARE_FAMILY_RECEIVER) - POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA); + if (information.productFamily == FIRMWARE_FAMILY_RECEIVER) { + if (isReceiverOTAEnabledFromModule(INTERNAL_MODULE, information.productId)) + POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA_BY_INTERNAL); + if (isReceiverOTAEnabledFromModule(EXTERNAL_MODULE, information.productId)) + POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA_BY_EXTERNAL); + } #endif #if defined(BLUETOOTH) if (information.productFamily == FIRMWARE_FAMILY_BLUETOOTH_CHIP) @@ -476,6 +555,27 @@ bool menuRadioSdManager(event_t _event) } } +#if defined(PXX2) + if (moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND) { + if (reusableBuffer.sdManager.otaUpdateInformation.step == BIND_INIT) { + if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount > 0) { + if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount != popupMenuItemsCount) { + CLEAR_POPUP(); + popupMenuItemsCount = min(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount,PXX2_MAX_RECEIVERS_PER_MODULE); + for (auto rx = 0; rx < popupMenuItemsCount; rx++) { + popupMenuItems[rx] = reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversNames[rx]; + } + //popupMenuTitle = STR_PXX2_SELECT_RX; + POPUP_MENU_START(onUpdateReceiverSelection); + } + } + else { + POPUP_WAIT(STR_WAITING_FOR_RX); + } + } + } +#endif + const char * ext = getFileExtension(reusableBuffer.sdManager.lines[index]); if (ext && isExtensionMatching(ext, BITMAPS_EXT)) { if (currentBitmapIndex != menuVerticalPosition) { diff --git a/radio/src/gui/common/stdlcd/model_receiver_options.cpp b/radio/src/gui/common/stdlcd/model_receiver_options.cpp index ed4dbcd48..6ce66ee29 100644 --- a/radio/src/gui/common/stdlcd/model_receiver_options.cpp +++ b/radio/src/gui/common/stdlcd/model_receiver_options.cpp @@ -46,14 +46,18 @@ void onRxOptionsUpdateConfirm(const char * result) enum { ITEM_RECEIVER_SETTINGS_PWM_RATE, ITEM_RECEIVER_SETTINGS_TELEMETRY, + ITEM_RECEIVER_SETTINGS_TELEMETRY_25MW, ITEM_RECEIVER_SETTINGS_SPORT_FPORT, ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED1, ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED2, ITEM_RECEIVER_SETTINGS_PINMAP_FIRST }; +#define IS_RECEIVER_CAPABILITY_ENABLED(capability) (reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilities & (1 << capability)) +#define IF_RECEIVER_CAPABILITY(capability, count) uint8_t(IS_RECEIVER_CAPABILITY_ENABLED(capability) ? count : HIDDEN_ROW) -#define IF_RECEIVER_CAPABILITY(capability, count) uint8_t((reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilities & (1 << capability)) ? count : HIDDEN_ROW) +#define CH_ENABLE_SPORT 4 +#define CH_ENABLE_SBUS 5 void menuModelReceiverOptions(event_t event) { @@ -76,6 +80,7 @@ void menuModelReceiverOptions(event_t event) SUBMENU_NOTITLE(ITEM_RECEIVER_SETTINGS_PINMAP_FIRST + outputsCount, { 0, // PWM rate isModuleR9MAccess(g_moduleIdx) && receiverVariant == PXX2_VARIANT_EU && reusableBuffer.hardwareAndSettings.moduleSettings.txPower > 14 /*25mW*/ ? READONLY_ROW : (uint8_t)0, // Telemetry + IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_TELEMETRY_25MW, 0), IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_FPORT, 0), uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW), uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW), @@ -139,7 +144,7 @@ void menuModelReceiverOptions(event_t event) switch (i) { case ITEM_RECEIVER_SETTINGS_PWM_RATE: - reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, isModuleR9MAccess(g_moduleIdx) ? "6.67ms PWM": "9ms PWM", attr, event); + reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, isModuleR9MAccess(g_moduleIdx) ? "6.67ms PWM": "7ms PWM", attr, event); if (attr && checkIncDec_Ret) { reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; } @@ -152,6 +157,13 @@ void menuModelReceiverOptions(event_t event) } break; + case ITEM_RECEIVER_SETTINGS_TELEMETRY_25MW: + reusableBuffer.hardwareAndSettings.receiverSettings.telemetry25mw = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.telemetry25mw, RECEIVER_OPTIONS_2ND_COLUMN, y, "25mw Tele", attr, event); + if (attr && checkIncDec_Ret) { + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; + } + break; + case ITEM_RECEIVER_SETTINGS_SPORT_FPORT: reusableBuffer.hardwareAndSettings.receiverSettings.fport = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.fport, RECEIVER_OPTIONS_2ND_COLUMN, y, "F.Port", attr, event); if (attr && checkIncDec_Ret) { @@ -174,27 +186,49 @@ void menuModelReceiverOptions(event_t event) if (pin < reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount) { uint8_t & mapping = reusableBuffer.hardwareAndSettings.receiverSettings.outputsMapping[pin]; uint8_t channel = g_model.moduleData[g_moduleIdx].channelsStart + mapping; - int32_t channelValue = channelOutputs[channel]; lcdDrawText(0, y, STR_PIN); lcdDrawNumber(lcdLastRightPos + 1, y, pin + 1); - putsChn(7 * FW, y, channel + 1, attr); + + uint8_t channelMax = sentModuleChannels(g_moduleIdx) - 1; + uint8_t selectionMax = channelMax; + + if (IS_RECEIVER_CAPABILITY_ENABLED(RECEIVER_CAPABILITY_ENABLE_PWM_CH5_CH6)) { + if (CH_ENABLE_SPORT == pin || CH_ENABLE_SBUS == pin) + selectionMax += 1; + + if (CH_ENABLE_SPORT == pin && selectionMax == channel) { + lcdDrawText(7 * FW, y, "S.PORT", attr); + } + else if (CH_ENABLE_SBUS == pin && selectionMax == channel) { + lcdDrawText(7 * FW, y, "SBUS", attr); + } + else { + putsChn(7 * FW, y, channel + 1, attr); + } + } + else { + putsChn(7 * FW, y, channel + 1, attr); + } // Channel if (attr) { - mapping = checkIncDec(event, mapping, 0, sentModuleChannels(g_moduleIdx) - 1); + mapping = checkIncDec(event, mapping, 0, selectionMax); if (checkIncDec_Ret) { reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; } } // Bargraph -#if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines - lcdDrawRect(RECEIVER_OPTIONS_2ND_COLUMN, y + 2, wbar + 1, 4); -#endif - const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); - const coord_t xChannel = (channelValue > 0) ? RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 : RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 + 1 - lenChannel; - lcdDrawHorizontalLine(xChannel, y + 3, lenChannel, SOLID, 0); - lcdDrawHorizontalLine(xChannel, y + 4, lenChannel, SOLID, 0); + if (channel <= channelMax) { + int32_t channelValue = channelOutputs[channel]; + #if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines + lcdDrawRect(RECEIVER_OPTIONS_2ND_COLUMN, y + 2, wbar + 1, 4); + #endif + auto lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); + auto xChannel = (channelValue > 0) ? RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 : RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 + 1 - lenChannel; + lcdDrawHorizontalLine(xChannel, y + 3, lenChannel, SOLID, 0); + lcdDrawHorizontalLine(xChannel, y + 4, lenChannel, SOLID, 0); + } } break; } diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index fe387f307..7b6f9ac86 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -94,12 +94,12 @@ void onSdFormatConfirm(const char * result) void onUpdateConfirmation(const char * result) { if (result == STR_OK) { - OtaUpdateInformation * destination = moduleState[EXTERNAL_MODULE].otaUpdateInformation; - Pxx2OtaUpdate otaUpdate(EXTERNAL_MODULE, destination->candidateReceiversNames[destination->selectedReceiverIndex]); + OtaUpdateInformation * destination = moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].otaUpdateInformation; + Pxx2OtaUpdate otaUpdate(reusableBuffer.sdManager.otaUpdateInformation.module, destination->candidateReceiversNames[destination->selectedReceiverIndex]); otaUpdate.flashFirmware(destination->filename); } else { - moduleState[EXTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; } } @@ -121,13 +121,13 @@ void onUpdateStateChanged() else { POPUP_WARNING(STR_OTA_UPDATE_ERROR); SET_WARNING_INFO(STR_UNSUPPORTED_RX, sizeof(TR_UNSUPPORTED_RX) - 1, 0); - moduleState[EXTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; } } else { POPUP_WARNING(STR_OTA_UPDATE_ERROR); SET_WARNING_INFO(STR_UNKNOWN_RX, sizeof(TR_UNKNOWN_RX) - 1, 0); - moduleState[EXTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; } } } @@ -246,10 +246,11 @@ void onSdManagerMenu(const char * result) } #endif #if defined(PXX2) - else if (result == STR_FLASH_RECEIVER_OTA) { + else if (result == STR_FLASH_RECEIVER_OTA_BY_INTERNAL || result == STR_FLASH_RECEIVER_OTA_BY_EXTERNAL) { memclear(&reusableBuffer.sdManager.otaUpdateInformation, sizeof(OtaUpdateInformation)); getSelectionFullPath(reusableBuffer.sdManager.otaUpdateInformation.filename); - moduleState[EXTERNAL_MODULE].startBind(&reusableBuffer.sdManager.otaUpdateInformation, onUpdateStateChanged); + reusableBuffer.sdManager.otaUpdateInformation.module = result == STR_FLASH_RECEIVER_OTA_BY_INTERNAL ? INTERNAL_MODULE : EXTERNAL_MODULE; + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].startBind(&reusableBuffer.sdManager.otaUpdateInformation, onUpdateStateChanged); } #endif #endif @@ -274,7 +275,7 @@ void onUpdateReceiverSelection(const char * result) } else { // the user pressed [Exit] - moduleState[EXTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; } } #endif @@ -285,8 +286,8 @@ void menuRadioSdManager(event_t _event) int lastPos = menuVerticalPosition; #endif - if (moduleState[EXTERNAL_MODULE].mode == MODULE_MODE_BIND && EVT_KEY_MASK(_event) == KEY_EXIT) { - moduleState[EXTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + if (moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND && EVT_KEY_MASK(_event) == KEY_EXIT) { + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; CLEAR_POPUP(); killEvents(KEY_EXIT); _event = 0; @@ -417,8 +418,12 @@ void menuRadioSdManager(event_t _event) POPUP_MENU_ADD_ITEM(STR_FLASH_EXTERNAL_MODULE); } #if defined(PXX2) - if (information.productFamily == FIRMWARE_FAMILY_RECEIVER) - POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA); + if (information.productFamily == FIRMWARE_FAMILY_RECEIVER) { + if (isReceiverOTAEnabledFromModule(INTERNAL_MODULE, information.productId)) + POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA_BY_INTERNAL); + if (isReceiverOTAEnabledFromModule(EXTERNAL_MODULE, information.productId)) + POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA_BY_EXTERNAL); + } #endif #if defined(BLUETOOTH) if (information.productFamily == FIRMWARE_FAMILY_BLUETOOTH_CHIP) @@ -564,10 +569,10 @@ void menuRadioSdManager(event_t _event) } #if defined(PXX2) - if (moduleState[EXTERNAL_MODULE].mode == MODULE_MODE_BIND) { + if (moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND) { if (reusableBuffer.sdManager.otaUpdateInformation.step == BIND_INIT) { if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount > 0) { - if(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount != popupMenuItemsCount) { + if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount != popupMenuItemsCount) { CLEAR_POPUP(); popupMenuItemsCount = min(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount,PXX2_MAX_RECEIVERS_PER_MODULE); for (auto rx = 0; rx < popupMenuItemsCount; rx++) { diff --git a/radio/src/io/frsky_firmware_update.cpp b/radio/src/io/frsky_firmware_update.cpp index 7cc7135b4..2d9a62d5e 100644 --- a/radio/src/io/frsky_firmware_update.cpp +++ b/radio/src/io/frsky_firmware_update.cpp @@ -313,12 +313,12 @@ const char * FrskyDeviceFirmwareUpdate::doFlashFirmware(const char * filename) } else { #if defined(PCBHORUS) - information.productId = FIRMWARE_ID_XJT; + information.productId = FIRMWARE_ID_MODULE_XJT; #endif } #if defined(PCBHORUS) - if (module == INTERNAL_MODULE && information.productId == FIRMWARE_ID_XJT) { + if (module == INTERNAL_MODULE && information.productId == FIRMWARE_ID_MODULE_XJT) { INTERNAL_MODULE_ON(); RTOS_WAIT_MS(1); intmoduleSerialStart(38400, true, USART_Parity_No, USART_StopBits_1, USART_WordLength_8b); diff --git a/radio/src/io/frsky_firmware_update.h b/radio/src/io/frsky_firmware_update.h index a229edb27..fc296daf8 100644 --- a/radio/src/io/frsky_firmware_update.h +++ b/radio/src/io/frsky_firmware_update.h @@ -24,6 +24,7 @@ #include "dataconstants.h" #include "definitions.h" #include "frsky_pxx2.h" +#include "pulses/modules_helpers.h" #include "ff.h" enum FrskyFirmwareProductFamily { @@ -35,12 +36,43 @@ enum FrskyFirmwareProductFamily { FIRMWARE_FAMILY_POWER_MANAGEMENT_UNIT, }; -enum FrskyFirmwareProductId { - FIRMWARE_ID_NONE, - FIRMWARE_ID_XJT = 0x01, - FIRMWARE_ID_ISRM = 0x02, +enum FrskyFirmwareModuleProductId { + FIRMWARE_ID_MODULE_NONE, + FIRMWARE_ID_MODULE_XJT = 0x01, + FIRMWARE_ID_MODULE_ISRM = 0x02, }; +enum FrskyFirmwareReceiverProductId { + FIRMWARE_ID_RECEIVER_NONE, + FIRMWARE_ID_RECEIVER_ARCHER = 0xC0, // TODO use the right constant + FIRMWARE_ID_RECEIVER_R9MX = 0xF0, // TODO use the right constant + // TODO fill the table + +}; + +inline bool isReceiverOTAEnabledFromModule(uint8_t moduleIdx, uint8_t productId) +{ + switch (productId) { + case FIRMWARE_ID_RECEIVER_ARCHER: + return isModuleISRM(moduleIdx); + + case FIRMWARE_ID_RECEIVER_R9MX: + return isModuleR9M(moduleIdx); + + // TODO add all those OTA receivers here + +/* + "R9-MINI-OTA", // this one has OTA (different bootloader) + "R9-MM-OTA", // this one has OTA (different bootloader) + "R9-SLIM+-OTA", // this one has OTA (different bootloader) + "R9SX", // this one has OTA + */ + + default: + return false; + } +} + PACK(struct FrSkyFirmwareInformation { uint32_t fourcc; uint8_t headerVersion; @@ -69,7 +101,7 @@ class FrskyDeviceFirmwareUpdate { }; public: - FrskyDeviceFirmwareUpdate(ModuleIndex module): + explicit FrskyDeviceFirmwareUpdate(ModuleIndex module): module(module) { } diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 30a03355e..214e2f4e1 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -1751,7 +1751,7 @@ const luaR_value_entry opentxConstants[] = { { "EVT_VIRTUAL_INC_REPT", EVT_KEY_REPT(KEY_UP) }, #endif -#if defined(NAVIGATION_9X) || defined(NAVIGATION_XLITE) +#if defined(NAVIGATION_9X) { "EVT_VIRTUAL_PREV_PAGE", EVT_KEY_LONG(KEY_LEFT) }, { "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_BREAK(KEY_LEFT) }, { "EVT_VIRTUAL_MENU", EVT_KEY_BREAK(KEY_RIGHT) }, @@ -1759,6 +1759,14 @@ const luaR_value_entry opentxConstants[] = { { "EVT_VIRTUAL_ENTER", EVT_KEY_BREAK(KEY_ENTER) }, { "EVT_VIRTUAL_ENTER_LONG", EVT_KEY_LONG(KEY_ENTER) }, { "EVT_VIRTUAL_EXIT", EVT_KEY_BREAK(KEY_EXIT) }, +#elif defined(NAVIGATION_XLITE) + { "EVT_VIRTUAL_PREV_PAGE", EVT_KEY_LONG(KEY_LEFT) }, + { "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_LONG(KEY_RIGHT) }, + { "EVT_VIRTUAL_MENU", EVT_KEY_BREAK(KEY_SHIFT) }, + { "EVT_VIRTUAL_MENU_LONG", EVT_KEY_LONG(KEY_SHIFT) }, + { "EVT_VIRTUAL_ENTER", EVT_KEY_BREAK(KEY_ENTER) }, + { "EVT_VIRTUAL_ENTER_LONG", EVT_KEY_LONG(KEY_ENTER) }, + { "EVT_VIRTUAL_EXIT", EVT_KEY_BREAK(KEY_EXIT) }, #elif defined(NAVIGATION_X7) || defined(NAVIGATION_X9D) { "EVT_VIRTUAL_PREV_PAGE", EVT_KEY_LONG(KEY_PAGE) }, { "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_BREAK(KEY_PAGE) }, diff --git a/radio/src/opentx.h b/radio/src/opentx.h index c96d94e1e..47ea4cdcd 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -255,17 +255,6 @@ #include "myeeprom.h" -inline void memclear(void * p, size_t size) -{ - memset(p, 0, size); -} - -inline bool is_memclear(void * p, size_t size) -{ - uint8_t * buf = (uint8_t *)p; - return buf[0] == 0 && memcmp(buf, buf + 1, size - 1) == 0; -} - void memswap(void * a, void * b, uint8_t size); #if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBHORUS) diff --git a/radio/src/opentx_helpers.h b/radio/src/opentx_helpers.h index 8ddeba85e..866fdfb98 100644 --- a/radio/src/opentx_helpers.h +++ b/radio/src/opentx_helpers.h @@ -21,10 +21,23 @@ #ifndef _OPENTX_HELPERS_H_ #define _OPENTX_HELPERS_H_ +#include + template inline t min(t a, t b) { return a inline t max(t a, t b) { return a>b?a:b; } template inline t sgn(t a) { return a>0 ? 1 : (a < 0 ? -1 : 0); } template inline t limit(t mi, t x, t ma) { return min(max(mi,x),ma); } template inline void SWAP(t & a, t & b) { t tmp = b; b = a; a = tmp; } +inline void memclear(void * p, size_t size) +{ + memset(p, 0, size); +} + +inline bool is_memclear(void * p, size_t size) +{ + uint8_t * buf = (uint8_t *)p; + return buf[0] == 0 && memcmp(buf, buf + 1, size - 1) == 0; +} + #endif // _OPENTX_HELPERS_H_ diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index 4d358c36b..634035627 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -25,6 +25,8 @@ #include "definitions.h" #include "opentx_helpers.h" #include "telemetry/telemetry.h" +#include "storage/storage.h" + #if defined(MULTIMODULE) #include "telemetry/multi.h" #endif diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 7d859c075..e8c3ce8af 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -121,8 +121,10 @@ class ReceiverSettings { uint8_t receiverId; uint8_t dirty; uint8_t telemetryDisabled; + uint8_t telemetry25mw; uint8_t pwmRate; uint8_t fport; + uint8_t enablePwmCh5Ch6; uint8_t outputsCount; uint8_t outputsMapping[24]; }; @@ -144,6 +146,7 @@ class OtaUpdateInformation: public BindInformation { public: char filename[_MAX_LFN + 1]; uint32_t address; + uint32_t module; }; typedef void (* ModuleCallback)(); diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 323dc3c16..944be8a3a 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -223,6 +223,10 @@ void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) flag1 |= PXX2_RX_SETTINGS_FLAG1_FASTPWM; if (reusableBuffer.hardwareAndSettings.receiverSettings.fport) flag1 |= PXX2_RX_SETTINGS_FLAG1_FPORT; + if (reusableBuffer.hardwareAndSettings.receiverSettings.telemetry25mw) + flag1 |= PXX2_RX_SETTINGS_FLAG1_TELEMETRY_25MW; + if (reusableBuffer.hardwareAndSettings.receiverSettings.enablePwmCh5Ch6) + flag1 |= PXX2_RX_SETTINGS_FLAG1_ENABLE_PWM_CH5_CH6; Pxx2Transport::addByte(flag1); uint8_t outputsCount = min(24, reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount); for (int i = 0; i < outputsCount; i++) { @@ -355,6 +359,8 @@ void Pxx2Pulses::sendOtaUpdate(uint8_t module, const char * rxName, uint32_t add if (module == EXTERNAL_MODULE) extmoduleSendNextFrame(); + else if (module == INTERNAL_MODULE) + intmoduleSendNextFrame(); } void Pxx2Pulses::setupAuthenticationFrame(uint8_t module, uint8_t mode, const uint8_t * outputMessage) @@ -464,7 +470,12 @@ const char * Pxx2OtaUpdate::nextStep(uint8_t step, const char * rxName, uint32_t destination->address = address; for (uint8_t retry = 0;; retry++) { - extmodulePulsesData.pxx2.sendOtaUpdate(module, rxName, address, (const char *) buffer); + if (module == EXTERNAL_MODULE) { + extmodulePulsesData.pxx2.sendOtaUpdate(module, rxName, address, (const char *) buffer); + } + else if (module == INTERNAL_MODULE) { + intmodulePulsesData.pxx2.sendOtaUpdate(module, rxName, address, (const char *) buffer); + } if (waitStep(step + 1, 20)) { return nullptr; } diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index c739b6e3d..2fa64dcad 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -53,6 +53,8 @@ #define PXX2_RX_SETTINGS_FLAG1_READONLY (1 << 6) #define PXX2_RX_SETTINGS_FLAG1_FASTPWM (1 << 4) #define PXX2_RX_SETTINGS_FLAG1_FPORT (1 << 3) +#define PXX2_RX_SETTINGS_FLAG1_TELEMETRY_25MW (1 << 2) +#define PXX2_RX_SETTINGS_FLAG1_ENABLE_PWM_CH5_CH6 (1 << 1) #define PXX2_TX_SETTINGS_FLAG0_WRITE (1 << 6) #define PXX2_TX_SETTINGS_FLAG1_EXTERNAL_ANTENNA (1 << 3) @@ -81,7 +83,7 @@ enum PXX2ModuleModelID { PXX2_MODULE_ISRM_S_X10E, PXX2_MODULE_XJT_LITE, PXX2_MODULE_ISRM_S_X10S, - PXX2_MODULE_ISRM_S_X9LITE, + PXX2_MODULE_ISRM_X9LITES, }; static const char * const PXX2ModulesNames[] = { @@ -98,7 +100,7 @@ static const char * const PXX2ModulesNames[] = { "ISRM-S-X10E", "XJT Lite", "ISRM-S-X10S", - "ISRM-S-X9Lite" + "ISRM-X9LiteS" }; inline const char * getPXX2ModuleName(uint8_t modelId) @@ -140,7 +142,7 @@ static const uint8_t PXX2ModuleOptions[] = { 0b00000101, // ISRM-S-X10E 0b00000001, // XJT_LITE 0b00000101, // ISRM-S-X10S - 0b00000101, // ISRM-S-X9LITE + 0b00000100, // ISRM-X9LITES }; inline uint8_t getPXX2ModuleOptions(uint8_t modelId) @@ -189,6 +191,9 @@ static const char * const PXX2ReceiversNames[] = { "R9-MINI-OTA", // this one has OTA (different bootloader) "R9-MM-OTA", // this one has OTA (different bootloader) "R9-SLIM+-OTA", // this one has OTA (different bootloader) + "Archer-X", // this one has OTA (internal module) + "R9MX", // this one has OTA + "R9SX", // this one has OTA }; inline const char * getPXX2ReceiverName(uint8_t modelId) @@ -239,6 +244,9 @@ static const uint8_t PXX2ReceiverOptions[] = { 0b11111111, // R9-MINI+OTA 0b11111111, // R9-MM+OTA 0b11111111, // R9-SLIM+OTA + 0b11111111, // ARCHER-X + 0b11111111, // R9MX + 0b11111111, // R9SX }; inline uint8_t getPXX2ReceiverOptions(uint8_t modelId) @@ -256,6 +264,8 @@ inline bool isPXX2ReceiverOptionAvailable(uint8_t modelId, uint8_t option) enum ReceiverCapabilities { RECEIVER_CAPABILITY_FPORT, + RECEIVER_CAPABILITY_TELEMETRY_25MW, + RECEIVER_CAPABILITY_ENABLE_PWM_CH5_CH6, RECEIVER_CAPABILITY_COUNT }; diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 93ad67d18..8218447e4 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -187,6 +187,7 @@ enum FrSkyDataState { #define DIY_STREAM_FIRST_ID 0x5000 #define DIY_STREAM_LAST_ID 0x50FF #define FACT_TEST_ID 0xF000 +#define FRAME_LOSS_RATE_ID 0xF010 #define RSSI_ID 0xF101 #define ADC1_ID 0xF102 #define ADC2_ID 0xF103 diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 7d596ecc4..8ed11be1c 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -86,6 +86,12 @@ void processReceiverSettingsFrame(uint8_t module, const uint8_t * frame) if (frame[4] & PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED) destination->telemetryDisabled = 1; + if (frame[4] & PXX2_RX_SETTINGS_FLAG1_TELEMETRY_25MW) + destination->telemetry25mw = 1; + + if (frame[4] & PXX2_RX_SETTINGS_FLAG1_ENABLE_PWM_CH5_CH6) + destination->enablePwmCh5Ch6 = 1; + uint8_t outputsCount = min(16, frame[0] - 4); destination->outputsCount = outputsCount; for (uint8_t pin = 0; pin < outputsCount; pin++) { diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index bc32da123..78438caaf 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -30,6 +30,7 @@ struct FrSkySportSensor { }; const FrSkySportSensor sportSensors[] = { + { FRAME_LOSS_RATE_ID, FRAME_LOSS_RATE_ID, 0, ZSTR_FLR, UNIT_PERCENT, 0 }, { RSSI_ID, RSSI_ID, 0, ZSTR_RSSI, UNIT_DB, 0 }, #if defined(MULTIMODULE) { TX_RSSI_ID, TX_RSSI_ID, 0, ZSTR_TX_RSSI , UNIT_DB , 0 }, diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 0d15c3c0c..d2768ae87 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -23,6 +23,9 @@ #include "frsky.h" #include "crossfire.h" +#include "myeeprom.h" +#include "io/frsky_sport.h" + #if defined(MULTIMODULE) #include "spektrum.h" #include "flysky_ibus.h" diff --git a/radio/src/telemetry/telemetry_holders.h b/radio/src/telemetry/telemetry_holders.h index 70b2b6a9c..9db8d629f 100644 --- a/radio/src/telemetry/telemetry_holders.h +++ b/radio/src/telemetry/telemetry_holders.h @@ -22,6 +22,7 @@ #define _TELEMETRY_HOLDERS_H_ #include +#include #include "../timers.h" #define TELEMETRY_AVERAGE_COUNT 3 // we actually average one more reading! diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 1cd1c98a8..293e5abf8 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -428,6 +428,8 @@ const char STR_FIRMWARE_UPDATE_SUCCESS[] = TR_FIRMWARE_UPDATE_SUCCESS; const char STR_WRITING[] = TR_WRITING; const char STR_FLASH_EXTERNAL_DEVICE[] = TR_FLASH_EXTERNAL_DEVICE; const char STR_FLASH_RECEIVER_OTA[] = TR_FLASH_RECEIVER_OTA; +const char STR_FLASH_RECEIVER_OTA_BY_EXTERNAL[] = TR_FLASH_RECEIVER_OTA_BY_EXTERNAL; +const char STR_FLASH_RECEIVER_OTA_BY_INTERNAL[] = TR_FLASH_RECEIVER_OTA_BY_INTERNAL; const char STR_FLASH_BLUETOOTH_MODULE[] = TR_FLASH_BLUETOOTH_MODULE; const char STR_FLASH_POWER_MANAGEMENT_UNIT[] = TR_FLASH_POWER_MANAGEMENT_UNIT; const char STR_CONFIRM_FORMAT[] = TR_CONFIRM_FORMAT; diff --git a/radio/src/translations.h b/radio/src/translations.h index e11ad3197..7a28a4299 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -626,6 +626,8 @@ extern const char STR_VIEW_TEXT[]; extern const char STR_FLASH_BOOTLOADER[]; extern const char STR_FLASH_EXTERNAL_DEVICE[]; extern const char STR_FLASH_RECEIVER_OTA[]; +extern const char STR_FLASH_RECEIVER_OTA_BY_EXTERNAL[]; +extern const char STR_FLASH_RECEIVER_OTA_BY_INTERNAL[]; extern const char STR_FLASH_BLUETOOTH_MODULE[]; extern const char STR_FLASH_POWER_MANAGEMENT_UNIT[]; extern const char STR_CURRENT_VERSION[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index dbcab44a5..0033d2c49 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -821,6 +821,8 @@ #define TR_FLASH_BOOTLOADER "Flash bootloaderu" #define TR_FLASH_EXTERNAL_DEVICE TR("Flash S.Portem", "Flash S.Portem") #define TR_FLASH_RECEIVER_OTA "Flash příjímače OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash modulu BT", "Flash modulu Bluetooth") #define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash řízení spotř.", "Flash jednotky řízení spotřeby") #define TR_CURRENT_VERSION TR("Současná ver. ", "Současná verze: ") @@ -1165,6 +1167,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 431ad44b8..1e9d99231 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -823,6 +823,8 @@ #define TR_FLASH_BOOTLOADER TR("Flash bootloader","Flash bootloader") // #define TR_FLASH_EXTERNAL_DEVICE TR("Flash ext. Gerät","Flash externes Gerät") #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetoothmodul") #define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit") #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") @@ -1171,6 +1173,7 @@ #define TR_AUTH_FAILURE "Auth-failure" // ---------------------------------------------------------------- +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 91715127d..230b69b9b 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -822,6 +822,8 @@ #define TR_FLASH_BOOTLOADER "Flash bootloader" #define TR_FLASH_EXTERNAL_DEVICE TR("Flash S.Port", "Flash S.Port device") #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") #define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Curr Vers: ", "Current version: ") @@ -1169,6 +1171,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index c6943a0f1..fba624466 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -842,6 +842,8 @@ #define TR_FLASH_BOOTLOADER "Flash bootloader" #define TR_FLASH_EXTERNAL_DEVICE "Flash disp. externo" #define TR_FLASH_RECEIVER_OTA "Flash RX OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash modulo BT", "Flash modulo bluetooth") #define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash unid. pwr mngt" #define TR_CURRENT_VERSION TR("Vers. actual", "Version actual: ") @@ -1187,6 +1189,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltaje") #define TR_AUTH_FAILURE "Fallo auth." +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index f8740cdef..d917e82f5 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -840,6 +840,8 @@ #define TR_FLASH_BOOTLOADER "Flash bootloader" #define TR_FLASH_EXTERNAL_DEVICE "Flash External Device" #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") #define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") @@ -1178,6 +1180,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 115dab994..fad12d2b9 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -842,6 +842,8 @@ #define TR_FLASH_BOOTLOADER "Flasher BootLoader" #define TR_FLASH_EXTERNAL_DEVICE TR("Flasher S.Port", "Flasher S.Port externe") #define TR_FLASH_RECEIVER_OTA "Flasher RX OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash module BT", "Flash module Bluetooth") #define TR_FLASH_POWER_MANAGEMENT_UNIT "Flasher pwr mngt unit" #define TR_CURRENT_VERSION "Version courante :" @@ -1193,6 +1195,7 @@ #define TR_RTC_CHECK TR("Vérif. RTC", "Vérif. pile RTC") #define TR_AUTH_FAILURE "Auth-failure" +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 486e7fbf0..cb2b3c736 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -842,6 +842,8 @@ #define TR_FLASH_BOOTLOADER "Prog. bootloader" #define TR_FLASH_EXTERNAL_DEVICE "Progr. dispositivo Esterno" #define TR_FLASH_RECEIVER_OTA TR("Prog. RX OTA", INDENT "Prog. ricevente OTA") +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Prog. mod. BT", INDENT "Prog. modulo Bluetooth") #define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Prog. PMU", "Program. PMU") #define TR_CURRENT_VERSION TR("Vers. currente ", "Versione corrente: ") @@ -1187,6 +1189,7 @@ #define TR_RTC_CHECK TR("Controllo RTC", "Controllo voltaggio RTC") #define TR_AUTH_FAILURE "Auth-failure" +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 9f3173d6c..abda9557a 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -828,6 +828,8 @@ #define TR_FLASH_BOOTLOADER "Flash bootloader" #define TR_FLASH_EXTERNAL_DEVICE "Flash extern Apparaat" #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") #define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") @@ -1179,6 +1181,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 4e8915ce2..606a45895 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -841,6 +841,8 @@ #define TR_FLASH_BOOTLOADER "Flash bootloader" #define TR_FLASH_EXTERNAL_DEVICE "Sflashuj Moduł Zewnętrzny" #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") #define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") @@ -1186,6 +1188,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 90d3dcb9d..29533d2c5 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -831,6 +831,8 @@ #define TR_FLASH_BOOTLOADER "Flash bootloader" #define TR_FLASH_EXTERNAL_DEVICE "Flash External Device" #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") #define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") @@ -1175,6 +1177,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 8b47e3fda..eaacd2905 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -841,6 +841,8 @@ #define TR_FLASH_BOOTLOADER "Skriv BootLoader" #define TR_FLASH_EXTERNAL_DEVICE "Flash External Device" #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") #define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") @@ -1186,6 +1188,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR"