refact: ADC, switches and keys

Add "hardware_defs" target to dump hardware defines from hal.h per target

Fixed hal.h definitions for switches & ADC inputs

Tools to generate hardware definitions from current hal.h

generator: add support for EXTx and analog switches

WiP

Add generated header to hardware_defs target

Add support for ADC input direction and index per GPIO port

Incredible: it compiles

Removed StdPeriph ADC driver

Works on QX7

Works on TX16S (VBat missing)

Switch driver using generated switches for stm32 targets

Switch driver with generated switches for simu

Use switch names from switch driver

Fixed single conversion handling

Fixed horus VBat reading

Added switch name

Fix warnings about bitfield offsets and GCC 4.4

This is caused by bitfields that cross type boundaries. In this particular case, it happens as the bitfield is not defined the same in `rtc_backup.cpp`.

Switches has already been moved to generic driver

Jitter measurement for each sample, not just for oversampled values

Moved periph clock init to the ADC driver

ADC & GPIOs.

Add switchInit() to init pins

Fix NV14 CMake

Fix taranis target

Fix NV14 (again)

Model audio files: use new interface for switch index

Fix X9-lite

Fix simu headers

Fix getSwitchName()

Add support for ADC switches

Fix switch warning YAML

Test only switches which are defined

Conversions tests for QX7 only on QX7

Fix X12S

Fix function switch names

Enable ADC periph clock before initialising channels

NV14: offset inputs for the sticks & fix switches

WiP: get rid of VSRCRAW and some more

Simu shall use normal ADC driver

fix x7

fix nv14

Fix 9x nav

fix 212x64

fix xlite

fix x9e

fix simu lib

fix unit tests

fix x7 tests

PWM stick values should be written directly into adcValues

... just like FlySky sticks.

fix x12s

fix nv14

Add some support for SPI ADC (only unit tests)

Remove `jq` usage

fix generate_yaml.py for newer libclang

fix pot config

fix stick names

Some YAML generator improvements

Max 16 Pots on COLORLCD

Fix some source names

Use 10 bits for switches to prevent overflow

Removed horus constants for switches & ADC inputs

Fix unit tests

Fix curve edit

Fix libsimulator

Fix function switches (tpro)

Refine ADC & analog API

Moved hardware definitions scripts and templates into own dir

cleanup API refine

Fix unit tests

Mixer: apply calibration only on required inputs

Place ADC switches after all other ADC inputs

Fix X12S

Remove useless TR_POTS_VSRCRAW, TR_SW_VSRCRAW, and TR_VSRCRAW

Cleanup redundant generated YAML parsers

Fixes Boxer rebase

Add boxer to generate-hw-defs.sh

Obsolete LUA exports

Add boxer ADC_DIRECTION

Split generate_hw_defs.py into multiple files

Some cleanup (+ LUA switches)

Fix AXIS definitions

Fixed translation strings declarations

Some rebase fixes

Remove some useless StdPeriph drivers

fix: set pin mode to reset state on usart deinit

fix: use canonical names for calibration data

fix: ADC driver does not care about unconfigured inputs

fix X12S ADC

Add support for ADC conversion chaining

Better X12S ADC implem

Moved X12S ADC driver to HAL/LL

Improve ADC driver separation

Fixed taranis & nv14

Moved PWM gimbals to HAL/LL

Removed useless TR_EXTRA_VSRCRAW

Fixed include guards

Small fixes

Renamed control inputs

Moved internal and external module pulse driver def to boards

Move more things to the generic_stm32 board

Remove STR_VMIXTRIMS

Added analog labels

Generate main control names

Misuse labels / short labels for main controls

Backward compatibility: sliders and legacy names

New keys driver

Let's get rid of StdPeriph headers in simu

Add jinja2 to CI workflows

Use `grep` instead of `sed`

chore: add python jinja2 oto msys setup script

Removed more static definitions and use dynamic ones instead

Fixes X9E

Fix x7 nav too

212 switch display

Fix default sliders

Removed NUM_STICKS

212 switch display working nicely

Surface radio 'stick' replacements

fix: switch, trim & rotary pin init

Remove old key drivers

Removed VKEYS

Removed ETX_FOURCC

Fixed SURFACE_NAME

Removed TR_VSWITCHES & TR_TRIMS_SWITCHES

Fix xpot switches

Store calibrated analogs in physical order

Use getSourceString in drawSource

Implement missing YAML read/write

Fix isSourceAvailableInInputs()

Fix isSourceAvailable()

Some surface fixes

Fix CLI debug

Ported colour UI of analog diagnostics to new ADC API

Small fixes

Better input mapping

Minor tpro fixes

Fix trims available

Remove TX mode choice on surface radio

Rename surface controls

Channel order alignement

Fix throttle warning

Fix checkTrims()

Fix pot config casting issue

Fix IS_SWITCH_FS()

Fixed input mapping

Fix fswitch auto-switch

Fixed storing / reading function switches in YAML

Fix enableVBatBridge() / disableVBatBridge()

Fix interesting mode conversion

Fix sources issues

Fix special funnction list

Proper function switch handling

128 GUI improvements

Fix compilation

Boxer cosmetics

128 hardware screen cosmetic

Fix TX12 switches

More switches fixes

Simplify CPU type handling

Fix flash size

