mirror of
https://github.com/EdgeTX/edgetx.git
synced 2025-07-15 04:15:24 +03:00
691 lines
26 KiB
C++
691 lines
26 KiB
C++
/*
|
|
* Copyright (C) OpenTX
|
|
*
|
|
* Based on code named
|
|
* th9x - http://code.google.com/p/th9x
|
|
* er9x - http://code.google.com/p/er9x
|
|
* gruvin9x - http://code.google.com/p/gruvin9x
|
|
*
|
|
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#include <opentx.h>
|
|
|
|
#if defined(PCBSKY9X)
|
|
#define HW_SETTINGS_COLUMN (2+(15*FW))
|
|
enum {
|
|
ITEM_RADIO_HARDWARE_OPTREX_DISPLAY,
|
|
ITEM_RADIO_HARDWARE_STICKS_GAINS_LABELS,
|
|
ITEM_RADIO_HARDWARE_STICK_LV_GAIN,
|
|
ITEM_RADIO_HARDWARE_STICK_LH_GAIN,
|
|
ITEM_RADIO_HARDWARE_STICK_RV_GAIN,
|
|
ITEM_RADIO_HARDWARE_STICK_RH_GAIN,
|
|
CASE_BLUETOOTH(ITEM_RADIO_HARDWARE_BT_BAUDRATE)
|
|
ITEM_RADIO_HARDWARE_MAX
|
|
};
|
|
|
|
void menuRadioHardware(event_t event)
|
|
{
|
|
MENU(STR_HARDWARE, menuTabGeneral, MENU_RADIO_HARDWARE, ITEM_RADIO_HARDWARE_MAX+1, {0, 0, 0, 0, 0, 0, CASE_BLUETOOTH(0)});
|
|
|
|
uint8_t sub = menuVerticalPosition - 1;
|
|
|
|
for (uint8_t i=0; i<LCD_LINES-1; i++) {
|
|
coord_t y = MENU_HEADER_HEIGHT + 1 + i*FH;
|
|
uint8_t k = i+menuVerticalOffset;
|
|
uint8_t blink = ((s_editMode>0) ? BLINK|INVERS : INVERS);
|
|
uint8_t attr = (sub == k ? blink : 0);
|
|
|
|
switch(k) {
|
|
case ITEM_RADIO_HARDWARE_OPTREX_DISPLAY:
|
|
g_eeGeneral.optrexDisplay = editChoice(HW_SETTINGS_COLUMN, y, STR_LCD, STR_VLCD, g_eeGeneral.optrexDisplay, 0, 1, attr, event);
|
|
break;
|
|
|
|
case ITEM_RADIO_HARDWARE_STICKS_GAINS_LABELS:
|
|
lcdDrawTextAlignedLeft(y, "Sticks");
|
|
lcdDrawText(LCD_W, y, BUTTON(TR_CALIBRATION), attr| RIGHT);
|
|
if (attr && event == EVT_KEY_FIRST(KEY_ENTER)) {
|
|
pushMenu(menuRadioCalibration);
|
|
}
|
|
break;
|
|
|
|
case ITEM_RADIO_HARDWARE_STICK_LV_GAIN:
|
|
case ITEM_RADIO_HARDWARE_STICK_LH_GAIN:
|
|
case ITEM_RADIO_HARDWARE_STICK_RV_GAIN:
|
|
case ITEM_RADIO_HARDWARE_STICK_RH_GAIN:
|
|
{
|
|
lcdDrawTextAtIndex(INDENT_WIDTH, y, "\002LVLHRVRH", k-ITEM_RADIO_HARDWARE_STICK_LV_GAIN, 0);
|
|
lcdDrawText(INDENT_WIDTH+3*FW, y, "Gain");
|
|
uint8_t mask = (1<<(k-ITEM_RADIO_HARDWARE_STICK_LV_GAIN));
|
|
uint8_t val = (g_eeGeneral.sticksGain & mask ? 1 : 0);
|
|
lcdDrawChar(HW_SETTINGS_COLUMN, y, val ? '2' : '1', attr);
|
|
if (attr) {
|
|
CHECK_INCDEC_GENVAR(event, val, 0, 1);
|
|
if (checkIncDec_Ret) {
|
|
g_eeGeneral.sticksGain ^= mask;
|
|
setSticksGain(g_eeGeneral.sticksGain);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
#if defined(BLUETOOTH)
|
|
case ITEM_RADIO_HARDWARE_BT_BAUDRATE:
|
|
g_eeGeneral.bluetoothBaudrate = editChoice(HW_SETTINGS_COLUMN, y, STR_BAUDRATE, "\005115k 9600 19200", g_eeGeneral.bluetoothBaudrate, 0, 2, attr, event);
|
|
if (attr && checkIncDec_Ret) {
|
|
btInit();
|
|
}
|
|
break;
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
#endif // PCBSKY9X
|
|
|
|
#if defined(PCBTARANIS)
|
|
enum {
|
|
ITEM_RADIO_HARDWARE_LABEL_STICKS,
|
|
ITEM_RADIO_HARDWARE_STICK1,
|
|
ITEM_RADIO_HARDWARE_STICK2,
|
|
ITEM_RADIO_HARDWARE_STICK3,
|
|
ITEM_RADIO_HARDWARE_STICK4,
|
|
ITEM_RADIO_HARDWARE_LABEL_POTS,
|
|
ITEM_RADIO_HARDWARE_POT1,
|
|
#if defined(HARDWARE_POT2)
|
|
ITEM_RADIO_HARDWARE_POT2,
|
|
#endif
|
|
#if defined(HARDWARE_POT3) || defined(PCBX9D) // TODO #if defined(STORAGE_POT3)
|
|
ITEM_RADIO_HARDWARE_POT3,
|
|
#endif
|
|
#if defined(HARDWARE_POT4)
|
|
ITEM_RADIO_HARDWARE_POT4,
|
|
#endif
|
|
#if NUM_SLIDERS > 0
|
|
ITEM_RADIO_HARDWARE_SLIDER1,
|
|
ITEM_RADIO_HARDWARE_SLIDER2,
|
|
#endif
|
|
#if NUM_SLIDERS > 2
|
|
ITEM_RADIO_HARDWARE_SLIDER3,
|
|
ITEM_RADIO_HARDWARE_SLIDER4,
|
|
#endif
|
|
ITEM_RADIO_HARDWARE_LABEL_SWITCHES,
|
|
ITEM_RADIO_HARDWARE_SA,
|
|
ITEM_RADIO_HARDWARE_SB,
|
|
ITEM_RADIO_HARDWARE_SC,
|
|
ITEM_RADIO_HARDWARE_SD,
|
|
#if defined(HARDWARE_SWITCH_E)
|
|
ITEM_RADIO_HARDWARE_SE,
|
|
#endif
|
|
#if defined(HARDWARE_SWITCH_F)
|
|
ITEM_RADIO_HARDWARE_SF,
|
|
#endif
|
|
#if defined(HARDWARE_SWITCH_G)
|
|
ITEM_RADIO_HARDWARE_SG,
|
|
#endif
|
|
#if defined(HARDWARE_SWITCH_H)
|
|
ITEM_RADIO_HARDWARE_SH,
|
|
#endif
|
|
#if defined(HARDWARE_SWITCH_I)
|
|
ITEM_RADIO_HARDWARE_SI,
|
|
#endif
|
|
#if defined(HARDWARE_SWITCH_J)
|
|
ITEM_RADIO_HARDWARE_SJ,
|
|
#endif
|
|
#if defined(HARDWARE_SWITCH_K)
|
|
ITEM_RADIO_HARDWARE_SK,
|
|
ITEM_RADIO_HARDWARE_SL,
|
|
ITEM_RADIO_HARDWARE_SM,
|
|
ITEM_RADIO_HARDWARE_SN,
|
|
ITEM_RADIO_HARDWARE_SO,
|
|
ITEM_RADIO_HARDWARE_SP,
|
|
ITEM_RADIO_HARDWARE_SQ,
|
|
ITEM_RADIO_HARDWARE_SR,
|
|
#endif
|
|
|
|
ITEM_RADIO_HARDWARE_BATTERY_CALIB,
|
|
|
|
#if defined(STM32)
|
|
ITEM_RADIO_HARDWARE_RTC_BATTERY,
|
|
ITEM_RADIO_HARDWARE_RTC_CHECK,
|
|
#endif
|
|
|
|
#if defined(TX_CAPACITY_MEASUREMENT)
|
|
ITEM_RADIO_HARDWARE_CAPACITY_CALIB,
|
|
#endif
|
|
|
|
#if (defined(CROSSFIRE) || defined(GHOST)) && SPORT_MAX_BAUDRATE < 400000
|
|
ITEM_RADIO_HARDWARE_SERIAL_BAUDRATE,
|
|
#endif
|
|
|
|
#if defined(BLUETOOTH)
|
|
ITEM_RADIO_HARDWARE_BLUETOOTH_MODE,
|
|
ITEM_RADIO_HARDWARE_BLUETOOTH_PAIRING_CODE,
|
|
ITEM_RADIO_HARDWARE_BLUETOOTH_LOCAL_ADDR,
|
|
ITEM_RADIO_HARDWARE_BLUETOOTH_DISTANT_ADDR,
|
|
ITEM_RADIO_HARDWARE_BLUETOOTH_NAME,
|
|
#endif
|
|
|
|
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
|
|
ITEM_RADIO_HARDWARE_EXTERNAL_ANTENNA,
|
|
#endif
|
|
|
|
#if defined(AUX_SERIAL)
|
|
ITEM_RADIO_HARDWARE_AUX_SERIAL_MODE,
|
|
#endif
|
|
|
|
ITEM_RADIO_HARDWARE_JITTER_FILTER,
|
|
ITEM_RADIO_HARDWARE_RAS,
|
|
#if defined(SPORT_UPDATE_PWR_GPIO)
|
|
ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER,
|
|
#endif
|
|
ITEM_RADIO_HARDWARE_DEBUG,
|
|
#if defined(EEPROM_RLC)
|
|
ITEM_RADIO_BACKUP_EEPROM,
|
|
ITEM_RADIO_FACTORY_RESET,
|
|
#endif
|
|
ITEM_RADIO_HARDWARE_MAX
|
|
};
|
|
|
|
#if (NUM_POTS + NUM_SLIDERS) == 1
|
|
#define POTS_ROWS NAVIGATION_LINE_BY_LINE|1
|
|
#elif (NUM_POTS + NUM_SLIDERS) == 2
|
|
#define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
|
|
#elif (NUM_POTS + NUM_SLIDERS) == 3
|
|
#define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
|
|
#elif defined(PCBX9D) // TODO defined(STORAGE_POT3) && !defined(STORAGE_POT3)
|
|
#define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, HIDDEN_ROW, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
|
|
#elif (NUM_POTS + NUM_SLIDERS) == 4
|
|
#define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
|
|
#elif (NUM_POTS + NUM_SLIDERS) == 5
|
|
#define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
|
|
#elif (NUM_POTS + NUM_SLIDERS) == 8
|
|
#define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
|
|
#endif
|
|
|
|
#if defined(PCBX9E)
|
|
#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
|
|
#elif defined(RADIO_T12)
|
|
#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|HIDDEN_ROW, NAVIGATION_LINE_BY_LINE|HIDDEN_ROW
|
|
#elif NUM_SWITCHES == 9
|
|
#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
|
|
#elif NUM_SWITCHES == 8
|
|
#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
|
|
#elif NUM_SWITCHES == 7
|
|
#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
|
|
#elif NUM_SWITCHES == 6
|
|
#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
|
|
#elif NUM_SWITCHES == 5
|
|
#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
|
|
#elif NUM_SWITCHES == 4
|
|
#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
|
|
#endif
|
|
|
|
#if !defined(BLUETOOTH)
|
|
#define BLUETOOTH_ROWS
|
|
#elif defined(PCBX9E)
|
|
#define BLUETOOTH_ROWS 0, uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : READONLY_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : READONLY_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0),
|
|
#else
|
|
#define BLUETOOTH_ROWS uint8_t(IS_BLUETOOTH_CHIP_PRESENT() ? 0 : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_TELEMETRY ? READONLY_ROW : HIDDEN_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : READONLY_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : READONLY_ROW), uint8_t(g_eeGeneral.bluetoothMode == BLUETOOTH_OFF ? HIDDEN_ROW : 0),
|
|
#endif
|
|
|
|
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
|
|
#define EXTERNAL_ANTENNA_ROW 0,
|
|
void onHardwareAntennaSwitchConfirm(const char * result)
|
|
{
|
|
if (result == STR_OK) {
|
|
// Switch to external antenna confirmation
|
|
g_eeGeneral.antennaMode = reusableBuffer.radioHardware.antennaMode;
|
|
storageDirty(EE_GENERAL);
|
|
}
|
|
else {
|
|
reusableBuffer.radioHardware.antennaMode = g_eeGeneral.antennaMode;
|
|
}
|
|
}
|
|
#else
|
|
#define EXTERNAL_ANTENNA_ROW
|
|
#endif
|
|
|
|
#if defined(PCBX9LITE)
|
|
#define SWITCH_TYPE_MAX(sw) (sw == MIXSRC_SD-MIXSRC_FIRST_SWITCH ? SWITCH_2POS : SWITCH_3POS)
|
|
#elif defined(PCBXLITES)
|
|
#define SWITCH_TYPE_MAX(sw) (sw >= MIXSRC_SE-MIXSRC_FIRST_SWITCH ? SWITCH_2POS : SWITCH_3POS)
|
|
#elif defined(PCBXLITE)
|
|
#define SWITCH_TYPE_MAX(sw) (SWITCH_3POS)
|
|
#elif defined(PCBX9E)
|
|
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS)
|
|
#elif defined(RADIO_TX12)
|
|
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SA - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SD - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS)
|
|
#else
|
|
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH - MIXSRC_FIRST_SWITCH <= sw) ? SWITCH_2POS : SWITCH_3POS)
|
|
#endif
|
|
|
|
#if defined(STM32)
|
|
#define RTC_ROW READONLY_ROW, 0,
|
|
#else
|
|
#define RTC_ROW
|
|
#endif
|
|
|
|
#if defined(TX_CAPACITY_MEASUREMENT)
|
|
#define TX_CAPACITY_MEASUREMENT_ROWS 0,
|
|
#else
|
|
#define TX_CAPACITY_MEASUREMENT_ROWS
|
|
#endif
|
|
|
|
#if (defined(CROSSFIRE) || defined(GHOST)) && SPORT_MAX_BAUDRATE < 400000
|
|
#define MAX_BAUD_ROWS 0,
|
|
#else
|
|
#define MAX_BAUD_ROWS
|
|
#endif
|
|
|
|
#if defined(AUX_SERIAL)
|
|
#define AUX_SERIAL_ROWS 0,
|
|
#else
|
|
#define AUX_SERIAL_ROWS
|
|
#endif
|
|
|
|
#if LCD_W >= 212
|
|
#define HW_SETTINGS_COLUMN1 12*FW
|
|
#define HW_SETTINGS_COLUMN2 (20*FW - 3)
|
|
#else
|
|
#define HW_SETTINGS_COLUMN1 30
|
|
#define HW_SETTINGS_COLUMN2 (HW_SETTINGS_COLUMN1 + 5*FW)
|
|
#endif
|
|
|
|
#if defined(SPORT_UPDATE_PWR_GPIO)
|
|
#define SPORT_POWER_ROWS 0,
|
|
#else
|
|
#define SPORT_POWER_ROWS
|
|
#endif
|
|
|
|
#if defined(EEPROM_RLC)
|
|
void onFactoryResetConfirm(const char * result)
|
|
{
|
|
if (result == STR_OK) {
|
|
showMessageBox(STR_STORAGE_FORMAT);
|
|
storageEraseAll(false);
|
|
NVIC_SystemReset();
|
|
}
|
|
}
|
|
#endif
|
|
|
|
void menuRadioHardware(event_t event)
|
|
{
|
|
MENU(STR_HARDWARE, menuTabGeneral, MENU_RADIO_HARDWARE, HEADER_LINE + ITEM_RADIO_HARDWARE_MAX, {
|
|
HEADER_LINE_COLUMNS
|
|
0 /* calibration button */,
|
|
0 /* stick 1 */,
|
|
0 /* stick 2 */,
|
|
0 /* stick 3 */,
|
|
0 /* stick 4 */,
|
|
LABEL(Pots),
|
|
POTS_ROWS,
|
|
LABEL(Switches),
|
|
SWITCHES_ROWS,
|
|
|
|
0 /* battery calib */,
|
|
RTC_ROW
|
|
TX_CAPACITY_MEASUREMENT_ROWS
|
|
|
|
MAX_BAUD_ROWS
|
|
|
|
BLUETOOTH_ROWS
|
|
|
|
EXTERNAL_ANTENNA_ROW
|
|
|
|
AUX_SERIAL_ROWS
|
|
|
|
0 /* ADC filter */,
|
|
READONLY_ROW /* RAS */,
|
|
SPORT_POWER_ROWS
|
|
1 /* debugs */,
|
|
|
|
0,
|
|
|
|
0
|
|
});
|
|
|
|
uint8_t sub = menuVerticalPosition - HEADER_LINE;
|
|
|
|
#if defined(BLUETOOTH)
|
|
if (g_eeGeneral.bluetoothMode != BLUETOOTH_OFF && !IS_BLUETOOTH_CHIP_PRESENT()) {
|
|
g_eeGeneral.bluetoothMode = BLUETOOTH_OFF;
|
|
storageDirty(EE_GENERAL);
|
|
}
|
|
#endif
|
|
|
|
if (menuEvent) {
|
|
disableVBatBridge();
|
|
}
|
|
else if (event == EVT_ENTRY) {
|
|
enableVBatBridge();
|
|
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
|
|
reusableBuffer.radioHardware.antennaMode = g_eeGeneral.antennaMode;
|
|
#endif
|
|
}
|
|
|
|
for (uint8_t 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+HEADER_LINE] == HIDDEN_ROW) {
|
|
k++;
|
|
}
|
|
}
|
|
LcdFlags blink = ((s_editMode>0) ? BLINK|INVERS : INVERS);
|
|
LcdFlags attr = (sub == k ? blink : 0);
|
|
|
|
switch(k) {
|
|
case ITEM_RADIO_HARDWARE_LABEL_STICKS:
|
|
lcdDrawTextAlignedLeft(y, STR_STICKS);
|
|
lcdDrawText(HW_SETTINGS_COLUMN2, y, BUTTON(TR_CALIBRATION), attr);
|
|
if (attr && event == EVT_KEY_FIRST(KEY_ENTER)) {
|
|
pushMenu(menuRadioCalibration);
|
|
}
|
|
break;
|
|
|
|
case ITEM_RADIO_HARDWARE_STICK1:
|
|
case ITEM_RADIO_HARDWARE_STICK2:
|
|
case ITEM_RADIO_HARDWARE_STICK3:
|
|
case ITEM_RADIO_HARDWARE_STICK4:
|
|
editStickHardwareSettings(HW_SETTINGS_COLUMN1, y, k - ITEM_RADIO_HARDWARE_STICK1, event, attr);
|
|
break;
|
|
|
|
case ITEM_RADIO_HARDWARE_LABEL_POTS:
|
|
lcdDrawTextAlignedLeft(y, STR_POTS);
|
|
break;
|
|
|
|
case ITEM_RADIO_HARDWARE_POT1:
|
|
#if defined(HARDWARE_POT2)
|
|
case ITEM_RADIO_HARDWARE_POT2:
|
|
#endif
|
|
#if defined(HARDWARE_POT3)
|
|
case ITEM_RADIO_HARDWARE_POT3:
|
|
#endif
|
|
#if defined(HARDWARE_POT4)
|
|
case ITEM_RADIO_HARDWARE_POT4:
|
|
#endif
|
|
{
|
|
int idx = k - ITEM_RADIO_HARDWARE_POT1;
|
|
uint8_t shift = (2*idx);
|
|
uint8_t mask = (0x03 << shift);
|
|
lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, NUM_STICKS+idx+1, menuHorizontalPosition < 0 ? attr : 0);
|
|
if (g_eeGeneral.anaNames[NUM_STICKS+idx][0] || (attr && s_editMode > 0 && menuHorizontalPosition == 0))
|
|
editName(HW_SETTINGS_COLUMN1, y, g_eeGeneral.anaNames[NUM_STICKS+idx], LEN_ANA_NAME, event, attr && menuHorizontalPosition == 0);
|
|
else
|
|
lcdDrawMMM(HW_SETTINGS_COLUMN1, y, menuHorizontalPosition==0 ? attr : 0);
|
|
uint8_t potType = (g_eeGeneral.potsConfig & mask) >> shift;
|
|
potType = editChoice(HW_SETTINGS_COLUMN2, y, "", STR_POTTYPES, potType, POT_NONE, POT_WITHOUT_DETENT, menuHorizontalPosition == 1 ? attr : 0, event);
|
|
g_eeGeneral.potsConfig &= ~mask;
|
|
g_eeGeneral.potsConfig |= (potType << shift);
|
|
break;
|
|
}
|
|
|
|
#if NUM_SLIDERS > 0
|
|
case ITEM_RADIO_HARDWARE_SLIDER1:
|
|
case ITEM_RADIO_HARDWARE_SLIDER2:
|
|
#if NUM_SLIDERS > 2
|
|
case ITEM_RADIO_HARDWARE_SLIDER3:
|
|
case ITEM_RADIO_HARDWARE_SLIDER4:
|
|
#endif
|
|
{
|
|
int idx = k - ITEM_RADIO_HARDWARE_SLIDER1;
|
|
lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, NUM_STICKS+NUM_POTS+idx+1, menuHorizontalPosition < 0 ? attr : 0);
|
|
if (ZEXIST(g_eeGeneral.anaNames[NUM_STICKS+NUM_POTS+idx]) || (attr && menuHorizontalPosition == 0 && s_editMode > 0))
|
|
editName(HW_SETTINGS_COLUMN1, y, g_eeGeneral.anaNames[NUM_STICKS+NUM_POTS+idx], LEN_ANA_NAME, event, attr && menuHorizontalPosition == 0);
|
|
else
|
|
lcdDrawMMM(HW_SETTINGS_COLUMN1, y, menuHorizontalPosition == 0 ? attr : 0);
|
|
uint8_t mask = (0x01 << idx);
|
|
uint8_t potType = (g_eeGeneral.slidersConfig & mask) >> idx;
|
|
potType = editChoice(HW_SETTINGS_COLUMN2, y, "", STR_SLIDERTYPES, potType, SLIDER_NONE, SLIDER_WITH_DETENT, menuHorizontalPosition == 1 ? attr : 0, event);
|
|
g_eeGeneral.slidersConfig &= ~mask;
|
|
g_eeGeneral.slidersConfig |= (potType << idx);
|
|
break;
|
|
}
|
|
#endif
|
|
|
|
case ITEM_RADIO_HARDWARE_LABEL_SWITCHES:
|
|
lcdDrawTextAlignedLeft(y, STR_SWITCHES);
|
|
break;
|
|
|
|
case ITEM_RADIO_HARDWARE_SA:
|
|
case ITEM_RADIO_HARDWARE_SB:
|
|
case ITEM_RADIO_HARDWARE_SC:
|
|
case ITEM_RADIO_HARDWARE_SD:
|
|
#if defined(HARDWARE_SWITCH_E)
|
|
case ITEM_RADIO_HARDWARE_SE:
|
|
#endif
|
|
#if defined(HARDWARE_SWITCH_F)
|
|
case ITEM_RADIO_HARDWARE_SF:
|
|
#endif
|
|
#if defined(HARDWARE_SWITCH_G)
|
|
case ITEM_RADIO_HARDWARE_SG:
|
|
#endif
|
|
#if defined(HARDWARE_SWITCH_H)
|
|
case ITEM_RADIO_HARDWARE_SH:
|
|
#endif
|
|
#if defined(HARDWARE_SWITCH_I)
|
|
case ITEM_RADIO_HARDWARE_SI:
|
|
#endif
|
|
#if defined(HARDWARE_SWITCH_J)
|
|
case ITEM_RADIO_HARDWARE_SJ:
|
|
#endif
|
|
#if defined(HARDWARE_SWITCH_K)
|
|
case ITEM_RADIO_HARDWARE_SK:
|
|
case ITEM_RADIO_HARDWARE_SL:
|
|
case ITEM_RADIO_HARDWARE_SM:
|
|
case ITEM_RADIO_HARDWARE_SN:
|
|
case ITEM_RADIO_HARDWARE_SO:
|
|
case ITEM_RADIO_HARDWARE_SP:
|
|
case ITEM_RADIO_HARDWARE_SQ:
|
|
case ITEM_RADIO_HARDWARE_SR:
|
|
#endif
|
|
{
|
|
int index = k - ITEM_RADIO_HARDWARE_SA;
|
|
int config = SWITCH_CONFIG(index);
|
|
lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, MIXSRC_FIRST_SWITCH - MIXSRC_Rud + index + 1, menuHorizontalPosition < 0 ? attr : 0);
|
|
if (ZEXIST(g_eeGeneral.switchNames[index]) || (attr && s_editMode > 0 && menuHorizontalPosition == 0))
|
|
editName(HW_SETTINGS_COLUMN1, y, g_eeGeneral.switchNames[index], LEN_SWITCH_NAME, event, menuHorizontalPosition == 0 ? attr : 0);
|
|
else
|
|
lcdDrawMMM(HW_SETTINGS_COLUMN1, y, menuHorizontalPosition == 0 ? attr : 0);
|
|
config = editChoice(HW_SETTINGS_COLUMN2, y, "", STR_SWTYPES, config, SWITCH_NONE, SWITCH_TYPE_MAX(index), menuHorizontalPosition == 1 ? attr : 0, event);
|
|
if (attr && checkIncDec_Ret) {
|
|
swconfig_t mask = (swconfig_t)0x03 << (2*index);
|
|
g_eeGeneral.switchConfig = (g_eeGeneral.switchConfig & ~mask) | ((swconfig_t(config) & 0x03) << (2*index));
|
|
}
|
|
break;
|
|
}
|
|
|
|
case ITEM_RADIO_HARDWARE_BATTERY_CALIB:
|
|
#if defined(PCBTARANIS)
|
|
lcdDrawTextAlignedLeft(y, STR_BATT_CALIB);
|
|
putsVolts(HW_SETTINGS_COLUMN2, y, getBatteryVoltage(), attr|PREC2|LEFT);
|
|
#elif defined(PCBSKY9X)
|
|
lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+1+4*FH, STR_BATT_CALIB);
|
|
static int32_t adcBatt;
|
|
// TODO board.cpp
|
|
adcBatt = ((adcBatt * 7) + anaIn(TX_VOLTAGE)) / 8;
|
|
uint32_t batCalV = (adcBatt + adcBatt*(g_eeGeneral.txVoltageCalibration)/128) * 4191;
|
|
batCalV /= 55296;
|
|
putsVolts(HW_SETTINGS_COLUMN2, y, batCalV, (menuVerticalPosition==HEADER_LINE ? INVERS : 0));
|
|
#else
|
|
lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT + 1 + (NUM_STICKS+NUM_POTS+NUM_SLIDERS+1)/2 * FH, STR_BATT_CALIB);
|
|
putsVolts(HW_SETTINGS_COLUMN2, y, g_vbat100mV, attr|LEFT);
|
|
#endif
|
|
if (attr) {
|
|
CHECK_INCDEC_GENVAR(event, g_eeGeneral.txVoltageCalibration, -127, 127);
|
|
}
|
|
break;
|
|
|
|
#if defined(STM32)
|
|
case ITEM_RADIO_HARDWARE_RTC_BATTERY:
|
|
lcdDrawTextAlignedLeft(y, STR_RTC_BATT);
|
|
putsVolts(HW_SETTINGS_COLUMN2, y, getRTCBatteryVoltage(), PREC2|LEFT);
|
|
break;
|
|
|
|
case ITEM_RADIO_HARDWARE_RTC_CHECK:
|
|
g_eeGeneral.disableRtcWarning = 1 - editCheckBox(1 - g_eeGeneral.disableRtcWarning, HW_SETTINGS_COLUMN2, y, STR_RTC_CHECK, attr, event);
|
|
break;
|
|
#endif
|
|
|
|
#if defined(TX_CAPACITY_MEASUREMENT)
|
|
case ITEM_RADIO_HARDWARE_CAPACITY_CALIB:
|
|
lcdDrawTextAlignedLeft(y, STR_CURRENT_CALIB);
|
|
drawValueWithUnit(HW_SETTINGS_COLUMN2, y, getCurrent(), UNIT_MILLIAMPS, attr);
|
|
if (attr) {
|
|
CHECK_INCDEC_GENVAR(event, g_eeGeneral.txCurrentCalibration, -49, 49);
|
|
}
|
|
break;
|
|
#endif
|
|
|
|
#if (defined(CROSSFIRE) || defined(GHOST)) && SPORT_MAX_BAUDRATE < 400000
|
|
case ITEM_RADIO_HARDWARE_SERIAL_BAUDRATE:
|
|
lcdDrawTextAlignedLeft(y, STR_MAXBAUDRATE);
|
|
lcdDrawNumber(HW_SETTINGS_COLUMN2, y, CROSSFIRE_BAUDRATES[g_eeGeneral.telemetryBaudrate], attr|LEFT);
|
|
if (attr) {
|
|
g_eeGeneral.telemetryBaudrate = DIM(CROSSFIRE_BAUDRATES) - 1 - checkIncDecModel(event, DIM(CROSSFIRE_BAUDRATES) - 1 - g_eeGeneral.telemetryBaudrate, 0, DIM(CROSSFIRE_BAUDRATES) - 1);
|
|
if (checkIncDec_Ret && IS_EXTERNAL_MODULE_ON()) {
|
|
pauseMixerCalculations();
|
|
pausePulses();
|
|
EXTERNAL_MODULE_OFF();
|
|
RTOS_WAIT_MS(20); // 20ms so that the pulses interrupt will reinit the frame rate
|
|
telemetryProtocol = 255; // force telemetry port + module reinitialization
|
|
EXTERNAL_MODULE_ON();
|
|
resumePulses();
|
|
resumeMixerCalculations();
|
|
}
|
|
}
|
|
break;
|
|
#endif
|
|
|
|
#if defined(BLUETOOTH)
|
|
case ITEM_RADIO_HARDWARE_BLUETOOTH_MODE:
|
|
lcdDrawTextAlignedLeft(y, STR_BLUETOOTH);
|
|
lcdDrawTextAtIndex(HW_SETTINGS_COLUMN2, y, STR_BLUETOOTH_MODES, g_eeGeneral.bluetoothMode, attr);
|
|
if (attr) {
|
|
g_eeGeneral.bluetoothMode = checkIncDecGen(event, g_eeGeneral.bluetoothMode, BLUETOOTH_OFF, BLUETOOTH_MAX);
|
|
}
|
|
break;
|
|
|
|
case ITEM_RADIO_HARDWARE_BLUETOOTH_PAIRING_CODE:
|
|
lcdDrawText(INDENT_WIDTH, y, STR_BLUETOOTH_PIN_CODE);
|
|
lcdDrawText(HW_SETTINGS_COLUMN2, y, "000000");
|
|
break;
|
|
|
|
case ITEM_RADIO_HARDWARE_BLUETOOTH_LOCAL_ADDR:
|
|
lcdDrawText(INDENT_WIDTH, y, STR_BLUETOOTH_LOCAL_ADDR);
|
|
lcdDrawText(HW_SETTINGS_COLUMN2, y, bluetooth.localAddr[0] == '\0' ? "---" : bluetooth.localAddr);
|
|
break;
|
|
|
|
case ITEM_RADIO_HARDWARE_BLUETOOTH_DISTANT_ADDR:
|
|
lcdDrawText(INDENT_WIDTH, y, STR_BLUETOOTH_DIST_ADDR);
|
|
lcdDrawText(HW_SETTINGS_COLUMN2, y, bluetooth.distantAddr[0] == '\0' ? "---" : bluetooth.distantAddr);
|
|
break;
|
|
|
|
case ITEM_RADIO_HARDWARE_BLUETOOTH_NAME:
|
|
lcdDrawText(INDENT_WIDTH, y, STR_NAME);
|
|
editName(HW_SETTINGS_COLUMN2, y, g_eeGeneral.bluetoothName, LEN_BLUETOOTH_NAME, event, attr);
|
|
break;
|
|
#endif
|
|
|
|
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
|
|
case ITEM_RADIO_HARDWARE_EXTERNAL_ANTENNA:
|
|
reusableBuffer.radioHardware.antennaMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_ANTENNA, STR_ANTENNA_MODES, reusableBuffer.radioHardware.antennaMode, ANTENNA_MODE_INTERNAL, ANTENNA_MODE_EXTERNAL, attr, event);
|
|
if (!s_editMode && reusableBuffer.radioHardware.antennaMode != g_eeGeneral.antennaMode) {
|
|
if (!isExternalAntennaEnabled() && (reusableBuffer.radioHardware.antennaMode == ANTENNA_MODE_EXTERNAL || (reusableBuffer.radioHardware.antennaMode == ANTENNA_MODE_PER_MODEL && g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode == ANTENNA_MODE_EXTERNAL))) {
|
|
POPUP_CONFIRMATION(STR_ANTENNACONFIRM1, onHardwareAntennaSwitchConfirm);
|
|
SET_WARNING_INFO(STR_ANTENNACONFIRM2, sizeof(TR_ANTENNACONFIRM2), 0);
|
|
}
|
|
else {
|
|
g_eeGeneral.antennaMode = reusableBuffer.radioHardware.antennaMode;
|
|
checkExternalAntenna();
|
|
}
|
|
}
|
|
break;
|
|
#endif
|
|
|
|
#if defined(AUX_SERIAL)
|
|
case ITEM_RADIO_HARDWARE_AUX_SERIAL_MODE:
|
|
g_eeGeneral.auxSerialMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_AUX_SERIAL_MODE, STR_AUX_SERIAL_MODES, g_eeGeneral.auxSerialMode, 0, UART_MODE_MAX, attr, event);
|
|
if (attr && checkIncDec_Ret) {
|
|
auxSerialInit(g_eeGeneral.auxSerialMode, modelTelemetryProtocol());
|
|
}
|
|
break;
|
|
#endif
|
|
|
|
case ITEM_RADIO_HARDWARE_JITTER_FILTER:
|
|
g_eeGeneral.jitterFilter = 1 - editCheckBox(1 - g_eeGeneral.jitterFilter, HW_SETTINGS_COLUMN2, y, STR_JITTER_FILTER, attr, event);
|
|
break;
|
|
|
|
case ITEM_RADIO_HARDWARE_RAS:
|
|
#if defined(HARDWARE_INTERNAL_RAS)
|
|
lcdDrawTextAlignedLeft(y, "RAS");
|
|
if (telemetryData.swrInternal.isFresh())
|
|
lcdDrawNumber(HW_SETTINGS_COLUMN2, y, telemetryData.swrInternal.value());
|
|
else
|
|
lcdDrawText(HW_SETTINGS_COLUMN2, y, "---");
|
|
lcdDrawText(lcdNextPos, y, "/");
|
|
#else
|
|
lcdDrawTextAlignedLeft(y, "Ext. RAS");
|
|
lcdNextPos = HW_SETTINGS_COLUMN2;
|
|
#endif
|
|
if (telemetryData.swrExternal.isFresh())
|
|
lcdDrawNumber(lcdNextPos, y, telemetryData.swrExternal.value());
|
|
else
|
|
lcdDrawText(lcdNextPos, y, "---");
|
|
break;
|
|
|
|
#if defined(SPORT_UPDATE_PWR_GPIO)
|
|
case ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER:
|
|
g_eeGeneral.sportUpdatePower = editChoice(HW_SETTINGS_COLUMN2, y, STR_SPORT_UPDATE_POWER_MODE, STR_SPORT_UPDATE_POWER_MODES, g_eeGeneral.sportUpdatePower, 0, 1, attr, event);
|
|
if (attr && checkIncDec_Ret) {
|
|
SPORT_UPDATE_POWER_INIT();
|
|
}
|
|
break;
|
|
#endif
|
|
|
|
case ITEM_RADIO_HARDWARE_DEBUG:
|
|
lcdDrawTextAlignedLeft(y, STR_DEBUG);
|
|
lcdDrawText(HW_SETTINGS_COLUMN2, y, STR_ANALOGS_BTN, menuHorizontalPosition == 0 ? attr : 0);
|
|
lcdDrawText(lcdLastRightPos + 2, y, STR_KEYS_BTN, menuHorizontalPosition == 1 ? attr : 0);
|
|
if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) {
|
|
if (menuHorizontalPosition == 0)
|
|
pushMenu(menuRadioDiagAnalogs);
|
|
else
|
|
pushMenu(menuRadioDiagKeys);
|
|
}
|
|
break;
|
|
|
|
case ITEM_RADIO_BACKUP_EEPROM:
|
|
if (LCD_W < 212)
|
|
lcdDrawText(LCD_W / 2, y, BUTTON(STR_EEBACKUP), attr | CENTERED);
|
|
else
|
|
lcdDrawText(HW_SETTINGS_COLUMN2, y, BUTTON(STR_EEBACKUP), attr);
|
|
if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) {
|
|
s_editMode = EDIT_SELECT_FIELD;
|
|
eepromBackup();
|
|
}
|
|
break;
|
|
|
|
case ITEM_RADIO_FACTORY_RESET:
|
|
if (LCD_W < 212)
|
|
lcdDrawText(LCD_W / 2, y, BUTTON(STR_FACTORYRESET), attr | CENTERED);
|
|
else
|
|
lcdDrawText(HW_SETTINGS_COLUMN2, y, BUTTON(STR_FACTORYRESET), attr);
|
|
if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) {
|
|
s_editMode = EDIT_SELECT_FIELD;
|
|
POPUP_CONFIRMATION(STR_CONFIRMRESET, onFactoryResetConfirm);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
#endif // PCBSKY9X
|