Merge branch '2.3' into 3djc/TX16s-2.3

# Conflicts:
#	radio/src/translations/es.h.txt
This commit is contained in:
Kilrah
2020-04-24 12:14:54 +02:00
82 changed files with 2560 additions and 465 deletions
+1
View File
@@ -40,6 +40,7 @@
#define drawFieldLabel(x, y, str) lcdDrawTextAlignedLeft(y, str)
#define NUM_BODY_LINES (LCD_LINES-1)
#define TEXT_VIEWER_LINES NUM_BODY_LINES
#define MENU_HEADER_HEIGHT FH
#define CURVE_SIDE_WIDTH (LCD_H/2)
+23 -4
View File
@@ -313,7 +313,7 @@ void onBluetoothConnectMenu(const char * result)
MULTIMODULE_SUBTYPE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_SUBTYPE */ \
MULTIMODULE_STATUS_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_STATUS, ITEM_MODEL_SETUP_INTERNAL_MODULE_SYNCSTATUS */ \
MODULE_CHANNELS_ROWS(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS */ \
IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(IF_INTERNAL_MODULE_ON(isModuleRxNumAvailable(INTERNAL_MODULE) ? (uint8_t)2 : (uint8_t)1))), /* *ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE */\
IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(IF_INTERNAL_MODULE_ON(MODULE_BIND_ROWS(INTERNAL_MODULE)))), /* *ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE */\
IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM */ \
MODULE_OPTION_ROW(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_OPTIONS */ \
MULTIMODULE_MODULE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_AUTOBIND */ \
@@ -1000,7 +1000,25 @@ void menuModelSetup(event_t event)
lcdDrawMultiProtocolString(MODEL_SETUP_2ND_COLUMN, y, moduleIdx, multi_rfProto, attr);
if (attr) {
int multiRfProto = g_model.moduleData[moduleIdx].getMultiProtocol();
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
if (status.isValid()) {
int8_t direction = checkIncDec(event, 0, -1, 1);
if (direction == -1) {
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX_RX;
else
multiRfProto = convertMultiToOtx(status.protocolPrev);
}
if (direction == 1) {
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX2;
else
multiRfProto = convertMultiToOtx(status.protocolNext);
}
}
else {
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
}
if (checkIncDec_Ret) {
g_model.moduleData[moduleIdx].setMultiProtocol(multiRfProto);
g_model.moduleData[moduleIdx].subType = 0;
@@ -1326,7 +1344,8 @@ void menuModelSetup(event_t event)
}
}
lcdDrawText(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, l_posHorz==1 ? attr : 0);
lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0);
if (!IS_RX_MULTI(moduleIdx))
lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0);
uint8_t newFlag = 0;
#if defined(MULTIMODULE)
if (getMultiBindStatus(moduleIdx) == MULTI_BIND_FINISHED) {
@@ -1586,7 +1605,7 @@ void menuModelSetup(event_t event)
}
#if defined(MULTIMODULE)
else if (isModuleMultimodule(moduleIdx)) {
module.multi.lowPowerMode = editCheckBox(module.multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event);
module.multi.lowPowerMode = editCheckBox(module.multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, IS_RX_MULTI(moduleIdx) ? STR_MULTI_LNA_DISABLE : STR_MULTI_LOWPOWER, attr, event);
}
#endif
-4
View File
@@ -128,10 +128,6 @@ void menuChannelsView(event_t event)
case EVT_KEY_PREVIOUS_PAGE:
g_eeGeneral.view = (g_eeGeneral.view + (4 * ALTERNATE_VIEW) - ALTERNATE_VIEW) % (4 * ALTERNATE_VIEW);
break;
case EVT_KEY_FIRST(KEY_ENTER):
reusableBuffer.viewChannels.mixersView = !reusableBuffer.viewChannels.mixersView;
break;
}
menuChannelsViewCommon(event);
+1
View File
@@ -32,6 +32,7 @@
#define DEFAULT_SCROLLBAR_X (LCD_W-1)
#define NUM_BODY_LINES (LCD_LINES-1)
#define TEXT_VIEWER_LINES NUM_BODY_LINES
#define MENU_HEADER_HEIGHT FH
#define MODEL_BITMAP_WIDTH 64
+29 -5
View File
@@ -907,7 +907,25 @@ void menuModelSetup(event_t event)
switch (menuHorizontalPosition) {
case 0: {
int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol();
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
MultiModuleStatus &status = getMultiModuleStatus(EXTERNAL_MODULE);
if (status.isValid()) {
int8_t direction = checkIncDec(event, 0, -1, 1);
if (direction == -1) {
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX_RX;
else
multiRfProto = convertMultiToOtx(status.protocolPrev);
}
if (direction == 1) {
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX2;
else
multiRfProto = convertMultiToOtx(status.protocolNext);
}
}
else {
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
}
if (checkIncDec_Ret) {
g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(multiRfProto);
g_model.moduleData[EXTERNAL_MODULE].subType = 0;
@@ -1122,8 +1140,13 @@ void menuModelSetup(event_t event)
lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM);
}
if (isModuleBindRangeAvailable(moduleIdx)) {
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2);
bindButtonPos = lcdNextPos + FW;
if (!IS_RX_MULTI(moduleIdx)) {
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz == 0 ? attr : 0) | LEADING0 | LEFT, 2);
bindButtonPos = lcdNextPos + FW;
}
else {
bindButtonPos = MODEL_SETUP_2ND_COLUMN;
}
if (attr && l_posHorz==0) {
if (s_editMode>0) {
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx));
@@ -1141,7 +1164,8 @@ void menuModelSetup(event_t event)
}
}
lcdDrawText(bindButtonPos, y, STR_MODULE_BIND, l_posHorz==1 ? attr : 0);
lcdDrawText(lcdNextPos + FW, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0);
if (!IS_RX_MULTI(moduleIdx))
lcdDrawText(lcdNextPos + FW, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0);
uint8_t newFlag = 0;
#if defined(MULTIMODULE)
if (getMultiBindStatus(moduleIdx) == MULTI_BIND_FINISHED) {
@@ -1306,7 +1330,7 @@ void menuModelSetup(event_t event)
}
#if defined (MULTIMODULE)
else if (isModuleMultimodule(moduleIdx)) {
g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event);
g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, IS_RX_MULTI(moduleIdx) ? STR_MULTI_LNA_DISABLE : STR_MULTI_LOWPOWER, attr, event);
}
#endif
break;
+1
View File
@@ -47,6 +47,7 @@
#define FH 20
#define NUM_BODY_LINES (MENU_BODY_HEIGHT / FH)
#define TEXT_VIEWER_LINES ((MENU_FOOTER_TOP-MENU_HEADER_HEIGHT) / FH)
#define INVERT_HORZ_MARGIN 2
#define INVERT_VERT_MARGIN 1
+2 -2
View File
@@ -25,8 +25,8 @@ const uint8_t LBM_LAYOUT_1x1[] = {
};
const ZoneOption OPTIONS_LAYOUT_1x1[] = {
{ "Top bar", ZoneOption::Bool },
{ "Sliders+Trims", ZoneOption::Bool },
{ STR_TOP_BAR, ZoneOption::Bool },
{ STR_SLIDERS_TRIMS, ZoneOption::Bool },
{ NULL, ZoneOption::Bool }
};
+4 -4
View File
@@ -25,10 +25,10 @@ const uint8_t LBM_LAYOUT_2P1[] = {
};
const ZoneOption OPTIONS_LAYOUT_2P1[] = {
{ "Top bar", ZoneOption::Bool },
{ "Flight mode", ZoneOption::Bool },
{ "Sliders", ZoneOption::Bool },
{ "Trims", ZoneOption::Bool },
{ STR_TOP_BAR, ZoneOption::Bool },
{ STR_FLIGHT_MODE, ZoneOption::Bool },
{ STR_SLIDERS, ZoneOption::Bool },
{ STR_TRIMS, ZoneOption::Bool },
{ NULL, ZoneOption::Bool }
};
+1 -1
View File
@@ -25,7 +25,7 @@ const uint8_t LBM_LAYOUT_2x1[] = {
};
const ZoneOption OPTIONS_LAYOUT_2x1[] = {
{ "Top bar", ZoneOption::Bool },
{ STR_TOP_BAR, ZoneOption::Bool },
{ NULL, ZoneOption::Bool }
};
+1 -1
View File
@@ -25,7 +25,7 @@ const uint8_t LBM_LAYOUT_2x2[] = {
};
const ZoneOption OPTIONS_LAYOUT_2x2[] = {
{ "Top bar", ZoneOption::Bool },
{ STR_TOP_BAR, ZoneOption::Bool },
{ NULL, ZoneOption::Bool }
};
+8 -8
View File
@@ -25,14 +25,14 @@ const uint8_t LBM_LAYOUT_2x4[] = {
};
const ZoneOption OPTIONS_LAYOUT_2x4[] = {
{ "Top bar", ZoneOption::Bool },
{ "Flight mode", ZoneOption::Bool },
{ "Sliders", ZoneOption::Bool },
{ "Trims", ZoneOption::Bool },
{ "Panel1 background", ZoneOption::Bool },
{ " Color", ZoneOption::Color },
{ "Panel2 background", ZoneOption::Bool },
{ " Color", ZoneOption::Color },
{ STR_TOP_BAR, ZoneOption::Bool },
{ STR_FLIGHT_MODE, ZoneOption::Bool },
{ STR_SLIDERS, ZoneOption::Bool },
{ STR_TRIMS, ZoneOption::Bool },
{ STR_PANEL1_BACKGROUND, ZoneOption::Bool },
{ INDENT TR_COLOR, ZoneOption::Color },
{ STR_PANEL2_BACKGROUND, ZoneOption::Bool },
{ INDENT TR_COLOR, ZoneOption::Color },
{ NULL, ZoneOption::Bool }
};
+4 -4
View File
@@ -339,9 +339,9 @@ void drawDate(coord_t x, coord_t y, TelemetryItem & telemetryItem, LcdFlags att)
att &= ~FONTSIZE_MASK;
lcdDrawNumber(x, y, telemetryItem.datetime.day, att|LEADING0|LEFT, 2);
lcdDrawChar(lcdNextPos-1, y, '-', att);
lcdDrawNumber(lcdNextPos-1, y, telemetryItem.datetime.month, att|LEFT, 2);
lcdDrawNumber(lcdNextPos-1, y, telemetryItem.datetime.month, att|LEADING0|LEFT, 2);
lcdDrawChar(lcdNextPos-1, y, '-', att);
lcdDrawNumber(lcdNextPos-1, y, telemetryItem.datetime.year-2000, att|LEFT);
lcdDrawNumber(lcdNextPos-1, y, telemetryItem.datetime.year-2000, att|LEADING0|LEFT);
y += FH;
lcdDrawNumber(x, y, telemetryItem.datetime.hour, att|LEADING0|LEFT, 2);
lcdDrawChar(lcdNextPos, y, ':', att);
@@ -352,9 +352,9 @@ void drawDate(coord_t x, coord_t y, TelemetryItem & telemetryItem, LcdFlags att)
else {
lcdDrawNumber(x, y, telemetryItem.datetime.day, att|LEADING0|LEFT, 2);
lcdDrawChar(lcdNextPos-1, y, '-', att);
lcdDrawNumber(lcdNextPos, y, telemetryItem.datetime.month, att|LEFT, 2);
lcdDrawNumber(lcdNextPos, y, telemetryItem.datetime.month, att|LEADING0|LEFT, 2);
lcdDrawChar(lcdNextPos-1, y, '-', att);
lcdDrawNumber(lcdNextPos, y, telemetryItem.datetime.year-2000, att|LEFT);
lcdDrawNumber(lcdNextPos, y, telemetryItem.datetime.year-2000, att|LEADING0|LEFT);
lcdDrawNumber(lcdNextPos+11, y, telemetryItem.datetime.hour, att|LEADING0|LEFT, 2);
lcdDrawChar(lcdNextPos, y, ':', att);
lcdDrawNumber(lcdNextPos, y, telemetryItem.datetime.min, att|LEADING0|LEFT, 2);
+2
View File
@@ -560,6 +560,8 @@ inline void CLEAR_POPUP()
warningInfoText = nullptr;
popupMenuHandler = nullptr;
popupMenuItemsCount = 0;
// TODO ? popupFunc = nullptr;
putEvent(EVT_REFRESH);
}
inline void POPUP_WAIT(const char * s)
+1 -1
View File
@@ -133,7 +133,7 @@ bool menuModelCurveOne(event_t event)
// Curve type
LcdFlags attr = (menuVerticalPosition==ITEM_CURVE_TYPE ? (s_editMode>0 ? INVERS|BLINK : INVERS) : 0);
lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP, "Type");
lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP, STR_TYPE);
lcdDrawTextAtIndex(MODEL_CURVE_ONE_2ND_COLUMN, MENU_CONTENT_TOP, STR_CURVE_TYPES, crv.type, attr);
if (attr) {
uint8_t newType = checkIncDecModelZero(event, crv.type, CURVE_TYPE_LAST);
+1 -1
View File
@@ -60,7 +60,7 @@ bool menuModelFailsafe(event_t event)
}
SIMPLE_SUBMENU_WITH_OPTIONS("FAILSAFE", ICON_STATS_ANALOGS, sentModuleChannels(g_moduleIdx)+1, OPTION_MENU_NO_SCROLLBAR);
drawStringWithIndex(50, 3+FH, "Module", g_moduleIdx+1, MENU_TITLE_COLOR);
drawStringWithIndex(50, 3+FH, STR_MODULE, g_moduleIdx+1, MENU_TITLE_COLOR);
for (uint8_t col=0; col < cols; col++) {
for (uint8_t line=0; line < 8; line++) {
+2
View File
@@ -607,6 +607,8 @@ bool menuModelMixAll(event_t event)
if (!s_copyMode) {
attr = INVERS;
}
if (g_model.limitData[ch-1].name[0] != '\0')
lcdDrawSizedText(MENUS_MARGIN_LEFT, MENU_FOOTER_TOP, g_model.limitData[ch-1].name, sizeof(g_model.limitData[ch-1].name), MENU_TITLE_COLOR | LEFT | ZCHAR);
}
if (cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES) {
putsChn(MENUS_MARGIN_LEFT, y, ch, attr); // show CHx
+1 -1
View File
@@ -279,7 +279,7 @@ void onModelSelectMenu(const char * result)
setCurrentModel(currentCategory->size() - 1);
}
else {
POPUP_WARNING("Invalid File");
POPUP_WARNING(STR_INVALID_FILE);
}
}
else if (result == STR_MOVE_MODEL) {
+27 -10
View File
@@ -788,7 +788,7 @@ bool menuModelSetup(event_t event)
case ITEM_MODEL_SETUP_DISPLAY_TRIMS:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_DISPLAY_TRIMS);
g_model.displayTrims = editChoice(MODEL_SETUP_2ND_COLUMN, y, "\006No\0 ChangeYes", g_model.displayTrims, 0, 2, attr, event);
g_model.displayTrims = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_VDISPLAYTRIMS, g_model.displayTrims, 0, 2, attr, event);
break;
case ITEM_MODEL_SETUP_TRIM_INC:
@@ -1018,10 +1018,6 @@ bool menuModelSetup(event_t event)
uint8_t moduleType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].type, MODULE_TYPE_NONE, MODULE_TYPE_MAX, EE_MODEL, isInternalModuleAvailable);
if (checkIncDec_Ret) {
setModuleType(INTERNAL_MODULE, moduleType);
#if defined(ACCESS_LIB)
// the module will reset on mode switch, we need to reset the authentication counter
globalData.authenticationCount = 0;
#endif
}
}
else if (isModuleXJT(INTERNAL_MODULE)) {
@@ -1034,6 +1030,7 @@ bool menuModelSetup(event_t event)
}
else if (isModulePXX2(INTERNAL_MODULE)) {
g_model.moduleData[INTERNAL_MODULE].subType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].subType, 0, MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16, EE_MODEL);
resetAccessAuthenticationCount();
}
}
break;
@@ -1115,9 +1112,27 @@ bool menuModelSetup(event_t event)
if (isModuleDSM2(moduleIdx))
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX);
#if defined(MULTIMODULE)
else if (isModuleMultimodule(moduleIdx)) {
else if (isModuleMultimodule(moduleIdx)) {
int multiRfProto = g_model.moduleData[moduleIdx].getMultiProtocol();
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
if (status.isValid()) {
int8_t direction = checkIncDec(event, 0, -1, 1);
if (direction == -1) {
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX_RX;
else
multiRfProto = convertMultiToOtx(status.protocolPrev);
}
if (direction == 1) {
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX2;
else
multiRfProto = convertMultiToOtx(status.protocolNext);
}
}
else {
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
}
if (checkIncDec_Ret) {
g_model.moduleData[moduleIdx].setMultiProtocol(multiRfProto);
g_model.moduleData[moduleIdx].subType = 0;
@@ -1339,7 +1354,8 @@ bool menuModelSetup(event_t event)
{
lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_MODULE);
drawButton(MODEL_SETUP_2ND_COLUMN, y, STR_REGISTER, (menuHorizontalPosition == 0 ? attr : 0));
drawButton(MODEL_SETUP_2ND_COLUMN + MODEL_SETUP_SET_FAILSAFE_OFS, y, STR_MODULE_RANGE, (menuHorizontalPosition == 1 ? attr : 0));
if (!IS_RX_MULTI(moduleIdx))
drawButton(MODEL_SETUP_2ND_COLUMN + MODEL_SETUP_SET_FAILSAFE_OFS, y, STR_MODULE_RANGE, (menuHorizontalPosition == 1 ? attr : 0));
if (attr) {
if (moduleState[moduleIdx].mode == MODULE_MODE_NORMAL && s_editMode > 0) {
if (menuHorizontalPosition == 0 && event == EVT_KEY_BREAK(KEY_ENTER)) {
@@ -1523,7 +1539,8 @@ bool menuModelSetup(event_t event)
}
}
drawButton(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, (moduleState[moduleIdx].mode == MODULE_MODE_BIND ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==1 ? attr : 0));
drawButton(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, (moduleState[moduleIdx].mode == MODULE_MODE_RANGECHECK ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==2 ? attr : 0));
if (!IS_RX_MULTI(moduleIdx))
drawButton(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, (moduleState[moduleIdx].mode == MODULE_MODE_RANGECHECK ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==2 ? attr : 0));
uint8_t newFlag = 0;
#if defined(MULTIMODULE)
if (getMultiBindStatus(moduleIdx) == MULTI_BIND_FINISHED) {
@@ -1686,7 +1703,7 @@ bool menuModelSetup(event_t event)
}
#if defined(MULTIMODULE)
else if (isModuleMultimodule(moduleIdx)) {
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_LOWPOWER);
lcdDrawText(MENUS_MARGIN_LEFT, y, IS_RX_MULTI(moduleIdx) ? STR_MULTI_LNA_DISABLE : STR_MULTI_LOWPOWER);
g_model.moduleData[moduleIdx].multi.lowPowerMode = editCheckBox(g_model.moduleData[moduleIdx].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, attr, event);
}
#endif
+1 -1
View File
@@ -193,7 +193,7 @@ bool menuRadioHardware(event_t event)
LcdFlags attr = (sub == k ? ((s_editMode>0) ? BLINK|INVERS : INVERS) : 0);
switch (k) {
case ITEM_RADIO_HARDWARE_CALIBRATION:
lcdDrawText(MENUS_MARGIN_LEFT, y, "Calibration", attr);
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_CALIBRATION, attr);
if (attr && s_editMode>0) {
pushMenu(menuRadioCalibration);
}
+1 -4
View File
@@ -50,10 +50,7 @@ bool menuRadioPowerMeter(event_t event)
lcdDrawCenteredText(LCD_H/2, STR_STOPPING);
lcdRefresh();
moduleState[g_moduleIdx].readModuleInformation(&reusableBuffer.moduleSetup.pxx2.moduleInformation, PXX2_HW_INFO_TX_ID, PXX2_HW_INFO_TX_ID);
#if defined(ACCESS_LIB)
// the module will reset on mode switch, we need to reset the authentication counter
globalData.authenticationCount = 0;
#endif
resetAccessAuthenticationCount();
/* wait 1s to resume normal operation before leaving */
watchdogSuspend(500 /*5s*/);
RTOS_WAIT_MS(1000);
+2 -1
View File
@@ -97,6 +97,7 @@ void onUpdateConfirmation(const char * result)
OtaUpdateInformation * destination = moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].otaUpdateInformation;
Pxx2OtaUpdate otaUpdate(reusableBuffer.sdManager.otaUpdateInformation.module, destination->candidateReceiversNames[destination->selectedReceiverIndex]);
otaUpdate.flashFirmware(destination->filename);
putEvent(EVT_REFRESH);
}
else {
moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL;
@@ -563,7 +564,7 @@ bool menuRadioSdManager(event_t _event)
if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount > 0) {
if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount != popupMenuItemsCount) {
CLEAR_POPUP();
popupMenuItemsCount = min<uint8_t>(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount,PXX2_MAX_RECEIVERS_PER_MODULE);
popupMenuItemsCount = min<uint8_t>(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE);
for (auto rx = 0; rx < popupMenuItemsCount; rx++) {
popupMenuItems[rx] = reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversNames[rx];
}
@@ -58,10 +58,7 @@ bool menuRadioSpectrumAnalyser(event_t event)
lcdRefresh();
if (isModulePXX2(g_moduleIdx)) {
moduleState[g_moduleIdx].readModuleInformation(&reusableBuffer.moduleSetup.pxx2.moduleInformation, PXX2_HW_INFO_TX_ID, PXX2_HW_INFO_TX_ID);
#if defined(ACCESS_LIB)
// the module will reset on mode switch, we need to reset the authentication counter
globalData.authenticationCount = 0;
#endif
resetAccessAuthenticationCount();
}
else if (isModuleMultimodule(g_moduleIdx)) {
if (reusableBuffer.spectrumAnalyser.moduleOFF)
+2 -2
View File
@@ -121,7 +121,7 @@ bool editZoneOption(coord_t y, const ZoneOption * option, ZoneOptionValue * valu
}
}
else if (option->type == ZoneOption::TextSize) {
lcdDrawTextAtIndex(SCREENS_SETUP_2ND_COLUMN, y, "\010StandardTiny\0 Small\0 Mid\0 Double", value->unsignedValue, attr);
lcdDrawTextAtIndex(SCREENS_SETUP_2ND_COLUMN, y, STR_TEXT_SIZE, value->unsignedValue, attr);
if (attr) {
value->unsignedValue = checkIncDec(event, value->unsignedValue, 0, 4, i_flags);
}
@@ -558,7 +558,7 @@ bool menuScreenSetup(int index, event_t event)
currentContainer = currentScreen;
bool needsOffsetCheck = (menuVerticalPosition != 0 || menuHorizontalPosition < 0);
char title[] = "Main view X";
char title[] = TR_MAIN_VIEW_X;
title[sizeof(title)-2] = '1' + index;
menuPageCount = updateMainviewsMenu();
+4 -4
View File
@@ -42,7 +42,7 @@ bool menuTextView(event_t event)
break;
case EVT_ROTARY_RIGHT:
if (menuVerticalOffset + NUM_BODY_LINES >= lines_count)
if (menuVerticalOffset + TEXT_VIEWER_LINES >= lines_count)
break;
else
++menuVerticalOffset;
@@ -55,11 +55,11 @@ bool menuTextView(event_t event)
break;
}
for (int i=0; i<NUM_BODY_LINES; i++) {
lcd->drawTextMaxWidth(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + i * FH, reusableBuffer.viewText.lines[i], 0, LCD_W - 2 * MENUS_MARGIN_LEFT);
for (int i = 0; i < TEXT_VIEWER_LINES; i++) {
lcd->drawTextMaxWidth(MENUS_MARGIN_LEFT, MENU_HEADER_HEIGHT + i * FH, reusableBuffer.viewText.lines[i], 0, LCD_W - 2 * MENUS_MARGIN_LEFT);
}
drawVerticalScrollbar(LCD_W-5, 50, 195, menuVerticalOffset, lines_count, NUM_BODY_LINES);
drawVerticalScrollbar(LCD_W-5, 50, 195, menuVerticalOffset, lines_count, TEXT_VIEWER_LINES);
return true;
}
+4 -4
View File
@@ -34,10 +34,10 @@ class GaugeWidget: public Widget
};
const ZoneOption GaugeWidget::options[] = {
{ "Source", ZoneOption::Source, OPTION_VALUE_UNSIGNED(1) },
{ "Min", ZoneOption::Integer, OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(RESX) },
{ "Max", ZoneOption::Integer, OPTION_VALUE_SIGNED(RESX), OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(RESX) },
{ "Color", ZoneOption::Color, OPTION_VALUE_UNSIGNED(RED) },
{ STR_SOURCE, ZoneOption::Source, OPTION_VALUE_UNSIGNED(1) },
{ STR_MIN, ZoneOption::Integer, OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(RESX) },
{ STR_MAX, ZoneOption::Integer, OPTION_VALUE_SIGNED(RESX), OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(RESX) },
{ STR_COLOR, ZoneOption::Color, OPTION_VALUE_UNSIGNED(RED) },
{ NULL, ZoneOption::Bool }
};
+3 -3
View File
@@ -86,9 +86,9 @@ class OutputsWidget: public Widget
};
const ZoneOption OutputsWidget::options[] = {
{ "First channel", ZoneOption::Integer, OPTION_VALUE_UNSIGNED(1), OPTION_VALUE_UNSIGNED(1), OPTION_VALUE_UNSIGNED(32) },
{ "Fill Background?", ZoneOption::Bool, OPTION_VALUE_BOOL(false) },
{ "BG Color", ZoneOption::Color, OPTION_VALUE_UNSIGNED(LIGHTGREY) },
{ STR_FIRST_CHANNEL, ZoneOption::Integer, OPTION_VALUE_UNSIGNED(1), OPTION_VALUE_UNSIGNED(1), OPTION_VALUE_UNSIGNED(32) },
{ STR_FILL_BACKGROUND, ZoneOption::Bool, OPTION_VALUE_BOOL(false) },
{ STR_BG_COLOR, ZoneOption::Color, OPTION_VALUE_UNSIGNED(LIGHTGREY) },
{ NULL, ZoneOption::Bool }
};
+4 -4
View File
@@ -36,10 +36,10 @@ class TextWidget: public Widget
};
const ZoneOption TextWidget::options[] = {
{ "Text", ZoneOption::String, OPTION_VALUE_STRING(TEXT_WIDGET_DEFAULT_LABEL) },
{ "Color", ZoneOption::Color, OPTION_VALUE_UNSIGNED(RED) },
{ "Size", ZoneOption::TextSize, OPTION_VALUE_UNSIGNED(0) },
{ "Shadow", ZoneOption::Bool, OPTION_VALUE_BOOL(false) },
{ STR_TEXT, ZoneOption::String, OPTION_VALUE_STRING(TEXT_WIDGET_DEFAULT_LABEL) },
{ STR_COLOR, ZoneOption::Color, OPTION_VALUE_UNSIGNED(RED) },
{ STR_SIZE, ZoneOption::TextSize, OPTION_VALUE_UNSIGNED(0) },
{ STR_SHADOW, ZoneOption::Bool, OPTION_VALUE_BOOL(false) },
{ NULL, ZoneOption::Bool }
};
+1 -1
View File
@@ -34,7 +34,7 @@ class TimerWidget: public Widget
};
const ZoneOption TimerWidget::options[] = {
{ "Timer source", ZoneOption::Timer, OPTION_VALUE_UNSIGNED(0) },
{ STR_TIMER_SOURCE, ZoneOption::Timer, OPTION_VALUE_UNSIGNED(0) },
{ NULL, ZoneOption::Bool }
};
+3 -3
View File
@@ -34,9 +34,9 @@ class ValueWidget: public Widget
};
const ZoneOption ValueWidget::options[] = {
{ "Source", ZoneOption::Source, OPTION_VALUE_UNSIGNED(MIXSRC_Rud) },
{ "Color", ZoneOption::Color, OPTION_VALUE_UNSIGNED(WHITE) },
{ "Shadow", ZoneOption::Bool, OPTION_VALUE_BOOL(false) },
{ STR_SOURCE, ZoneOption::Source, OPTION_VALUE_UNSIGNED(MIXSRC_Rud) },
{ STR_COLOR, ZoneOption::Color, OPTION_VALUE_UNSIGNED(WHITE) },
{ STR_SHADOW, ZoneOption::Bool, OPTION_VALUE_BOOL(false) },
{ NULL, ZoneOption::Bool }
};
@@ -576,7 +576,7 @@ void menuRadioSdManager(event_t _event)
if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount > 0) {
if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount != popupMenuItemsCount) {
CLEAR_POPUP();
popupMenuItemsCount = min<uint8_t>(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount,PXX2_MAX_RECEIVERS_PER_MODULE);
popupMenuItemsCount = min<uint8_t>(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE);
for (auto rx = 0; rx < popupMenuItemsCount; rx++) {
popupMenuItems[rx] = reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversNames[rx];
}
@@ -92,7 +92,7 @@ void menuViewTelemetry(event_t event)
}
drawTelemetryTopBar();
lcdDrawText(LCD_W / 2, 3 * FH, "No Telemetry Screens", CENTERED);
lcdDrawText(LCD_W / 2, 3 * FH, STR_NO_TELEMETRY_SCREENS, CENTERED);
displayRssiLine();
}
+30 -6
View File
@@ -789,7 +789,7 @@ int getFirstAvailable(int min, int max, IsValueAvailable isValueAvailable)
#if defined(MULTIMODULE)
// This maps OpenTX multi type with Pascal's Multi type
uint8_t convertMultiProtocol(uint8_t moduleIdx, uint8_t type)
uint8_t multiConvertOtxToMulti(uint8_t moduleIdx, uint8_t type)
{
// 15 for Multimodule is FrskyX or D16 which we map as a subprotocol of 3 (FrSky)
@@ -803,7 +803,7 @@ uint8_t convertMultiProtocol(uint8_t moduleIdx, uint8_t type)
if (type == MODULE_SUBTYPE_MULTI_FRSKY) {
int subtype = g_model.moduleData[moduleIdx].subType;
if (subtype == MM_RF_FRSKY_SUBTYPE_D8) {
if (subtype == MM_RF_FRSKY_SUBTYPE_D8 || subtype == MM_RF_FRSKY_SUBTYPE_D8_CLONED) {
//D8
type = 3;
}
@@ -818,6 +818,27 @@ uint8_t convertMultiProtocol(uint8_t moduleIdx, uint8_t type)
return type;
}
// This maps multi type to OpenTX number, type ONLY (no subtype)
int convertMultiToOtx(int type)
{
if (type == 3) //FrSkyD
return MODULE_SUBTYPE_MULTI_FRSKY;
if (type == 15) //FrSkyX
return MODULE_SUBTYPE_MULTI_FRSKY;
if (type == 25) //FrSkyV
return MODULE_SUBTYPE_MULTI_FRSKY;
if (type > 25)
type = type - 1;
if (type > 15)
type = type - 1;
return type - 1; //Multi list starts at 1
}
// Third row is number of subtypes -1 (max valid subtype)
#define NO_SUBTYPE nullptr
@@ -831,8 +852,8 @@ uint8_t convertMultiProtocol(uint8_t moduleIdx, uint8_t type)
const char STR_SUBTYPE_FLYSKY[] = "\004""Std\0""V9x9""V6x6""V912""CX20";
const char STR_SUBTYPE_HUBSAN[] = "\004""H107""H301""H501";
const char STR_SUBTYPE_FRSKY[] = "\007""D16\0 ""D8\0 ""D16 8ch""V8\0 ""LBT(EU)""LBT 8ch";
const char STR_SUBTYPE_FRSKYX2[] = "\007""D16\0 ""D16 8ch""LBT(EU)""LBT 8ch";
const char STR_SUBTYPE_FRSKY[] = "\011""D16\0 ""D8\0 ""D16 8ch\0 ""V8\0 ""LBT(EU)\0 ""LBT 8ch\0 ""D8Cloned\0""D16Cloned";
const char STR_SUBTYPE_FRSKYX2[] = "\011""D16\0 ""D16 8ch\0 ""LBT(EU)\0 ""LBT 8ch\0 ""D16Cloned";
const char STR_SUBTYPE_HISKY[] = "\005""Std\0 ""HK310";
const char STR_SUBTYPE_V2X2[] = "\006""Std\0 ""JXD506";
const char STR_SUBTYPE_DSM[] = "\006""2 22ms""2 11ms""X 22ms""X 11ms";
@@ -866,6 +887,7 @@ const char STR_SUBTYPE_ZSX[] = "\007""280JJRC";
const char STR_SUBTYPE_FLYZONE[] = "\005""FZ410";
const char STR_SUBTYPE_FX816[] = "\003""P38";
const char STR_SUBTYPE_ESKY150[] = "\003""4CH""7CH";
const char STR_SUBTYPE_FRSKYL[] = "\010""LR12\0 ""LR12 6ch";
const char* mm_options_strings::options[] = {
nullptr,
@@ -883,7 +905,7 @@ const mm_protocol_definition multi_protocols[] = {
// Protocol as defined in pulses\modules_constants.h, number of sub_protocols - 1, Failsafe supported, Disable channel mapping supported, Subtype string, Option type
{MODULE_SUBTYPE_MULTI_FLYSKY, 4, false, true, STR_SUBTYPE_FLYSKY, nullptr},
{MODULE_SUBTYPE_MULTI_HUBSAN, 2, false, false, STR_SUBTYPE_HUBSAN, STR_MULTI_VIDFREQ},
{MODULE_SUBTYPE_MULTI_FRSKY, 5, false, false, STR_SUBTYPE_FRSKY, STR_MULTI_RFTUNE},
{MODULE_SUBTYPE_MULTI_FRSKY, 7, false, false, STR_SUBTYPE_FRSKY, STR_MULTI_RFTUNE},
{MODULE_SUBTYPE_MULTI_HISKY, 1, false, true, STR_SUBTYPE_HISKY, nullptr},
{MODULE_SUBTYPE_MULTI_V2X2, 1, false, false, STR_SUBTYPE_V2X2, nullptr},
{MODULE_SUBTYPE_MULTI_DSM2, 3, false, true, STR_SUBTYPE_DSM, STR_MULTI_MAX_THROW},
@@ -924,7 +946,9 @@ const mm_protocol_definition multi_protocols[] = {
{MODULE_SUBTYPE_MULTI_ESKY150, 1, false, false, STR_SUBTYPE_ESKY150, nullptr},
{MODULE_SUBTYPE_MULTI_FX816, 0, false, false, STR_SUBTYPE_FX816, nullptr},
{MODULE_SUBTYPE_MULTI_HOTT, 0, true, false, NO_SUBTYPE, STR_MULTI_RFTUNE},
{MODULE_SUBTYPE_MULTI_FRSKYX2, 3, true, false, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE},
{MODULE_SUBTYPE_MULTI_FRSKYX2, 4, true, false, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE},
{MODULE_SUBTYPE_MULTI_PROPEL, 0, false, false, NO_SUBTYPE, nullptr},
{MODULE_SUBTYPE_MULTI_FRSKYL, 1, false, false, STR_SUBTYPE_FRSKYL, STR_MULTI_RFTUNE},
{MM_RF_CUSTOM_SELECTED, 7, true, true, NO_SUBTYPE, STR_MULTI_OPTION},
// Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff)
+8 -3
View File
@@ -122,6 +122,8 @@ void drawSensorCustomValue(coord_t x, coord_t y, uint8_t sensor, int32_t value,
void drawSourceCustomValue(coord_t x, coord_t y, source_t channel, int32_t val, LcdFlags flags=0);
void drawSourceValue(coord_t x, coord_t y, source_t channel, LcdFlags flags=0);
int convertMultiToOtx(int type);
void drawCurve(coord_t offset=0);
#if defined(COLORLCD)
@@ -139,6 +141,9 @@ void runFatalErrorScreen(const char * message);
inline uint8_t MODULE_BIND_ROWS(int moduleIdx)
{
if (IS_RX_MULTI(moduleIdx))
return 0;
if (isModuleXJTD8(moduleIdx) || isModuleSBUS(moduleIdx))
return 1;
@@ -150,7 +155,7 @@ inline uint8_t MODULE_BIND_ROWS(int moduleIdx)
inline uint8_t MODULE_CHANNELS_ROWS(int moduleIdx)
{
if (!IS_MODULE_ENABLED(moduleIdx))
if (!IS_MODULE_ENABLED(moduleIdx) || IS_RX_MULTI(moduleIdx))
return HIDDEN_ROW;
if (isModuleDSM2(moduleIdx) || isModuleCrossfire(moduleIdx) || isModuleSBUS(moduleIdx) || (isModuleMultimodule(moduleIdx) && g_model.moduleData[moduleIdx].getMultiProtocol() != MODULE_SUBTYPE_MULTI_DSM2))
@@ -250,14 +255,14 @@ inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx)
return false;
}
#define MULTIMODULE_MODULE_ROWS(moduleIdx) MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, MULTI_DISABLE_CHAN_MAP_ROW(moduleIdx), // AUTOBIND, DISABLE TELEM, DISABLE CN.MAP
#define MULTIMODULE_MODULE_ROWS(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) && !IS_RX_MULTI(moduleIdx)) ? (uint8_t) 0 : HIDDEN_ROW, (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) && !IS_RX_MULTI(moduleIdx)) ? (uint8_t) 0 : HIDDEN_ROW, MULTI_DISABLE_CHAN_MAP_ROW(moduleIdx), // AUTOBIND, DISABLE TELEM, DISABLE CN.MAP
#define MULTIMODULE_TYPE_ROW(moduleIdx) isModuleMultimodule(moduleIdx) ? MULTIMODULE_RFPROTO_COLUMNS(moduleIdx) : HIDDEN_ROW,
#define MULTIMODULE_STATUS_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? TITLE_ROW : HIDDEN_ROW, (isModuleMultimodule(moduleIdx) && getMultiSyncStatus(moduleIdx).isValid()) ? TITLE_ROW : HIDDEN_ROW,
#define MULTIMODULE_MODE_ROWS(moduleIdx) (g_model.moduleData[moduleIdx].multi.customProto) ? (uint8_t) 3 : MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t)2 : (uint8_t)1
#define MULTIMODULE_TYPE_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW,
#define MULTIMODULE_SUBTYPE_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? MULTIMODULE_RFPROTO_COLUMNS(moduleIdx) : HIDDEN_ROW,
#define MULTIMODULE_OPTIONS_ROW(moduleIdx) (isModuleMultimodule(moduleIdx) && MULTIMODULE_HASOPTIONS(moduleIdx)) ? (uint8_t) 0: HIDDEN_ROW
#define MODULE_POWER_ROW(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) || isModuleR9MNonAccess(moduleIdx)) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW
#define MODULE_POWER_ROW(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) || isModuleR9MNonAccess(moduleIdx)) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW
#else
#define MULTIMODULE_STATUS_ROWS(moduleIdx)