Fixed page-up / page-down in libopenui
This commit is contained in:
Raphael Coeffic
2023-06-25 14:32:39 +02:00
committed by Malte Langermann
parent b6dd3a0ef8
commit 2b100e0eb5
323 changed files with 12812 additions and 22301 deletions
@@ -16,6 +16,7 @@ set(GUI_SRC
../common/stdlcd/radio_version.cpp
../common/stdlcd/radio_trainer.cpp
../common/stdlcd/view_telemetry.cpp
../common/stdlcd/calibration.cpp
model_curve_edit.cpp
)
@@ -0,0 +1,81 @@
/*
* Copyright (C) EdgeTX
*
* Based on code named
* opentx - https://github.com/opentx/opentx
* 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"
#include "calibration.h"
#include "gui.h"
#include "hal/adc_driver.h"
void menuCommonCalib(event_t event)
{
adcCalibMinMax();
// make sure we don't scroll while calibrating
menuCalibrationState = reusableBuffer.calib.state;
switch (event) {
case EVT_ENTRY:
case EVT_KEY_BREAK(KEY_EXIT):
reusableBuffer.calib.state = CALIB_START;
break;
case EVT_KEY_BREAK(KEY_ENTER):
reusableBuffer.calib.state++;
break;
}
switch (reusableBuffer.calib.state) {
case CALIB_START:
// START CALIBRATION
if (!READ_ONLY()) {
lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+2*FH, STR_MENUTOSTART);
}
break;
case CALIB_SET_MIDPOINT:
// SET MIDPOINT
lcdDrawText(0*FW, MENU_HEADER_HEIGHT+FH, STR_SETMIDPOINT, INVERS);
lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+2*FH, STR_MENUWHENDONE);
adcCalibSetMidPoint();
break;
case CALIB_MOVE_STICKS:
// MOVE STICKS/POTS
lcdDrawText(0*FW, MENU_HEADER_HEIGHT+FH, STR_MOVESTICKSPOTS, INVERS);
lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+2*FH, STR_MENUWHENDONE);
adcCalibSetMinMax();
break;
case CALIB_STORE:
adcCalibSetXPot();
adcCalibStore();
reusableBuffer.calib.state = CALIB_FINISHED;
break;
default:
reusableBuffer.calib.state = CALIB_START;
break;
}
doMainScreenGraphics();
}
+27
View File
@@ -0,0 +1,27 @@
/*
* Copyright (C) EdgeTX
*
* Based on code named
* opentx - https://github.com/opentx/opentx
* 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.
*/
#pragma once
#include "opentx_types.h"
// Runs the main calibration steps
void menuCommonCalib(event_t event);
+11 -5
View File
@@ -22,6 +22,9 @@
#include "opentx.h"
#include <math.h>
#include "hal/adc_driver.h"
#include "analogs.h"
#if defined(MULTIMODULE)
void lcdDrawMultiProtocolString(coord_t x, coord_t y, uint8_t moduleIdx, uint8_t protocol, LcdFlags flags)
{
@@ -305,12 +308,15 @@ void drawGVarName(coord_t x, coord_t y, int8_t idx, LcdFlags flags)
lcdDrawText(x, y, s, flags);
}
void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags, uint8_t old_editMode)
void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event,
LcdFlags flags, uint8_t old_editMode)
{
lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, idx+1, 0);
if (g_eeGeneral.anaNames[idx][0] || (flags && s_editMode > 0))
editName(x, y, g_eeGeneral.anaNames[idx], LEN_ANA_NAME, event, (flags != 0),
flags, old_editMode);
lcdDrawText(INDENT_WIDTH, y, STR_CHAR_STICK, 0);
lcdDrawText(lcdNextPos, y, analogGetCanonicalName(ADC_INPUT_MAIN, idx), 0);
if (analogHasCustomLabel(ADC_INPUT_MAIN, idx) || (flags && s_editMode > 0))
editName(x, y, (char*)analogGetCustomLabel(ADC_INPUT_MAIN, idx),
LEN_ANA_NAME, event, (flags != 0), flags, old_editMode);
else
lcdDrawMMM(x, y, flags);
}
+6 -14
View File
@@ -52,20 +52,12 @@ void menuModelCurvesAll(event_t event)
int8_t sub = menuVerticalPosition - HEADER_LINE;
switch (event) {
#if defined(ROTARY_ENCODER_NAVIGATION)
case EVT_ROTARY_BREAK:
#endif
#if !defined(PCBTARANIS)
case EVT_KEY_FIRST(KEY_RIGHT):
#endif
case EVT_KEY_FIRST(KEY_ENTER):
if (CURVE_SELECTED() && !READ_ONLY()) {
s_currIdxSubMenu = sub;
s_currSrcRaw = MIXSRC_NONE;
pushMenu(menuModelCurveOne);
}
break;
if (event == EVT_KEY_BREAK(KEY_ENTER) &&
CURVE_SELECTED() && !READ_ONLY()) {
s_currIdxSubMenu = sub;
s_currSrcRaw = MIXSRC_NONE;
pushMenu(menuModelCurveOne);
}
for (uint8_t i=0; i<LCD_LINES-1; i++) {
+64 -56
View File
@@ -21,6 +21,8 @@
#include "opentx.h"
#include "tasks/mixer_task.h"
#include "hal/adc_driver.h"
#include "input_mapping.h"
#define _STR_MAX(x) "/" #x
#define STR_MAX(x) _STR_MAX(x)
@@ -57,7 +59,11 @@ void insertExpo(uint8_t idx)
memmove(expo+1, expo, (MAX_EXPOS-(idx+1))*sizeof(ExpoData));
memclear(expo, sizeof(ExpoData));
for (int i = s_currCh; i < INPUTSRC_LAST; i++) {
expo->srcRaw = (s_currCh > 4 ? MIXSRC_Rud - 1 + i: MIXSRC_Rud - 1 + channelOrder(i));
if (i > adcGetMaxInputs(ADC_INPUT_MAIN)) {
expo->srcRaw = MIXSRC_FIRST_STICK - 1 + i;
} else {
expo->srcRaw = MIXSRC_FIRST_STICK + inputMappingChannelOrder(i - 1);
}
if (isSourceAvailableInInputs(expo->srcRaw)) {
break;
}
@@ -178,12 +184,17 @@ void displayExpoInfos(coord_t y, ExpoData * ed)
drawSwitch(EXPO_LINE_SWITCH_POS, y, ed->swtch, 0);
}
void displayExpoLine(coord_t y, ExpoData * ed)
void displayExpoLine(coord_t y, ExpoData * ed, LcdFlags attr)
{
drawSource(EXPO_LINE_SRC_POS, y, ed->srcRaw, 0);
drawSource(EXPO_LINE_SRC_POS, y, ed->srcRaw, attr);
if (ed->trimSource != TRIM_ON) {
lcdDrawChar(EXPO_LINE_TRIM_POS, y, ed->trimSource > 0 ? '-' : STR_RETA123[-ed->trimSource][0]);
if (ed->trimSource > 0) {
lcdDrawChar(EXPO_LINE_TRIM_POS, y, '-', attr);
} else {
const char* short_label = getAnalogShortLabel(-ed->trimSource);
lcdDrawChar(EXPO_LINE_TRIM_POS, y, short_label ? short_label[0] : ' ', attr);
}
}
if (!ed->flightModes || ((ed->curve.value || ed->swtch) && ((get_tmr10ms() / 200) & 1)))
@@ -192,7 +203,7 @@ void displayExpoLine(coord_t y, ExpoData * ed)
displayFlightModes(EXPO_LINE_FM_POS, y, ed->flightModes);
if (ed->name[0]) {
lcdDrawSizedText(EXPO_LINE_NAME_POS, y, ed->name, sizeof(ed->name), 0);
lcdDrawSizedText(EXPO_LINE_NAME_POS, y, ed->name, sizeof(ed->name), attr);
}
#if LCD_DEPTH > 1
@@ -201,7 +212,7 @@ void displayExpoLine(coord_t y, ExpoData * ed)
}
#endif
}
#else
#else // LCD_W < 212
#define EXPO_LINE_WEIGHT_POS 7*FW+8
#define EXPO_LINE_SRC_POS 8*FW+3
#define EXPO_LINE_INFOS_POS 11*FW+11
@@ -219,12 +230,12 @@ void displayExpoInfos(coord_t y, ExpoData * ed)
}
}
void displayExpoLine(coord_t y, ExpoData * ed)
void displayExpoLine(coord_t y, ExpoData * ed, LcdFlags attr)
{
drawSource(EXPO_LINE_SRC_POS, y, ed->srcRaw, 0);
drawSource(EXPO_LINE_SRC_POS, y, ed->srcRaw, attr);
if (ed->name[0])
lcdDrawSizedText(EXPO_LINE_INFOS_POS, y, ed->name, LEN_EXPOMIX_NAME, 0);
lcdDrawSizedText(EXPO_LINE_INFOS_POS, y, ed->name, LEN_EXPOMIX_NAME, attr);
else if (!ed->flightModes || ((ed->curve.value || ed->swtch) && ((get_tmr10ms() / 200) & 1)))
displayExpoInfos(y, ed);
else
@@ -319,54 +330,51 @@ void menuModelExposAll(event_t event)
}
}
break;
case EVT_KEY_LONG(KEY_LEFT):
case EVT_KEY_LONG(KEY_RIGHT):
if (s_copyMode && !s_copyTgtOfs) {
if (reachExposLimit()) break;
s_currCh = chn;
if (event == EVT_KEY_LONG(KEY_RIGHT)) { s_currIdx++; menuVerticalPosition++; }
insertExpo(s_currIdx);
pushMenu(menuModelExpoOne);
s_copyMode = 0;
killEvents(event);
}
break;
case EVT_KEY_FIRST(KEY_UP):
case EVT_KEY_REPT(KEY_UP):
case EVT_KEY_FIRST(KEY_DOWN):
case EVT_KEY_REPT(KEY_DOWN):
#if defined(ROTARY_ENCODER_NAVIGATION)
case EVT_ROTARY_RIGHT:
case EVT_ROTARY_LEFT:
#endif
if (s_copyMode) {
uint8_t next_ofs = (IS_PREVIOUS_EVENT(event) ? s_copyTgtOfs - 1 : s_copyTgtOfs + 1);
// TODO: add PLUS / MINUS?
// case EVT_KEY_LONG(KEY_LEFT):
// case EVT_KEY_LONG(KEY_RIGHT):
// if (s_copyMode && !s_copyTgtOfs) {
// if (reachExposLimit()) break;
// s_currCh = chn;
// if (event == EVT_KEY_LONG(KEY_RIGHT)) { s_currIdx++; menuVerticalPosition++; }
// insertExpo(s_currIdx);
// pushMenu(menuModelExpoOne);
// s_copyMode = 0;
// killEvents(event);
// }
// break;
}
if (s_copyMode &&
(IS_NEXT_EVENT(event) || IS_PREVIOUS_EVENT(event))) {
uint8_t next_ofs = (IS_PREVIOUS_EVENT(event) ? s_copyTgtOfs - 1 : s_copyTgtOfs + 1);
if (s_copyTgtOfs==0 && s_copyMode==COPY_MODE) {
// insert a mix on the same channel (just above / just below)
if (reachExposLimit()) break;
copyExpo(s_currIdx);
if (IS_NEXT_EVENT(event))
s_currIdx++;
else if (sub-menuVerticalOffset >= 6)
menuVerticalOffset++;
}
else if (next_ofs==0 && s_copyMode==COPY_MODE) {
// delete the mix
deleteExpo(s_currIdx);
if (IS_PREVIOUS_EVENT(event))
s_currIdx--;
}
else {
// only swap the mix with its neighbor
if (!swapExpos(s_currIdx, IS_PREVIOUS_EVENT(event)))
break;
storageDirty(EE_MODEL);
}
s_copyTgtOfs = next_ofs;
if (s_copyTgtOfs==0 && s_copyMode==COPY_MODE) {
// insert a mix on the same channel (just above / just below)
if (!reachExposLimit()) {
copyExpo(s_currIdx);
if (IS_NEXT_EVENT(event))
s_currIdx++;
else if (sub-menuVerticalOffset >= 6)
menuVerticalOffset++;
}
break;
}
else if (next_ofs==0 && s_copyMode==COPY_MODE) {
// delete the mix
deleteExpo(s_currIdx);
if (IS_PREVIOUS_EVENT(event))
s_currIdx--;
}
else {
// only swap the mix with its neighbor
if (swapExpos(s_currIdx, IS_PREVIOUS_EVENT(event))) {
storageDirty(EE_MODEL);
}
}
s_copyTgtOfs = next_ofs;
}
lcdDrawNumber(FW*sizeof(TR_MENUINPUTS)+FW+FW/2, 0, getExposCount(), RIGHT);
@@ -421,7 +429,7 @@ void menuModelExposAll(event_t event)
LcdFlags attr = ((s_copyMode || sub != cur) ? 0 : INVERS);
GVAR_MENU_ITEM(EXPO_LINE_WEIGHT_POS, y, ed->weight, -100, 100, RIGHT | attr | (isExpoActive(i) ? BOLD : 0), 0, 0);
displayExpoLine(y, ed);
displayExpoLine(y, ed, attr);
if (s_copyMode) {
if ((s_copyMode==COPY_MODE || s_copyTgtOfs == 0) && s_copySrcCh == ch && i == (s_copySrcIdx + (s_copyTgtOfs<0))) {
+49 -45
View File
@@ -21,6 +21,8 @@
#include "opentx.h"
#include "tasks/mixer_task.h"
#include "hal/adc_driver.h"
#include "input_mapping.h"
#define _STR_MAX(x) "/" #x
#define STR_MAX(x) _STR_MAX(x)
@@ -67,7 +69,11 @@ void insertMix(uint8_t idx)
mix->destCh = s_currCh-1;
mix->srcRaw = s_currCh;
if (!isSourceAvailable(mix->srcRaw)) {
mix->srcRaw = (s_currCh > 4 ? MIXSRC_Rud - 1 + s_currCh : MIXSRC_Rud - 1 + channelOrder(s_currCh));
if (s_currCh > adcGetMaxInputs(ADC_INPUT_MAIN)) {
mix->srcRaw = MIXSRC_FIRST_STICK - 1 + s_currCh;
} else {
mix->srcRaw = MIXSRC_FIRST_STICK + inputMappingChannelOrder(s_currCh - 1);
}
while (!isSourceAvailable(mix->srcRaw)) {
mix->srcRaw += 1;
}
@@ -339,53 +345,51 @@ void menuModelMixAll(event_t event)
}
}
break;
case EVT_KEY_LONG(KEY_LEFT):
case EVT_KEY_LONG(KEY_RIGHT):
if (s_copyMode && !s_copyTgtOfs) {
if (reachMixesLimit()) break;
s_currCh = chn;
if (event == EVT_KEY_LONG(KEY_RIGHT)) { s_currIdx++; menuVerticalPosition++; }
insertMix(s_currIdx);
pushMenu(menuModelMixOne);
s_copyMode = 0;
killEvents(event);
}
break;
case EVT_KEY_FIRST(KEY_UP):
case EVT_KEY_REPT(KEY_UP):
case EVT_KEY_FIRST(KEY_DOWN):
case EVT_KEY_REPT(KEY_DOWN):
#if defined(ROTARY_ENCODER_NAVIGATION)
case EVT_ROTARY_RIGHT:
case EVT_ROTARY_LEFT:
#endif
if (s_copyMode) {
uint8_t next_ofs = (IS_PREVIOUS_EVENT(event) ? s_copyTgtOfs - 1 : s_copyTgtOfs + 1);
if (s_copyTgtOfs==0 && s_copyMode==COPY_MODE) {
// insert a mix on the same channel (just above / just below)
if (reachMixesLimit()) break;
copyMix(s_currIdx);
if (IS_NEXT_EVENT(event))
s_currIdx++;
else if (sub - menuVerticalOffset >= 6)
menuVerticalOffset++;
}
else if (next_ofs==0 && s_copyMode==COPY_MODE) {
// delete the mix
deleteMix(s_currIdx);
if (IS_PREVIOUS_EVENT(event))
s_currIdx--;
}
else {
// only swap the mix with its neighbor
if (!swapMixes(s_currIdx, IS_PREVIOUS_EVENT(event))) break;
storageDirty(EE_MODEL);
}
// TODO: add PLUS / MINUS?
// case EVT_KEY_LONG(KEY_LEFT):
// case EVT_KEY_LONG(KEY_RIGHT):
// if (s_copyMode && !s_copyTgtOfs) {
// if (reachMixesLimit()) break;
// s_currCh = chn;
// if (event == EVT_KEY_LONG(KEY_RIGHT)) { s_currIdx++; menuVerticalPosition++; }
// insertMix(s_currIdx);
// pushMenu(menuModelMixOne);
// s_copyMode = 0;
// killEvents(event);
// }
// break;
}
s_copyTgtOfs = next_ofs;
if (s_copyMode &&
(IS_NEXT_EVENT(event) || IS_PREVIOUS_EVENT(event))) {
uint8_t next_ofs = (IS_PREVIOUS_EVENT(event) ? s_copyTgtOfs - 1 : s_copyTgtOfs + 1);
if (s_copyTgtOfs==0 && s_copyMode==COPY_MODE) {
// insert a mix on the same channel (just above / just below)
if (!reachMixesLimit()) {
copyMix(s_currIdx);
if (IS_NEXT_EVENT(event))
s_currIdx++;
else if (sub - menuVerticalOffset >= 6)
menuVerticalOffset++;
}
break;
}
else if (next_ofs==0 && s_copyMode==COPY_MODE) {
// delete the mix
deleteMix(s_currIdx);
if (IS_PREVIOUS_EVENT(event))
s_currIdx--;
}
else {
// only swap the mix with its neighbor
if (swapMixes(s_currIdx, IS_PREVIOUS_EVENT(event))) {
storageDirty(EE_MODEL);
}
}
s_copyTgtOfs = next_ofs;
}
lcdDrawNumber(FW*sizeof(TR_MIXES)+FW/2, 0, getMixesCount(), 0);
@@ -61,7 +61,7 @@ void menuModelUSBJoystickOne(event_t event)
killEvents(event);
}
#elif defined(NAVIGATION_XLITE)
if (event == EVT_KEY_FIRST(KEY_ENTER) && IS_SHIFT_PRESSED()) {
if (event == EVT_KEY_FIRST(KEY_ENTER) && keysGetState(KEY_SHIFT)) {
pushMenu(menuChannelsView);
killEvents(event);
}
+40 -56
View File
@@ -106,72 +106,56 @@ const char * runPopupMenu(event_t event)
}
#endif
switch (eventTemp) {
#if defined(ROTARY_ENCODER_NAVIGATION)
CASE_EVT_ROTARY_LEFT
#endif
case EVT_KEY_FIRST(KEY_UP):
case EVT_KEY_REPT(KEY_UP):
if (popupMenuSelectedItem > 0) {
popupMenuSelectedItem--;
}
if (IS_PREVIOUS_EVENT(eventTemp)) {
if (popupMenuSelectedItem > 0) {
popupMenuSelectedItem--;
}
#if defined(SDCARD)
else if (popupMenuOffset > 0) {
popupMenuOffset--;
else if (popupMenuOffset > 0) {
popupMenuOffset--;
result = STR_UPDATE_LIST;
}
#endif
else {
popupMenuSelectedItem = min<uint8_t>(display_count, MENU_MAX_DISPLAY_LINES) - 1;
#if defined(SDCARD)
if (popupMenuItemsCount > MENU_MAX_DISPLAY_LINES) {
popupMenuOffset = popupMenuItemsCount - display_count;
result = STR_UPDATE_LIST;
}
#endif
else {
popupMenuSelectedItem = min<uint8_t>(display_count, MENU_MAX_DISPLAY_LINES) - 1;
}
} else if (IS_NEXT_EVENT(eventTemp)) {
if (popupMenuSelectedItem < display_count - 1 && popupMenuOffset + popupMenuSelectedItem + 1 < popupMenuItemsCount) {
popupMenuSelectedItem++;
}
#if defined(SDCARD)
if (popupMenuItemsCount > MENU_MAX_DISPLAY_LINES) {
popupMenuOffset = popupMenuItemsCount - display_count;
result = STR_UPDATE_LIST;
}
else if (popupMenuItemsCount > popupMenuOffset + display_count) {
popupMenuOffset++;
result = STR_UPDATE_LIST;
}
#endif
}
break;
#if defined(ROTARY_ENCODER_NAVIGATION)
CASE_EVT_ROTARY_RIGHT
#endif
case EVT_KEY_FIRST(KEY_DOWN):
case EVT_KEY_REPT(KEY_DOWN):
if (popupMenuSelectedItem < display_count - 1 && popupMenuOffset + popupMenuSelectedItem + 1 < popupMenuItemsCount) {
popupMenuSelectedItem++;
}
else {
popupMenuSelectedItem = 0;
#if defined(SDCARD)
else if (popupMenuItemsCount > popupMenuOffset + display_count) {
popupMenuOffset++;
if (popupMenuOffset) {
popupMenuOffset = 0;
result = STR_UPDATE_LIST;
}
#endif
else {
popupMenuSelectedItem = 0;
#if defined(SDCARD)
if (popupMenuOffset) {
popupMenuOffset = 0;
result = STR_UPDATE_LIST;
}
#endif
}
break;
case EVT_KEY_BREAK(KEY_ENTER):
result = popupMenuItems[popupMenuSelectedItem + (popupMenuOffsetType == MENU_OFFSET_INTERNAL ? popupMenuOffset : 0)];
popupMenuItemsCount = 0;
popupMenuSelectedItem = 0;
popupMenuOffset = 0;
popupMenuTitle = nullptr;
break;
case EVT_KEY_BREAK(KEY_EXIT):
result = STR_EXIT;
popupMenuItemsCount = 0;
popupMenuSelectedItem = 0;
popupMenuOffset = 0;
popupMenuTitle = nullptr;
break;
}
} else if (eventTemp == EVT_KEY_BREAK(KEY_ENTER)) {
result = popupMenuItems[popupMenuSelectedItem + (popupMenuOffsetType == MENU_OFFSET_INTERNAL ? popupMenuOffset : 0)];
popupMenuItemsCount = 0;
popupMenuSelectedItem = 0;
popupMenuOffset = 0;
popupMenuTitle = nullptr;
} else if (eventTemp == EVT_KEY_BREAK(KEY_EXIT)) {
result = STR_EXIT;
popupMenuItemsCount = 0;
popupMenuSelectedItem = 0;
popupMenuOffset = 0;
popupMenuTitle = nullptr;
}
return result;
+278 -445
View File
@@ -19,250 +19,21 @@
* GNU General Public License for more details.
*/
#include <opentx.h>
#include "hal/adc_driver.h"
#include "io/frsky_firmware_update.h"
#include "opentx.h"
#if defined(CROSSFIRE)
#include "telemetry/crossfire.h"
#endif
#include "hal/adc_driver.h"
#include "hal/switch_driver.h"
#include "hal/module_port.h"
#include "analogs.h"
#include "switches.h"
#if defined(BLUETOOTH)
#include "bluetooth_driver.h"
#endif
#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,
#if (NUM_POTS + NUM_SLIDERS) > 0
ITEM_RADIO_HARDWARE_LABEL_POTS,
ITEM_RADIO_HARDWARE_POT1,
#endif
#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(RADIO_TPRO)
#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
#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,
ITEM_RADIO_HARDWARE_RTC_BATTERY,
ITEM_RADIO_HARDWARE_RTC_CHECK,
#if defined(TX_CAPACITY_MEASUREMENT)
ITEM_RADIO_HARDWARE_CAPACITY_CALIB,
#endif
#if !defined(PCBX9D) && !defined(PCBX9DP) && !defined(PCBX9E)
ITEM_RADIO_HARDWARE_LABEL_INTERNAL_MODULE,
ITEM_RADIO_HARDWARE_INTERNAL_MODULE_TYPE,
ITEM_RADIO_HARDWARE_INTERNAL_MODULE_BAUDRATE,
#endif
#if defined(HARDWARE_EXTERNAL_MODULE)
ITEM_RADIO_HARDWARE_SERIAL_SAMPLE_MODE,
#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) || defined(USB_SERIAL)
ITEM_RADIO_HARDWARE_SERIAL_PORT_LABEL,
ITEM_RADIO_HARDWARE_AUX1_SERIAL_MODE,
ITEM_RADIO_HARDWARE_AUX2_SERIAL_MODE,
ITEM_RADIO_HARDWARE_VCP_SERIAL_MODE,
#endif
ITEM_RADIO_HARDWARE_JITTER_FILTER,
ITEM_RADIO_HARDWARE_RAS,
ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER,
ITEM_RADIO_HARDWARE_DEBUG,
#if defined(EEPROM)
ITEM_RADIO_BACKUP_EEPROM,
ITEM_RADIO_FACTORY_RESET,
#endif
ITEM_RADIO_HARDWARE_MAX
};
#if (NUM_POTS + NUM_SLIDERS) == 0
#define POTS_ROWS
#elif (NUM_POTS + NUM_SLIDERS) == 1
#define POTS_ROWS LABEL(Pots), NAVIGATION_LINE_BY_LINE|1,
#elif (NUM_POTS + NUM_SLIDERS) == 2
#define POTS_ROWS LABEL(Pots), NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1,
#elif (NUM_POTS + NUM_SLIDERS) == 3
#define POTS_ROWS LABEL(Pots), 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 LABEL(Pots), 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 LABEL(Pots), 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 LABEL(Pots), 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 LABEL(Pots), 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_TPRO)
#define SWITCHES_ROWS 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_ZORRO)
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SB - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SC - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_3POS : SWITCH_2POS)
#elif defined(RADIO_T8) || defined(RADIO_COMMANDO8)
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SA - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SD - 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) || \
(MIXSRC_SI - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SJ - MIXSRC_FIRST_SWITCH == sw)) ? SWITCH_2POS : SWITCH_3POS)
#elif defined(RADIO_TX12MK2)
#define SWITCH_TYPE_MAX(sw) (((MIXSRC_SA - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SD - MIXSRC_FIRST_SWITCH == sw)) ? SWITCH_2POS : SWITCH_3POS)
#elif defined(RADIO_BOXER)
#define SWITCH_TYPE_MAX(sw) (((MIXSRC_SB - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SC - MIXSRC_FIRST_SWITCH == sw)) ? SWITCH_3POS : SWITCH_2POS)
#elif defined(RADIO_T12)
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SG - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH - 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
#define RTC_ROW READONLY_ROW, 0,
#if defined(TX_CAPACITY_MEASUREMENT)
#define TX_CAPACITY_MEASUREMENT_ROWS 0,
#else
#define TX_CAPACITY_MEASUREMENT_ROWS
#endif
#if !defined(PCBX9D) && !defined(PCBX9DP) && !defined(PCBX9E)
#define INTERNAL_MODULE_ROWS \
LABEL(InternalModule), 0, \
(isInternalModuleCrossfire() ? (uint8_t)0 : HIDDEN_ROW),
#else
#define INTERNAL_MODULE_ROWS
#endif
#if defined(HARDWARE_EXTERNAL_MODULE)
#define SERIAL_SAMPLE_MODE_ROWS 0,
#else
#define SERIAL_SAMPLE_MODE_ROWS
#endif
#if defined(AUX_SERIAL) || defined(USB_SERIAL)
static uint8_t _dispSerialPort(uint8_t port_nr)
{
auto port = serialGetPort(port_nr);
if (!port || !port->name) return HIDDEN_ROW;
return 0;
}
#define SERIAL_PORT_ROWS \
LABEL(SerialPorts), _dispSerialPort(SP_AUX1), _dispSerialPort(SP_AUX2), \
_dispSerialPort(SP_VCP),
#else
#define SERIAL_PORT_ROWS
#if defined(CROSSFIRE)
#include "telemetry/crossfire.h"
#endif
#if LCD_W >= 212
@@ -273,22 +44,69 @@ static uint8_t _dispSerialPort(uint8_t port_nr)
#define HW_SETTINGS_COLUMN2 (HW_SETTINGS_COLUMN1 + 5*FW)
#endif
#define SPORT_PWR_ROW (hasSportPower() ? (uint8_t)0 : HIDDEN_ROW)
enum {
ITEM_RADIO_HARDWARE_LABEL_STICKS = 0,
ITEM_RADIO_HARDWARE_STICK,
ITEM_RADIO_HARDWARE_STICK_END = ITEM_RADIO_HARDWARE_STICK + MAX_STICKS - 1,
ITEM_RADIO_HARDWARE_LABEL_POTS,
ITEM_RADIO_HARDWARE_POT,
ITEM_RADIO_HARDWARE_POT_END = ITEM_RADIO_HARDWARE_POT + MAX_POTS - 1,
ITEM_RADIO_HARDWARE_LABEL_SWITCHES,
ITEM_RADIO_HARDWARE_SWITCH,
ITEM_RADIO_HARDWARE_SWITCH_END = ITEM_RADIO_HARDWARE_SWITCH + MAX_SWITCHES - 1,
ITEM_RADIO_HARDWARE_BATTERY_CALIB,
ITEM_RADIO_HARDWARE_RTC_BATTERY,
ITEM_RADIO_HARDWARE_RTC_CHECK,
ITEM_RADIO_HARDWARE_LABEL_INTERNAL_MODULE,
ITEM_RADIO_HARDWARE_INTERNAL_MODULE_TYPE,
ITEM_RADIO_HARDWARE_INTERNAL_MODULE_BAUDRATE,
ITEM_RADIO_HARDWARE_SERIAL_SAMPLE_MODE,
#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
ITEM_RADIO_HARDWARE_EXTERNAL_ANTENNA,
ITEM_RADIO_HARDWARE_SERIAL_PORT_LABEL,
ITEM_RADIO_HARDWARE_SERIAL_PORT,
ITEM_RADIO_HARDWARE_SERIAL_PORT_END = ITEM_RADIO_HARDWARE_SERIAL_PORT + MAX_SERIAL_PORTS - 1,
ITEM_RADIO_HARDWARE_JITTER_FILTER,
ITEM_RADIO_HARDWARE_RAS,
ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER,
ITEM_RADIO_HARDWARE_DEBUG,
#if defined(FUNCTION_SWITCHES)
ITEM_RADIO_HARDWARE_DEBUG_FS,
#endif
#if defined(EEPROM)
#define EEPROM_ROWS 0 /* EEPROM backup */, 0 /* Factory reset */,
void onFactoryResetConfirm(const char* result)
ITEM_RADIO_BACKUP_EEPROM,
ITEM_RADIO_FACTORY_RESET,
#endif
ITEM_RADIO_HARDWARE_MAX
};
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
static void onHardwareAntennaSwitchConfirm(const char * result)
{
if (result == STR_OK) {
showMessageBox(STR_STORAGE_FORMAT);
storageEraseAll(false);
NVIC_SystemReset();
// Switch to external antenna confirmation
g_eeGeneral.antennaMode = reusableBuffer.radioHardware.antennaMode;
storageDirty(EE_GENERAL);
}
else {
reusableBuffer.radioHardware.antennaMode = g_eeGeneral.antennaMode;
}
}
#else
#define EEPROM_ROWS
#endif
static uint8_t _dispSerialPort(uint8_t port_nr)
{
auto port = serialGetPort(port_nr);
if (!port || !port->name) return HIDDEN_ROW;
return 0;
}
static bool _isAux1ModeAvailable(int m) { return isSerialModeAvailable(SP_AUX1, m); }
static bool _isAux2ModeAvailable(int m) { return isSerialModeAvailable(SP_AUX2, m); }
static bool _isVCPModeAvailable(int m) { return isSerialModeAvailable(SP_VCP, m); }
@@ -297,34 +115,116 @@ static const IsValueAvailable _isSerialModeAvailable[MAX_SERIAL_PORTS] = {
_isAux1ModeAvailable, _isAux2ModeAvailable, _isVCPModeAvailable
};
#if defined(EEPROM)
void onFactoryResetConfirm(const char* result)
{
if (result == STR_OK) {
showMessageBox(STR_STORAGE_FORMAT);
storageEraseAll(false);
NVIC_SystemReset();
}
}
#endif
static void _init_menu_tab_array(uint8_t* tab, size_t len)
{
memset((void*)tab, READONLY_ROW, sizeof(MENU_TAB_ARRAY_TYPE) * len);
tab += HEADER_LINE; // skip header line
tab[ITEM_RADIO_HARDWARE_LABEL_STICKS] = 0; // calib button
auto max_sticks = adcGetMaxInputs(ADC_INPUT_MAIN);
for (int i = ITEM_RADIO_HARDWARE_STICK; i <= ITEM_RADIO_HARDWARE_STICK_END; i++) {
uint8_t idx = i - ITEM_RADIO_HARDWARE_STICK;
tab[i] = idx < max_sticks ? 0 : HIDDEN_ROW;
}
auto max_pots = adcGetMaxInputs(ADC_INPUT_POT);
for (int i = ITEM_RADIO_HARDWARE_POT; i <= ITEM_RADIO_HARDWARE_POT_END; i++) {
uint8_t idx = i - ITEM_RADIO_HARDWARE_POT;
tab[i] = idx < max_pots ? 1 : HIDDEN_ROW;
}
auto max_switches = switchGetMaxSwitches();
for (int i = ITEM_RADIO_HARDWARE_SWITCH; i <= ITEM_RADIO_HARDWARE_SWITCH_END; i++) {
uint8_t idx = i - ITEM_RADIO_HARDWARE_SWITCH;
tab[i] = idx < max_switches ? 1 : HIDDEN_ROW;
}
tab[ITEM_RADIO_HARDWARE_BATTERY_CALIB] = 0;
tab[ITEM_RADIO_HARDWARE_RTC_BATTERY] = READONLY_ROW;
tab[ITEM_RADIO_HARDWARE_RTC_CHECK] = 0;
#if defined(HARDWARE_INTERNAL_MODULE)
tab[ITEM_RADIO_HARDWARE_INTERNAL_MODULE_TYPE] = 0;
tab[ITEM_RADIO_HARDWARE_INTERNAL_MODULE_BAUDRATE] =
isInternalModuleCrossfire() ? (uint8_t)0 : HIDDEN_ROW;
#else
memset((void*)&tab[ITEM_RADIO_HARDWARE_LABEL_INTERNAL_MODULE], HIDDEN_ROW, 3);
#endif
#if defined(HARDWARE_EXTERNAL_MODULE)
tab[ITEM_RADIO_HARDWARE_SERIAL_SAMPLE_MODE] = 0;
#else
tab[ITEM_RADIO_HARDWARE_SERIAL_SAMPLE_MODE] = HIDDEN_ROW;
#endif
#if defined(BLUETOOTH)
bool has_bt = IS_BLUETOOTH_CHIP_PRESENT();
tab[ITEM_RADIO_HARDWARE_BLUETOOTH_MODE] = has_bt ? 0 : HIDDEN_ROW;
bool bt_telem = g_eeGeneral.bluetoothMode == BLUETOOTH_TELEMETRY;
tab[ITEM_RADIO_HARDWARE_BLUETOOTH_PAIRING_CODE] = bt_telem ? READONLY_ROW : HIDDEN_ROW;
bool bt_off = g_eeGeneral.bluetoothMode == BLUETOOTH_OFF;
tab[ITEM_RADIO_HARDWARE_BLUETOOTH_LOCAL_ADDR] = bt_off ? HIDDEN_ROW : READONLY_ROW;
tab[ITEM_RADIO_HARDWARE_BLUETOOTH_DISTANT_ADDR] = bt_off ? HIDDEN_ROW : READONLY_ROW;
tab[ITEM_RADIO_HARDWARE_BLUETOOTH_NAME] = bt_off ? HIDDEN_ROW : 0;
#endif
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
tab[ITEM_RADIO_HARDWARE_EXTERNAL_ANTENNA] =
g_eeGeneral.internalModule == MODULE_TYPE_XJT_PXX1 ? 0 : HIDDEN_ROW;
#else
tab[ITEM_RADIO_HARDWARE_EXTERNAL_ANTENNA] = HIDDEN_ROW;
#endif
bool has_serial = false;
for (int i = 0; i < MAX_SERIAL_PORTS; i++) {
uint8_t idx = ITEM_RADIO_HARDWARE_SERIAL_PORT + i;
auto r = _dispSerialPort(i);
tab[idx] = r;
has_serial = has_serial || (!r);
}
tab[ITEM_RADIO_HARDWARE_SERIAL_PORT_LABEL] = has_serial ? 0 : HIDDEN_ROW;
tab[ITEM_RADIO_HARDWARE_JITTER_FILTER] = 0;
tab[ITEM_RADIO_HARDWARE_RAS] = READONLY_ROW;
auto mod_desc = modulePortGetModuleDescription(SPORT_MODULE);
if (mod_desc && mod_desc->set_pwr) {
tab[ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER] = 0;
} else {
tab[ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER] = HIDDEN_ROW;
}
tab[ITEM_RADIO_HARDWARE_DEBUG] = 1;
#if defined(FUNCTIONS_SWITCHES)
tab[ITEM_RADIO_HARDWARE_DEBUG_FS] = 0;
#endif
#if defined(EEPROM)
tab[ITEM_RADIO_BACKUP_EEPROM] = 0;
tab[ITEM_RADIO_FACTORY_RESET] = 0;
#endif
}
void menuRadioHardware(event_t event)
{
uint8_t old_editMode = s_editMode;
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 */,
POTS_ROWS
LABEL(Switches),
SWITCHES_ROWS,
0 /* battery calib */,
RTC_ROW
TX_CAPACITY_MEASUREMENT_ROWS
INTERNAL_MODULE_ROWS
SERIAL_SAMPLE_MODE_ROWS
BLUETOOTH_ROWS
EXTERNAL_ANTENNA_ROW
SERIAL_PORT_ROWS
0 /* ADC filter */,
READONLY_ROW /* RAS */,
SPORT_PWR_ROW,
1 /* debugs */,
EEPROM_ROWS
});
uint8_t MENU_TAB_ARRAY_NAME[HEADER_LINE + ITEM_RADIO_HARDWARE_MAX];
_init_menu_tab_array(MENU_TAB_ARRAY_NAME, HEADER_LINE + ITEM_RADIO_HARDWARE_MAX);
MENU_CHECK(menuTabGeneral, MENU_RADIO_HARDWARE, HEADER_LINE + ITEM_RADIO_HARDWARE_MAX);
title(STR_HARDWARE);
uint8_t sub = menuVerticalPosition - HEADER_LINE;
@@ -347,9 +247,9 @@ void menuRadioHardware(event_t event)
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) {
uint8_t k = i + menuVerticalOffset;
for (int j = 0; j <= k; j++) {
if (mstate_tab[j + HEADER_LINE] == HIDDEN_ROW) {
k++;
}
}
@@ -365,139 +265,17 @@ void menuRadioHardware(event_t event)
}
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, old_editMode);
break;
#if (NUM_POTS + NUM_SLIDERS) > 0
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, 0, old_editMode);
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,
0, old_editMode);
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
#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(RADIO_TPRO)
#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
#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, 0, old_editMode);
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);
#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);
}
@@ -512,17 +290,6 @@ void menuRadioHardware(event_t event)
g_eeGeneral.disableRtcWarning = 1 - editCheckBox(1 - g_eeGeneral.disableRtcWarning, HW_SETTINGS_COLUMN2, y, STR_RTC_CHECK, attr, event);
break;
#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(PCBX9D) && !defined(PCBX9DP) && !defined(PCBX9E)
case ITEM_RADIO_HARDWARE_LABEL_INTERNAL_MODULE:
lcdDrawTextAlignedLeft(y, STR_INTERNALRF);
break;
@@ -545,9 +312,7 @@ void menuRadioHardware(event_t event)
#endif
}
} break;
#endif
#if !defined(PCBX9D) && !defined(PCBX9DP) && !defined(PCBX9E)
case ITEM_RADIO_HARDWARE_INTERNAL_MODULE_BAUDRATE:
lcdDrawText(INDENT_WIDTH, y, STR_BAUDRATE);
lcdDrawTextAtIndex(HW_SETTINGS_COLUMN2, y, STR_CRSF_BAUDRATE, CROSSFIRE_STORE_TO_INDEX(g_eeGeneral.internalModuleBaudrate),attr | LEFT);
@@ -558,15 +323,14 @@ void menuRadioHardware(event_t event)
}
}
break;
#endif
#if defined(HARDWARE_EXTERNAL_MODULE)
case ITEM_RADIO_HARDWARE_SERIAL_SAMPLE_MODE:
g_eeGeneral.uartSampleMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_SAMPLE_MODE, STR_SAMPLE_MODES, g_eeGeneral.uartSampleMode, 0, UART_SAMPLE_MODE_MAX, attr, event);
if (attr && checkIncDec_Ret) {
restartModule(EXTERNAL_MODULE);
}
break;
#endif
#if defined(BLUETOOTH)
case ITEM_RADIO_HARDWARE_BLUETOOTH_MODE:
lcdDrawTextAlignedLeft(y, STR_BLUETOOTH);
@@ -614,33 +378,15 @@ void menuRadioHardware(event_t event)
break;
#endif
#if defined(AUX_SERIAL) || defined(USB_SERIAL)
case ITEM_RADIO_HARDWARE_SERIAL_PORT_LABEL:
lcdDrawTextAlignedLeft(y, STR_AUX_SERIAL_MODE);
break;
case ITEM_RADIO_HARDWARE_AUX1_SERIAL_MODE:
case ITEM_RADIO_HARDWARE_AUX2_SERIAL_MODE:
case ITEM_RADIO_HARDWARE_VCP_SERIAL_MODE:
{
auto port_nr = k - ITEM_RADIO_HARDWARE_AUX1_SERIAL_MODE;
auto port = serialGetPort(port_nr);
if (port && port->name) {
lcdDrawText(INDENT_WIDTH, y, port->name);
auto mode = serialGetMode(port_nr);
mode = editChoice(HW_SETTINGS_COLUMN2, y, nullptr,
STR_AUX_SERIAL_MODES, mode, 0, UART_MODE_MAX, attr,
event, _isSerialModeAvailable[port_nr]);
if (attr && checkIncDec_Ret) {
serialSetMode(port_nr, mode);
serialInit(port_nr, mode);
}
}
} break;
#endif
case ITEM_RADIO_HARDWARE_JITTER_FILTER:
g_eeGeneral.noJitterFilter = 1 - editCheckBox(1 - g_eeGeneral.noJitterFilter, HW_SETTINGS_COLUMN2, y, STR_JITTER_FILTER, attr, event);
g_eeGeneral.noJitterFilter =
1 - editCheckBox(1 - g_eeGeneral.noJitterFilter,
HW_SETTINGS_COLUMN2, y, STR_JITTER_FILTER, attr,
event);
break;
case ITEM_RADIO_HARDWARE_RAS:
@@ -661,15 +407,12 @@ void menuRadioHardware(event_t event)
lcdDrawText(lcdNextPos, y, "---");
break;
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) {
auto mod_desc = modulePortGetModuleDescription(SPORT_MODULE);
if (mod_desc && mod_desc->set_pwr) {
mod_desc->set_pwr(g_eeGeneral.sportUpdatePower);
}
}
break;
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) {
modulePortSetPower(SPORT_MODULE, g_eeGeneral.sportUpdatePower);
}
break;
case ITEM_RADIO_HARDWARE_DEBUG:
lcdDrawTextAlignedLeft(y, STR_DEBUG);
@@ -682,6 +425,14 @@ void menuRadioHardware(event_t event)
pushMenu(menuRadioDiagKeys);
}
break;
#if defined(FUNCTION_SWITCHES)
case ITEM_RADIO_HARDWARE_DEBUG_FS:
lcdDrawText(HW_SETTINGS_COLUMN2, y, STR_FS_BTN, attr);
if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) {
pushMenu(menuRadioDiagFS);
}
break;
#endif
#if defined(EEPROM)
case ITEM_RADIO_BACKUP_EEPROM:
@@ -706,7 +457,89 @@ void menuRadioHardware(event_t event)
}
break;
#endif
default:
if (k <= ITEM_RADIO_HARDWARE_STICK_END) {
// Sticks
editStickHardwareSettings(HW_SETTINGS_COLUMN1, y,
k - ITEM_RADIO_HARDWARE_STICK, event,
attr, old_editMode);
} else if (k <= ITEM_RADIO_HARDWARE_POT_END) {
// Pots & sliders
int idx = k - ITEM_RADIO_HARDWARE_POT;
uint8_t shift = (POT_CFG_BITS * idx);
potconfig_t mask = POT_CONFIG_MASK(idx);
// draw hw name
LcdFlags flags = menuHorizontalPosition < 0 ? attr : 0;
lcdDrawText(INDENT_WIDTH, y, STR_CHAR_POT, flags);
lcdDrawText(lcdNextPos, y, adcGetInputName(ADC_INPUT_POT, idx), flags);
// draw custom name
if (analogHasCustomLabel(ADC_INPUT_POT, idx) ||
(attr && s_editMode > 0 && menuHorizontalPosition == 0)) {
editName(HW_SETTINGS_COLUMN1, y,
(char*)analogGetCustomLabel(ADC_INPUT_POT, idx), LEN_ANA_NAME, event,
attr && menuHorizontalPosition == 0, 0, old_editMode);
} else {
lcdDrawMMM(HW_SETTINGS_COLUMN1, y, menuHorizontalPosition==0 ? attr : 0);
}
// pot config
uint8_t potType = (g_eeGeneral.potsConfig & mask) >> shift;
potType = editChoice(HW_SETTINGS_COLUMN2, y, "", STR_POTTYPES, potType,
POT_NONE, POT_SLIDER_WITH_DETENT,
menuHorizontalPosition == 1 ? attr : 0, event);
g_eeGeneral.potsConfig &= ~mask;
g_eeGeneral.potsConfig |= (potType << shift);
} else if (k <= ITEM_RADIO_HARDWARE_SWITCH_END) {
// Switches
int index = k - ITEM_RADIO_HARDWARE_SWITCH;
int config = SWITCH_CONFIG(index);
LcdFlags flags = menuHorizontalPosition < 0 ? attr : 0;
lcdDrawText(INDENT_WIDTH, y, STR_CHAR_SWITCH, flags);
lcdDrawText(lcdNextPos, y, switchGetName(index), flags);
flags = menuHorizontalPosition == 0 ? attr : 0;
if (switchHasCustomName(index) ||
(attr && s_editMode > 0 && menuHorizontalPosition == 0)) {
editName(HW_SETTINGS_COLUMN1, y, (char*)switchGetCustomName(index),
LEN_SWITCH_NAME, event, flags, 0, old_editMode);
} else {
lcdDrawMMM(HW_SETTINGS_COLUMN1, y, flags);
}
flags = menuHorizontalPosition == 1 ? attr : 0;
config = editChoice(HW_SETTINGS_COLUMN2, y, "", STR_SWTYPES, config,
SWITCH_NONE, switchGetMaxType(index), flags, event);
if (attr && checkIncDec_Ret) {
swconfig_t mask = SWITCH_CONFIG_MASK(index);
g_eeGeneral.switchConfig =
(g_eeGeneral.switchConfig & ~mask) |
((swconfig_t(config) & SW_CFG_MASK) << (SW_CFG_BITS * index));
}
} else if (k <= ITEM_RADIO_HARDWARE_SERIAL_PORT_END) {
auto port_nr = k - ITEM_RADIO_HARDWARE_SERIAL_PORT;
auto port = serialGetPort(port_nr);
if (port && port->name) {
lcdDrawText(INDENT_WIDTH, y, port->name);
auto mode = serialGetMode(port_nr);
mode = editChoice(HW_SETTINGS_COLUMN2, y, nullptr,
STR_AUX_SERIAL_MODES, mode, 0, UART_MODE_MAX, attr,
event, _isSerialModeAvailable[port_nr]);
if (attr && checkIncDec_Ret) {
serialSetMode(port_nr, mode);
serialInit(port_nr, mode);
}
}
}
break;
}
}
}
#endif
@@ -20,6 +20,8 @@
*/
#include "opentx.h"
#include "hal/adc_driver.h"
#include "input_mapping.h"
#if LCD_W >= 212
#define TRAINER_CALIB_COLUMN_WIDTH (6 * FW)
@@ -48,11 +50,13 @@ void menuRadioTrainer(event_t event)
y = MENU_HEADER_HEIGHT + 1 + FH;
for (uint8_t i=HEADER_LINE; i<HEADER_LINE+NUM_STICKS; i++) {
uint8_t chan = channelOrder(i+1-HEADER_LINE);
TrainerMix * td = &g_eeGeneral.trainer.mix[chan-1];
auto controls = adcGetMaxInputs(ADC_INPUT_MAIN);
for (uint8_t i = HEADER_LINE; i < HEADER_LINE + controls; i++) {
uint8_t chan = inputMappingChannelOrder(i - HEADER_LINE);
TrainerMix * td = &g_eeGeneral.trainer.mix[chan];
drawSource(0, y, MIXSRC_Rud-1+chan, (menuVerticalPosition==i && CURSOR_ON_LINE()) ? INVERS : 0);
drawSource(0, y, MIXSRC_FIRST_STICK + chan,
(menuVerticalPosition==i && CURSOR_ON_LINE()) ? INVERS : 0);
for (uint8_t j=0; j<3; j++) {
+14 -29
View File
@@ -29,15 +29,6 @@
#include "fw_version.h"
// TODO duplicated code
#if defined(ROTARY_ENCODER_NAVIGATION)
#define EVT_KEY_NEXT_LINE EVT_ROTARY_RIGHT
#define EVT_KEY_PREVIOUS_LINE EVT_ROTARY_LEFT
#else
#define EVT_KEY_NEXT_LINE EVT_KEY_FIRST(KEY_DOWN)
#define EVT_KEY_PREVIOUS_LINE EVT_KEY_FIRST(KEY_UP)
#endif
#define MENU_BODY_TOP (FH + 1)
#define MENU_BODY_BOTTOM (LCD_H)
@@ -227,27 +218,21 @@ void menuRadioModulesVersion(event_t event)
drawVerticalScrollbar(LCD_W-1, FH, LCD_H-FH, menuVerticalOffset, lines, NUM_BODY_LINES);
}
switch(event) {
case EVT_KEY_PREVIOUS_LINE:
if (lines > NUM_BODY_LINES) {
if (menuVerticalOffset-- == 0)
menuVerticalOffset = lines - 1;
}
break;
case EVT_KEY_NEXT_LINE:
if (lines > NUM_BODY_LINES) {
if (++menuVerticalOffset + NUM_BODY_LINES > lines)
menuVerticalOffset = 0;
}
break;
case EVT_KEY_BREAK(KEY_EXIT):
if (menuVerticalOffset != 0)
if (IS_PREVIOUS_EVENT(event)) {
if (lines > NUM_BODY_LINES) {
if (menuVerticalOffset-- == 0)
menuVerticalOffset = lines - 1;
}
} else if (IS_NEXT_EVENT(event)) {
if (lines > NUM_BODY_LINES) {
if (++menuVerticalOffset + NUM_BODY_LINES > lines)
menuVerticalOffset = 0;
else
popMenu();
break;
}
} else if (event == EVT_KEY_BREAK(KEY_EXIT)) {
if (menuVerticalOffset != 0)
menuVerticalOffset = 0;
else
popMenu();
}
}
#endif
@@ -33,8 +33,8 @@ enum NavigationDirection {
#define incrTelemetryScreen() direction = NAVIGATION_DIRECTION_DOWN
#if defined(NAVIGATION_XLITE)
#define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_LEFT) && IS_SHIFT_PRESSED())
#define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_LONG(KEY_RIGHT) && IS_SHIFT_PRESSED())
#define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_LEFT) && keysGetState(KEY_SHIFT))
#define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_LONG(KEY_RIGHT) && keysGetState(KEY_SHIFT))
#elif defined(KEYS_GPIO_REG_PAGEDN)
#define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_PAGEUP))
#define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_PAGEDN))
+11 -32
View File
@@ -21,14 +21,6 @@
#include "opentx.h"
#if defined(ROTARY_ENCODER_NAVIGATION)
#define EVT_KEY_NEXT_LINE EVT_ROTARY_RIGHT
#define EVT_KEY_PREVIOUS_LINE EVT_ROTARY_LEFT
#else
#define EVT_KEY_NEXT_LINE EVT_KEY_FIRST(KEY_DOWN)
#define EVT_KEY_PREVIOUS_LINE EVT_KEY_FIRST(KEY_UP)
#endif
constexpr uint32_t TEXT_FILE_MAXSIZE = 2048;
static void sdReadTextFile(const char * filename, char lines[TEXT_VIEWER_LINES][LCD_COLS + 1], int & lines_count)
@@ -132,32 +124,22 @@ void readModelNotes()
void menuTextView(event_t event)
{
switch (event) {
case EVT_ENTRY:
if (event == EVT_ENTRY) {
menuVerticalOffset = 0;
reusableBuffer.viewText.linesCount = 0;
sdReadTextFile(reusableBuffer.viewText.filename, reusableBuffer.viewText.lines, reusableBuffer.viewText.linesCount);
break;
case EVT_KEY_PREVIOUS_LINE:
if (menuVerticalOffset == 0)
break;
else
menuVerticalOffset--;
} else if (IS_PREVIOUS_EVENT(event)) {
if (menuVerticalOffset > 0) {
menuVerticalOffset--;
sdReadTextFile(reusableBuffer.viewText.filename, reusableBuffer.viewText.lines, reusableBuffer.viewText.linesCount);
break;
case EVT_KEY_NEXT_LINE:
if (menuVerticalOffset+LCD_LINES-1 >= reusableBuffer.viewText.linesCount)
break;
else
++menuVerticalOffset;
}
} else if (IS_NEXT_EVENT(event)) {
if (menuVerticalOffset + LCD_LINES-1 < reusableBuffer.viewText.linesCount) {
++menuVerticalOffset;
sdReadTextFile(reusableBuffer.viewText.filename, reusableBuffer.viewText.lines, reusableBuffer.viewText.linesCount);
break;
case EVT_KEY_BREAK(KEY_EXIT):
popMenu();
break;
}
} else if (event == EVT_KEY_BREAK(KEY_EXIT)) {
popMenu();
}
for (int i=0; i<LCD_LINES-1; i++) {
@@ -185,6 +167,3 @@ void pushMenuTextView(const char *filename)
pushMenu(menuTextView);
}
}
#undef EVT_KEY_NEXT_LINE
#undef EVT_KEY_PREVIOUS_LINE