From 3e640a2e49c0386114ad2f500e351ae934c4d02b Mon Sep 17 00:00:00 2001 From: raphaelcoeffic Date: Fri, 23 Dec 2022 08:33:20 +0100 Subject: [PATCH] Removed horus constants for switches & ADC inputs --- radio/src/dataconstants.h | 124 +----------- radio/src/gui/colorlcd/hw_inputs.cpp | 7 +- radio/src/gui/colorlcd/layouts/sliders.h | 2 +- radio/src/gui/colorlcd/preflight_checks.cpp | 56 +++--- radio/src/gui/colorlcd/radio_calibration.cpp | 13 +- radio/src/gui/colorlcd/radio_diaganas.cpp | 4 +- radio/src/gui/colorlcd/radio_diagkeys.cpp | 2 +- radio/src/gui/colorlcd/switch_warn_dialog.cpp | 6 +- .../src/gui/colorlcd/view_main_decoration.cpp | 88 ++++----- radio/src/gui/gui_common.cpp | 4 +- radio/src/hal/adc_driver.cpp | 45 ++++- radio/src/hal/adc_driver.h | 5 + radio/src/logs.cpp | 14 +- radio/src/mixer.cpp | 2 +- radio/src/model_init.cpp | 6 +- radio/src/simu.cpp | 16 +- .../storage/yaml/yaml_datastructs_funcs.cpp | 4 +- .../storage/yaml/yaml_datastructs_lr3pro.cpp | 24 --- .../storage/yaml/yaml_datastructs_nv14.cpp | 24 --- .../src/storage/yaml/yaml_datastructs_t12.cpp | 24 --- .../src/storage/yaml/yaml_datastructs_t8.cpp | 24 --- .../storage/yaml/yaml_datastructs_tlite.cpp | 24 --- .../storage/yaml/yaml_datastructs_tpro.cpp | 30 --- .../storage/yaml/yaml_datastructs_tx12.cpp | 24 --- .../storage/yaml/yaml_datastructs_tx12mk2.cpp | 24 --- .../src/storage/yaml/yaml_datastructs_x10.cpp | 30 --- .../storage/yaml/yaml_datastructs_x12s.cpp | 30 --- .../src/storage/yaml/yaml_datastructs_x7.cpp | 24 --- .../src/storage/yaml/yaml_datastructs_x9d.cpp | 27 --- .../src/storage/yaml/yaml_datastructs_x9e.cpp | 54 ------ .../storage/yaml/yaml_datastructs_x9lite.cpp | 15 -- .../storage/yaml/yaml_datastructs_x9lites.cpp | 21 -- .../storage/yaml/yaml_datastructs_xlite.cpp | 18 -- .../storage/yaml/yaml_datastructs_xlites.cpp | 18 -- .../storage/yaml/yaml_datastructs_zorro.cpp | 24 --- radio/src/switches.cpp | 9 +- .../targets/common/arm/stm32/adc_driver.cpp | 33 +++- .../src/targets/common/arm/stm32/adc_driver.h | 26 +++ .../common/arm/stm32/sticks_pwm_driver.cpp | 2 + .../common/arm/stm32/stm32_hal_adc.cpp | 4 +- .../targets/common/arm/stm32/stm32_hal_adc.h | 6 + radio/src/targets/horus/board.h | 182 ------------------ .../targets/horus/flyskyHallStick_driver.cpp | 2 + radio/src/targets/horus/hal.h | 1 + radio/src/targets/horus/x12s_adc_driver.cpp | 67 ++++--- radio/src/targets/nv14/board.h | 114 ----------- radio/src/targets/simu/adc_driver.cpp | 2 +- radio/src/targets/taranis/board.h | 2 - radio/util/adcs.jinja | 19 +- 49 files changed, 298 insertions(+), 1028 deletions(-) create mode 100644 radio/src/targets/common/arm/stm32/adc_driver.h diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 49bce702067..9c70a461f8d 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -394,121 +394,7 @@ enum SwitchSources { SWSRC_NONE = 0, SWSRC_FIRST_SWITCH SKIP, - -#if defined(STORAGE_SWITCH_A) - SWSRC_SA0 = SWSRC_FIRST_SWITCH, - SWSRC_SA1, - SWSRC_SA2, -#endif - -#if defined(STORAGE_SWITCH_B) - SWSRC_SB0, - SWSRC_SB1, - SWSRC_SB2, -#endif - -#if defined(STORAGE_SWITCH_C) - SWSRC_SC0, - SWSRC_SC1, - SWSRC_SC2, -#endif - -#if defined(STORAGE_SWITCH_D) - SWSRC_SD0, - SWSRC_SD1, - SWSRC_SD2, -#endif - -#if defined(FUNCTION_SWITCHES) && defined(RADIO_TPRO) - SWSRC_FIRST_FUNCTION_SWITCH SKIP, - SWSRC_SE0 = SWSRC_FIRST_FUNCTION_SWITCH, - SWSRC_SE1, - SWSRC_SE2, -#elif defined(STORAGE_SWITCH_E) - SWSRC_SE0, - SWSRC_SE1, - SWSRC_SE2, -#endif - -#if defined(STORAGE_SWITCH_F) - SWSRC_SF0, - SWSRC_SF1, - SWSRC_SF2, -#endif - -#if defined(STORAGE_SWITCH_G) - SWSRC_SG0, - SWSRC_SG1, - SWSRC_SG2, -#endif - -#if defined(STORAGE_SWITCH_H) - SWSRC_SH0, - SWSRC_SH1, - SWSRC_SH2, -#endif - -#if defined(STORAGE_SWITCH_I) - SWSRC_SI0, - SWSRC_SI1, - SWSRC_SI2, -#endif - -#if defined(STORAGE_SWITCH_J) - SWSRC_SJ0, - SWSRC_SJ1, - SWSRC_SJ2, -#endif - -#if defined(STORAGE_SWITCH_K) - SWSRC_SK0, - SWSRC_SK1, - SWSRC_SK2, -#endif - -#if defined(STORAGE_SWITCH_L) - SWSRC_SL0, - SWSRC_SL1, - SWSRC_SL2, -#endif - -#if defined(STORAGE_SWITCH_M) - SWSRC_SM0, - SWSRC_SM1, - SWSRC_SM2, -#endif - -#if defined(STORAGE_SWITCH_N) - SWSRC_SN0, - SWSRC_SN1, - SWSRC_SN2, -#endif - -#if defined(STORAGE_SWITCH_O) - SWSRC_SO0, - SWSRC_SO1, - SWSRC_SO2, -#endif - -#if defined(STORAGE_SWITCH_P) - SWSRC_SP0, - SWSRC_SP1, - SWSRC_SP2, -#endif - -#if defined(STORAGE_SWITCH_Q) - SWSRC_SQ0, - SWSRC_SQ1, - SWSRC_SQ2, -#endif - -#if defined(STORAGE_SWITCH_R) - SWSRC_SR0, - SWSRC_SR1, - SWSRC_SR2, -#endif - - SWSRC_LAST_SWITCH SKIP = SWSRC_FIRST_SWITCH + STORAGE_NUM_SWITCHES_POSITIONS - 1, + SWSRC_LAST_SWITCH SKIP = SWSRC_FIRST_SWITCH + (MAX_SWITCHES * 3) - 1, SWSRC_FIRST_MULTIPOS_SWITCH SKIP, SWSRC_LAST_MULTIPOS_SWITCH SKIP = SWSRC_FIRST_MULTIPOS_SWITCH + (MAX_POTS * XPOTS_MULTIPOS_COUNT) - 1, @@ -650,6 +536,9 @@ enum MixSources { #if defined(PCBHORUS) MIXSRC_MOUSE1, LUA_EXPORT("jsx", "Joystick X") MIXSRC_MOUSE2, LUA_EXPORT("jsy", "Joystick Y") + MIXSRC_LAST_ANALOG SKIP = MIXSRC_MOUSE2, +#else + MIXSRC_LAST_ANALOG SKIP = MIXSRC_LAST_POT, #endif #if defined(IMU) @@ -690,7 +579,7 @@ enum MixSources { //#endif MIXSRC_FIRST_SWITCH SKIP, - MIXSRC_LAST_SWITCH SKIP = MIXSRC_FIRST_SWITCH + STORAGE_NUM_SWITCHES - 1, + MIXSRC_LAST_SWITCH SKIP = MIXSRC_FIRST_SWITCH + MAX_SWITCHES - 1, // #if defined(HARDWARE_SWITCH_A) // MIXSRC_SA = MIXSRC_FIRST_SWITCH, LUA_EXPORT("sa", "Switch A") // MIXSRC_SB, LUA_EXPORT("sb", "Switch B") @@ -764,9 +653,6 @@ enum MixSources { MIXSRC_LAST_TELEM SKIP = MIXSRC_FIRST_TELEM + 3 * MAX_TELEMETRY_SENSORS - 1, }; -#if defined(__cplusplus) -static_assert(MIXSRC_FIRST_LOGICAL_SWITCH == MIXSRC_FIRST_SWITCH + STORAGE_NUM_SWITCHES, "Wrong switches definition in MIXSRC list"); -#endif // #define MIXSRC_FIRST (MIXSRC_NONE + 1) #define MIXSRC_LAST MIXSRC_LAST_CH diff --git a/radio/src/gui/colorlcd/hw_inputs.cpp b/radio/src/gui/colorlcd/hw_inputs.cpp index 3a4eef94122..01466e72e22 100644 --- a/radio/src/gui/colorlcd/hw_inputs.cpp +++ b/radio/src/gui/colorlcd/hw_inputs.cpp @@ -73,9 +73,10 @@ HWPots::HWPots(Window* parent) : FormGroup(parent, rect_t{}) // TODO: check initialised ADC inputs instead! // Display EX3 & EX4 (= last two pots) only when FlySky gimbals are present -#if !defined(SIMU) && defined(RADIO_FAMILY_T16) - if (!globalData.flyskygimbals && (i >= (NUM_POTS - 2))) continue; -#endif + // TODO! +// #if !defined(SIMU) && defined(RADIO_FAMILY_T16) +// if (!globalData.flyskygimbals && (i >= (NUM_POTS - 2))) continue; +// #endif auto line = newLine(&grid); new StaticText(line, rect_t{}, analogGetCanonicalPotName(i), 0, COLOR_THEME_PRIMARY1); diff --git a/radio/src/gui/colorlcd/layouts/sliders.h b/radio/src/gui/colorlcd/layouts/sliders.h index 0fb0b27d4f7..b056dcd63af 100644 --- a/radio/src/gui/colorlcd/layouts/sliders.h +++ b/radio/src/gui/colorlcd/layouts/sliders.h @@ -47,7 +47,7 @@ class MainViewSlider : public Window void checkEvents() override { Window::checkEvents(); - int16_t newValue = calibratedAnalogs[idx]; + int16_t newValue = calibratedAnalogs[MAX_STICKS + idx]; if (value != newValue) { value = newValue; invalidate(); diff --git a/radio/src/gui/colorlcd/preflight_checks.cpp b/radio/src/gui/colorlcd/preflight_checks.cpp index cd446d25863..33b5139a5d5 100644 --- a/radio/src/gui/colorlcd/preflight_checks.cpp +++ b/radio/src/gui/colorlcd/preflight_checks.cpp @@ -82,7 +82,7 @@ struct SwitchWarnMatrix : public ButtonMatrix { void onPress(uint8_t btn_id); bool isActive(uint8_t btn_id); private: - uint8_t sw_idx[NUM_SWITCHES]; + uint8_t sw_idx[MAX_SWITCHES]; }; struct PotWarnMatrix : public ButtonMatrix { @@ -90,7 +90,7 @@ struct PotWarnMatrix : public ButtonMatrix { void onPress(uint8_t btn_id); bool isActive(uint8_t btn_id); private: - uint8_t pot_idx[NUM_POTS + NUM_SLIDERS]; + uint8_t pot_idx[MAX_POTS]; }; struct CenterBeepsMatrix : public ButtonMatrix { @@ -98,7 +98,7 @@ struct CenterBeepsMatrix : public ButtonMatrix { void onPress(uint8_t btn_id); bool isActive(uint8_t btn_id); private: - uint8_t ana_idx[NUM_STICKS + NUM_POTS + NUM_SLIDERS]; + uint8_t ana_idx[MAX_ANALOG_INPUTS]; }; PreflightChecks::PreflightChecks() : Page(ICON_MODEL_SETUP) @@ -140,17 +140,16 @@ PreflightChecks::PreflightChecks() : Page(ICON_MODEL_SETUP) new SwitchWarnMatrix(form, rect_t{}); // Pots and sliders warning -#if NUM_POTS + NUM_SLIDERS - line = form->newLine(&grid); - new StaticText(line, rect_t{}, STR_POTWARNINGSTATE, 0, COLOR_THEME_PRIMARY1); - auto pots_wm = new Choice(line, rect_t{}, {"OFF", "ON", "AUTO"}, 0, 2, - GET_SET_DEFAULT(g_model.potsWarnMode)); -#if (NUM_POTS) - // Pot warnings - auto pwm = new PotWarnMatrix(form, rect_t{}); - make_conditional(pwm, pots_wm); -#endif -#endif + if (adcGetMaxPots() > 0) { + line = form->newLine(&grid); + new StaticText(line, rect_t{}, STR_POTWARNINGSTATE, 0, COLOR_THEME_PRIMARY1); + auto pots_wm = new Choice(line, rect_t{}, {"OFF", "ON", "AUTO"}, 0, 2, + GET_SET_DEFAULT(g_model.potsWarnMode)); + + // Pot warnings + auto pwm = new PotWarnMatrix(form, rect_t{}); + make_conditional(pwm, pots_wm); + } // Center beeps line = form->newLine(&grid); @@ -170,7 +169,7 @@ SwitchWarnMatrix::SwitchWarnMatrix(Window* parent, const rect_t& r) : { // Setup button layout & texts uint8_t btn_cnt = 0; - for (uint8_t i = 0; i < NUM_SWITCHES; i++) { + for (uint8_t i = 0; i < MAX_SWITCHES; i++) { if (SWITCH_EXISTS(i)) { sw_idx[btn_cnt] = i; btn_cnt++; @@ -180,7 +179,7 @@ SwitchWarnMatrix::SwitchWarnMatrix(Window* parent, const rect_t& r) : initBtnMap(4, btn_cnt); uint8_t btn_id = 0; - for (uint8_t i = 0; i < NUM_SWITCHES; i++) { + for (uint8_t i = 0; i < MAX_SWITCHES; i++) { if (SWITCH_EXISTS(i)) { std::string txt = switchWarninglabel(i); setText(btn_id, txt.c_str()); @@ -208,7 +207,7 @@ SwitchWarnMatrix::SwitchWarnMatrix(Window* parent, const rect_t& r) : void SwitchWarnMatrix::onPress(uint8_t btn_id) { - if (btn_id >= NUM_SWITCHES) return; + if (btn_id >= MAX_SWITCHES) return; auto sw = sw_idx[btn_id]; swarnstate_t newstate = bfGet(g_model.switchWarningState, 3 * sw, 3); @@ -228,7 +227,7 @@ void SwitchWarnMatrix::onPress(uint8_t btn_id) bool SwitchWarnMatrix::isActive(uint8_t btn_id) { - if (btn_id >= NUM_SWITCHES) return false; + if (btn_id >= MAX_SWITCHES) return false; return bfGet(g_model.switchWarningState, 3 * sw_idx[btn_id], 3) != 0; } @@ -274,7 +273,7 @@ PotWarnMatrix::PotWarnMatrix(Window* parent, const rect_t& r) : void PotWarnMatrix::onPress(uint8_t btn_id) { - if (btn_id >= NUM_POTS + NUM_SLIDERS) return; + if (btn_id >= MAX_POTS) return; auto pot = pot_idx[btn_id]; g_model.potsWarnEnabled ^= (1 << pot); @@ -287,7 +286,7 @@ void PotWarnMatrix::onPress(uint8_t btn_id) bool PotWarnMatrix::isActive(uint8_t btn_id) { - if (btn_id >= NUM_POTS + NUM_SLIDERS) return false; + if (btn_id >= MAX_POTS) return false; return (g_model.potsWarnEnabled & (1 << pot_idx[btn_id])) != 0; } @@ -296,9 +295,12 @@ CenterBeepsMatrix::CenterBeepsMatrix(Window* parent, const rect_t& r) : { // Setup button layout & texts uint8_t btn_cnt = 0; - for (uint8_t i = 0; i < NUM_STICKS + NUM_POTS + NUM_SLIDERS; i++) { + auto max_analogs = MAX_STICKS + adcGetMaxPots(); + for (uint8_t i = 0; i < max_analogs; i++) { // multipos cannot be centered - if (i < NUM_STICKS || (IS_POT_SLIDER_AVAILABLE(i) && !IS_POT_MULTIPOS(i))) { + if (i < adcGetMaxSticks() || + (i >= MAX_STICKS && IS_POT_SLIDER_AVAILABLE(i) && + !IS_POT_MULTIPOS(i))) { ana_idx[btn_cnt] = i; btn_cnt++; } @@ -307,8 +309,10 @@ CenterBeepsMatrix::CenterBeepsMatrix(Window* parent, const rect_t& r) : initBtnMap(4, btn_cnt); uint8_t btn_id = 0; - for (uint8_t i = 0; i < NUM_STICKS + NUM_POTS + NUM_SLIDERS; i++) { - if (i < NUM_STICKS || (IS_POT_SLIDER_AVAILABLE(i) && !IS_POT_MULTIPOS(i))) { + for (uint8_t i = 0; i < max_analogs; i++) { + if (i < adcGetMaxSticks() || + (i >= MAX_STICKS && IS_POT_SLIDER_AVAILABLE(i) && + !IS_POT_MULTIPOS(i))) { setText(btn_id, STR_RETA123[i]); btn_id++; } @@ -334,7 +338,7 @@ CenterBeepsMatrix::CenterBeepsMatrix(Window* parent, const rect_t& r) : void CenterBeepsMatrix::onPress(uint8_t btn_id) { - if (btn_id >= NUM_STICKS + NUM_POTS + NUM_SLIDERS) return; + if (btn_id >= MAX_STICKS + adcGetMaxPots()) return; uint8_t i = ana_idx[btn_id]; BFBIT_FLIP(g_model.beepANACenter, bfBit(i)); SET_DIRTY(); @@ -342,7 +346,7 @@ void CenterBeepsMatrix::onPress(uint8_t btn_id) bool CenterBeepsMatrix::isActive(uint8_t btn_id) { - if (btn_id >= NUM_STICKS + NUM_POTS + NUM_SLIDERS) return false; + if (btn_id >= MAX_STICKS + adcGetMaxPots()) return false; uint8_t i = ana_idx[btn_id]; return bfSingleBitGet(g_model.beepANACenter, i) != 0; } diff --git a/radio/src/gui/colorlcd/radio_calibration.cpp b/radio/src/gui/colorlcd/radio_calibration.cpp index e3e3671d8ee..1d406fa8dce 100644 --- a/radio/src/gui/colorlcd/radio_calibration.cpp +++ b/radio/src/gui/colorlcd/radio_calibration.cpp @@ -85,13 +85,14 @@ void RadioCalibrationPage::buildBody(FormWindow * window) // The two sticks //TODO: dynamic placing - new StickCalibrationWindow(window, - {window->width() / 3, window->height() / 2, 0, 0}, - STICK1, STICK2); + new StickCalibrationWindow( + window, {window->width() / 3, window->height() / 2, 0, 0}, 0, 1); - new StickCalibrationWindow(window, - {(2 * window->width()) / 3, window->height() / 2, 0, 0}, - STICK4, STICK3); + if (adcGetMaxSticks() > 2) { + new StickCalibrationWindow( + window, {(2 * window->width()) / 3, window->height() / 2, 0, 0}, 3, + 2); + } std::unique_ptr deco(new ViewMainDecoration(window)); deco->setTrimsVisible(false); diff --git a/radio/src/gui/colorlcd/radio_diaganas.cpp b/radio/src/gui/colorlcd/radio_diaganas.cpp index 98f4a9623e1..a0b0f75e61a 100644 --- a/radio/src/gui/colorlcd/radio_diaganas.cpp +++ b/radio/src/gui/colorlcd/radio_diaganas.cpp @@ -239,9 +239,9 @@ class AnaFilteredDevViewWindow: public Window { (int16_t)calibratedAnalogs[CONVERT_MODE(i)] * 25 / 256, RIGHT | COLOR_THEME_PRIMARY1); stats[i].write(getAnalogValue(i)); - extern uint32_t s_anaFilt[NUM_ANALOGS]; + dc->drawNumber( - x + VALUE_X_OFFSET, y, s_anaFilt[i] / JITTER_ALPHA, + x + VALUE_X_OFFSET, y, anaIn_diag(i), RIGHT | COLOR_THEME_PRIMARY1); // use integrated filter dc->drawNumber( dc->drawText(x + DEV_X_OFFSET, y, " +/- ", COLOR_THEME_PRIMARY1), diff --git a/radio/src/gui/colorlcd/radio_diagkeys.cpp b/radio/src/gui/colorlcd/radio_diagkeys.cpp index 3a57d85c7bf..cb8f35a37e2 100644 --- a/radio/src/gui/colorlcd/radio_diagkeys.cpp +++ b/radio/src/gui/colorlcd/radio_diagkeys.cpp @@ -95,7 +95,7 @@ class RadioKeyDiagsWindow : public Window } #endif // SWITCHES - for (uint8_t i = 0; i < NUM_SWITCHES; i++) { + for (uint8_t i = 0; i < MAX_SWITCHES; i++) { if (SWITCH_EXISTS(i)) { coord_t y = 1 + FH * i; getvalue_t val = getValue(MIXSRC_FIRST_SWITCH + i); diff --git a/radio/src/gui/colorlcd/switch_warn_dialog.cpp b/radio/src/gui/colorlcd/switch_warn_dialog.cpp index 796894d73c2..6f401215e80 100644 --- a/radio/src/gui/colorlcd/switch_warn_dialog.cpp +++ b/radio/src/gui/colorlcd/switch_warn_dialog.cpp @@ -74,7 +74,7 @@ void SwitchWarnDialog::checkEvents() std::string warn_txt; swarnstate_t states = g_model.switchWarningState; - for (int i = 0; i < NUM_SWITCHES; ++i) { + for (int i = 0; i < MAX_SWITCHES; ++i) { if (SWITCH_WARNING_ALLOWED(i)) { swarnstate_t mask = ((swarnstate_t)0x07 << (i*3)); if (states & mask) { @@ -88,8 +88,8 @@ void SwitchWarnDialog::checkEvents() if (g_model.potsWarnMode) { if (!warn_txt.empty()) { warn_txt += '\n'; } - for (int i = 0; i < NUM_POTS + NUM_SLIDERS; i++) { - if (!IS_POT_SLIDER_AVAILABLE(POT1 + i)) { continue; } + for (int i = 0; i < MAX_POTS; i++) { + if (!IS_POT_SLIDER_AVAILABLE(i)) { continue; } if ( (g_model.potsWarnEnabled & (1 << i))) { if (abs(g_model.potsWarnPosition[i] - GET_LOWRES_POT_POSITION(i)) > 1) { warn_txt += getPotName(i); diff --git a/radio/src/gui/colorlcd/view_main_decoration.cpp b/radio/src/gui/colorlcd/view_main_decoration.cpp index d54abe931c6..14d232dd81b 100644 --- a/radio/src/gui/colorlcd/view_main_decoration.cpp +++ b/radio/src/gui/colorlcd/view_main_decoration.cpp @@ -30,6 +30,7 @@ #include "layouts/trims.h" #include "board.h" +#include "hal/adc_driver.h" static Window* create_layout_box(Window* parent, lv_align_t align, lv_flex_flow_t flow) @@ -119,64 +120,65 @@ rect_t ViewMainDecoration::getMainZone() const void ViewMainDecoration::createSliders(Window* ml, Window* mr, Window* bl, Window* bc, Window* br) { // TODO: make dynamic - Window* sl = new MainViewHorizontalSlider(bl, CALIBRATED_POT1); + //uint8_t pot_idx = 0; + Window* sl = new MainViewHorizontalSlider(bl, 0); sl->updateSize(); - sliders[SLIDERS_POT1] = sl; + sliders[0] = sl; -#if !defined(HARDWARE_POT3) - bc = br; -#endif - - if (IS_POT_MULTIPOS(POT2)) { + if (!IS_POT_AVAILABLE(2)) { + bc = br; + } + + if (IS_POT_MULTIPOS(1)) { sl = new MainView6POS(bc, 1); sl->updateSize(); - sliders[SLIDERS_POT2] = sl; + sliders[1] = sl; } - else if (IS_POT_AVAILABLE(POT2)) { - sl = new MainViewHorizontalSlider(bc, CALIBRATED_POT2); + else if (IS_POT_AVAILABLE(1)) { + sl = new MainViewHorizontalSlider(bc, 1); sl->updateSize(); - sliders[SLIDERS_POT2] = sl; + sliders[1] = sl; } -#if defined(HARDWARE_POT3) - sl = new MainViewHorizontalSlider(br, CALIBRATED_POT3); - sl->updateSize(); - sliders[SLIDERS_POT3] = sl; -#endif + if (IS_POT_AVAILABLE(2)) { + sl = new MainViewHorizontalSlider(br, 2); + sl->updateSize(); + sliders[2] = sl; + } -#if NUM_SLIDERS > 0 - // create containers for the sliders, so that they are at the borders of the display - // on top of each other, when there are two sliders to display per side - auto leftPots = create_layout_box(ml, LV_ALIGN_LEFT_MID, LV_FLEX_FLOW_COLUMN); - leftPots->setHeight(VERTICAL_SLIDERS_HEIGHT); + if (adcGetMaxPots() > 3) { + // create containers for the sliders, so that they are at the borders of the display + // on top of each other, when there are two sliders to display per side + auto leftPots = create_layout_box(ml, LV_ALIGN_LEFT_MID, LV_FLEX_FLOW_COLUMN); + leftPots->setHeight(VERTICAL_SLIDERS_HEIGHT); - auto rightPots = create_layout_box(mr, LV_ALIGN_RIGHT_MID, LV_FLEX_FLOW_COLUMN); - rightPots->setHeight(VERTICAL_SLIDERS_HEIGHT); + auto rightPots = create_layout_box(mr, LV_ALIGN_RIGHT_MID, LV_FLEX_FLOW_COLUMN); + rightPots->setHeight(VERTICAL_SLIDERS_HEIGHT); - auto vertSlLeft1 = new MainViewVerticalSlider(leftPots, CALIBRATED_SLIDER_REAR_LEFT); - sliders[SLIDERS_REAR_LEFT] = vertSlLeft1; + if (IS_POT_AVAILABLE(3)) { + sl = new MainViewVerticalSlider(leftPots, 3); + sl->updateSize(); + sliders[3] = sl; + } - auto vertSlRight1 = new MainViewVerticalSlider(rightPots, CALIBRATED_SLIDER_REAR_RIGHT); - sliders[SLIDERS_REAR_RIGHT] = vertSlRight1; + if (IS_POT_AVAILABLE(4)) { + sl = new MainViewVerticalSlider(rightPots, 4); + sl->updateSize(); + sliders[4] = sl; + } -#if defined(HARDWARE_EXT1) || defined(PCBX12S) - if (IS_POT_SLIDER_AVAILABLE(EXT1)) { - sl = new MainViewVerticalSlider(leftPots, CALIBRATED_POT_EXT1); - sl->updateSize(); - sliders[SLIDERS_EXT1] = sl; - } -#endif + if (IS_POT_AVAILABLE(5)) { + sl = new MainViewVerticalSlider(leftPots, 5); + sl->updateSize(); + sliders[5] = sl; + } -#if defined(HARDWARE_EXT2) || defined(PCBX12S) - if (IS_POT_SLIDER_AVAILABLE(EXT2)) { - sl = new MainViewVerticalSlider(rightPots, CALIBRATED_POT_EXT2); - sl->updateSize(); - sliders[SLIDERS_EXT2] = sl; + if (IS_POT_AVAILABLE(6)) { + sl = new MainViewVerticalSlider(rightPots, 6); + sl->updateSize(); + sliders[6] = sl; + } } -#endif - vertSlLeft1->updateSize(); - vertSlRight1->updateSize(); -#endif // NUM_SLIDERS > 0 } void ViewMainDecoration::createTrims(Window* ml, Window* mr, Window* bl, Window* br) diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index ece3a62a91e..4b53dc225d6 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -259,9 +259,9 @@ bool isSourceAvailableInCustomSwitches(int source) bool isSourceAvailableInInputs(int source) { if (source >= MIXSRC_FIRST_POT && source <= MIXSRC_LAST_POT) - return IS_POT_SLIDER_AVAILABLE(POT1+source - MIXSRC_FIRST_POT); + return IS_POT_SLIDER_AVAILABLE(source - MIXSRC_FIRST_POT); -#if defined(PCBX10) +#if defined(PCBHORUS) && !defined(PCBX12S) if (source >= MIXSRC_MOUSE1 && source <= MIXSRC_MOUSE2) return false; #endif diff --git a/radio/src/hal/adc_driver.cpp b/radio/src/hal/adc_driver.cpp index e067a7fe021..b9ba03e197b 100644 --- a/radio/src/hal/adc_driver.cpp +++ b/radio/src/hal/adc_driver.cpp @@ -28,7 +28,7 @@ const etx_hal_adc_driver_t* _hal_adc_driver = nullptr; -uint16_t adcValues[NUM_ANALOGS] __DMA; +static uint16_t adcValues[MAX_ANALOG_INPUTS] __DMA; bool adcInit(const etx_hal_adc_driver_t* driver) { @@ -190,7 +190,10 @@ void adcCalibStore() uint16_t getRTCBatteryVoltage() { // anaIn() outputs value divided by (1 << ANALOG_SCALE) - return (anaIn(TX_RTC_VOLTAGE) * ADC_VREF_PREC2) / (2048 >> ANALOG_SCALE); + auto vRTC = adcGetVRTC(); + if (vRTC < 0) return 0; + + return (anaIn(vRTC) * ADC_VREF_PREC2) / (2048 >> ANALOG_SCALE); } uint16_t getAnalogValue(uint8_t index) @@ -207,8 +210,19 @@ uint16_t getAnalogValue(uint8_t index) return adcValues[index]; } +void setAnalogValue(uint8_t index, uint16_t value) +{ + if (index >= MAX_ANALOG_INPUTS) return; + adcValues[index] = value; +} + +uint16_t* getAnalogValues() +{ + return adcValues; +} + // used by diaganas -uint32_t s_anaFilt[NUM_ANALOGS]; +uint32_t s_anaFilt[MAX_ANALOG_INPUTS]; #define ANALOG_MULTIPLIER (1<= NUM_ANALOGS) return 0; + if (chan >= MAX_ANALOG_INPUTS) return 0; return ANA_FILT(chan); } +uint32_t anaIn_diag(uint8_t chan) +{ + if (chan >= MAX_ANALOG_INPUTS) return 0; + return s_anaFilt[chan] / JITTER_ALPHA; +} + void anaSetFiltered(uint8_t chan, uint16_t val) { s_anaFilt[chan] = val * (JITTER_ALPHA * ANALOG_MULTIPLIER); @@ -233,16 +253,20 @@ void anaResetFiltered() } #if defined(JITTER_MEASURE) -JitterMeter rawJitter[NUM_ANALOGS]; -JitterMeter avgJitter[NUM_ANALOGS]; +JitterMeter rawJitter[MAX_ANALOG_INPUTS]; +JitterMeter avgJitter[MAX_ANALOG_INPUTS]; tmr10ms_t jitterResetTime = 0; #endif uint16_t getBatteryVoltage() { // using filtered ADC value on purpose - int32_t instant_vbat = anaIn(TX_VOLTAGE); + auto vBAT = adcGetVBAT(); + if (vBAT < 0) return 0; + + int32_t instant_vbat = anaIn(vBAT); + // TODO: remove BATT_SCALE / BATTERY_DIVIDER defines #if defined(BATT_SCALE) instant_vbat = (instant_vbat * BATT_SCALE * (128 + g_eeGeneral.txVoltageCalibration)) / @@ -262,7 +286,7 @@ void getADC() #if defined(JITTER_MEASURE) if (JITTER_MEASURE_ACTIVE() && jitterResetTime < get_tmr10ms()) { // reset jitter measurement every second - for (uint32_t x=0; x= adcGetMaxSticks() && x < MAX_STICKS) continue; + uint32_t v = getAnalogValue(x) >> (1 - ANALOG_SCALE); // Jitter filter: diff --git a/radio/src/hal/adc_driver.h b/radio/src/hal/adc_driver.h index 36065568e11..df409dde986 100644 --- a/radio/src/hal/adc_driver.h +++ b/radio/src/hal/adc_driver.h @@ -42,6 +42,8 @@ bool adcRead(); uint16_t getBatteryVoltage(); uint16_t getRTCBatteryVoltage(); uint16_t getAnalogValue(uint8_t index); +void setAnalogValue(uint8_t index, uint16_t value); +uint16_t* getAnalogValues(); // Run calibration steps void adcCalibMinMax(); @@ -57,6 +59,7 @@ extern JitterMeter avgJitter[MAX_ANALOG_INPUTS]; void getADC(); uint16_t anaIn(uint8_t chan); +uint32_t anaIn_diag(uint8_t chan); uint16_t getBatteryVoltage(); // Warning: @@ -68,6 +71,8 @@ void disableVBatBridge(); bool isVBatBridgeEnabled(); // To be implemented by the target driver +int8_t adcGetVRTC(); +int8_t adcGetVBAT(); const char* adcGetStickName(uint8_t idx); const char* adcGetPotName(uint8_t idx); uint8_t adcGetMaxSticks(); diff --git a/radio/src/logs.cpp b/radio/src/logs.cpp index 4e423e1756a..b7d03d5cd69 100644 --- a/radio/src/logs.cpp +++ b/radio/src/logs.cpp @@ -21,7 +21,10 @@ #include "opentx.h" #include "ff.h" + #include "switches.h" +#include "hal/switch_driver.h" +#include "hal/adc_driver.h" #if defined(LIBOPENUI) #include "libopenui.h" @@ -241,7 +244,7 @@ void writeHeader() f_putc(',', &g_oLogFile); } - for (uint8_t i=0; i= MAX_STICKS && IS_POT_AVAILABLE(i))) + f_printf(&g_oLogFile, "%d,", calibratedAnalogs[i]); } - for (uint8_t i=0; isliders[idx]->getValue(); - else if (idx < MAX_STICKS + adcGetMaxPots()) + else if (idx < max_analogs) return opentxSim->knobs[idx - MAX_STICKS]->getValue(); - else if (idx == TX_RTC_VOLTAGE) + else if (idx == max_analogs) return 800; // 2.34V else return 0; diff --git a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp index 3a3cb0fe626..4681931ce69 100644 --- a/radio/src/storage/yaml/yaml_datastructs_funcs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_funcs.cpp @@ -28,6 +28,8 @@ #include "analogs.h" #include "stamp.h" +#include "hal/switch_driver.h" + // // WARNING: // ======== @@ -886,7 +888,7 @@ static bool w_swtchWarn(void* user, uint8_t* data, uint32_t bitoffs, data += (bitoffs >> 3UL); swarnstate_t states = *(swarnstate_t*)data; - for (int i = 0; i < NUM_SWITCHES; i++) { + for (uint8_t i = 0; i < switchGetMaxSwitches(); i++) { // TODO: SWITCH_EXISTS() uses the g_eeGeneral stucture, which might not be // avail if (SWITCH_EXISTS(i)) { diff --git a/radio/src/storage/yaml/yaml_datastructs_lr3pro.cpp b/radio/src/storage/yaml/yaml_datastructs_lr3pro.cpp index c0b4643f2ee..fdb2995add7 100644 --- a/radio/src/storage/yaml/yaml_datastructs_lr3pro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_lr3pro.cpp @@ -144,30 +144,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, { SWSRC_TrimRudLeft, "TrimRudLeft" }, { SWSRC_TrimRudRight, "TrimRudRight" }, { SWSRC_TrimEleDown, "TrimEleDown" }, diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 64ddbbe4659..339ce182aab 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -155,30 +155,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, { SWSRC_TrimRudLeft, "TrimRudLeft" }, { SWSRC_TrimRudRight, "TrimRudRight" }, { SWSRC_TrimEleDown, "TrimEleDown" }, diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index afe8e248d1a..fdb2995add7 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -144,30 +144,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, { SWSRC_TrimRudLeft, "TrimRudLeft" }, { SWSRC_TrimRudRight, "TrimRudRight" }, { SWSRC_TrimEleDown, "TrimEleDown" }, diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index c0b4643f2ee..fdb2995add7 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -144,30 +144,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, { SWSRC_TrimRudLeft, "TrimRudLeft" }, { SWSRC_TrimRudRight, "TrimRudRight" }, { SWSRC_TrimEleDown, "TrimEleDown" }, diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index c0b4643f2ee..fdb2995add7 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -144,30 +144,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, { SWSRC_TrimRudLeft, "TrimRudLeft" }, { SWSRC_TrimRudRight, "TrimRudRight" }, { SWSRC_TrimEleDown, "TrimEleDown" }, diff --git a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp index 3e64688b868..3ac6ece275b 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp @@ -144,36 +144,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, { SWSRC_TrimRudLeft, "TrimRudLeft" }, { SWSRC_TrimRudRight, "TrimRudRight" }, { SWSRC_TrimEleDown, "TrimEleDown" }, diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index 06b7e44ffbc..fdb2995add7 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -144,30 +144,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, { SWSRC_TrimRudLeft, "TrimRudLeft" }, { SWSRC_TrimRudRight, "TrimRudRight" }, { SWSRC_TrimEleDown, "TrimEleDown" }, diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp index 52ad52d18d2..fdb2995add7 100755 --- a/radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp @@ -144,30 +144,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, { SWSRC_TrimRudLeft, "TrimRudLeft" }, { SWSRC_TrimRudRight, "TrimRudRight" }, { SWSRC_TrimEleDown, "TrimEleDown" }, diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 4ba5f07f23c..910c0044757 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -165,36 +165,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, { SWSRC_TrimRudLeft, "TrimRudLeft" }, { SWSRC_TrimRudRight, "TrimRudRight" }, { SWSRC_TrimEleDown, "TrimEleDown" }, diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 4ba5f07f23c..910c0044757 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -165,36 +165,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, { SWSRC_TrimRudLeft, "TrimRudLeft" }, { SWSRC_TrimRudRight, "TrimRudRight" }, { SWSRC_TrimEleDown, "TrimEleDown" }, diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index c0b4643f2ee..fdb2995add7 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -144,30 +144,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, { SWSRC_TrimRudLeft, "TrimRudLeft" }, { SWSRC_TrimRudRight, "TrimRudRight" }, { SWSRC_TrimEleDown, "TrimEleDown" }, diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 1a517540be5..1b217a95b3a 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -144,33 +144,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, { SWSRC_TrimRudLeft, "TrimRudLeft" }, { SWSRC_TrimRudRight, "TrimRudRight" }, { SWSRC_TrimEleDown, "TrimEleDown" }, diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 55117cc85cb..c2d143b9397 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -144,60 +144,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, - { SWSRC_SI0, "SI0" }, - { SWSRC_SI1, "SI1" }, - { SWSRC_SI2, "SI2" }, - { SWSRC_SJ0, "SJ0" }, - { SWSRC_SJ1, "SJ1" }, - { SWSRC_SJ2, "SJ2" }, - { SWSRC_SK0, "SK0" }, - { SWSRC_SK1, "SK1" }, - { SWSRC_SK2, "SK2" }, - { SWSRC_SL0, "SL0" }, - { SWSRC_SL1, "SL1" }, - { SWSRC_SL2, "SL2" }, - { SWSRC_SM0, "SM0" }, - { SWSRC_SM1, "SM1" }, - { SWSRC_SM2, "SM2" }, - { SWSRC_SN0, "SN0" }, - { SWSRC_SN1, "SN1" }, - { SWSRC_SN2, "SN2" }, - { SWSRC_SO0, "SO0" }, - { SWSRC_SO1, "SO1" }, - { SWSRC_SO2, "SO2" }, - { SWSRC_SP0, "SP0" }, - { SWSRC_SP1, "SP1" }, - { SWSRC_SP2, "SP2" }, - { SWSRC_SQ0, "SQ0" }, - { SWSRC_SQ1, "SQ1" }, - { SWSRC_SQ2, "SQ2" }, - { SWSRC_SR0, "SR0" }, - { SWSRC_SR1, "SR1" }, - { SWSRC_SR2, "SR2" }, { SWSRC_TrimRudLeft, "TrimRudLeft" }, { SWSRC_TrimRudRight, "TrimRudRight" }, { SWSRC_TrimEleDown, "TrimEleDown" }, diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index 7e29da4b4b4..3d1e3691a09 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -144,21 +144,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, { SWSRC_TrimRudLeft, "TrimRudLeft" }, { SWSRC_TrimRudRight, "TrimRudRight" }, { SWSRC_TrimEleDown, "TrimEleDown" }, diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 6e20d8d5b57..fdb2995add7 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -144,27 +144,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, { SWSRC_TrimRudLeft, "TrimRudLeft" }, { SWSRC_TrimRudRight, "TrimRudRight" }, { SWSRC_TrimEleDown, "TrimEleDown" }, diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index 5d3168bf942..fdb2995add7 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -144,24 +144,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, { SWSRC_TrimRudLeft, "TrimRudLeft" }, { SWSRC_TrimRudRight, "TrimRudRight" }, { SWSRC_TrimEleDown, "TrimEleDown" }, diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index 36c3d57facc..d07dd47b0db 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -146,24 +146,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, { SWSRC_TrimRudLeft, "TrimRudLeft" }, { SWSRC_TrimRudRight, "TrimRudRight" }, { SWSRC_TrimEleDown, "TrimEleDown" }, diff --git a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp index 52ad52d18d2..fdb2995add7 100644 --- a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp @@ -144,30 +144,6 @@ const struct YamlIdStr enum_SwashType[] = { }; const struct YamlIdStr enum_SwitchSources[] = { { SWSRC_NONE, "NONE" }, - { SWSRC_SA0, "SA0" }, - { SWSRC_SA1, "SA1" }, - { SWSRC_SA2, "SA2" }, - { SWSRC_SB0, "SB0" }, - { SWSRC_SB1, "SB1" }, - { SWSRC_SB2, "SB2" }, - { SWSRC_SC0, "SC0" }, - { SWSRC_SC1, "SC1" }, - { SWSRC_SC2, "SC2" }, - { SWSRC_SD0, "SD0" }, - { SWSRC_SD1, "SD1" }, - { SWSRC_SD2, "SD2" }, - { SWSRC_SE0, "SE0" }, - { SWSRC_SE1, "SE1" }, - { SWSRC_SE2, "SE2" }, - { SWSRC_SF0, "SF0" }, - { SWSRC_SF1, "SF1" }, - { SWSRC_SF2, "SF2" }, - { SWSRC_SG0, "SG0" }, - { SWSRC_SG1, "SG1" }, - { SWSRC_SG2, "SG2" }, - { SWSRC_SH0, "SH0" }, - { SWSRC_SH1, "SH1" }, - { SWSRC_SH2, "SH2" }, { SWSRC_TrimRudLeft, "TrimRudLeft" }, { SWSRC_TrimRudRight, "TrimRudRight" }, { SWSRC_TrimEleDown, "TrimEleDown" }, diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index ad6e9c92084..1d9551f4eba 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -20,6 +20,7 @@ */ #include "hal/switch_driver.h" +#include "hal/adc_driver.h" #include "opentx.h" #include "switches.h" @@ -59,7 +60,7 @@ CircularBuffer luaSetStickySwitchBuffer; #define LS_LAST_VALUE(fm, idx) lswFm[fm].lsw[idx].lastValue -tmr10ms_t switchesMidposStart[NUM_SWITCHES]; +tmr10ms_t switchesMidposStart[MAX_SWITCHES]; uint64_t switchesPos = 0; static_assert(sizeof(uint64_t) * 8 >= ((MAX_SWITCHES - 1) / 2) + 1, @@ -635,7 +636,7 @@ swsrc_t getMovedSwitch() swsrc_t result = 0; // Switches - for (int i = 0; i < NUM_SWITCHES - NUM_FUNCTIONS_SWITCHES; i++) { + for (int i = 0; i < switchGetMaxSwitches(); i++) { if (SWITCH_EXISTS(i)) { swarnstate_t mask = ((swarnstate_t) 0x07 << (i * 3)); uint8_t prev = (switches_states & mask) >> (i * 3); @@ -690,7 +691,7 @@ bool isSwitchWarningRequired(uint16_t &bad_pots) getMovedSwitch(); bool warn = false; - for (int i = 0; i < NUM_SWITCHES; i++) { + for (int i = 0; i < switchGetMaxSwitches(); i++) { if (SWITCH_WARNING_ALLOWED(i)) { swarnstate_t mask = ((swarnstate_t)0x07 << (i * 3)); if ((states & mask) && !((states & mask) == (switches_states & mask))) { @@ -702,7 +703,7 @@ bool isSwitchWarningRequired(uint16_t &bad_pots) if (g_model.potsWarnMode) { evalFlightModeMixes(e_perout_mode_normal, 0); bad_pots = 0; - for (int i = 0; i < MAX_POTS; i++) { + for (int i = 0; i < adcGetMaxPots(); i++) { if (!IS_POT_SLIDER_AVAILABLE(i)) continue; if ((g_model.potsWarnEnabled & (1 << i)) && (abs(g_model.potsWarnPosition[i] - GET_LOWRES_POT_POSITION(i)) > 1)) { diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/adc_driver.cpp index 27ba1b9862a..599289c90c7 100644 --- a/radio/src/targets/common/arm/stm32/adc_driver.cpp +++ b/radio/src/targets/common/arm/stm32/adc_driver.cpp @@ -19,24 +19,39 @@ * GNU General Public License for more details. */ -#include "stm32_hal_ll.h" -#include "stm32_hal_adc.h" - +#include "adc_driver.h" #include "board_common.h" #include "hw_adc_inputs.inc" #include "definitions.h" +#include // needed to prevent the compiler to eject this symbol !!! // TODO: place this in some header used by board.cpp extern const etx_hal_adc_driver_t _adc_driver; constexpr uint8_t n_ADC = DIM(_ADC_adc); +constexpr uint8_t n_ADC_spi = DIM(_ADC_spi); constexpr uint8_t n_GPIO = DIM(_ADC_GPIOs); constexpr uint8_t n_inputs = DIM(_ADC_inputs); +static int8_t _vbat_input; +static int8_t _vrtc_input; + +static int8_t _find_input_name(const char* name) +{ + for (uint8_t i = 0; i < n_inputs; i++) { + if (!strcmp(_ADC_inputs[i].name, name)) return i; + } + + return -1; +} + static bool adc_init() { + _vbat_input = _find_input_name("VBAT"); + _vrtc_input = _find_input_name("RTC_BAT"); + return stm32_hal_adc_init(_ADC_adc, n_ADC, _ADC_inputs, _ADC_GPIOs, n_GPIO); } @@ -56,6 +71,18 @@ const etx_hal_adc_driver_t _adc_driver = { adc_wait_completion }; +uint8_t adc_get_n_inputs() { return n_inputs; } +const stm32_adc_input_t* adc_get_inputs() { return _ADC_inputs; } + +const stm32_spi_adc_t* adc_spi_get() +{ + if (n_ADC_spi > 0) return &_ADC_spi[0]; + return nullptr; +} + +int8_t adcGetVRTC() { return _vrtc_input; } +int8_t adcGetVBAT() { return _vbat_input; } + const char* adcGetStickName(uint8_t idx) { if (idx >= DIM(_stick_inputs)) return ""; diff --git a/radio/src/targets/common/arm/stm32/adc_driver.h b/radio/src/targets/common/arm/stm32/adc_driver.h new file mode 100644 index 00000000000..1dd426dc0c7 --- /dev/null +++ b/radio/src/targets/common/arm/stm32/adc_driver.h @@ -0,0 +1,26 @@ +/* + * 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 "stm32_hal_adc.h" + +uint8_t adc_get_n_inputs(); +const stm32_adc_input_t* adc_get_inputs(); +const stm32_spi_adc_t* adc_spi_get(); diff --git a/radio/src/targets/common/arm/stm32/sticks_pwm_driver.cpp b/radio/src/targets/common/arm/stm32/sticks_pwm_driver.cpp index d47ce164360..ee285ff5875 100644 --- a/radio/src/targets/common/arm/stm32/sticks_pwm_driver.cpp +++ b/radio/src/targets/common/arm/stm32/sticks_pwm_driver.cpp @@ -141,6 +141,8 @@ extern "C" void PWM_IRQHandler(void) static uint8_t timer_capture_states[MAX_STICKS]; static uint32_t timer_capture_rising_time[MAX_STICKS]; + auto adcValues = getAnalogValues(); + for (uint8_t i=0; iSR & (TIM_DIER_CC1IE << i)) { uint32_t capture = TIM_GetCapture_Stick(i); diff --git a/radio/src/targets/common/arm/stm32/stm32_hal_adc.cpp b/radio/src/targets/common/arm/stm32/stm32_hal_adc.cpp index a2ec7575724..6104ae662c4 100644 --- a/radio/src/targets/common/arm/stm32/stm32_hal_adc.cpp +++ b/radio/src/targets/common/arm/stm32/stm32_hal_adc.cpp @@ -489,7 +489,7 @@ static void adc_wait_completion(const stm32_adc_t* ADCs, uint8_t n_ADC, } // finally copy the values into their final destination - copy_adc_values(adcValues, dma_buffer, adc, inputs); + copy_adc_values(getAnalogValues(), dma_buffer, adc, inputs); if (seq_len == LL_ADC_REG_SEQ_SCAN_DISABLE) { // single conversion @@ -509,6 +509,8 @@ static void adc_wait_completion(const stm32_adc_t* ADCs, uint8_t n_ADC, void stm32_hal_adc_wait_completion(const stm32_adc_t* ADCs, uint8_t n_ADC, const stm32_adc_input_t* inputs, uint8_t n_inputs) { + uint16_t* adcValues = getAnalogValues(); + while(++_adc_run <= OVERSAMPLING) { adc_wait_completion(ADCs, n_ADC, inputs); diff --git a/radio/src/targets/common/arm/stm32/stm32_hal_adc.h b/radio/src/targets/common/arm/stm32/stm32_hal_adc.h index 8341a0b2d54..56400189d96 100644 --- a/radio/src/targets/common/arm/stm32/stm32_hal_adc.h +++ b/radio/src/targets/common/arm/stm32/stm32_hal_adc.h @@ -60,6 +60,12 @@ struct stm32_adc_gpio_t { uint8_t n_pins; }; +struct stm32_spi_adc_t { + SPI_TypeDef* SPIx; + const uint8_t* channels; + uint8_t n_channels; +}; + // Driver to be passed to adcInit() //extern const etx_hal_adc_driver_t stm32_hal_adc_driver; diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index acc5918ac29..fd67da4ba73 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -219,61 +219,6 @@ enum EnumKeys #define IS_SHIFT_KEY(index) (false) #define IS_SHIFT_PRESSED() (false) -enum EnumSwitches -{ - SW_SA, - SW_SB, - SW_SC, - SW_SD, - SW_SE, - SW_SF, - SW_SG, - SW_SH, - SW_SI, - SW_SJ, - NUM_SWITCHES -}; - -#define STORAGE_NUM_SWITCHES NUM_SWITCHES -#define IS_3POS(x) ((x) != SW_SF && (x) != SW_SH) - -enum EnumSwitchesPositions -{ - SW_SA0, - SW_SA1, - SW_SA2, - SW_SB0, - SW_SB1, - SW_SB2, - SW_SC0, - SW_SC1, - SW_SC2, - SW_SD0, - SW_SD1, - SW_SD2, - SW_SE0, - SW_SE1, - SW_SE2, - SW_SF0, - SW_SF1, - SW_SF2, - SW_SG0, - SW_SG1, - SW_SG2, - SW_SH0, - SW_SH1, - SW_SH2, - SW_SI0, - SW_SI1, - SW_SI2, - SW_SJ0, - SW_SJ1, - SW_SJ2, - NUM_SWITCHES_POSITIONS -}; - -#define STORAGE_NUM_SWITCHES_POSITIONS (STORAGE_NUM_SWITCHES * 3) - #if !defined(NUM_FUNCTIONS_SWITCHES) #define NUM_FUNCTIONS_SWITCHES 0 #endif @@ -297,133 +242,6 @@ uint32_t readTrims(); void rotaryEncoderInit(); void rotaryEncoderCheck(); -// ADC driver - -#if defined(PCBX10) - #define NUM_POTS 7 - #define STORAGE_NUM_POTS 7 -#else - #define NUM_POTS 3 - #define STORAGE_NUM_POTS 5 -#endif - -#define NUM_XPOTS NUM_POTS - -#if defined(PCBX10) - #define NUM_SLIDERS 2 -#else - #define NUM_SLIDERS 4 -#endif - -#define STORAGE_NUM_SLIDERS 4 - - -enum Analogs { - STICK1, - STICK2, - STICK3, - STICK4, - POT_FIRST, - POT1 = POT_FIRST, - POT2, - POT3, -#if defined(PCBX10) - EXT1, - EXT2, - EXT3, - EXT4, -#endif - POT_LAST = POT_FIRST + NUM_POTS - 1, - SLIDER_FIRST, - SLIDER_FRONT_LEFT = SLIDER_FIRST, - SLIDER_FRONT_RIGHT, -#if defined(PCBX12S) - SLIDER_REAR_LEFT, - SLIDER_REAR_RIGHT, -#endif - SLIDER_LAST = SLIDER_FIRST + NUM_SLIDERS - 1, - TX_VOLTAGE, -#if defined(PCBX12S) - MOUSE1, // after voltage because previous ones come from SPI on X12S - MOUSE2, -#endif - TX_RTC_VOLTAGE, - NUM_ANALOGS -}; - -#if defined(PCBX12S) -#define EXT1 SLIDER_FRONT_LEFT -#define EXT2 SLIDER_FRONT_RIGHT -#endif - -#define SLIDER1 SLIDER_FRONT_LEFT -#define SLIDER2 SLIDER_FRONT_RIGHT - -// #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 14) + (SWITCH_3POS << 12) + (SWITCH_2POS << 10) + (SWITCH_3POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0) -// #if defined(RADIO_FAMILY_T16) -// #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 4) + (POT_MULTIPOS_SWITCH << 2) + (POT_WITH_DETENT << 0) -// #else -// #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 4) + (POT_MULTIPOS_SWITCH << 2) + (POT_WITHOUT_DETENT << 0) -// #endif - -// TODO: integrate into JSON hw defs -// #if defined(PCBX12S) -// #define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 3) + (SLIDER_WITH_DETENT << 2) + (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0) -// #else -// #define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0) -// #endif - -#define HARDWARE_POT3 -#if !defined(PCBX12S) // ext are used by mouse on X12S - #define HARDWARE_EXT1 - #define HARDWARE_EXT2 - #define HARDWARE_EXT3 - #define HARDWARE_EXT4 -#endif - -enum CalibratedAnalogs { - CALIBRATED_STICK1, - CALIBRATED_STICK2, - CALIBRATED_STICK3, - CALIBRATED_STICK4, - CALIBRATED_POT1, - CALIBRATED_POT2, - CALIBRATED_POT3, -#if defined(PCBX12S) - CALIBRATED_SLIDER_FRONT_LEFT, - CALIBRATED_POT_EXT1 = CALIBRATED_SLIDER_FRONT_LEFT, - CALIBRATED_SLIDER_FRONT_RIGHT, - CALIBRATED_POT_EXT2 = CALIBRATED_SLIDER_FRONT_RIGHT, - CALIBRATED_SLIDER_REAR_LEFT, - CALIBRATED_SLIDER_REAR_RIGHT, -#else - CALIBRATED_POT_EXT1, - CALIBRATED_POT_EXT2, - CALIBRATED_POT_EXT3, - CALIBRATED_POT_EXT4, - CALIBRATED_SLIDER_REAR_LEFT, - CALIBRATED_SLIDER_REAR_RIGHT, -#endif - CALIBRATED_MOUSE1, - CALIBRATED_MOUSE2, - NUM_CALIBRATED_ANALOGS -}; - -extern uint16_t adcValues[NUM_ANALOGS]; - -#if defined(PCBX12S) - #define NUM_MOUSE_ANALOGS 2 -#else - #define NUM_MOUSE_ANALOGS 0 -#endif -#define STORAGE_NUM_MOUSE_ANALOGS 2 - -#if defined(STICKS_PWM) - #define STICKS_PWM_ENABLED() (!hardwareOptions.sticksPwmDisabled) -#else - #define STICKS_PWM_ENABLED() (false) -#endif - // Battery driver #if defined(PCBX10) // Lipo 2S diff --git a/radio/src/targets/horus/flyskyHallStick_driver.cpp b/radio/src/targets/horus/flyskyHallStick_driver.cpp index 654195b7e2f..ff0de82d341 100644 --- a/radio/src/targets/horus/flyskyHallStick_driver.cpp +++ b/radio/src/targets/horus/flyskyHallStick_driver.cpp @@ -24,6 +24,7 @@ #include "fifo.h" #include "dmafifo.h" +#include "hal/adc_driver.h" DMAFifo hallDMAFifo __DMA (FLYSKY_HALL_DMA_Stream_RX); Fifo hallStickTxFifo; @@ -363,6 +364,7 @@ void flysky_hall_stick_loop(void) if (HallProtocol.hallID.hall_Id.packetID == FLYSKY_HALL_RESP_TYPE_VALUES) { int16_t *p_values = (int16_t*)HallProtocol.data; + uint16_t* adcValues = getAnalogValues(); for (uint8_t i = 0; i < 4; i++) { adcValues[i] = FLYSKY_OFFSET_VALUE - p_values[i]; } diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 866ec2c13f2..a36c1697c71 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -308,6 +308,7 @@ #define ADC_GPIO_MOUSE GPIOF #define ADC_CHANNEL_MOUSE1 6 #define ADC_CHANNEL_MOUSE2 7 + #define ADC_GPIOF_PINS (ADC_GPIO_PIN_MOUSE1 | ADC_GPIO_PIN_MOUSE2) #define ADC_EXT ADC1 #define ADC_EXT_SAMPTIME LL_ADC_SAMPLINGTIME_56CYCLES #define ADC_CHANNEL_RTC_BAT LL_ADC_CHANNEL_VBAT // ADC1_IN16 diff --git a/radio/src/targets/horus/x12s_adc_driver.cpp b/radio/src/targets/horus/x12s_adc_driver.cpp index 58f01e45e05..71ef524f28e 100644 --- a/radio/src/targets/horus/x12s_adc_driver.cpp +++ b/radio/src/targets/horus/x12s_adc_driver.cpp @@ -19,7 +19,7 @@ * GNU General Public License for more details. */ -#include "stm32_hal_adc.h" +#include "adc_driver.h" #include "x12s_adc_driver.h" #include "opentx.h" @@ -41,6 +41,7 @@ #define SPI_L1 11 #define RESETCMD 0x4000 #define MANUAL_MODE 0x1000 // manual mode channel 0 +#define MANUAL_MODE_CHANNEL(x) (MANUAL_MODE | ((x) << 7)) uint16_t SPIx_ReadWriteByte(uint16_t value) { @@ -111,40 +112,25 @@ static bool x12s_adc_init() // we're going to do it ourselves stm32_hal_adc_disable_oversampling(); + // TODO: fetch internal ADC channel mapping + // init onboard ADC return _adc_driver.init(); } -const uint16_t adcCommands[MOUSE1+2] = -{ - MANUAL_MODE | (SPI_STICK1 << 7), - MANUAL_MODE | (SPI_STICK2 << 7), - MANUAL_MODE | (SPI_STICK3 << 7), - MANUAL_MODE | (SPI_STICK4 << 7), - MANUAL_MODE | (SPI_S1 << 7), - MANUAL_MODE | (SPI_6POS << 7), - MANUAL_MODE | (SPI_S2 << 7), - MANUAL_MODE | (SPI_L1 << 7), - MANUAL_MODE | (SPI_L2 << 7), - MANUAL_MODE | (SPI_LS << 7), - MANUAL_MODE | (SPI_RS << 7), - MANUAL_MODE | (SPI_TX_VOLTAGE << 7), - MANUAL_MODE | (0 << 7), // small joystick left/right - MANUAL_MODE | (0 << 7) // small joystick up/down -}; - -void adcReadSPIDummy() +static void adcReadSPIDummy() { // A dummy command to get things started // (because the sampled data is lagging behind for two command cycles) ADC_CS_LOW(); delay_01us(1); - SPIx_ReadWriteByte(adcCommands[0]); + SPIx_ReadWriteByte(MANUAL_MODE_CHANNEL(0)); ADC_CS_HIGH(); delay_01us(1); } -uint32_t adcReadNextSPIChannel(uint8_t index) +static uint32_t adcReadNextSPIChannel(uint8_t index, const stm32_adc_input_t* inputs, + const uint8_t* chan, uint8_t nconv) { uint32_t result = 0; @@ -163,14 +149,20 @@ uint32_t adcReadNextSPIChannel(uint8_t index) for (uint8_t i = 0; i < 4; i++) { ADC_CS_LOW(); delay_01us(1); + // command is changed to the next index for the last two readings // (because the sampled data is lagging behind for two command cycles) - uint16_t val = (0x0fff & SPIx_ReadWriteByte(adcCommands[(i>1) ? index+1 : index])); + uint8_t chan_idx = (i > 1 ? index + 1 : index) % nconv; + auto spi_chan = inputs[chan_idx].ADC_Channel; + + uint16_t val = (0x0fff & SPIx_ReadWriteByte(MANUAL_MODE_CHANNEL(spi_chan))); + #if defined(JITTER_MEASURE) if (JITTER_MEASURE_ACTIVE()) { rawJitter[index].measure(val); } #endif + ADC_CS_HIGH(); delay_01us(1); result += val; @@ -192,17 +184,29 @@ bool x12s_adc_start_read() void x12s_adc_wait_completion() { - uint16_t temp[NUM_ANALOGS-MOUSE1] = { 0 }; + auto spi_adc = adc_spi_get(); + auto spi_channels = spi_adc->n_channels; + auto chans = spi_adc->channels; + auto inputs = adc_get_inputs(); + + auto all_channels = adc_get_n_inputs(); + auto adc_channels = all_channels - spi_channels; + uint8_t noInternalReads = 0; + uint8_t adc_idx[adc_channels] = { 11, 12, 14 }; // TODO + uint16_t temp[adc_channels] = { 0 }; + // Fetch buffer from generic ADC driver + auto adcValues = getAnalogValues(); + // At this point, the first conversion has been started // in x12s_adc_start_read() - + // for each SPI channel - for (uint32_t index=0; index from inputs?) (11, 12, 14) + temp[x] += adcValues[adc_idx[x]]; } // restart internal ADC if not yet done @@ -230,8 +235,8 @@ void x12s_adc_wait_completion() } #endif - for (uint8_t x=0; x> 2; + for (uint8_t x = 0; x < adc_channels; x++) { + adcValues[adc_idx[x]] = temp[x] >> 2; } } diff --git a/radio/src/targets/nv14/board.h b/radio/src/targets/nv14/board.h index 69b84f642f6..846be8af875 100644 --- a/radio/src/targets/nv14/board.h +++ b/radio/src/targets/nv14/board.h @@ -202,62 +202,6 @@ enum VirtualKeys { VKEY_DEFAULT, }; -enum LUATouchEvent { - TOUCH_DOWN = 1, - TOUCH_UP, - TOUCH_SLIDE_UP, - TOUCH_SLIDE_DOWN, - TOUCH_SLIDE_LEFT, - TOUCH_SLIDE_RIGHT, -}; - -enum EnumSwitches -{ - SW_SA, - SW_SB, - SW_SC, - SW_SD, - SW_SE, - SW_SF, - SW_SG, - SW_SH, - NUM_SWITCHES -}; - -#define STORAGE_NUM_SWITCHES NUM_SWITCHES -#define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 14) + (SWITCH_3POS << 12) + (SWITCH_3POS << 10) + (SWITCH_TOGGLE << 8) + (SWITCH_2POS << 6) + (SWITCH_TOGGLE << 4) + (SWITCH_3POS << 2) + (SWITCH_2POS << 0); - -enum EnumSwitchesPositions -{ - SW_SA0, - SW_SA1, - SW_SA2, - SW_SB0, - SW_SB1, - SW_SB2, - SW_SC0, - SW_SC1, - SW_SC2, - SW_SD0, - SW_SD1, - SW_SD2, - SW_SE0, - SW_SE1, - SW_SE2, - SW_SF0, - SW_SF1, - SW_SF2, - SW_SG0, - SW_SG1, - SW_SG2, - SW_SH0, - SW_SH1, - SW_SH2, - NUM_SWITCHES_POSITIONS -}; - -#define STORAGE_NUM_SWITCHES_POSITIONS (STORAGE_NUM_SWITCHES * 3) - #if !defined(NUM_FUNCTIONS_SWITCHES) #define NUM_FUNCTIONS_SWITCHES 0 #endif @@ -280,68 +224,10 @@ bool getTrimsAsButtons(); #define DBLKEYS_PRESSED_RGT_UP(in) (false) #define DBLKEYS_PRESSED_LFT_DWN(in) (false) -// ADC driver -#define NUM_POTS 2 -#define NUM_XPOTS 0 // NUM_POTS -#define NUM_SLIDERS 0 -#define NUM_MOUSE_ANALOGS 0 -#define STORAGE_NUM_POTS 5 -#define STORAGE_NUM_SLIDERS 0 -#define STORAGE_NUM_MOUSE_ANALOGS 0 - -enum Analogs { - STICK1, - STICK2, - STICK3, - STICK4, - POT_FIRST, - POT1 = POT_FIRST, - POT2, - POT_LAST = POT2, - SWITCH_FIRST, - SWA = SWITCH_FIRST, - SWB, - SWC, - SWD, - SWE, - SWF, - SWG, - SWH, - SUB_ANALOG_POS = SWH, - SWITCH_END = SWH, - TX_VOLTAGE, - TX_RTC_VOLTAGE, - NUM_ANALOGS -}; - -#define SLIDER_FIRST 0 -#define SLIDER_LAST -1 - #define DEFAULT_STICK_DEADZONE 2 #define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 0) + (POT_WITHOUT_DETENT << 2) // 2 pots without detent -enum CalibratedAnalogs { - CALIBRATED_STICK1, - CALIBRATED_STICK2, - CALIBRATED_STICK3, - CALIBRATED_STICK4, - CALIBRATED_POT1, - CALIBRATED_POT2, - CALIBRATED_SWA, - CALIBRATED_SWB, - CALIBRATED_SWC, - CALIBRATED_SWD, - CALIBRATED_SWE, - CALIBRATED_SWF, - CALIBRATED_SWG, - CALIBRATED_SWH, - NUM_CALIBRATED_ANALOGS -}; - -extern uint16_t adcValues[NUM_ANALOGS]; - - #define BATTERY_WARN 36 // 3.6V #define BATTERY_MIN 35 // 3.5V #define BATTERY_MAX 42 // 4.2V diff --git a/radio/src/targets/simu/adc_driver.cpp b/radio/src/targets/simu/adc_driver.cpp index 0ce99f0c267..7c2f82aa48f 100644 --- a/radio/src/targets/simu/adc_driver.cpp +++ b/radio/src/targets/simu/adc_driver.cpp @@ -34,7 +34,7 @@ extern uint16_t simu_get_analog(uint8_t idx); static bool simu_start_conversion() { for (int i=0; i