diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index a9d1f78f1..862df89ff 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -128,6 +128,7 @@ body: - RadioMaster TX12 / TX12MK2 - RadioMaster TX15 - RadioMaster TX16S / TX16SMK2 + - RadioMaster TX16SMK3 - RadioMaster Zorro - Other (Please specify below) validations: diff --git a/.github/workflows/build_fw.yml b/.github/workflows/build_fw.yml index 29d2c2b55..18d9166c8 100644 --- a/.github/workflows/build_fw.yml +++ b/.github/workflows/build_fw.yml @@ -33,6 +33,7 @@ jobs: - x9dp2019 - tx15 - tx16s + - tx16smk3 - nv14 - el18 - pl18 @@ -95,6 +96,7 @@ jobs: - tx12mk2;boxer;gx12 - tx15 - tx16s + - tx16smk3 - f16 - v12;v14;v16 - x10;x10express diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 7a9bd7bde..4c537a65f 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -26,6 +26,7 @@ jobs: - t20;t20v2;t14 - tx12mk2;boxer;gx12 - tx16s + - tx16smk3 - f16 - v16 - x10;x10express diff --git a/companion/src/firmwares/boardjson.cpp b/companion/src/firmwares/boardjson.cpp index a02d0325b..c581003c5 100644 --- a/companion/src/firmwares/boardjson.cpp +++ b/companion/src/firmwares/boardjson.cpp @@ -117,6 +117,21 @@ void BoardJson::afterLoadFixups(Board::Type board, InputsTable * inputs, Switche } } + if (IS_RADIOMASTER_TX16SMK3(board)) { + if (getInputIndex(inputs, "LIGHT", Board::LVT_TAG) < 0) { + InputDefn defn; + defn.type = AIT_FLEX; + defn.tag = "LIGHT"; + defn.name = "Ambient light"; + defn.shortName = "Light"; + defn.flexType = FLEX_POT; + defn.inverted = false; + defn.cfgYaml = Board::LVT_TAG; + defn.refYaml = Board::LVT_TAG; // non-default + inputs->insert(inputs->end(), defn); + } + } + // Flex switches are not listed in json file for these radios int count = IS_RADIOMASTER_TX16S(board) || IS_RADIOMASTER_MT12(board) ? 2 : 0; diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp index 27d954cf4..178c14ca2 100644 --- a/companion/src/firmwares/boards.cpp +++ b/companion/src/firmwares/boards.cpp @@ -137,6 +137,8 @@ uint32_t Boards::getFourCC(Type board) return 0x3878746F; case BOARD_RADIOMASTER_TX15: return 0x4978746F; + case BOARD_RADIOMASTER_TX16SMK3: + return 0x4978746F; case BOARD_RADIOMASTER_TX12: return 0x4178746F; case BOARD_RADIOMASTER_TX12_MK2: @@ -214,6 +216,7 @@ int Boards::getEEpromSize(Board::Type board) case BOARD_JUMPER_T16: case BOARD_JUMPER_T18: case BOARD_RADIOMASTER_TX16S: + case BOARD_RADIOMASTER_TX16SMK3: case BOARD_RADIOMASTER_TX15: case BOARD_FLYSKY_NV14: case BOARD_FLYSKY_EL18: @@ -276,6 +279,7 @@ int Boards::getFlashSize(Type board) case BOARD_JUMPER_T16: case BOARD_JUMPER_T18: case BOARD_RADIOMASTER_TX16S: + case BOARD_RADIOMASTER_TX16SMK3: case BOARD_RADIOMASTER_TX15: case BOARD_FLYSKY_NV14: case BOARD_FLYSKY_EL18: @@ -387,27 +391,25 @@ int Boards::getCapability(Board::Type board, Board::Capability capability) return 1; case LcdHeight: - if (IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board)) + if (IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board) || IS_RADIOMASTER_TX16SMK3(board)) return 480; + else if (IS_FAMILY_HORUS_OR_T16(board)) + return 272; else if (IS_FAMILY_PL18(board) || IS_JUMPER_T15(board) || IS_JUMPER_T15PRO(board) || IS_FLYSKY_ST16(board) || IS_RADIOMASTER_TX15(board)) return 320; else if (IS_FLYSKY_PA01(board)) return 240; - else if (IS_FAMILY_HORUS_OR_T16(board)) - return 272; else return 64; case LcdWidth: - if (IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board) || IS_FLYSKY_PA01(board)) + if (IS_RADIOMASTER_TX16SMK3(board)) + return 800; + else if (IS_FAMILY_HORUS_OR_T16(board) || IS_RADIOMASTER_TX15(board) || IS_FAMILY_PL18(board) || IS_FLYSKY_ST16(board)) + return 480; + else if (IS_FLYSKY_NV14(board) || IS_FLYSKY_EL18(board) || IS_FLYSKY_PA01(board)) return 320; - else if (IS_FAMILY_PL18(board) || IS_FLYSKY_ST16(board)) - return 480; - else if (IS_FAMILY_HORUS_OR_T16(board) || IS_RADIOMASTER_TX15(board)) - return 480; - else if (IS_TARANIS_SMALL(board)) - return 128; - else if (IS_TARANIS(board)) + else if (IS_TARANIS(board) && !IS_TARANIS_SMALL(board)) return 212; else return 128; @@ -427,7 +429,7 @@ int Boards::getCapability(Board::Type board, Board::Capability capability) return IS_RADIOMASTER_MT12(board); case FunctionSwitchColors: - return IS_RADIOMASTER_GX12(board) || IS_FLYSKY_ST16(board) || IS_FLYSKY_PA01(board) || IS_RADIOMASTER_TX15(board); + return IS_RADIOMASTER_GX12(board) || IS_FLYSKY_ST16(board) || IS_FLYSKY_PA01(board) || IS_RADIOMASTER_TX15(board) || IS_RADIOMASTER_TX16SMK3(board); default: return getBoardJson(board)->getCapability(capability); @@ -659,6 +661,8 @@ QString Boards::getBoardName(Board::Type board) return "Radiomaster TX12 Mark II"; case BOARD_RADIOMASTER_TX16S: return "Radiomaster TX16S"; + case BOARD_RADIOMASTER_TX16SMK3: + return "Radiomaster TX16SMK3"; case BOARD_RADIOMASTER_TX15: return "Radiomaster TX15"; case BOARD_RADIOMASTER_ZORRO: @@ -799,6 +803,7 @@ int Boards::getDefaultInternalModules(Board::Type board) case BOARD_HELLORADIOSKY_V14: case BOARD_HELLORADIOSKY_V16: case BOARD_RADIOMASTER_TX15: + case BOARD_RADIOMASTER_TX16SMK3: case BOARD_IFLIGHT_COMMANDO8: case BOARD_JUMPER_BUMBLEBEE: case BOARD_JUMPER_T12MAX: @@ -866,6 +871,7 @@ void Boards::getBattRange(Board::Type board, int& vmin, int& vmax, unsigned int& case BOARD_X10: case BOARD_X10_EXPRESS: case BOARD_RADIOMASTER_TX16S: + case BOARD_RADIOMASTER_TX16SMK3: case BOARD_RADIOMASTER_TX15: case BOARD_JUMPER_T16: case BOARD_JUMPER_T18: diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index d20c5d470..7d595a2dc 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -65,6 +65,7 @@ namespace Board { BOARD_JUMPER_T15PRO, BOARD_JUMPER_T16, BOARD_RADIOMASTER_TX16S, + BOARD_RADIOMASTER_TX16SMK3, BOARD_RADIOMASTER_TX15, BOARD_JUMPER_T18, BOARD_JUMPER_T20, @@ -572,6 +573,11 @@ inline bool IS_RADIOMASTER_TX16S(Board::Type board) return board == Board::BOARD_RADIOMASTER_TX16S; } +inline bool IS_RADIOMASTER_TX16SMK3(Board::Type board) +{ + return board == Board::BOARD_RADIOMASTER_TX16SMK3; +} + inline bool IS_RADIOMASTER_TX15(Board::Type board) { return board == Board::BOARD_RADIOMASTER_TX15; @@ -634,13 +640,14 @@ inline bool IS_HELLORADIOSKY_V16(Board::Type board) inline bool IS_FAMILY_T16(Board::Type board) { - return board == Board::BOARD_JUMPER_T15 || + return board == Board::BOARD_FATFISH_F16 || + board == Board::BOARD_HELLORADIOSKY_V16 || + board == Board::BOARD_JUMPER_T15 || board == Board::BOARD_JUMPER_T16 || board == Board::BOARD_JUMPER_T18 || + board == Board::BOARD_RADIOMASTER_TX15 || board == Board::BOARD_RADIOMASTER_TX16S || - board == Board::BOARD_FATFISH_F16 || - board == Board::BOARD_HELLORADIOSKY_V16 || - board == Board::BOARD_RADIOMASTER_TX15; + board == Board::BOARD_RADIOMASTER_TX16SMK3; } inline bool IS_FAMILY_T12(Board::Type board) diff --git a/companion/src/firmwares/generalsettings.cpp b/companion/src/firmwares/generalsettings.cpp index 287a2d8ec..388efde40 100644 --- a/companion/src/firmwares/generalsettings.cpp +++ b/companion/src/firmwares/generalsettings.cpp @@ -213,6 +213,8 @@ void GeneralSettings::init() strcpy(bluetoothName, "st16"); else if (IS_RADIOMASTER_TX15(board)) strcpy(bluetoothName, "tx15"); + else if (IS_RADIOMASTER_TX16SMK3(board)) + strcpy(bluetoothName, "tx16smk3"); else if (IS_FAMILY_HORUS_OR_T16(board)) strcpy(bluetoothName, "horus"); else if (IS_TARANIS_X9E(board) || IS_TARANIS_SMALL(board)) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 9468940a6..b3cdf7a3c 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -329,7 +329,8 @@ int OpenTxFirmware::getCapability(::Capability capability) IS_RADIOMASTER_BOXER(board) || IS_RADIOMASTER_GX12(board) || IS_RADIOMASTER_MT12(board) || IS_RADIOMASTER_POCKET(board) || IS_RADIOMASTER_TX12(board) || IS_RADIOMASTER_TX12_MK2(board) || IS_RADIOMASTER_TX16S(board) || IS_RADIOMASTER_ZORRO(board) || IS_RADIOMASTER_TX15(board) || IS_JUMPER_T15PRO(board) || - IS_FLYSKY_PA01(board) || IS_FLYSKY_ST16(board)); + IS_FLYSKY_PA01(board) || IS_FLYSKY_ST16(board) || + IS_RADIOMASTER_TX16SMK3(board)); case HasSoftwareSerialPower: return IS_RADIOMASTER_TX16S(board); case HasIntModuleMulti: @@ -852,6 +853,13 @@ void registerOpenTxFirmwares() firmware->addOption("flyskygimbals", Firmware::tr("Support hardware mod: FlySky Paladin EV Gimbals")); registerOpenTxFirmware(firmware); + /* Radiomaster TX16SMK3 board */ + firmware = new OpenTxFirmware(FIRMWAREID("tx16smk3"), Firmware::tr("Radiomaster TX16SMK3"), BOARD_RADIOMASTER_TX16SMK3); + addOpenTxFrskyOptions(firmware); + addOpenTxRfOptions(firmware, FLEX); + firmware->addOptionsGroup({opt_bt, opt_internal_gps}); + registerOpenTxFirmware(firmware); + /* Radiomaster Zorro board */ firmware = new OpenTxFirmware(FIRMWAREID("zorro"), QCoreApplication::translate("Firmware", "Radiomaster Zorro"), Board::BOARD_RADIOMASTER_ZORRO); addOpenTxCommonOptions(firmware); diff --git a/fw.json b/fw.json index 57b586d08..2baa51da6 100644 --- a/fw.json +++ b/fw.json @@ -38,6 +38,7 @@ ["RadioMaster TX12MK2", "tx12mk2-"], ["RadioMaster TX15", "tx15-"], ["RadioMaster TX16S", "tx16s-"], + ["RadioMaster TX16SMK3", "tx16smk3-"], ["RadioMaster Zorro","zorro-"] ], "changelog": "- Major initial bug fixes" diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index c1a92c103..d4daae156 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -1,7 +1,7 @@ include(CMakeForceCompiler) include(Bitmaps) -set(PCB_TYPES X9LITE X9LITES X7 XLITE XLITES X9D X9D+ X9E X10 X12S PL18 T15PRO ST16 PA01 TX15) +set(PCB_TYPES X9LITE X9LITES X7 XLITE XLITES X9D X9D+ X9E X10 X12S PL18 T15PRO ST16 PA01 TX15 TX16SMK3) set(RADIO_LANGUAGES CN CZ DA DE EN ES FI FR HE HU IT JP KO NL PL PT RU SE SK TW UA) set(TTS_LANGUAGES CN CZ DA DE EN ES FI FR HE HU IT JP KO NL PL PT RU SE SK TW UA) @@ -99,6 +99,8 @@ elseif(PCB STREQUAL PA01) include(targets/pa01/CMakeLists.txt) elseif(PCB STREQUAL TX15) include(targets/tx15/CMakeLists.txt) +elseif(PCB STREQUAL TX16SMK3) + include(targets/tx16smk3/CMakeLists.txt) elseif(PCB STREQUAL STM32H7S78_DK) include(targets/stm32h7s78-dk/CMakeLists.txt) elseif(PCB STREQUAL X9E OR PCB STREQUAL X9D+ OR PCB STREQUAL X9D OR PCB STREQUAL X7 OR PCB STREQUAL X9LITE OR PCB STREQUAL X9LITES OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES) @@ -424,6 +426,14 @@ if(DISABLE_MCUCHECK) add_definitions(-DDISABLE_MCUCHECK) endif() +if(SIZE_TARGET_MEM_DEFINE MATCHES 32768) + add_definitions(-DSDRAM_32M) +elseif(SIZE_TARGET_MEM_DEFINE MATCHES 16384) + add_definitions(-DSDRAM_16M) +else(SIZE_TARGET_MEM_DEFINE MATCHES 8192) + add_definitions(-DSDRAM_8M) +endif() + set(SRC ${SRC} edgetx.cpp diff --git a/radio/src/boards/rm-h750/audio_driver.cpp b/radio/src/boards/rm-h750/audio_driver.cpp index 4435223b4..ee83c1fc8 100644 --- a/radio/src/boards/rm-h750/audio_driver.cpp +++ b/radio/src/boards/rm-h750/audio_driver.cpp @@ -184,7 +184,7 @@ extern "C" void DMA1_Stream4_IRQHandler(void) if (stm32_dma_check_ht_flag(I2S_DMA, I2S_DMA_Stream)) { audio_update_dma_buffer(0); } - + if (stm32_dma_check_tc_flag(I2S_DMA, I2S_DMA_Stream)) { audio_update_dma_buffer(1); } diff --git a/radio/src/boards/rm-h750/backlight_driver.cpp b/radio/src/boards/rm-h750/backlight_driver.cpp index 5452b87a3..772af46c9 100644 --- a/radio/src/boards/rm-h750/backlight_driver.cpp +++ b/radio/src/boards/rm-h750/backlight_driver.cpp @@ -29,6 +29,12 @@ #include "globals.h" +typedef void (*lcdSpiInitFucPtr)(void); +typedef unsigned int LcdReadIDFucPtr( void ); + +extern lcdSpiInitFucPtr lcdOffFunction; +extern lcdSpiInitFucPtr lcdOnFunction; + static const stm32_pulse_timer_t _bl_timer = { .GPIO = (gpio_t)BACKLIGHT_GPIO, .GPIO_Alternate = BACKLIGHT_GPIO_AF, @@ -51,7 +57,7 @@ void backlightLowInit() void backlightInit() { - stm32_pulse_init(&_bl_timer, 1000000); + stm32_pulse_init(&_bl_timer, 100000); stm32_pulse_config_output(&_bl_timer, true, LL_TIM_OCMODE_PWM1, 100); LL_TIM_SetAutoReload(_bl_timer.TIMx, 100); LL_TIM_EnableCounter(_bl_timer.TIMx); diff --git a/radio/src/boards/rm-h750/bsp_io.cpp b/radio/src/boards/rm-h750/bsp_io.cpp index c1e59fdc0..df4261950 100644 --- a/radio/src/boards/rm-h750/bsp_io.cpp +++ b/radio/src/boards/rm-h750/bsp_io.cpp @@ -202,7 +202,7 @@ static SwitchHwPos _get_switch_pos(uint8_t idx) } else if (!def->Pin_low) { // 2POS switch - if ((state & def->Pin_high) == 0) { + if ((state & def->Pin_high) != 0) { pos = SWITCH_HW_DOWN; } } else { diff --git a/radio/src/boards/rm-h750/lcd_driver_800.cpp b/radio/src/boards/rm-h750/lcd_driver_800.cpp new file mode 100644 index 000000000..d6790db74 --- /dev/null +++ b/radio/src/boards/rm-h750/lcd_driver_800.cpp @@ -0,0 +1,275 @@ +/* + * 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_ll.h" +#include "stm32_hal.h" +#include "edgetx_types.h" +#include "dma2d.h" +#include "hal.h" +#include "delays_driver.h" +#include "debug.h" +#include "lcd.h" +#include "lcd_driver_800.h" +#include "board.h" + +#include "hal/gpio.h" +#include "stm32_gpio.h" +#include "stm32_qspi.h" + +uint8_t TouchControllerType = 0; // 0: other; 1: CST836U +static const uint16_t lcd_phys_w = LCD_PHYS_W; +static const uint16_t lcd_phys_h = LCD_PHYS_H; + +static LTDC_HandleTypeDef hltdc; +static void* initialFrameBuffer = nullptr; + +static volatile uint8_t _frame_addr_reloaded = 0; + +static void startLcdRefresh(lv_disp_drv_t *disp_drv, uint16_t *buffer, + const rect_t ©_area) +{ + (void)disp_drv; + (void)copy_area; + + // given the data cache size, this is probably + // faster than cleaning by address + SCB_CleanDCache(); + + LTDC_Layer1->CFBAR = (uint32_t)buffer; + // reload shadow registers on vertical blank + _frame_addr_reloaded = 0; + LTDC->SRCR = LTDC_SRCR_VBR; + + __HAL_LTDC_ENABLE_IT(&hltdc, LTDC_IT_LI); + + // wait for reload + // TODO: replace through some smarter mechanism without busy wait + while(_frame_addr_reloaded == 0); +} + +lcdSpiInitFucPtr lcdInitFunction; +lcdSpiInitFucPtr lcdOffFunction; +lcdSpiInitFucPtr lcdOnFunction; +uint32_t lcdPixelClock; + +volatile uint8_t LCD_ReadBuffer[24] = { 0, 0 }; + +static void LCD_AF_GPIOConfig(void) +{ + const gpio_t _lcd_af_gpios[] = { + GPIO_PIN(GPIOI, 12), GPIO_PIN(GPIOI, 13), GPIO_PIN(GPIOI, 14), + + GPIO_PIN(GPIOJ, 1), GPIO_PIN(GPIOJ, 2), GPIO_PIN(GPIOJ, 3), + GPIO_PIN(GPIOJ, 4), GPIO_PIN(GPIOJ, 5), GPIO_PIN(GPIOJ, 6), + GPIO_PIN(GPIOJ, 9), GPIO_PIN(GPIOJ, 10), GPIO_PIN(GPIOJ, 11), + GPIO_PIN(GPIOJ, 14), GPIO_PIN(GPIOJ, 15), + + GPIO_PIN(GPIOK, 0), GPIO_PIN(GPIOK, 1), GPIO_PIN(GPIOK, 2), + GPIO_PIN(GPIOK, 3), GPIO_PIN(GPIOK, 4), GPIO_PIN(GPIOK, 5), + GPIO_PIN(GPIOK, 6), GPIO_PIN(GPIOK, 7), + }; + + for (unsigned i = 0; i < sizeof(_lcd_af_gpios) / sizeof(_lcd_af_gpios[0]); i++) { + gpio_init_af(_lcd_af_gpios[i], GPIO_AF14, GPIO_SPEED_FREQ_LOW); + } +} + +static void lcdSpiConfig(void) +{ + LL_GPIO_InitTypeDef GPIO_InitStructure; + LL_GPIO_StructInit(&GPIO_InitStructure); + + GPIO_InitStructure.Pin = LCD_RESET_GPIO_PIN; + GPIO_InitStructure.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStructure.Mode = LL_GPIO_MODE_OUTPUT; + GPIO_InitStructure.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStructure.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(LCD_RESET_GPIO, &GPIO_InitStructure); +} + +void lcdDelay() { + delay_01us(1); +} + +static void lcdReset() { + + LCD_NRST_HIGH(); + delay_ms(1); + + LCD_NRST_LOW(); // RESET(); + delay_ms(10); + + LCD_NRST_HIGH(); + delay_ms(100); +} + + + +void LCD_Init_LTDC() { + hltdc.Instance = LTDC; + + /* Configure PLLSAI prescalers for LCD */ + /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * lcdPixelclock * 16 = XX Mhz */ + /* PLLLCDCLK = PLLSAI_VCO Output/PLL_LTDC = PLLSAI_VCO/4 = YY Mhz */ + /* LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = YY/4 = lcdPixelClock Mhz */ +// uint32_t clock = (lcdPixelClock*16) / 1000000; // clock*16 in MHz +// RCC_PeriphCLKInitTypeDef clkConfig; +// clkConfig.PeriphClockSelection = RCC_PERIPHCLK_LTDC; +// clkConfig.PLLI2S +// clkConfig.PLLSAI.PLLSAIN = clock; +// clkConfig.PLLSAI.PLLSAIR = 4; +// clkConfig.PLLSAIDivQ = 6; +// clkConfig.PLLSAIDivR = RCC_PLLSAIDIVR_4; +// HAL_RCCEx_PeriphCLKConfig(&clkConfig); + + /* LTDC Configuration *********************************************************/ + /* Polarity configuration */ + /* Initialize the horizontal synchronization polarity as active low */ + hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL; + /* Initialize the vertical synchronization polarity as active low */ + hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL; + /* Initialize the data enable polarity as active low */ + hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL; + /* Initialize the pixel clock polarity as input pixel clock */ + hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IIPC; + + /* Configure R,G,B component values for LCD background color */ + hltdc.Init.Backcolor.Red = 0; + hltdc.Init.Backcolor.Green = 0; + hltdc.Init.Backcolor.Blue = 0; + + /* Configure horizontal synchronization width */ + hltdc.Init.HorizontalSync = HSW-1; + /* Configure vertical synchronization height */ + hltdc.Init.VerticalSync = VSH-1; + /* Configure accumulated horizontal back porch */ + hltdc.Init.AccumulatedHBP = HSW+HBP-1; + /* Configure accumulated vertical back porch */ + hltdc.Init.AccumulatedVBP = VSH+VBP-1; + /* Configure accumulated active width */ + hltdc.Init.AccumulatedActiveW = lcd_phys_w + HBP+HSW-1; + /* Configure accumulated active height */ + hltdc.Init.AccumulatedActiveH = lcd_phys_h + VBP+VSH-1; + /* Configure total width */ + hltdc.Init.TotalWidth = lcd_phys_w + HBP + HFP + HSW -1; + /* Configure total height */ + hltdc.Init.TotalHeigh = lcd_phys_h + VBP + VFP+VSH-1; + + HAL_LTDC_Init(&hltdc); + + // Configure IRQ (line) + NVIC_SetPriority(LTDC_IRQn, LTDC_IRQ_PRIO); + NVIC_EnableIRQ(LTDC_IRQn); + + // Trigger on last line + HAL_LTDC_ProgramLineEvent(&hltdc, lcd_phys_h); + __HAL_LTDC_ENABLE_IT(&hltdc, LTDC_IT_LI); +} + +void LCD_LayerInit() { + auto& layer = hltdc.LayerCfg[0]; + + /* Windowing configuration */ + layer.WindowX0 = 0; + layer.WindowX1 = lcd_phys_w; + layer.WindowY0 = 0; + layer.WindowY1 = lcd_phys_h; + + /* Pixel Format configuration*/ + layer.PixelFormat = LTDC_PIXEL_FORMAT_RGB565; + + /* Alpha constant (255 totally opaque) */ + layer.Alpha = 255; + + /* Default Color configuration (configure A,R,G,B component values) */ + layer.Backcolor.Blue = 0; + layer.Backcolor.Green = 0; + layer.Backcolor.Red = 0; + layer.Alpha0 = 0; + + /* Configure blending factors */ + layer.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; + layer.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; + + layer.ImageWidth = lcd_phys_w; + layer.ImageHeight = lcd_phys_h; + + /* Start Address configuration : the LCD Frame buffer is defined on SDRAM w/ Offset */ + layer.FBStartAdress = (intptr_t)initialFrameBuffer; + + /* Initialize LTDC layer 1 */ + HAL_LTDC_ConfigLayer(&hltdc, &hltdc.LayerCfg[0], 0); + + /* dithering activation */ + HAL_LTDC_EnableDither(&hltdc); +} + +extern "C" +void lcdSetInitalFrameBuffer(void* fbAddress) +{ + initialFrameBuffer = fbAddress; +} + +const char* boardLcdType = ""; + +extern "C" +void lcdInit(void) +{ +#if defined(LCD_SPI_CONFLICTS_WITH_QSPI) + stm32_qspi_nor_deinit(); +#endif + + /* Configure the LCD SPI+RESET pins */ + lcdSpiConfig(); + + /* Reset the LCD --------------------------------------------------------*/ + lcdReset(); + + /* Configure the LCD Control pins */ + LCD_AF_GPIOConfig(); + + /* Send LCD initialization commands */ + TRACE("LCD INIT (default): ST7365"); + boardLcdType = "ST7365 (Default)"; + + __HAL_RCC_LTDC_CLK_ENABLE(); + + LCD_Init_LTDC(); + LCD_LayerInit(); + + // Enable LCD display + __HAL_LTDC_ENABLE(&hltdc); + + lcdSetFlushCb(startLcdRefresh); + +#if defined(LCD_SPI_CONFLICTS_WITH_QSPI) + stm32_qspi_nor_init(); + stm32_qspi_nor_memory_mapped(); +#endif +} + +extern "C" void LTDC_IRQHandler(void) +{ + __HAL_LTDC_CLEAR_FLAG(&hltdc, LTDC_FLAG_LI); + __HAL_LTDC_DISABLE_IT(&hltdc, LTDC_IT_LI); + _frame_addr_reloaded = 1; +} diff --git a/radio/src/boards/rm-h750/lcd_driver_800.h b/radio/src/boards/rm-h750/lcd_driver_800.h new file mode 100644 index 000000000..9b700f931 --- /dev/null +++ b/radio/src/boards/rm-h750/lcd_driver_800.h @@ -0,0 +1,46 @@ +/* +* 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 "bsp_io.h" + +#define HBP ( 16 ) +#define VBP ( 8 ) + +#define HSW ( 4 ) +#define VSH ( 4 ) + +#define HFP ( 16 ) +#define VFP ( 8 ) + +typedef void (*lcdSpiInitFucPtr)(void); +typedef unsigned int LcdReadIDFucPtr( void ); + +extern lcdSpiInitFucPtr lcdInitFunction; +extern lcdSpiInitFucPtr lcdOffFunction; +extern lcdSpiInitFucPtr lcdOnFunction; + +#define SET_IO_INPUT( PORT, PIN ) LL_GPIO_SetPinMode( PORT, PIN, LL_GPIO_MODE_INPUT ) +#define SET_IO_OUTPUT( PORT, PIN ) LL_GPIO_SetPinMode( PORT, PIN, LL_GPIO_MODE_OUTPUT ) + +#define LCD_NRST_HIGH() LL_GPIO_SetOutputPin(LCD_RESET_GPIO, LCD_RESET_GPIO_PIN) +#define LCD_NRST_LOW() LL_GPIO_ResetOutputPin(LCD_RESET_GPIO, LCD_RESET_GPIO_PIN) diff --git a/radio/src/boards/rm-h750/luminosity_sensor.cpp b/radio/src/boards/rm-h750/luminosity_sensor.cpp new file mode 100644 index 000000000..75235ad99 --- /dev/null +++ b/radio/src/boards/rm-h750/luminosity_sensor.cpp @@ -0,0 +1,51 @@ +/* +* 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 "edgetx.h" +#include "luminosity_sensor.h" +#include "hal/adc_driver.h" + +static uint32_t luxEMA = 0; +static bool luxInitialized = false; + +bool getPeriodicLuxSensorValue() +{ + if (adcGetMaxInputs(ADC_INPUT_LUX) < 1) return false; + + uint16_t newValue = anaIn(adcGetInputOffset(ADC_INPUT_LUX)); + + if (!luxInitialized) { + // Initialize EMA with first reading + luxEMA = (uint32_t)newValue << 8; // Scale up for precision + luxInitialized = true; + } else { + // EMA formula with alpha = 26/256 ≈ 0.102 + int32_t diff = ((int32_t)newValue << 8) - (int32_t)luxEMA; + luxEMA = luxEMA + ((diff * 26) >> 8); + } + + return true; +} + +uint16_t getLuxSensorValue() +{ + return luxEMA >> 8; // Scale back down +} \ No newline at end of file diff --git a/radio/src/boards/rm-h750/luminosity_sensor.h b/radio/src/boards/rm-h750/luminosity_sensor.h new file mode 100644 index 000000000..c9039fb67 --- /dev/null +++ b/radio/src/boards/rm-h750/luminosity_sensor.h @@ -0,0 +1,28 @@ +/* +* 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 +#include "edgetx_types.h" + +#pragma once + +bool getPeriodicLuxSensorValue(); +uint16_t getLuxSensorValue(); \ No newline at end of file diff --git a/radio/src/boards/rm-h750/sdram_driver.cpp b/radio/src/boards/rm-h750/sdram_driver.cpp index b643af154..49c21b884 100644 --- a/radio/src/boards/rm-h750/sdram_driver.cpp +++ b/radio/src/boards/rm-h750/sdram_driver.cpp @@ -96,6 +96,9 @@ extern "C" void SDRAM_GPIOConfig(void) /* GPIOG configuration */ gpio_init_af(GPIO_PIN(GPIOG, 0), GPIO_AF_FMC, GPIO_PIN_SPEED_VERY_HIGH); gpio_init_af(GPIO_PIN(GPIOG, 1), GPIO_AF_FMC, GPIO_PIN_SPEED_VERY_HIGH); +#if defined(SDRAM_32M) + gpio_init_af(GPIO_PIN(GPIOG, 2), GPIO_AF_FMC, GPIO_PIN_SPEED_VERY_HIGH); +#endif gpio_init_af(GPIO_PIN(GPIOG, 4), GPIO_AF_FMC, GPIO_PIN_SPEED_VERY_HIGH); gpio_init_af(GPIO_PIN(GPIOG, 5), GPIO_AF_FMC, GPIO_PIN_SPEED_VERY_HIGH); gpio_init_af(GPIO_PIN(GPIOG, 8), GPIO_AF_FMC, GPIO_PIN_SPEED_VERY_HIGH); @@ -194,8 +197,13 @@ extern "C" void SDRAM_Init(void) /* FMC SDRAM control configuration */ FMC_SDRAMInitStructure.SDBank = FMC_SDRAM_BANK2; +#if defined(SDRAM_32M) + FMC_SDRAMInitStructure.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9; + FMC_SDRAMInitStructure.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13; +#else FMC_SDRAMInitStructure.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8; FMC_SDRAMInitStructure.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12; +#endif FMC_SDRAMInitStructure.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16; FMC_SDRAMInitStructure.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4; FMC_SDRAMInitStructure.CASLatency = FMC_SDRAM_CAS_LATENCY_3; diff --git a/radio/src/boards/rm-h750/system_clock.c b/radio/src/boards/rm-h750/system_clock.c index 2c32220da..99ab35fc4 100644 --- a/radio/src/boards/rm-h750/system_clock.c +++ b/radio/src/boards/rm-h750/system_clock.c @@ -94,7 +94,11 @@ BOOTSTRAP void SystemClock_Config(void) LL_RCC_PLL3_SetN(4); LL_RCC_PLL3_SetP(2); LL_RCC_PLL3_SetQ(2); +#if defined(RADIO_TX16SMK3) + LL_RCC_PLL3_SetR(8); // 24 MHz +#else LL_RCC_PLL3_SetR(18); +#endif LL_RCC_PLL3_Enable(); while (LL_RCC_PLL3_IsReady() != 1) { } @@ -105,7 +109,7 @@ BOOTSTRAP void SystemClock_Config(void) LL_AHB2_GRP1_PERIPH_D2SRAM3); /* Set periph clock sources */ - LL_RCC_SetSPIClockSource(LL_RCC_SPI123_CLKSOURCE_PLL1Q); + LL_RCC_SetSPIClockSource(LL_RCC_SPI123_CLKSOURCE_PLL1Q); LL_RCC_SetUSBClockSource(LL_RCC_USB_CLKSOURCE_PLL1Q); LL_RCC_SetADCClockSource(LL_RCC_ADC_CLKSOURCE_CLKP); } diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index bcd368d50..b6606a56c 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -520,6 +520,10 @@ enum MixSources { MIXSRC_MIN, MIXSRC_MAX, +#if defined(LUMINOSITY_SENSOR) + MIXSRC_LIGHT, +#endif + MIXSRC_FIRST_HELI SKIP, MIXSRC_LAST_HELI SKIP = MIXSRC_FIRST_HELI + 2, @@ -588,8 +592,9 @@ enum SrcTypes { SRC_TX = 1 << 16, SRC_TIMER = 1 << 17, SRC_TELEM = 1 << 18, - SRC_NONE = 1 << 19, - SRC_INVERT = 1 << 20, + SRC_LIGHT = 1 << 19, + SRC_NONE = 1 << 30, + SRC_INVERT = 1 << 31, }; enum BacklightMode { diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 891fad317..21e0f081f 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -78,7 +78,7 @@ static inline void check_struct() #if defined(PCBXLITES) CHKSIZE(RadioData, 950); -#elif defined(RADIO_ST16) || defined(PCBPA01) || defined(RADIO_TX15) || defined(RADIO_T15PRO) +#elif defined(RADIO_ST16) || defined(PCBPA01) || defined(RADIO_TX15) || defined(RADIO_T15PRO) || defined(RADIO_TX16SMK3) CHKSIZE(RadioData, 1181); #elif defined(COLORLCD) CHKSIZE(RadioData, 1061); @@ -112,6 +112,8 @@ static inline void check_struct() CHKSIZE(ModelData, 7582); #elif defined(RADIO_T15) CHKSIZE(ModelData, 6867); +#elif defined(RADIO_TX16SMK3) + CHKSIZE(ModelData, 7642); #elif defined(RADIO_H7RS) // CHKSIZE() #elif defined(PCBHORUS) diff --git a/radio/src/edgetx.cpp b/radio/src/edgetx.cpp index f32b54088..847ca0354 100644 --- a/radio/src/edgetx.cpp +++ b/radio/src/edgetx.cpp @@ -78,6 +78,10 @@ #include "lua/custom_allocator.h" #endif +#if defined(LUMINOSITY_SENSOR) +#include "luminosity_sensor.h" +#endif + RadioData g_eeGeneral; ModelData g_model; @@ -238,6 +242,10 @@ void per10ms() if (mixWarning & 4) if(((g_tmr10ms&0xFF)==128) || ((g_tmr10ms&0xFF)==136) || ((g_tmr10ms&0xFF)==144)) AUDIO_MIX_WARNING(3); #endif +#if defined(LUMINOSITY_SENSOR) + getPeriodicLuxSensorValue(); +#endif + outputTelemetryBuffer.per10ms(); heartbeat |= HEART_TIMER_10MS; @@ -2016,6 +2024,12 @@ void getMixSrcRange(const int source, int16_t & valMin, int16_t & valMax, LcdFla if (flags) *flags |= PREC1; } +#if defined(LUMINOSITY_SENSOR) + else if (asrc == MIXSRC_LIGHT) { + valMax = 100; + valMin = -valMax; + } +#endif else if (asrc == MIXSRC_TX_TIME) { valMax = 23 * 60 + 59; valMin = 0; diff --git a/radio/src/functions.cpp b/radio/src/functions.cpp index af2a8521f..0d71e40a6 100644 --- a/radio/src/functions.cpp +++ b/radio/src/functions.cpp @@ -109,6 +109,10 @@ PLAY_FUNCTION(playValue, mixsrc_t idx) PLAY_DURATION(val * 60, PLAY_TIME); } else if (idx == MIXSRC_TX_VOLTAGE) { PLAY_NUMBER(val, UNIT_VOLTS, PREC1); +#if defined(LUMINOSITY_SENSOR) + } else if (idx == MIXSRC_LIGHT) { + PLAY_NUMBER(val, UNIT_RAW, 0); +#endif } else { if (idx <= MIXSRC_LAST_CH) { val = calcRESXto100(val); diff --git a/radio/src/gui/colorlcd/controls/sourcechoice.cpp b/radio/src/gui/colorlcd/controls/sourcechoice.cpp index 6d9d8fe5e..24b11c3d5 100644 --- a/radio/src/gui/colorlcd/controls/sourcechoice.cpp +++ b/radio/src/gui/colorlcd/controls/sourcechoice.cpp @@ -42,13 +42,7 @@ class SourceChoiceMenuToolbar : public MenuToolbar addButton(CHAR_LUA, MIXSRC_FIRST_LUA, MIXSRC_LAST_LUA, nullptr, STR_MENU_LUA); #endif -#if defined(PCBHORUS) - auto lastSource = MIXSRC_LAST_SPACEMOUSE; -#elif defined(IMU) - auto lastSource = MIXSRC_TILT_Y; -#else - auto lastSource = MIXSRC_LAST_STICK; -#endif + auto lastSource = MIXSRC_MIN - 1; addButton( CHAR_STICK, MIXSRC_FIRST_STICK, lastSource, [=](int16_t index) { @@ -62,6 +56,9 @@ class SourceChoiceMenuToolbar : public MenuToolbar addButton( CHAR_FUNCTION, MIXSRC_MIN, MIXSRC_LAST_TIMER, [=](int16_t index) { +#if defined(LUMINOSITY_SENSOR) + if (index == MIXSRC_LIGHT) return true; +#endif return (index >= MIXSRC_MIN && index <= MIXSRC_MAX) || (index >= MIXSRC_TX_VOLTAGE && index <= MIXSRC_LAST_TIMER); }, diff --git a/radio/src/gui/colorlcd/libui/list_line_button.cpp b/radio/src/gui/colorlcd/libui/list_line_button.cpp index 0d1c13137..ccb22fbd6 100644 --- a/radio/src/gui/colorlcd/libui/list_line_button.cpp +++ b/radio/src/gui/colorlcd/libui/list_line_button.cpp @@ -251,18 +251,22 @@ InputMixGroupBase::InputMixGroupBase(Window* parent, mixsrc_t idx) : etx_font(label, FONT_XS_INDEX, LV_STATE_USER_1); } -void InputMixGroupBase::adjustHeight() +void InputMixGroupBase::_adjustHeight(coord_t y) { if (getLineCount() == 0) setHeight(ListLineButton::BTN_H + PAD_SMALL * 2); - coord_t y = PAD_OUTLINE; for (auto it = lines.cbegin(); it != lines.cend(); ++it) { auto line = *it; line->updateHeight(); line->updatePos(InputMixButtonBase::LN_X, y); y += line->height() + PAD_OUTLINE; } - setHeight(y + PAD_BORDER * 2); + setHeight(y + PAD_BORDER * 2 + PAD_OUTLINE); +} + +void InputMixGroupBase::adjustHeight() +{ + _adjustHeight(0); } void InputMixGroupBase::addLine(InputMixButtonBase* line) diff --git a/radio/src/gui/colorlcd/libui/list_line_button.h b/radio/src/gui/colorlcd/libui/list_line_button.h index 96c9301af..c91d110ef 100644 --- a/radio/src/gui/colorlcd/libui/list_line_button.h +++ b/radio/src/gui/colorlcd/libui/list_line_button.h @@ -37,7 +37,7 @@ class ListLineButton : public ButtonBase virtual void refresh() = 0; - static constexpr coord_t BTN_H = EdgeTxStyles::STD_FONT_HEIGHT + PAD_BORDER * 2 + PAD_TINY * 2; + static constexpr coord_t BTN_H = EdgeTxStyles::STD_FONT_HEIGHT + PAD_BORDER * 2 + PAD_OUTLINE * 2; static constexpr coord_t GRP_W = LCD_W - PAD_SMALL * 2; protected: @@ -72,7 +72,7 @@ class InputMixButtonBase : public ListLineButton #else static LAYOUT_VAL_SCALED(LN_X, 73) #endif - static constexpr coord_t BTN_W = ListLineButton::GRP_W - LN_X - PAD_BORDER * 2 - PAD_OUTLINE; + static constexpr coord_t BTN_W = ListLineButton::GRP_W - LN_X - PAD_BORDER * 2 - PAD_OUTLINE * 2; static constexpr coord_t WGT_X = PAD_TINY; static constexpr coord_t WGT_Y = PAD_TINY; static LAYOUT_VAL_SCALED(WGT_W, 50) @@ -122,6 +122,8 @@ class InputMixGroupBase : public Window mixsrc_t idx; lv_obj_t* label; std::list lines; + + void _adjustHeight(coord_t y); }; class InputMixPageBase : public PageGroupItem diff --git a/radio/src/gui/colorlcd/lv_conf.h b/radio/src/gui/colorlcd/lv_conf.h index c60fc47c1..31f427879 100644 --- a/radio/src/gui/colorlcd/lv_conf.h +++ b/radio/src/gui/colorlcd/lv_conf.h @@ -57,10 +57,17 @@ #endif #if LV_MEM_CUSTOM == 0 /*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/ - #if defined(SIMU) - #define LV_MEM_SIZE (4 * 1024U * 1024U) /*[bytes]*/ + #if defined(SDRAM_32M) + #define LV_MEM 8 + #elif defined(SDRAM_16M) + #define LV_MEM 4 #else - #define LV_MEM_SIZE (2 * 1024U * 1024U) /*[bytes]*/ + #define LV_MEM 2 + #endif + #if defined(SIMU) + #define LV_MEM_SIZE (LV_MEM * 2 * 1024U * 1024U) /*[bytes]*/ + #else + #define LV_MEM_SIZE (LV_MEM * 1024U * 1024U) /*[bytes]*/ #endif /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ diff --git a/radio/src/gui/colorlcd/model/curveedit.cpp b/radio/src/gui/colorlcd/model/curveedit.cpp index 1154a2fbe..1fb98c22a 100644 --- a/radio/src/gui/colorlcd/model/curveedit.cpp +++ b/radio/src/gui/colorlcd/model/curveedit.cpp @@ -124,7 +124,11 @@ class CurveDataEdit : public Window } static LAYOUT_VAL_SCALED(ROW_HEIGHT, 82) +#if WIDE_LAYOUT + static LAYOUT_VAL_SCALED(NUM_BTN_WIDTH, 50) +#else static LAYOUT_VAL_SCALED(NUM_BTN_WIDTH, 47) +#endif static LAYOUT_VAL_SCALED(NUM_HDR_HEIGHT, 15) static LAYOUT_VAL_SCALED(PTNUM_X, 15) static LAYOUT_VAL_SCALED(PTNUM_H, 13) diff --git a/radio/src/gui/colorlcd/model/model_logical_switches.cpp b/radio/src/gui/colorlcd/model/model_logical_switches.cpp index 8f42f52c8..8c1deed6a 100644 --- a/radio/src/gui/colorlcd/model/model_logical_switches.cpp +++ b/radio/src/gui/colorlcd/model/model_logical_switches.cpp @@ -36,7 +36,7 @@ #define SET_DIRTY() storageDirty(EE_MODEL) #define ETX_STATE_LS_ACTIVE LV_STATE_USER_1 -#define ETX_STATE_V1_SMALL_FONT LV_STATE_USER_1 +#define ETX_STATE_V1_SMALL_FONT LV_STATE_USER_2 static const lv_coord_t col_dsc[] = {LV_GRID_FR(2), LV_GRID_FR(3), LV_GRID_TEMPLATE_LAST}; diff --git a/radio/src/gui/colorlcd/model/model_mixes.cpp b/radio/src/gui/colorlcd/model/model_mixes.cpp index 0f850b141..b7f21366e 100644 --- a/radio/src/gui/colorlcd/model/model_mixes.cpp +++ b/radio/src/gui/colorlcd/model/model_mixes.cpp @@ -214,14 +214,7 @@ class MixGroup : public InputMixGroupBase void adjustHeight() override { - coord_t y = monitorVisible ? CHNUM_Y : PAD_OUTLINE; - for (auto it = lines.cbegin(); it != lines.cend(); ++it) { - auto line = *it; - line->updateHeight(); - line->updatePos(InputMixButtonBase::LN_X, y); - y += line->height() + PAD_OUTLINE; - } - setHeight(y + PAD_BORDER * 2); + _adjustHeight(monitorVisible ? CHNUM_Y : 0); } static LAYOUT_VAL_SCALED(CHNUM_Y, 17) diff --git a/radio/src/gui/common/stdlcd/draw_functions.cpp b/radio/src/gui/common/stdlcd/draw_functions.cpp index b866ce3fb..9521c09f3 100644 --- a/radio/src/gui/common/stdlcd/draw_functions.cpp +++ b/radio/src/gui/common/stdlcd/draw_functions.cpp @@ -450,6 +450,11 @@ void drawSourceCustomValue(coord_t x, coord_t y, mixsrc_t source, int32_t value, else if (source == MIXSRC_TX_VOLTAGE) { lcdDrawNumber(x, y, value, flags|PREC1); } +#if defined(LUMINOSITY_SENSOR) + else if (source == MIXSRC_LIGHT) { + lcdDrawNumber(x, y, value, flags); + } +#endif #if defined(INTERNAL_GPS) else if (source == MIXSRC_TX_GPS) { if (gpsData.fix) { diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 0f6bf6a90..6d58240b3 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -262,6 +262,9 @@ static struct sourceAvailableCheck sourceChecks[] = { #if defined(IMU) { MIXSRC_TILT_X, MIXSRC_TILT_Y, SRC_TILT, sourceIsAvailable }, #endif +#if defined(LUMINOSITY_SENSOR) + { MIXSRC_LIGHT, MIXSRC_LIGHT, SRC_LIGHT, sourceIsAvailable }, +#endif #if defined(PCBHORUS) { MIXSRC_FIRST_SPACEMOUSE, MIXSRC_LAST_SPACEMOUSE, SRC_SPACEMOUSE, isSourceSpacemouseAvailable }, #endif @@ -298,7 +301,7 @@ bool checkSourceAvailable(int source, uint32_t sourceTypes) } #define SRC_COMMON \ - SRC_STICK | SRC_POT | SRC_TILT | SRC_SPACEMOUSE | SRC_MINMAX | SRC_TRIM | \ + SRC_STICK | SRC_POT | SRC_TILT | SRC_LIGHT | SRC_SPACEMOUSE | SRC_MINMAX | SRC_TRIM | \ SRC_SWITCH | SRC_FUNC_SWITCH | SRC_LOGICAL_SWITCH | SRC_TRAINER | SRC_GVAR bool isSourceAvailable(int source) @@ -310,7 +313,7 @@ bool isSourceAvailable(int source) bool isSourceAvailableForBacklightOrVolume(int source) { - return checkSourceAvailable(source, SRC_SWITCH | SRC_POT | SRC_NONE); + return checkSourceAvailable(source, SRC_SWITCH | SRC_POT | SRC_LIGHT | SRC_NONE); } bool isLogicalSwitchAvailable(int index) diff --git a/radio/src/hal/adc_driver.h b/radio/src/hal/adc_driver.h index 41468445e..1659297a3 100644 --- a/radio/src/hal/adc_driver.h +++ b/radio/src/hal/adc_driver.h @@ -42,6 +42,7 @@ enum { ADC_INPUT_FLEX, ADC_INPUT_VBAT, ADC_INPUT_RTC_BAT, + ADC_INPUT_LUX, ADC_INPUT_ALL, }; diff --git a/radio/src/lua/api_colorlcd_lvgl.cpp b/radio/src/lua/api_colorlcd_lvgl.cpp index 38c79fbfb..887c4fc24 100644 --- a/radio/src/lua/api_colorlcd_lvgl.cpp +++ b/radio/src/lua/api_colorlcd_lvgl.cpp @@ -495,7 +495,7 @@ LROT_BEGIN(lvgllib, NULL, 0) LROT_NUMENTRY(SRC_ALL, 0xFFFFFFFF) LROT_NUMENTRY(SRC_INPUT, SRC_INPUT) LROT_NUMENTRY(SRC_LUA, SRC_LUA) - LROT_NUMENTRY(SRC_STICK, SRC_STICK|SRC_TILT|SRC_SPACEMOUSE) + LROT_NUMENTRY(SRC_STICK, SRC_STICK|SRC_TILT|SRC_LIGHT|SRC_SPACEMOUSE) LROT_NUMENTRY(SRC_POT, SRC_POT) LROT_NUMENTRY(SRC_OTHER, SRC_MINMAX|SRC_TX|SRC_TIMER) LROT_NUMENTRY(SRC_HELI, SRC_HELI) diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 461015496..750743dd3 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -372,6 +372,10 @@ const LuaSingleField luaSingleFields[] = { {MIXSRC_TILT_Y, "tilty", "Tilt Y"}, #endif +#if defined(LUMINOSITY_SENSOR) + {MIXSRC_LIGHT, "light", "Light Sensor"}, +#endif + #if defined(PCBHORUS) {MIXSRC_SPACEMOUSE_A, "sma", "SpaceMouse A"}, {MIXSRC_SPACEMOUSE_B, "smb", "SpaceMouse B"}, diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index f60e67610..cd9125f88 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -31,6 +31,10 @@ #include "hal/switch_driver.h" #include "hal/audio_driver.h" +#if defined(LUMINOSITY_SENSOR) +#include "luminosity_sensor.h" +#endif + #define DELAY_POS_MARGIN 3 uint8_t s_mixer_first_run_done = false; @@ -403,6 +407,12 @@ getvalue_t _getValue(mixsrc_t i, bool* valid) return RESX; } +#if defined(LUMINOSITY_SENSOR) + else if (i == MIXSRC_LIGHT) { + return getLuxSensorValue() - RESX; + } +#endif + else if (i <= MIXSRC_LAST_HELI) { #if defined(HELI) return cyc_anas[i - MIXSRC_FIRST_HELI]; diff --git a/radio/src/storage/yaml/CMakeLists.txt b/radio/src/storage/yaml/CMakeLists.txt index fe222f631..6199a0238 100644 --- a/radio/src/storage/yaml/CMakeLists.txt +++ b/radio/src/storage/yaml/CMakeLists.txt @@ -40,6 +40,8 @@ elseif(PCB STREQUAL PA01) set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_pa01.cpp) elseif(PCB STREQUAL TX15) set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_tx15.cpp) +elseif(PCB STREQUAL TX16SMK3) + set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_tx16smk3.cpp) elseif(PCB STREQUAL X7) if(PCBREV STREQUAL TPRO) set(YAML_GEN_OUTPUT storage/yaml/yaml_datastructs_tpro.cpp) diff --git a/radio/src/storage/yaml/yaml_datastructs.cpp b/radio/src/storage/yaml/yaml_datastructs.cpp index ed162e462..f2e05b952 100644 --- a/radio/src/storage/yaml/yaml_datastructs.cpp +++ b/radio/src/storage/yaml/yaml_datastructs.cpp @@ -40,6 +40,8 @@ #include "yaml_datastructs_tx15.cpp" #elif defined(PCBT15) #include "yaml_datastructs_t15pro.cpp" +#elif defined(PCBTX16SMK3) + #include "yaml_datastructs_tx16smk3.cpp" #elif defined(PCBPL18) #if defined(RADIO_NB4P) #include "yaml_datastructs_nb4p.cpp" diff --git a/radio/src/storage/yaml/yaml_datastructs_tx16smk3.cpp b/radio/src/storage/yaml/yaml_datastructs_tx16smk3.cpp new file mode 100644 index 000000000..9f00007e0 --- /dev/null +++ b/radio/src/storage/yaml/yaml_datastructs_tx16smk3.cpp @@ -0,0 +1,1042 @@ +// generated by generate_yaml.py + +// +// Enums first +// + +const struct YamlIdStr enum_BacklightMode[] = { + { e_backlight_mode_off, "backlight_mode_off" }, + { e_backlight_mode_keys, "backlight_mode_keys" }, + { e_backlight_mode_sticks, "backlight_mode_sticks" }, + { e_backlight_mode_all, "backlight_mode_all" }, + { e_backlight_mode_on, "backlight_mode_on" }, + { 0, NULL } +}; +const struct YamlIdStr enum_AntennaModes[] = { + { ANTENNA_MODE_INTERNAL, "MODE_INTERNAL" }, + { ANTENNA_MODE_ASK, "MODE_ASK" }, + { ANTENNA_MODE_PER_MODEL, "MODE_PER_MODEL" }, + { ANTENNA_MODE_EXTERNAL, "MODE_EXTERNAL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModuleType[] = { + { MODULE_TYPE_NONE, "TYPE_NONE" }, + { MODULE_TYPE_PPM, "TYPE_PPM" }, + { MODULE_TYPE_XJT_PXX1, "TYPE_XJT_PXX1" }, + { MODULE_TYPE_ISRM_PXX2, "TYPE_ISRM_PXX2" }, + { MODULE_TYPE_DSM2, "TYPE_DSM2" }, + { MODULE_TYPE_CROSSFIRE, "TYPE_CROSSFIRE" }, + { MODULE_TYPE_MULTIMODULE, "TYPE_MULTIMODULE" }, + { MODULE_TYPE_R9M_PXX1, "TYPE_R9M_PXX1" }, + { MODULE_TYPE_R9M_PXX2, "TYPE_R9M_PXX2" }, + { MODULE_TYPE_R9M_LITE_PXX1, "TYPE_R9M_LITE_PXX1" }, + { MODULE_TYPE_R9M_LITE_PXX2, "TYPE_R9M_LITE_PXX2" }, + { MODULE_TYPE_GHOST, "TYPE_GHOST" }, + { MODULE_TYPE_R9M_LITE_PRO_PXX2, "TYPE_R9M_LITE_PRO_PXX2" }, + { MODULE_TYPE_SBUS, "TYPE_SBUS" }, + { MODULE_TYPE_XJT_LITE_PXX2, "TYPE_XJT_LITE_PXX2" }, + { MODULE_TYPE_FLYSKY_AFHDS2A, "TYPE_FLYSKY_AFHDS2A" }, + { MODULE_TYPE_FLYSKY_AFHDS3, "TYPE_FLYSKY_AFHDS3" }, + { MODULE_TYPE_LEMON_DSMP, "TYPE_LEMON_DSMP" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TrainerMultiplex[] = { + { TRAINER_OFF, "OFF" }, + { TRAINER_ADD, "ADD" }, + { TRAINER_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BeeperMode[] = { + { e_mode_quiet, "mode_quiet" }, + { e_mode_alarms, "mode_alarms" }, + { e_mode_nokeys, "mode_nokeys" }, + { e_mode_all, "mode_all" }, + { 0, NULL } +}; +const struct YamlIdStr enum_BluetoothModes[] = { + { BLUETOOTH_OFF, "OFF" }, + { BLUETOOTH_TELEMETRY, "TELEMETRY" }, + { BLUETOOTH_TRAINER, "TRAINER" }, + { 0, NULL } +}; +const struct YamlIdStr enum_Functions[] = { + { FUNC_OVERRIDE_CHANNEL, "OVERRIDE_CHANNEL" }, + { FUNC_TRAINER, "TRAINER" }, + { FUNC_INSTANT_TRIM, "INSTANT_TRIM" }, + { FUNC_RESET, "RESET" }, + { FUNC_SET_TIMER, "SET_TIMER" }, + { FUNC_ADJUST_GVAR, "ADJUST_GVAR" }, + { FUNC_VOLUME, "VOLUME" }, + { FUNC_SET_FAILSAFE, "SET_FAILSAFE" }, + { FUNC_RANGECHECK, "RANGECHECK" }, + { FUNC_BIND, "BIND" }, + { FUNC_PLAY_SOUND, "PLAY_SOUND" }, + { FUNC_PLAY_TRACK, "PLAY_TRACK" }, + { FUNC_PLAY_VALUE, "PLAY_VALUE" }, + { FUNC_PLAY_SCRIPT, "PLAY_SCRIPT" }, + { FUNC_BACKGND_MUSIC, "BACKGND_MUSIC" }, + { FUNC_BACKGND_MUSIC_PAUSE, "BACKGND_MUSIC_PAUSE" }, + { FUNC_VARIO, "VARIO" }, + { FUNC_HAPTIC, "HAPTIC" }, + { FUNC_LOGS, "LOGS" }, + { FUNC_BACKLIGHT, "BACKLIGHT" }, + { FUNC_SCREENSHOT, "SCREENSHOT" }, + { FUNC_RACING_MODE, "RACING_MODE" }, + { FUNC_DISABLE_TOUCH, "DISABLE_TOUCH" }, + { FUNC_SET_SCREEN, "SET_SCREEN" }, + { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, + { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_PUSH_CUST_SWITCH, "PUSH_CUST_SWITCH" }, + { FUNC_TEST, "TEST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchConfig[] = { + { SWITCH_NONE, "NONE" }, + { SWITCH_TOGGLE, "TOGGLE" }, + { SWITCH_2POS, "2POS" }, + { SWITCH_3POS, "3POS" }, + { SWITCH_GLOBAL, "GLOBAL" }, + { SWITCH_none, "none" }, + { SWITCH_toggle, "toggle" }, + { SWITCH_2pos, "2pos" }, + { SWITCH_3pos, "3pos" }, + { 0, NULL } +}; +const struct YamlIdStr enum_fsStartPositionType[] = { + { FS_START_OFF, "START_OFF" }, + { FS_START_ON, "START_ON" }, + { FS_START_PREVIOUS, "START_PREVIOUS" }, + { 0, NULL } +}; +const struct YamlIdStr enum_booleanEnum[] = { + { BOOL_OFF, "OFF" }, + { BOOL_ON, "ON" }, + { 0, NULL } +}; +const struct YamlIdStr enum_QMPage[] = { + { QM_NONE, "NONE" }, + { QM_OPEN_QUICK_MENU, "OPEN_QUICK_MENU" }, + { QM_MANAGE_MODELS, "MANAGE_MODELS" }, + { QM_MODEL_SETUP, "MODEL_SETUP" }, + { QM_MODEL_FLIGHTMODES, "MODEL_FLIGHTMODES" }, + { QM_MODEL_INPUTS, "MODEL_INPUTS" }, + { QM_MODEL_MIXES, "MODEL_MIXES" }, + { QM_MODEL_OUTPUTS, "MODEL_OUTPUTS" }, + { QM_MODEL_CURVES, "MODEL_CURVES" }, + { QM_MODEL_GVARS, "MODEL_GVARS" }, + { QM_MODEL_LS, "MODEL_LS" }, + { QM_MODEL_SF, "MODEL_SF" }, + { QM_MODEL_SCRIPTS, "MODEL_SCRIPTS" }, + { QM_MODEL_TELEMETRY, "MODEL_TELEMETRY" }, + { QM_MODEL_NOTES, "MODEL_NOTES" }, + { QM_RADIO_SETUP, "RADIO_SETUP" }, + { QM_RADIO_GF, "RADIO_GF" }, + { QM_RADIO_TRAINER, "RADIO_TRAINER" }, + { QM_RADIO_HARDWARE, "RADIO_HARDWARE" }, + { QM_RADIO_VERSION, "RADIO_VERSION" }, + { QM_UI_THEMES, "UI_THEMES" }, + { QM_UI_SETUP, "UI_SETUP" }, + { QM_UI_SCREEN1, "UI_SCREEN1" }, + { QM_UI_SCREEN2, "UI_SCREEN2" }, + { QM_UI_SCREEN3, "UI_SCREEN3" }, + { QM_UI_SCREEN4, "UI_SCREEN4" }, + { QM_UI_SCREEN5, "UI_SCREEN5" }, + { QM_UI_SCREEN6, "UI_SCREEN6" }, + { QM_UI_SCREEN7, "UI_SCREEN7" }, + { QM_UI_SCREEN8, "UI_SCREEN8" }, + { QM_UI_SCREEN9, "UI_SCREEN9" }, + { QM_UI_SCREEN10, "UI_SCREEN10" }, + { QM_UI_ADD_PG, "UI_ADD_PG" }, + { QM_TOOLS_APPS, "TOOLS_APPS" }, + { QM_TOOLS_STORAGE, "TOOLS_STORAGE" }, + { QM_TOOLS_RESET, "TOOLS_RESET" }, + { QM_TOOLS_CHAN_MON, "TOOLS_CHAN_MON" }, + { QM_TOOLS_LS_MON, "TOOLS_LS_MON" }, + { QM_TOOLS_STATS, "TOOLS_STATS" }, + { QM_TOOLS_DEBUG, "TOOLS_DEBUG" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TimerModes[] = { + { TMRMODE_OFF, "OFF" }, + { TMRMODE_ON, "ON" }, + { TMRMODE_START, "START" }, + { TMRMODE_THR, "THR" }, + { TMRMODE_THR_REL, "THR_REL" }, + { TMRMODE_THR_START, "THR_START" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixerMultiplex[] = { + { MLTPX_ADD, "ADD" }, + { MLTPX_MUL, "MUL" }, + { MLTPX_REPL, "REPL" }, + { 0, NULL } +}; +const struct YamlIdStr enum_MixSources[] = { + { MIXSRC_NONE, "NONE" }, + { MIXSRC_TILT_X, "TILT_X" }, + { MIXSRC_TILT_Y, "TILT_Y" }, + { MIXSRC_SPACEMOUSE_A, "SPACEMOUSE_A" }, + { MIXSRC_SPACEMOUSE_B, "SPACEMOUSE_B" }, + { MIXSRC_SPACEMOUSE_C, "SPACEMOUSE_C" }, + { MIXSRC_SPACEMOUSE_D, "SPACEMOUSE_D" }, + { MIXSRC_SPACEMOUSE_E, "SPACEMOUSE_E" }, + { MIXSRC_SPACEMOUSE_F, "SPACEMOUSE_F" }, + { MIXSRC_MIN, "MIN" }, + { MIXSRC_MAX, "MAX" }, + { MIXSRC_LIGHT, "LIGHT" }, + { MIXSRC_TX_VOLTAGE, "TX_VOLTAGE" }, + { MIXSRC_TX_TIME, "TX_TIME" }, + { MIXSRC_TX_GPS, "TX_GPS" }, + { 0, NULL } +}; +const struct YamlIdStr enum_LogicalSwitchesFunctions[] = { + { LS_FUNC_NONE, "FUNC_NONE" }, + { LS_FUNC_VEQUAL, "FUNC_VEQUAL" }, + { LS_FUNC_VALMOSTEQUAL, "FUNC_VALMOSTEQUAL" }, + { LS_FUNC_VPOS, "FUNC_VPOS" }, + { LS_FUNC_VNEG, "FUNC_VNEG" }, + { LS_FUNC_APOS, "FUNC_APOS" }, + { LS_FUNC_ANEG, "FUNC_ANEG" }, + { LS_FUNC_AND, "FUNC_AND" }, + { LS_FUNC_OR, "FUNC_OR" }, + { LS_FUNC_XOR, "FUNC_XOR" }, + { LS_FUNC_EDGE, "FUNC_EDGE" }, + { LS_FUNC_EQUAL, "FUNC_EQUAL" }, + { LS_FUNC_GREATER, "FUNC_GREATER" }, + { LS_FUNC_LESS, "FUNC_LESS" }, + { LS_FUNC_DIFFEGREATER, "FUNC_DIFFEGREATER" }, + { LS_FUNC_ADIFFEGREATER, "FUNC_ADIFFEGREATER" }, + { LS_FUNC_TIMER, "FUNC_TIMER" }, + { LS_FUNC_STICKY, "FUNC_STICKY" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwashType[] = { + { SWASH_TYPE_NONE, "TYPE_NONE" }, + { SWASH_TYPE_120, "TYPE_120" }, + { SWASH_TYPE_120X, "TYPE_120X" }, + { SWASH_TYPE_140, "TYPE_140" }, + { SWASH_TYPE_90, "TYPE_90" }, + { 0, NULL } +}; +const struct YamlIdStr enum_SwitchSources[] = { + { SWSRC_NONE, "NONE" }, + { SWSRC_ON, "ON" }, + { SWSRC_ONE, "ONE" }, + { SWSRC_TELEMETRY_STREAMING, "TELEMETRY_STREAMING" }, + { SWSRC_RADIO_ACTIVITY, "RADIO_ACTIVITY" }, + { SWSRC_TRAINER_CONNECTED, "TRAINER_CONNECTED" }, + { SWSRC_OFF, "OFF" }, + { 0, NULL } +}; +const struct YamlIdStr enum_PotsWarnMode[] = { + { POTS_WARN_OFF, "WARN_OFF" }, + { POTS_WARN_MANUAL, "WARN_MANUAL" }, + { POTS_WARN_AUTO, "WARN_AUTO" }, + { 0, NULL } +}; +const struct YamlIdStr enum_ModelOverridableEnable[] = { + { OVERRIDE_GLOBAL, "GLOBAL" }, + { OVERRIDE_OFF, "OFF" }, + { OVERRIDE_ON, "ON" }, + { 0, NULL } +}; +const struct YamlIdStr enum_FailsafeModes[] = { + { FAILSAFE_NOT_SET, "NOT_SET" }, + { FAILSAFE_HOLD, "HOLD" }, + { FAILSAFE_CUSTOM, "CUSTOM" }, + { FAILSAFE_NOPULSES, "NOPULSES" }, + { FAILSAFE_RECEIVER, "RECEIVER" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorFormula[] = { + { TELEM_FORMULA_ADD, "FORMULA_ADD" }, + { TELEM_FORMULA_AVERAGE, "FORMULA_AVERAGE" }, + { TELEM_FORMULA_MIN, "FORMULA_MIN" }, + { TELEM_FORMULA_MAX, "FORMULA_MAX" }, + { TELEM_FORMULA_MULTIPLY, "FORMULA_MULTIPLY" }, + { TELEM_FORMULA_TOTALIZE, "FORMULA_TOTALIZE" }, + { TELEM_FORMULA_CELL, "FORMULA_CELL" }, + { TELEM_FORMULA_CONSUMPTION, "FORMULA_CONSUMPTION" }, + { TELEM_FORMULA_DIST, "FORMULA_DIST" }, + { 0, NULL } +}; +const struct YamlIdStr enum_TelemetrySensorType[] = { + { TELEM_TYPE_CUSTOM, "TYPE_CUSTOM" }, + { TELEM_TYPE_CALCULATED, "TYPE_CALCULATED" }, + { 0, NULL } +}; +const struct YamlIdStr enum_USBJoystickIfMode[] = { + { USBJOYS_JOYSTICK, "JOYSTICK" }, + { USBJOYS_GAMEPAD, "GAMEPAD" }, + { USBJOYS_MULTIAXIS, "MULTIAXIS" }, + { 0, NULL } +}; +const struct YamlIdStr enum_USBJoystickCh[] = { + { USBJOYS_CH_NONE, "CH_NONE" }, + { USBJOYS_CH_BUTTON, "CH_BUTTON" }, + { USBJOYS_CH_AXIS, "CH_AXIS" }, + { USBJOYS_CH_SIM, "CH_SIM" }, + { 0, NULL } +}; + +// +// Structs last +// + +static const struct YamlNode struct_CalibData[] = { + YAML_IDX_CUST("calib",r_calib,w_calib), + YAML_SIGNED( "mid", 16 ), + YAML_SIGNED( "spanNeg", 16 ), + YAML_SIGNED( "spanPos", 16 ), + YAML_END +}; +static const struct YamlNode struct_signed_16[] = { + YAML_IDX, + YAML_SIGNED( "val", 16 ), + YAML_END +}; +static const struct YamlNode struct_TrainerMix[] = { + YAML_IDX, + YAML_UNSIGNED( "srcChn", 6 ), + YAML_ENUM("mode", 2, enum_TrainerMultiplex, NULL), + YAML_SIGNED( "studWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_TrainerData[] = { + YAML_ARRAY("calib", 16, 4, struct_signed_16, NULL), + YAML_ARRAY("mix", 16, 4, struct_TrainerMix, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_1[] = { + YAML_STRING("name", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_2[] = { + YAML_SIGNED( "val", 16 ), + YAML_UNSIGNED( "mode", 8 ), + YAML_UNSIGNED( "param", 8 ), + YAML_SIGNED( "val2", 32 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_3[] = { + YAML_SIGNED( "val1", 32 ), + YAML_SIGNED( "val2", 32 ), + YAML_END +}; +static const struct YamlNode union_anonymous_0_elmts[] = { + YAML_STRUCT("play", 64, struct_anonymous_1, NULL), + YAML_STRUCT("all", 64, struct_anonymous_2, NULL), + YAML_STRUCT("clear", 64, struct_anonymous_3, NULL), + YAML_END +}; +static const struct YamlNode struct_CustomFunctionData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_ENUM("func", 6, enum_Functions, NULL), + YAML_CUSTOM("def",r_customFn,w_customFn), + YAML_PADDING( 64 ), + YAML_PADDING( 1 ), + YAML_PADDING( 7 ), + YAML_END +}; +static const struct YamlNode struct_RGBLedColor[] = { + YAML_UNSIGNED( "r", 8 ), + YAML_UNSIGNED( "g", 8 ), + YAML_UNSIGNED( "b", 8 ), + YAML_END +}; +static const struct YamlNode struct_switchDef[] = { + YAML_IDX_CUST("sw",sw_idx_read,sw_idx_write), + YAML_STRING("name", 3), + YAML_ENUM("type", 3, enum_SwitchConfig, NULL), + YAML_ENUM("start", 2, enum_fsStartPositionType, switch_is_cfs), + YAML_ENUM("onColorLuaOverride", 1, enum_booleanEnum, switch_is_cfs), + YAML_ENUM("offColorLuaOverride", 1, enum_booleanEnum, switch_is_cfs), + YAML_PADDING( 1 ), + YAML_STRUCT("onColor", 24, struct_RGBLedColor, switch_is_cfs), + YAML_STRUCT("offColor", 24, struct_RGBLedColor, switch_is_cfs), + YAML_END +}; +static const struct YamlNode struct_QuickMenuPage[] = { + YAML_IDX, + YAML_ENUM("shortcut", 8, enum_QMPage, NULL), + YAML_END +}; +static const struct YamlNode struct_RadioData[] = { + YAML_UNSIGNED( "manuallyEdited", 1 ), + YAML_SIGNED( "timezoneMinutes", 3 ), + YAML_UNSIGNED( "ppmunit", 2 ), + YAML_PADDING( 2 ), + YAML_CUSTOM("semver",nullptr,w_semver), + YAML_CUSTOM("board",nullptr,w_board), + YAML_ARRAY("calib", 48, 20, struct_CalibData, NULL), + YAML_PADDING( 16 ), + YAML_UNSIGNED( "vBatWarn", 8 ), + YAML_SIGNED( "txVoltageCalibration", 8 ), + YAML_ENUM("backlightMode", 3, enum_BacklightMode, NULL), + YAML_ENUM("antennaMode", 2, enum_AntennaModes, NULL), + YAML_UNSIGNED( "disableRtcWarning", 1 ), + YAML_UNSIGNED( "keysBacklight", 1 ), + YAML_UNSIGNED( "dontPlayHello", 1 ), + YAML_ENUM("internalModule", 8, enum_ModuleType, NULL), + YAML_STRUCT("trainer", 128, struct_TrainerData, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "fai", 1 ), + YAML_SIGNED_CUST( "beepMode", 2, r_beeperMode, w_beeperMode ), + YAML_UNSIGNED( "alarmsFlash", 1 ), + YAML_UNSIGNED( "disableMemoryWarning", 1 ), + YAML_UNSIGNED( "disableAlarmWarning", 1 ), + YAML_UNSIGNED( "stickMode", 2 ), + YAML_SIGNED( "timezone", 5 ), + YAML_UNSIGNED( "adjustRTC", 1 ), + YAML_UNSIGNED( "inactivityTimer", 8 ), + YAML_CUSTOM("telemetryBaudrate",r_telemetryBaudrate,nullptr), + YAML_UNSIGNED( "internalModuleBaudrate", 3 ), + YAML_SIGNED( "splashMode", 3 ), + YAML_SIGNED_CUST( "hapticMode", 2, r_beeperMode, w_beeperMode ), + YAML_SIGNED( "switchesDelay", 8 ), + YAML_UNSIGNED( "lightAutoOff", 8 ), + YAML_UNSIGNED( "templateSetup", 8 ), + YAML_SIGNED( "PPM_Multiplier", 8 ), + YAML_SIGNED_CUST( "hapticLength", 8, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "beepLength", 3, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "hapticStrength", 3, r_5pos, w_5pos ), + YAML_UNSIGNED( "gpsFormat", 1 ), + YAML_UNSIGNED( "audioMuteEnable", 1 ), + YAML_UNSIGNED_CUST( "speakerPitch", 8, r_spPitch, w_spPitch ), + YAML_SIGNED_CUST( "speakerVolume", 8, r_vol, w_vol ), + YAML_SIGNED_CUST( "vBatMin", 8, r_vbat_min, w_vbat_min ), + YAML_SIGNED_CUST( "vBatMax", 8, r_vbat_max, w_vbat_max ), + YAML_UNSIGNED( "backlightBright", 8 ), + YAML_UNSIGNED( "globalTimer", 32 ), + YAML_UNSIGNED( "bluetoothBaudrate", 4 ), + YAML_ENUM("bluetoothMode", 4, enum_BluetoothModes, NULL), + YAML_UNSIGNED( "countryCode", 2 ), + YAML_SIGNED( "pwrOnSpeed", 3 ), + YAML_SIGNED( "pwrOffSpeed", 3 ), + YAML_CUSTOM("jitterFilter",r_jitterFilter,nullptr), + YAML_UNSIGNED( "noJitterFilter", 1 ), + YAML_UNSIGNED( "imperial", 1 ), + YAML_UNSIGNED( "disableRssiPoweroffAlarm", 1 ), + YAML_UNSIGNED( "USBMode", 2 ), + YAML_UNSIGNED( "jackMode", 2 ), + YAML_PADDING( 1 ), + YAML_STRING("ttsLanguage", 2), + YAML_STRING("uiLanguage", 2), + YAML_SIGNED_CUST( "beepVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "wavVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "backgroundVolume", 4, r_5pos, w_5pos ), + YAML_SIGNED_CUST( "varioPitch", 8, r_vPitch, w_vPitch ), + YAML_SIGNED_CUST( "varioRange", 8, r_vPitch, w_vPitch ), + YAML_SIGNED( "varioRepeat", 8 ), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_CUSTOM("auxSerialMode",r_serialMode,nullptr), + YAML_CUSTOM("aux2SerialMode",r_serialMode,nullptr), + YAML_ARRAY("serialPort", 8, 4, struct_serialConfig, nullptr), + YAML_ARRAY("sticksConfig", 0, MAX_STICKS, struct_stickConfig, stick_name_valid), + YAML_ARRAY("slidersConfig", 0, MAX_POTS, struct_sliderConfig, nullptr), + YAML_PADDING( 8 ), + YAML_ARRAY("potsConfig", 4, 16, struct_potConfig, nullptr), + YAML_ARRAY("switchConfig", 80, 20, struct_switchDef, switchIsActive), + YAML_ARRAY("flexSwitches", 0, MAX_FLEX_SWITCHES, struct_flexSwitch, flex_sw_valid), + YAML_STRING("currModelFilename", 17), + YAML_UNSIGNED( "blOffBright", 8 ), + YAML_STRING("bluetoothName", 10), + YAML_STRING("ownerRegistrationID", 8), + YAML_CUSTOM("rotEncDirection",r_rotEncDirection,nullptr), + YAML_UNSIGNED( "rotEncMode", 3 ), + YAML_PADDING( 2 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "imuMax", 8 ), + YAML_SIGNED( "imuOffset", 8 ), + YAML_STRING("selectedTheme", 26), + YAML_SIGNED_CUST( "backlightSrc", 10, r_mixSrcRawEx, w_mixSrcRawEx ), + YAML_SIGNED( "radioGFDisabled", 1 ), + YAML_SIGNED( "radioTrainerDisabled", 1 ), + YAML_SIGNED( "modelHeliDisabled", 1 ), + YAML_SIGNED( "modelFMDisabled", 1 ), + YAML_SIGNED( "modelCurvesDisabled", 1 ), + YAML_SIGNED( "modelGVDisabled", 1 ), + YAML_SIGNED_CUST( "volumeSrc", 10, r_mixSrcRawEx, w_mixSrcRawEx ), + YAML_SIGNED( "modelLSDisabled", 1 ), + YAML_SIGNED( "modelSFDisabled", 1 ), + YAML_SIGNED( "modelCustomScriptsDisabled", 1 ), + YAML_SIGNED( "modelTelemetryDisabled", 1 ), + YAML_SIGNED( "disableTrainerPoweroffAlarm", 1 ), + YAML_SIGNED( "disablePwrOnOffHaptic", 1 ), + YAML_UNSIGNED( "modelQuickSelect", 1 ), + YAML_UNSIGNED( "labelSingleSelect", 1 ), + YAML_UNSIGNED( "labelMultiMode", 1 ), + YAML_UNSIGNED( "favMultiMode", 1 ), + YAML_UNSIGNED( "modelSelectLayout", 2 ), + YAML_UNSIGNED( "radioThemesDisabled", 1 ), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "pwrOffIfInactive", 8 ), + YAML_ARRAY("keyShortcuts", 8, 6, struct_QuickMenuPage, NULL), + YAML_ARRAY("qmFavorites", 8, 12, struct_QuickMenuPage, NULL), + YAML_END +}; +static const struct YamlNode struct_unsigned_8[] = { + YAML_IDX, + YAML_UNSIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_ModelHeader[] = { + YAML_STRING("name", 15), + YAML_ARRAY("modelId", 8, 2, struct_unsigned_8, NULL), + YAML_STRING("bitmap", 14), + YAML_STRING("labels", 100), + YAML_END +}; +static const struct YamlNode struct_TimerData[] = { + YAML_IDX, + YAML_UNSIGNED( "start", 22 ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED( "value", 22 ), + YAML_ENUM("mode", 3, enum_TimerModes, NULL), + YAML_UNSIGNED( "countdownBeep", 2 ), + YAML_UNSIGNED( "minuteBeep", 1 ), + YAML_UNSIGNED( "persistent", 2 ), + YAML_SIGNED( "countdownStart", 2 ), + YAML_UNSIGNED( "showElapsed", 1 ), + YAML_UNSIGNED( "extraHaptic", 1 ), + YAML_PADDING( 6 ), + YAML_STRING("name", 8), + YAML_END +}; +static const struct YamlNode struct_CurveRef[] = { + YAML_UNSIGNED( "type", 5 ), + YAML_UNSIGNED_CUST( "value", 11, r_sourceNumVal, w_sourceNumVal ), + YAML_END +}; +static const struct YamlNode struct_MixData[] = { + YAML_UNSIGNED( "destCh", 5 ), + YAML_SIGNED_CUST( "srcRaw", 10, r_mixSrcRawEx, w_mixSrcRawEx ), + YAML_UNSIGNED( "carryTrim", 1 ), + YAML_UNSIGNED( "mixWarn", 2 ), + YAML_ENUM("mltpx", 2, enum_MixerMultiplex, NULL), + YAML_UNSIGNED( "delayPrec", 1 ), + YAML_UNSIGNED( "speedPrec", 1 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), + YAML_PADDING( 1 ), + YAML_UNSIGNED_CUST( "weight", 11, r_sourceNumVal, w_sourceNumVal ), + YAML_UNSIGNED_CUST( "offset", 11, r_sourceNumVal, w_sourceNumVal ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "delayUp", 8 ), + YAML_UNSIGNED( "delayDown", 8 ), + YAML_UNSIGNED( "speedUp", 8 ), + YAML_UNSIGNED( "speedDown", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_LimitData[] = { + YAML_IDX, + YAML_SIGNED_CUST( "min", 11, in_read_weight, in_write_weight ), + YAML_SIGNED_CUST( "max", 11, in_read_weight, in_write_weight ), + YAML_SIGNED( "ppmCenter", 10 ), + YAML_SIGNED_CUST( "offset", 11, in_read_weight, in_write_weight ), + YAML_UNSIGNED( "symetrical", 1 ), + YAML_UNSIGNED( "revert", 1 ), + YAML_PADDING( 3 ), + YAML_SIGNED( "curve", 8 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_ExpoData[] = { + YAML_UNSIGNED( "mode", 2 ), + YAML_UNSIGNED( "scale", 14 ), + YAML_CUSTOM("carryTrim",r_carryTrim,nullptr), + YAML_SIGNED( "trimSource", 6 ), + YAML_SIGNED_CUST( "srcRaw", 10, r_mixSrcRawEx, w_mixSrcRawEx ), + YAML_UNSIGNED_CUST( "weight", 11, r_sourceNumVal, w_sourceNumVal ), + YAML_UNSIGNED_CUST( "offset", 11, r_sourceNumVal, w_sourceNumVal ), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_STRUCT("curve", 16, struct_CurveRef, NULL), + YAML_UNSIGNED( "chn", 5 ), + YAML_UNSIGNED_CUST( "flightModes", 9, r_flightModes, w_flightModes ), + YAML_PADDING( 2 ), + YAML_STRING("name", 6), + YAML_END +}; +static const struct YamlNode struct_CurveHeader[] = { + YAML_IDX, + YAML_UNSIGNED( "type", 1 ), + YAML_UNSIGNED( "smooth", 1 ), + YAML_SIGNED( "points", 6 ), + YAML_STRING("name", 3), + YAML_END +}; +static const struct YamlNode struct_signed_8[] = { + YAML_IDX, + YAML_SIGNED( "val", 8 ), + YAML_END +}; +static const struct YamlNode struct_LogicalSwitchData[] = { + YAML_IDX, + YAML_ENUM("func", 8, enum_LogicalSwitchesFunctions, NULL), + YAML_CUSTOM("def",r_logicSw,w_logicSw), + YAML_PADDING( 10 ), + YAML_PADDING( 10 ), + YAML_SIGNED_CUST( "andsw", 10, r_swtchSrc, w_swtchSrc ), + YAML_UNSIGNED( "lsPersist", 1 ), + YAML_UNSIGNED( "lsState", 1 ), + YAML_PADDING( 16 ), + YAML_UNSIGNED( "delay", 8 ), + YAML_UNSIGNED( "duration", 8 ), + YAML_END +}; +static const struct YamlNode struct_SwashRingData[] = { + YAML_ENUM("type", 8, enum_SwashType, NULL), + YAML_UNSIGNED( "value", 8 ), + YAML_UNSIGNED_CUST( "collectiveSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "aileronSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_UNSIGNED_CUST( "elevatorSource", 8, r_mixSrcRaw, w_mixSrcRaw ), + YAML_SIGNED( "collectiveWeight", 8 ), + YAML_SIGNED( "aileronWeight", 8 ), + YAML_SIGNED( "elevatorWeight", 8 ), + YAML_END +}; +static const struct YamlNode struct_trim_t[] = { + YAML_IDX, + YAML_SIGNED( "value", 11 ), + YAML_UNSIGNED( "mode", 5 ), + YAML_END +}; +static const struct YamlNode struct_FlightModeData[] = { + YAML_IDX, + YAML_ARRAY("trim", 16, 8, struct_trim_t, NULL), + YAML_STRING("name", 10), + YAML_SIGNED_CUST( "swtch", 10, r_swtchSrc, w_swtchSrc ), + YAML_PADDING( 6 ), + YAML_UNSIGNED( "fadeIn", 8 ), + YAML_UNSIGNED( "fadeOut", 8 ), + YAML_ARRAY("gvars", 16, 15, struct_signed_16, gvar_is_active), + YAML_END +}; +static const struct YamlNode struct_GVarData[] = { + YAML_IDX, + YAML_STRING("name", 3), + YAML_UNSIGNED( "min", 12 ), + YAML_UNSIGNED( "max", 12 ), + YAML_UNSIGNED( "popup", 1 ), + YAML_UNSIGNED( "prec", 1 ), + YAML_UNSIGNED( "unit", 2 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_VarioData[] = { + YAML_UNSIGNED_CUST( "source", 7, r_tele_sensor, w_tele_sensor ), + YAML_UNSIGNED( "centerSilent", 1 ), + YAML_SIGNED( "centerMax", 8 ), + YAML_SIGNED( "centerMin", 8 ), + YAML_SIGNED( "min", 8 ), + YAML_SIGNED( "max", 8 ), + YAML_END +}; +static const struct YamlNode struct_RssiAlarmData[] = { + YAML_CUSTOM("disabled",r_rssiDisabled,nullptr), + YAML_CUSTOM("warning",r_rssiWarning,nullptr), + YAML_CUSTOM("critical",r_rssiCritical,nullptr), + YAML_END +}; +static const struct YamlNode struct_RFAlarmData[] = { + YAML_SIGNED( "warning", 8 ), + YAML_SIGNED( "critical", 8 ), + YAML_END +}; +static const struct YamlNode struct_PpmModule[] = { + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_UNSIGNED( "outputType", 1 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_5[] = { + YAML_PADDING( 8 ), + YAML_UNSIGNED( "disableTelemetry", 1 ), + YAML_UNSIGNED( "disableMapping", 1 ), + YAML_UNSIGNED( "autoBindMode", 1 ), + YAML_UNSIGNED( "lowPowerMode", 1 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_PADDING( 2 ), + YAML_SIGNED( "optionValue", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_6[] = { + YAML_UNSIGNED( "power", 2 ), + YAML_PADDING( 2 ), + YAML_UNSIGNED( "receiverTelemetryOff", 1 ), + YAML_UNSIGNED( "receiverHigherChannels", 1 ), + YAML_SIGNED( "antennaMode", 2 ), + YAML_PADDING( 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_7[] = { + YAML_PADDING( 6 ), + YAML_UNSIGNED( "noninverted", 1 ), + YAML_PADDING( 1 ), + YAML_SIGNED( "refreshRate", 8 ), + YAML_END +}; +static const struct YamlNode struct_string_64[] = { + YAML_IDX, + YAML_STRING("val", 8), + YAML_END +}; +static const struct YamlNode struct_anonymous_8[] = { + YAML_UNSIGNED( "receivers", 7 ), + YAML_UNSIGNED( "racingMode", 1 ), + YAML_ARRAY("receiverName", 64, 3, struct_string_64, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_9[] = { + YAML_ARRAY("rx_id", 8, 4, struct_unsigned_8, NULL), + YAML_UNSIGNED( "mode", 3 ), + YAML_UNSIGNED( "rfPower", 1 ), + YAML_UNSIGNED( "reserved", 4 ), + YAML_ARRAY("rx_freq", 8, 2, struct_unsigned_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_10[] = { + YAML_UNSIGNED( "emi", 2 ), + YAML_UNSIGNED( "telemetry", 1 ), + YAML_UNSIGNED( "phyMode", 3 ), + YAML_UNSIGNED( "reserved", 2 ), + YAML_UNSIGNED( "rfPower", 8 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_11[] = { + YAML_UNSIGNED( "raw12bits", 1 ), + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_PADDING( 4 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_12[] = { + YAML_UNSIGNED( "telemetryBaudrate", 3 ), + YAML_UNSIGNED( "crsfArmingMode", 1 ), + YAML_PADDING( 4 ), + YAML_SIGNED_CUST( "crsfArmingTrigger", 10, r_swtchSrc, w_swtchSrc ), + YAML_SIGNED( "spare3", 6 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_13[] = { + YAML_UNSIGNED( "flags", 8 ), + YAML_UNSIGNED( "enableAETR", 1 ), + YAML_END +}; +static const struct YamlNode union_anonymous_4_elmts[] = { + YAML_ARRAY("raw", 8, 25, struct_unsigned_8, NULL), + YAML_STRUCT("ppm", 16, struct_PpmModule, NULL), + YAML_STRUCT("multi", 24, struct_anonymous_5, NULL), + YAML_STRUCT("pxx", 16, struct_anonymous_6, NULL), + YAML_STRUCT("sbus", 16, struct_anonymous_7, NULL), + YAML_STRUCT("pxx2", 200, struct_anonymous_8, NULL), + YAML_STRUCT("flysky", 56, struct_anonymous_9, NULL), + YAML_STRUCT("afhds3", 16, struct_anonymous_10, NULL), + YAML_STRUCT("ghost", 8, struct_anonymous_11, NULL), + YAML_STRUCT("crsf", 24, struct_anonymous_12, NULL), + YAML_STRUCT("dsmp", 16, struct_anonymous_13, NULL), + YAML_END +}; +static const struct YamlNode struct_ModuleData[] = { + YAML_IDX, + YAML_UNSIGNED_CUST( "type", 8, r_moduleType, w_moduleType ), + YAML_CUSTOM("subType",r_modSubtype,w_modSubtype), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ), + YAML_ENUM("failsafeMode", 4, enum_FailsafeModes, NULL), + YAML_PADDING( 4 ), + YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type), + YAML_END +}; +static const struct YamlNode struct_TrainerModuleData[] = { + YAML_UNSIGNED_CUST( "mode", 8, r_trainerMode, w_trainerMode ), + YAML_UNSIGNED( "channelsStart", 8 ), + YAML_SIGNED( "channelsCount", 8 ), + YAML_SIGNED( "frameLength", 8 ), + YAML_SIGNED( "delay", 6 ), + YAML_UNSIGNED( "pulsePol", 1 ), + YAML_PADDING( 1 ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput_elmts[] = { + YAML_SIGNED( "value", 16 ), + YAML_UNSIGNED_CUST( "source", 16, r_mixSrcRaw, w_mixSrcRaw ), + YAML_END +}; +static const struct YamlNode union_ScriptDataInput[] = { + YAML_IDX, + YAML_UNION("u", 16, union_ScriptDataInput_elmts, select_script_input), + YAML_END +}; +static const struct YamlNode struct_ScriptData[] = { + YAML_IDX, + YAML_STRING("file", 6), + YAML_STRING("name", 6), + YAML_ARRAY("inputs", 16, 6, union_ScriptDataInput, NULL), + YAML_END +}; +static const struct YamlNode struct_string_32[] = { + YAML_IDX, + YAML_STRING("val", 4), + YAML_END +}; +static const struct YamlNode union_anonymous_14_elmts[] = { + YAML_UNSIGNED( "id", 16 ), + YAML_UNSIGNED( "persistentValue", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_16[] = { + YAML_UNSIGNED( "physID", 5 ), + YAML_UNSIGNED( "rxIndex", 3 ), + YAML_END +}; +static const struct YamlNode union_anonymous_15_elmts[] = { + YAML_STRUCT("frskyInstance", 8, struct_anonymous_16, NULL), + YAML_UNSIGNED( "instance", 8 ), + YAML_ENUM("formula", 8, enum_TelemetrySensorFormula, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_18[] = { + YAML_UNSIGNED( "ratio", 16 ), + YAML_SIGNED( "offset", 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_19[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_UNSIGNED( "index", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_20[] = { + YAML_ARRAY("sources", 8, 4, struct_signed_8, NULL), + YAML_END +}; +static const struct YamlNode struct_anonymous_21[] = { + YAML_UNSIGNED( "source", 8 ), + YAML_PADDING( 24 ), + YAML_END +}; +static const struct YamlNode struct_anonymous_22[] = { + YAML_UNSIGNED( "gps", 8 ), + YAML_UNSIGNED( "alt", 8 ), + YAML_PADDING( 16 ), + YAML_END +}; +static const struct YamlNode union_anonymous_17_elmts[] = { + YAML_STRUCT("custom", 32, struct_anonymous_18, NULL), + YAML_STRUCT("cell", 32, struct_anonymous_19, NULL), + YAML_STRUCT("calc", 32, struct_anonymous_20, NULL), + YAML_STRUCT("consumption", 32, struct_anonymous_21, NULL), + YAML_STRUCT("dist", 32, struct_anonymous_22, NULL), + YAML_UNSIGNED( "param", 32 ), + YAML_END +}; +static const struct YamlNode struct_TelemetrySensor[] = { + YAML_IDX, + YAML_UNION("id1", 16, union_anonymous_14_elmts, select_id1), + YAML_UNION("id2", 8, union_anonymous_15_elmts, select_id2), + YAML_STRING("label", 4), + YAML_UNSIGNED( "subId", 8 ), + YAML_ENUM("type", 1, enum_TelemetrySensorType, NULL), + YAML_PADDING( 1 ), + YAML_UNSIGNED( "unit", 6 ), + YAML_UNSIGNED( "prec", 2 ), + YAML_UNSIGNED( "autoOffset", 1 ), + YAML_UNSIGNED( "filter", 1 ), + YAML_UNSIGNED( "logs", 1 ), + YAML_UNSIGNED( "persistent", 1 ), + YAML_UNSIGNED( "onlyPositive", 1 ), + YAML_PADDING( 1 ), + YAML_UNION("cfg", 32, union_anonymous_17_elmts, select_sensor_cfg), + YAML_END +}; +static const struct YamlNode union_WidgetOptionValue_elmts[] = { + YAML_CUSTOM("unsignedValue",r_wov_unsigned,w_wov_unsigned), + YAML_CUSTOM("signedValue",r_wov_signed,w_wov_signed), + YAML_CUSTOM("boolValue",r_wov_unsigned,w_wov_unsigned), + YAML_CUSTOM("stringValue",r_wov_string,w_wov_string), + YAML_CUSTOM("source",r_wov_source,w_wov_source), + YAML_CUSTOM("color",r_wov_color,w_wov_color), + YAML_END +}; +static const struct YamlNode struct_WidgetOptionValueTyped[] = { + YAML_IDX, + YAML_CUSTOM("type",r_wov_type,w_wov_type), + YAML_UNION("value", 0, union_WidgetOptionValue_elmts, select_wov), + YAML_END +}; +static const struct YamlNode struct_WidgetPersistentData[] = { + YAML_ARRAY("options", 0, 50, struct_WidgetOptionValueTyped, widget_option_is_active), + YAML_END +}; +static const struct YamlNode struct_ZonePersistentData[] = { + YAML_IDX, + YAML_CUSTOM("widgetName",r_widget_name,w_widget_name), + YAML_STRUCT("widgetData", 0, struct_WidgetPersistentData, isAlwaysActive), + YAML_END +}; +static const struct YamlNode union_LayoutOptionValue_elmts[] = { + YAML_CUSTOM("unsignedValue",r_lov_unsigned,w_lov_unsigned), + YAML_CUSTOM("boolValue",r_lov_unsigned,w_lov_unsigned), + YAML_CUSTOM("color",r_lov_color,w_lov_color), + YAML_END +}; +static const struct YamlNode struct_LayoutOptionValueTyped[] = { + YAML_IDX, + YAML_CUSTOM("type",r_lov_type,w_lov_type), + YAML_UNION("value", 0, union_LayoutOptionValue_elmts, select_lov), + YAML_END +}; +static const struct YamlNode struct_LayoutPersistentData[] = { + YAML_ARRAY("zones", 0, 10, struct_ZonePersistentData, widget_is_active), + YAML_ARRAY("options", 0, 10, struct_LayoutOptionValueTyped, layout_option_is_active), + YAML_END +}; +static const struct YamlNode struct_CustomScreenData[] = { + YAML_IDX, + YAML_CUSTOM("LayoutId",r_screen_id,w_screen_id), + YAML_STRUCT("layoutData", 0, struct_LayoutPersistentData, isAlwaysActive), + YAML_END +}; +static const struct YamlNode struct_TopBarPersistentData[] = { + YAML_ARRAY("zones", 0, 7, struct_ZonePersistentData, widget_is_active), + YAML_END +}; +static const struct YamlNode struct_customSwitch[] = { + YAML_IDX_CUST("sw",cfs_idx_read,cfs_idx_write), + YAML_STRING("name", 3), + YAML_ENUM("type", 3, enum_SwitchConfig, NULL), + YAML_UNSIGNED( "group", 2 ), + YAML_ENUM("start", 2, enum_fsStartPositionType, NULL), + YAML_UNSIGNED( "state", 1 ), + YAML_ENUM("onColorLuaOverride", 1, enum_booleanEnum, NULL), + YAML_ENUM("offColorLuaOverride", 1, enum_booleanEnum, NULL), + YAML_PADDING( 6 ), + YAML_STRUCT("onColor", 24, struct_RGBLedColor, isAlwaysActive), + YAML_STRUCT("offColor", 24, struct_RGBLedColor, isAlwaysActive), + YAML_END +}; +static const struct YamlNode struct_USBJoystickChData[] = { + YAML_IDX, + YAML_ENUM("mode", 3, enum_USBJoystickCh, NULL), + YAML_UNSIGNED( "inversion", 1 ), + YAML_UNSIGNED( "param", 4 ), + YAML_UNSIGNED( "btn_num", 5 ), + YAML_UNSIGNED( "switch_npos", 3 ), + YAML_END +}; +static const struct YamlNode struct_ModelData[] = { + YAML_CUSTOM("semver",nullptr,w_semver), + YAML_STRUCT("header", 1048, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL), + YAML_UNSIGNED( "telemetryProtocol", 3 ), + YAML_UNSIGNED( "thrTrim", 1 ), + YAML_UNSIGNED( "noGlobalFunctions", 1 ), + YAML_UNSIGNED( "displayTrims", 2 ), + YAML_UNSIGNED( "ignoreSensorIds", 1 ), + YAML_SIGNED( "trimInc", 3 ), + YAML_UNSIGNED( "disableThrottleWarning", 1 ), + YAML_UNSIGNED( "displayChecklist", 1 ), + YAML_UNSIGNED( "extendedLimits", 1 ), + YAML_UNSIGNED( "extendedTrims", 1 ), + YAML_UNSIGNED( "throttleReversed", 1 ), + YAML_UNSIGNED( "enableCustomThrottleWarning", 1 ), + YAML_UNSIGNED( "disableTelemetryWarning", 1 ), + YAML_UNSIGNED( "showInstanceIds", 1 ), + YAML_UNSIGNED( "checklistInteractive", 1 ), + YAML_PADDING( 4 ), + YAML_SIGNED( "customThrottleWarningPosition", 8 ), + YAML_UNSIGNED( "beepANACenter", 16 ), + YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL), + YAML_ARRAY("limitData", 104, 32, struct_LimitData, NULL), + YAML_ARRAY("expoData", 144, 64, struct_ExpoData, NULL), + YAML_ARRAY("curves", 32, 32, struct_CurveHeader, NULL), + YAML_ARRAY("points", 8, 512, struct_signed_8, NULL), + YAML_ARRAY("logicalSw", 72, 64, struct_LogicalSwitchData, NULL), + YAML_ARRAY("customFn", 88, 64, struct_CustomFunctionData, cfn_is_active), + YAML_STRUCT("swashR", 64, struct_SwashRingData, swash_is_active), + YAML_ARRAY("flightModeData", 480, 9, struct_FlightModeData, fmd_is_active), + YAML_UNSIGNED_CUST( "thrTraceSrc", 8, r_thrSrc, w_thrSrc ), + YAML_CUSTOM("switchWarningState",r_swtchWarn,nullptr), + YAML_ARRAY("switchWarning", 2, 32, struct_swtchWarn, nullptr), + YAML_ARRAY("gvars", 56, 15, struct_GVarData, NULL), + YAML_STRUCT("varioData", 40, struct_VarioData, NULL), + YAML_UNSIGNED_CUST( "rssiSource", 8, r_tele_sensor, w_tele_sensor ), + YAML_STRUCT("rssiAlarms", 0, struct_RssiAlarmData, NULL), + YAML_STRUCT("rfAlarms", 16, struct_RFAlarmData, NULL), + YAML_UNSIGNED( "thrTrimSw", 3 ), + YAML_ENUM("potsWarnMode", 2, enum_PotsWarnMode, NULL), + YAML_ENUM("jitterFilter", 2, enum_ModelOverridableEnable, NULL), + YAML_PADDING( 1 ), + YAML_ARRAY("moduleData", 232, 2, struct_ModuleData, NULL), + YAML_ARRAY("failsafeChannels", 16, 32, struct_signed_16, NULL), + YAML_STRUCT("trainerData", 40, struct_TrainerModuleData, NULL), + YAML_ARRAY("scriptsData", 192, 9, struct_ScriptData, NULL), + YAML_ARRAY("inputNames", 32, 32, struct_string_32, NULL), + YAML_UNSIGNED( "potsWarnEnabled", 16 ), + YAML_ARRAY("potsWarnPosition", 8, 16, struct_signed_8, NULL), + YAML_ARRAY("telemetrySensors", 112, 99, struct_TelemetrySensor, NULL), + YAML_ARRAY("screenData", 0, 10, struct_CustomScreenData, screen_is_active), + YAML_STRUCT("topbarData", 0, struct_TopBarPersistentData, isAlwaysActive), + YAML_ARRAY("topbarWidgetWidth", 8, 7, struct_unsigned_8, NULL), + YAML_UNSIGNED( "view", 8 ), + YAML_STRING("modelRegistrationID", 8), + YAML_CUSTOM("functionSwitchConfig",r_functionSwitchConfig,nullptr), + YAML_CUSTOM("functionSwitchGroup",r_functionSwitchGroup,nullptr), + YAML_CUSTOM("functionSwitchStartConfig",r_functionSwitchStartConfig,nullptr), + YAML_CUSTOM("functionSwitchLogicalState",r_functionSwitchLogicalState,nullptr), + YAML_ARRAY("switchNames", 0, NUM_FUNCTIONS_SWITCHES, struct_cfsNameConfig, nullptr), + YAML_ARRAY("functionSwitchLedONColor", 0, NUM_FUNCTIONS_SWITCHES, struct_cfsOnColorConfig, nullptr), + YAML_ARRAY("functionSwitchLedOFFColor", 0, NUM_FUNCTIONS_SWITCHES, struct_cfsOffColorConfig, nullptr), + YAML_ARRAY("customSwitches", 88, 6, struct_customSwitch, isAlwaysActive), + YAML_ARRAY("cfsGroupOn", 1, 8, struct_cfsGroupOn, cfsGroupIsActive), + YAML_PADDING( 8 ), + YAML_UNSIGNED( "usbJoystickExtMode", 1 ), + YAML_ENUM("usbJoystickIfMode", 3, enum_USBJoystickIfMode, NULL), + YAML_UNSIGNED( "usbJoystickCircularCut", 4 ), + YAML_ARRAY("usbJoystickCh", 16, 26, struct_USBJoystickChData, NULL), + YAML_ENUM("radioThemesDisabled", 2, enum_ModelOverridableEnable, NULL), + YAML_ENUM("radioGFDisabled", 2, enum_ModelOverridableEnable, NULL), + YAML_ENUM("radioTrainerDisabled", 2, enum_ModelOverridableEnable, NULL), + YAML_ENUM("modelHeliDisabled", 2, enum_ModelOverridableEnable, NULL), + YAML_ENUM("modelFMDisabled", 2, enum_ModelOverridableEnable, NULL), + YAML_ENUM("modelCurvesDisabled", 2, enum_ModelOverridableEnable, NULL), + YAML_ENUM("modelGVDisabled", 2, enum_ModelOverridableEnable, NULL), + YAML_ENUM("modelLSDisabled", 2, enum_ModelOverridableEnable, NULL), + YAML_ENUM("modelSFDisabled", 2, enum_ModelOverridableEnable, NULL), + YAML_ENUM("modelCustomScriptsDisabled", 2, enum_ModelOverridableEnable, NULL), + YAML_ENUM("modelTelemetryDisabled", 2, enum_ModelOverridableEnable, NULL), + YAML_END +}; +static const struct YamlNode struct_PartialModel[] = { + YAML_STRUCT("header", 1048, struct_ModelHeader, NULL), + YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL), + YAML_END +}; + +#define MAX_RADIODATA_MODELDATA_PARTIALMODEL_STR_LEN 29 + +static const struct YamlNode __RadioData_root_node = YAML_ROOT( struct_RadioData ); + +const YamlNode* get_radiodata_nodes() +{ + return &__RadioData_root_node; +} +static const struct YamlNode __ModelData_root_node = YAML_ROOT( struct_ModelData ); + +const YamlNode* get_modeldata_nodes() +{ + return &__ModelData_root_node; +} +static const struct YamlNode __PartialModel_root_node = YAML_ROOT( struct_PartialModel ); + +const YamlNode* get_partialmodel_nodes() +{ + return &__PartialModel_root_node; +} + diff --git a/radio/src/strhelpers.cpp b/radio/src/strhelpers.cpp index 3e0a2eede..cb07c912f 100644 --- a/radio/src/strhelpers.cpp +++ b/radio/src/strhelpers.cpp @@ -734,7 +734,13 @@ char *getSourceString(char (&destRef)[L], mixsrc_t idx, bool defaultOnly) strncpy(dest, STR_MENU_MIN, dest_len - 1); } else if (idx == MIXSRC_MAX) { strncpy(dest, STR_MENU_MAX, dest_len - 1); - } else if (idx <= MIXSRC_LAST_HELI) { + } +#if defined(LUMINOSITY_SENSOR) + else if (idx == MIXSRC_LIGHT) { + strncpy(dest, STR_SRC_LIGHT, dest_len - 1); + } +#endif + else if (idx <= MIXSRC_LAST_HELI) { idx -= MIXSRC_FIRST_HELI; getStringAtIndex(dest, STR_CYC_VSRCRAW, idx); } else if (idx <= MIXSRC_LAST_TRIM) { diff --git a/radio/src/targets/pl18/CMakeLists.txt b/radio/src/targets/pl18/CMakeLists.txt index 56ba68d4f..f9658a4d2 100644 --- a/radio/src/targets/pl18/CMakeLists.txt +++ b/radio/src/targets/pl18/CMakeLists.txt @@ -29,8 +29,8 @@ set(TARGET_LINKER_DIR stm32f429_sdram) set(TARGET_EXTRAM_START 0xC0000000) if(PCBREV STREQUAL PL18U) - set(TARGET_SDRAM_SIZE 32768K) set(SIZE_TARGET_MEM_DEFINE "MEM_SIZE_SDRAM1=32768") + set(TARGET_EXTRAM_SIZE 32M) else() set(SIZE_TARGET_MEM_DEFINE "MEM_SIZE_SDRAM1=8192") endif() diff --git a/radio/src/targets/simu/adc_driver.cpp b/radio/src/targets/simu/adc_driver.cpp index 8d7cecf6b..852967710 100644 --- a/radio/src/targets/simu/adc_driver.cpp +++ b/radio/src/targets/simu/adc_driver.cpp @@ -32,6 +32,8 @@ void enableVBatBridge(){} void disableVBatBridge(){} bool isVBatBridgeEnabled(){ return false; } +uint16_t getLuxSensorValue() { return 1024; } + uint16_t getBatteryVoltage() { if (adcGetMaxInputs(ADC_INPUT_VBAT) < 1) return 0; diff --git a/radio/src/targets/simu/backlight_driver.cpp b/radio/src/targets/simu/backlight_driver.cpp index 3aac072d8..b63b4ae3e 100644 --- a/radio/src/targets/simu/backlight_driver.cpp +++ b/radio/src/targets/simu/backlight_driver.cpp @@ -24,6 +24,8 @@ bool boardBacklightOn = false; bool isBacklightEnabled() { return boardBacklightOn; } +bool getPeriodicLuxSensorValue() { return true; } + void backlightInit() {} #if !defined(COLORLCD) diff --git a/radio/src/targets/tx16smk3/CMakeLists.txt b/radio/src/targets/tx16smk3/CMakeLists.txt new file mode 100644 index 000000000..61080fc12 --- /dev/null +++ b/radio/src/targets/tx16smk3/CMakeLists.txt @@ -0,0 +1,212 @@ +option(UNEXPECTED_SHUTDOWN "Enable the Unexpected Shutdown screen" ON) +option(PXX1 "PXX1 protocol support" ON) +option(PXX2 "PXX2 protocol support" OFF) +option(AFHDS3 "AFHDS3 TX Module" ON) +option(MULTIMODULE "DIY Multiprotocol TX Module (https://github.com/pascallanger/DIY-Multiprotocol-TX-Module)" ON) +option(GHOST "Ghost TX Module" ON) +option(MODULE_SIZE_STD "Standard size TX Module" ON) +option(LUA_MIXER "Enable LUA mixer/model scripts support" ON) +option(DISK_CACHE "Enable SD card disk cache" ON) +option(INTERNAL_GPS "Support for internal GPS" ON) + +set(FIRMWARE_QSPI YES) +set(FIRMWARE_FORMAT_UF2 YES) +set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") +set(CPU_TYPE STM32H7) +set(HSE_VALUE 48000000) +set(SDCARD YES) +set(STORAGE_MODELSLIST YES) +set(HAPTIC YES) +set(GUI_DIR colorlcd) +set(BITMAPS_DIR 800x480) +set(TARGET_DIR tx16smk3) +set(RTC_BACKUP_RAM YES) +set(PPM_LIMITS_SYMETRICAL YES) +set(USB_SERIAL ON CACHE BOOL "Enable USB serial (CDC)") +set(HARDWARE_EXTERNAL_MODULE YES) +set(INTERNAL_MODULE_AFHDS3 NO) +set(ROTARY_ENCODER YES) +set(FUNCTION_SWITCHES_WITH_RGB YES) +set(FLEXSW "2" CACHE STRING "Max flex inputs usable as switches") +set(INTERNAL_GPS_BAUDRATE "9600" CACHE STRING "Baud rate for internal GPS") + +#option(STICKS_DEAD_ZONE "Enable sticks dead zone" YES) + +# IMU support +set(IMU ON) +add_definitions(-DIMU_ICM4207C) + +# for size report script +set(CPU_TYPE_FULL STM32H750xB) +set(TARGET_LINKER_DIR stm32h750_sdram) +set(TARGET_EXTRAM_START 0xD0000000) +set(TARGET_EXTRAM_SIZE 32M) +set(SIZE_TARGET_MEM_DEFINE "MEM_SIZE_SDRAM1=32768") +set(FIRMWARE_STRIP_BOOTLOADER YES) + +add_definitions(-DPCBTX16SMK3 -DPCBHORUS) +add_definitions(-DBATTERY_CHARGE) +add_definitions(-DSTM32_SUPPORT_32BIT_TIMERS) +add_definitions(-DFIRMWARE_QSPI) +add_definitions(-DFIRMWARE_FORMAT_UF2) +add_definitions(-DUSE_CUSTOM_EXTI_IRQ) +add_definitions(-DUSB_CHARGER) +add_definitions(-DLUMINOSITY_SENSOR) + +set(FLAVOUR tx16smk3) +add_definitions(-DRADIO_TX16SMK3) +add_definitions(-DMANUFACTURER_RADIOMASTER) + +# defines existing internal modules +set(INTERNAL_MODULES CRSF CACHE STRING "Internal modules") +set(DEFAULT_INTERNAL_MODULE CROSSFIRE CACHE STRING "Default internal module") + +set(BITMAPS_TARGET bm800_bitmaps) +set(FONTS_TARGET x12_fonts) +set(LCD_DRIVER lcd_driver.cpp) +set(HARDWARE_TOUCH YES) +set(RADIO_DEPENDENCIES ${RADIO_DEPENDENCIES} ${BITMAPS_TARGET}) +set(FIRMWARE_DEPENDENCIES datacopy) +set(SOFTWARE_KEYBOARD ON) +set(FUNCTION_SWITCHES ON) +set(USB_CHARGER YES) +set(AUX_SERIAL YES) +set(AUX2_SERIAL YES) + +add_definitions( + -DSTM32H750XBTx -DSTM32H750xx + -DSDRAM -DCCMRAM + -DCOLORLCD -DLIBOPENUI + -DHARDWARE_TOUCH -DHARDWARE_KEYS -DSOFTWARE_KEYBOARD + -DWS2812_MAX_LEDS=26 +) + +set(SDRAM ON) + +add_definitions(-DAUDIO -DVOICE -DRTCLOCK) +add_definitions(-DGPS_USART_BAUDRATE=${INTERNAL_GPS_BAUDRATE}) +add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) + +if(STICKS_DEAD_ZONE) + add_definitions(-DSTICK_DEAD_ZONE) +endif() + +if(NOT UNEXPECTED_SHUTDOWN) + add_definitions(-DNO_UNEXPECTED_SHUTDOWN) +endif() + +if(DISK_CACHE) + set(SRC ${SRC} disk_cache.cpp) + add_definitions(-DDISK_CACHE) +endif() + +if(FUNCTION_SWITCHES_WITH_RGB) + set(FUNCTION_SWITCHES YES) + add_definitions(-DFUNCTION_SWITCHES) + add_definitions(-DFUNCTION_SWITCHES_RGB_LEDS) +endif() + +if(FUNCTION_SWITCHES) +add_definitions(-DFUNCTION_SWITCHES) +endif() + +if(INTERNAL_GPS) + message("-- Internal GPS enabled") + add_definitions(-DINTERNAL_GPS) + add_definitions(-DGPS_USART_BAUDRATE=${INTERNAL_GPS_BAUDRATE}) + set(SRC ${SRC} gps.cpp gps_nmea.cpp gps_ubx.cpp) +endif() + +set(AFHDS3 ON) + +# VCP CLI +set(ENABLE_SERIAL_PASSTHROUGH ON CACHE BOOL "Enable serial passthrough") +set(CLI ON CACHE BOOL "Enable CLI") + +set(BOARD rm-h750) + +include_directories(boards/${BOARD}) + +set(TARGET_SRC_DIR targets/${TARGET_DIR}) +set(BOARD_SRC_DIR boards/${BOARD}) + +set(BOARD_COMMON_SRC + ${BOARD_SRC_DIR}/board.cpp + ${BOARD_SRC_DIR}/bsp_io.cpp + ${TARGET_SRC_DIR}/key_driver.cpp + ${BOARD_SRC_DIR}/lcd_driver_800.cpp + ${BOARD_SRC_DIR}/backlight_driver.cpp + ${BOARD_SRC_DIR}/haptic_driver.cpp + ${BOARD_SRC_DIR}/extflash_driver.cpp + ${BOARD_SRC_DIR}/usb_charger_driver.cpp + targets/common/arm/stm32/abnormal_reboot.cpp + targets/common/arm/stm32/delays_driver.cpp + targets/common/arm/stm32/dma2d.cpp + targets/common/arm/stm32/flash_driver.cpp + targets/common/arm/stm32/pwr_driver.cpp + targets/common/arm/stm32/rotary_encoder_driver.cpp + targets/common/arm/stm32/rtc_driver.cpp + targets/common/arm/stm32/watchdog_driver.cpp + drivers/pca95xx.cpp +) + +# Bootloader board library +add_library(board_bl OBJECT EXCLUDE_FROM_ALL + ${BOARD_COMMON_SRC} + ${BOARD_SRC_DIR}/sdram_driver.cpp + ${RADIO_SRC_DIR}/gui/colorlcd/boot_menu.cpp + targets/common/arm/stm32/stm32_qspi.cpp + targets/common/arm/stm32/stm32_pulse_driver.cpp +) +add_dependencies(board_bl minimal_board_lib) +set(BOOTLOADER_SRC ${BOOTLOADER_SRC} $) + +set(CMSIS_SRC ${BOARD_SRC_DIR}/system_clock.c) + +# Firmware board library +add_library(board OBJECT EXCLUDE_FROM_ALL + ${BOARD_COMMON_SRC} + ${BOARD_SRC_DIR}/tp_gt911.cpp + ${BOARD_SRC_DIR}/audio_driver.cpp + ${BOARD_SRC_DIR}/luminosity_sensor.cpp + drivers/icm42607C.cpp + drivers/imu_filter.cpp + drivers/tas2505.cpp + targets/common/arm/stm32/heartbeat_driver.cpp + targets/common/arm/stm32/mixer_scheduler_driver.cpp + targets/common/arm/stm32/module_timer_driver.cpp + targets/common/arm/stm32/stm32_pulse_driver.cpp + targets/common/arm/stm32/stm32_softserial_driver.cpp + targets/common/arm/stm32/stm32_qspi.cpp + targets/common/arm/stm32/stm32_i2s.cpp + targets/common/arm/stm32/stm32_switch_driver.cpp + targets/common/arm/stm32/stm32_ws2812.cpp + targets/common/arm/stm32/trainer_driver.cpp +) +add_dependencies(board board_lib) +set(FIRMWARE_SRC ${FIRMWARE_SRC} $) + +include_directories(${RADIO_SRC_DIR}/fonts/colorlcd gui/${GUI_DIR} gui/${GUI_DIR}/layouts) + +if(BOOTLOADER) + set(FIRMWARE_TARGET_SRC + ${FIRMWARE_TARGET_SRC} + ../../bootloader/loadboot.cpp + ) +endif() + +set(SRC + ${SRC} + io/frsky_firmware_update.cpp + io/multi_firmware_update.cpp + ) + +if (MULTIMODULE) + add_definitions(-DMULTI_PROTOLIST) + set(SRC ${SRC} + io/multi_protolist.cpp + ) +endif() + +# Make malloc() thread-safe +add_definitions(-DTHREADSAFE_MALLOC) diff --git a/radio/src/targets/tx16smk3/bsp_io.h b/radio/src/targets/tx16smk3/bsp_io.h new file mode 100644 index 000000000..c30235f28 --- /dev/null +++ b/radio/src/targets/tx16smk3/bsp_io.h @@ -0,0 +1,55 @@ +/* + * 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 "drivers/pca95xx.h" +#include "hal/switch_driver.h" + +#define IO_EXPANDER_I2C_BUS I2C_Bus_1 +#define IO_EXPANDER1_I2C_ADDR 0x74 +#define IO_EXPANDER2_I2C_ADDR 0x75 + +// Port expander 2 (0x74) +#define BSP_TR6U PCA95XX_PIN_7 +#define BSP_TR6D PCA95XX_PIN_6 +#define BSP_TR4R PCA95XX_PIN_8 +#define BSP_TR4L PCA95XX_PIN_9 +#define BSP_TR2D PCA95XX_PIN_10 +#define BSP_TR2U PCA95XX_PIN_11 +#define BSP_TR1D PCA95XX_PIN_12 +#define BSP_TR1U PCA95XX_PIN_13 +#define BSP_TR3R PCA95XX_PIN_14 +#define BSP_TR3L PCA95XX_PIN_15 + +extern uint8_t isSwitch3Pos(uint8_t idx); + +int bsp_io_init(); +uint32_t bsp_io_read_switches(); +uint32_t bsp_io_read_fs_switches(); +uint32_t bsp_get_fs_switches(); + +uint16_t bsp_input_get(); +struct stm32_switch_t; + +//TODO compute from json +constexpr uint32_t IO_EXPANDER1_MASK = 0xFFFF; +constexpr uint32_t IO_EXPANDER2_MASK = 0xFFFF; diff --git a/radio/src/targets/tx16smk3/hal.h b/radio/src/targets/tx16smk3/hal.h new file mode 100644 index 000000000..9f0797d3e --- /dev/null +++ b/radio/src/targets/tx16smk3/hal.h @@ -0,0 +1,624 @@ +/* + * 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. + */ + + +/* + +STM32H750 + +SDMMC uses own DMA controler + +DMA1 +Stream0: LED_STRIP_TIMER_DMA_STREAM +Stream1: INTMODULE_DMA_STREAM +Stream2: FLYSKY_HALL_DMA_Stream_RX +Stream3: TELEMETRY_DMA_Stream_RX +Stream4: I2S_DMA_Stream +Stream5: INTMODULE_RX_DMA_STREAM +Stream6: AUX2_SERIAL_DMA_RX_STREAM +Stream7: TELEMETRY_DMA_Stream_TX + +DMA2 +Stream0: ADC_EXT_DMA_STREAM (do not move) +Stream1: AUX_SERIAL_DMA_TX_STREAM +Stream2: AUX_SERIAL_DMA_RX_STREAM +Stream3: EXTMODULE_TIMER_DMA_STREAM +Stream4: ADC_DMA_STREAM (do not move) +Stream5: EXTMODULE_USART_RX_DMA_STREAM +Stream6: EXTMODULE_USART_TX_DMA_STREAM +Stream7: AUX2_SERIAL_DMA_TX_STREAM + +TIM1: BACKLIGHT_TIMER +TIM2: LED_STRIP_TIMER +TIM3: HAPTIC_GPIO_TIMER +TIM4: +TIM5: EXTMODULE_TIMER +TIM7: +TIM8: TRAINER_TIMER +TIM12: MIXER_SCHEDULER_TIMER +TIM14: MS_TIMER +TIM15: PDM +TIM16: +TIM17: ROTARY_ENCODER_TIMER + +USART1: TELEMETRY_USART +USART2: EXTMODULE_USART +USART3: AUX2_SERIAL_USART +USART4: +USART5: AUX_SERIAL_USART +USART6: INTMODULE_USART + */ + +#ifndef _HAL_H_ +#define _HAL_H_ + +#define CPU_FREQ 480000000 + +#define PERI1_FREQUENCY 120000000 +#define PERI2_FREQUENCY 120000000 +#define TIMER_MULT_APB1 2 +#define TIMER_MULT_APB2 2 + +// Keys +#define KEYS_GPIO_REG_PAGEDN GPIOA +#define KEYS_GPIO_PIN_PAGEDN LL_GPIO_PIN_8 // PA.08 +#define KEYS_GPIO_REG_PAGEUP GPIOG +#define KEYS_GPIO_PIN_PAGEUP LL_GPIO_PIN_7 // PG.07 +#define KEYS_GPIO_REG_SYS GPIOB +#define KEYS_GPIO_PIN_SYS LL_GPIO_PIN_2 // PB.02 +#define KEYS_GPIO_REG_ENTER GPIOG +#define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_12 // PG.12 +#define KEYS_GPIO_REG_MDL GPIOE +#define KEYS_GPIO_PIN_MDL LL_GPIO_PIN_3 // PE.03 +#define KEYS_GPIO_REG_EXIT GPIOG +#define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_3 // PG.03 +#define KEYS_GPIO_REG_TELE GPIOI +#define KEYS_GPIO_PIN_TELE LL_GPIO_PIN_15 // PI.15 + +// Trims +#define TRIMS_GPIO_REG_LHL +#define TRIMS_GPIO_PIN_LHL + +#define TRIMS_GPIO_REG_LHR +#define TRIMS_GPIO_PIN_LHR + +#define TRIMS_GPIO_REG_LVD +#define TRIMS_GPIO_PIN_LVD + +#define TRIMS_GPIO_REG_LVU +#define TRIMS_GPIO_PIN_LVU + +#define TRIMS_GPIO_REG_RHL +#define TRIMS_GPIO_PIN_RHL + +#define TRIMS_GPIO_REG_RHR +#define TRIMS_GPIO_PIN_RHR + +#define TRIMS_GPIO_REG_RVD +#define TRIMS_GPIO_PIN_RVD + +#define TRIMS_GPIO_REG_RVU +#define TRIMS_GPIO_PIN_RVU + +#define TRIMS_GPIO_REG_RSD +#define TRIMS_GPIO_PIN_RSD + +#define TRIMS_GPIO_REG_RSU +#define TRIMS_GPIO_PIN_RSU + +#define TRIMS_GPIO_REG_LSD GPIOH +#define TRIMS_GPIO_PIN_LSD LL_GPIO_PIN_15 + +#define TRIMS_GPIO_REG_LSU GPIOH +#define TRIMS_GPIO_PIN_LSU LL_GPIO_PIN_13 + +// Extender Switches +#define SWITCHES_A_3POS +#define SWITCHES_GPIO_REG_A_H +#define SWITCHES_GPIO_PIN_A_H PCA95XX_P15 +#define SWITCHES_GPIO_REG_A_L +#define SWITCHES_GPIO_PIN_A_L PCA95XX_P14 + +#define SWITCHES_B_3POS +#define SWITCHES_GPIO_REG_B_H +#define SWITCHES_GPIO_PIN_B_H PCA95XX_P13 +#define SWITCHES_GPIO_REG_B_L +#define SWITCHES_GPIO_PIN_B_L PCA95XX_P12 + +#define SWITCHES_C_3POS +#define SWITCHES_GPIO_REG_C_H +#define SWITCHES_GPIO_PIN_C_H PCA95XX_P11 +#define SWITCHES_GPIO_REG_C_L +#define SWITCHES_GPIO_PIN_C_L PCA95XX_P10 + +#define SWITCHES_D_3POS +#define SWITCHES_GPIO_REG_D_H +#define SWITCHES_GPIO_PIN_D_H PCA95XX_P7 +#define SWITCHES_GPIO_REG_D_L +#define SWITCHES_GPIO_PIN_D_L PCA95XX_P6 + +#define SWITCHES_E_3POS +#define SWITCHES_GPIO_REG_E_H +#define SWITCHES_GPIO_PIN_E_H PCA95XX_P16 +#define SWITCHES_GPIO_REG_E_L +#define SWITCHES_GPIO_PIN_E_L PCA95XX_P17 + +#define SWITCHES_F_2POS +#define SWITCHES_GPIO_REG_F +#define SWITCHES_GPIO_PIN_F PCA95XX_P1 + +#define SWITCHES_G_3POS +#define SWITCHES_GPIO_REG_G_H +#define SWITCHES_GPIO_PIN_G_H PCA95XX_P4 +#define SWITCHES_GPIO_REG_G_L +#define SWITCHES_GPIO_PIN_G_L PCA95XX_P5 + +#define SWITCHES_H_2POS +#define SWITCHES_GPIO_REG_H +#define SWITCHES_GPIO_PIN_H PCA95XX_P0 + +#define SWITCHES_I_2POS +#define SWITCHES_GPIO_REG_I +#define SWITCHES_GPIO_PIN_I PCA95XX_P2 + +#define SWITCHES_J_2POS +#define SWITCHES_GPIO_REG_J +#define SWITCHES_GPIO_PIN_J PCA95XX_P3 + +// function switches +//SW1 +#define SWITCHES_GPIO_REG_K +#define SWITCHES_GPIO_PIN_K PCA95XX_P0 +#define SWITCHES_K_CFS_IDX 0 +#define FUNCTION_SWITCH_1 SK +//SW2 +#define SWITCHES_GPIO_REG_L +#define SWITCHES_GPIO_PIN_L PCA95XX_P1 +#define SWITCHES_L_CFS_IDX 1 +#define FUNCTION_SWITCH_2 SL +//SW3 +#define SWITCHES_GPIO_REG_M +#define SWITCHES_GPIO_PIN_M PCA95XX_P2 +#define SWITCHES_M_CFS_IDX 2 +#define FUNCTION_SWITCH_3 SM +//SW4 +#define SWITCHES_GPIO_REG_N +#define SWITCHES_GPIO_PIN_N PCA95XX_P3 +#define SWITCHES_N_CFS_IDX 3 +#define FUNCTION_SWITCH_4 SN +//SW5 +#define SWITCHES_GPIO_REG_O +#define SWITCHES_GPIO_PIN_O PCA95XX_P4 +#define SWITCHES_O_CFS_IDX 4 +#define FUNCTION_SWITCH_5 SO +//SW6 +#define SWITCHES_GPIO_REG_P +#define SWITCHES_GPIO_PIN_P PCA95XX_P5 +#define SWITCHES_P_CFS_IDX 5 +#define FUNCTION_SWITCH_6 SP + +// Expanders +#define IO_INT_GPIO GPIO_PIN(GPIOD, 3) +#define IO_RESET_GPIO GPIO_PIN(GPIOG, 10) +#if !defined(USE_EXTI3_IRQ) +#define USE_EXTI3_IRQ +#define EXTI3_IRQ_Priority 9 +#endif + +// ADC +#define ADC_GPIO_PIN_STICK_LH LL_GPIO_PIN_6 // PA.06 +#define ADC_GPIO_PIN_STICK_LV LL_GPIO_PIN_3 // PC.03 +#define ADC_GPIO_PIN_STICK_RV LL_GPIO_PIN_4 // PC.04 +#define ADC_GPIO_PIN_STICK_RH LL_GPIO_PIN_5 // PC.05 + +#define ADC_GPIO_PIN_POT1 LL_GPIO_PIN_1 // PC.01 POT1 +#define ADC_GPIO_PIN_POT2 LL_GPIO_PIN_1 // PB.01 POT2 +#define ADC_GPIO_PIN_BATT LL_GPIO_PIN_3 // PH.03 + +#define ADC_GPIO_PIN_SLIDER1 LL_GPIO_PIN_2 // PH.02 VRC/LS +#define ADC_GPIO_PIN_SLIDER2 LL_GPIO_PIN_7 // PA.07 VRD/RS + +#define ADC_GPIO_PIN_LUX LL_GPIO_PIN_0 // PB.00 Light Sensor + +#define ADC_GPIO_PIN_EXT1 LL_GPIO_PIN_5 // PA.05,ADC1_CH19 +#define ADC_GPIO_PIN_EXT2 LL_GPIO_PIN_5 // PH.05,ADC3_CH16 + +#define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_SLIDER2|ADC_GPIO_PIN_EXT1) +#define ADC_GPIOB_PINS (ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_LUX) +#define ADC_GPIOC_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_POT1) +#define ADC_GPIOH_PINS (ADC_GPIO_PIN_BATT | ADC_GPIO_PIN_SLIDER1 | ADC_GPIO_PIN_EXT2) + + +#define ADC_CHANNEL_STICK_LH LL_ADC_CHANNEL_3 // ADC12_INP3 +#define ADC_CHANNEL_STICK_LV LL_ADC_CHANNEL_13 // ADC12_INP13 +#define ADC_CHANNEL_STICK_RV LL_ADC_CHANNEL_4 // ADC12_INP4 +#define ADC_CHANNEL_STICK_RH LL_ADC_CHANNEL_8 // ADC12_INP8 + +// Each ADC cannot map more than 8 channels, otherwise it will cause problems +#define ADC_CHANNEL_POT1 LL_ADC_CHANNEL_11 // ADC12_INP11 +#define ADC_CHANNEL_POT2 LL_ADC_CHANNEL_5 // ADC12_INP5 +#define ADC_CHANNEL_BATT LL_ADC_CHANNEL_14 // ADC3_INP14 +#define ADC_CHANNEL_RTC_BAT LL_ADC_CHANNEL_VBAT // ADC3_INP17 +#define ADC_CHANNEL_SLIDER1 LL_ADC_CHANNEL_13 // ADC3_INP13 +#define ADC_CHANNEL_SLIDER2 LL_ADC_CHANNEL_7 // ADC12_INP7 + +#define ADC_CHANNEL_LUX LL_ADC_CHANNEL_9 // ADC12_INP9 -> Light Sensor + +#define ADC_CHANNEL_EXT1 LL_ADC_CHANNEL_19 // ADC1_IN19 +#define ADC_CHANNEL_EXT2 LL_ADC_CHANNEL_16 // ADC3_IN16 + +#define ADC_MAIN ADC1 +#define ADC_DMA DMA2 +#define ADC_DMA_CHANNEL LL_DMAMUX1_REQ_ADC1 +#define ADC_DMA_STREAM LL_DMA_STREAM_4 +#define ADC_DMA_STREAM_IRQ DMA2_Stream4_IRQn +#define ADC_DMA_STREAM_IRQHandler DMA2_Stream4_IRQHandler +#define ADC_SAMPTIME LL_ADC_SAMPLINGTIME_8CYCLES_5 + +#define ADC_EXT ADC3 +#define ADC_EXT_CHANNELS { ADC_CHANNEL_SLIDER1, ADC_CHANNEL_BATT, ADC_CHANNEL_RTC_BAT, ADC_CHANNEL_EXT2 } +#define ADC_EXT_DMA DMA2 +#define ADC_EXT_DMA_CHANNEL LL_DMAMUX1_REQ_ADC3 +#define ADC_EXT_DMA_STREAM LL_DMA_STREAM_0 +#define ADC_EXT_DMA_STREAM_IRQ DMA2_Stream0_IRQn +#define ADC_EXT_DMA_STREAM_IRQHandler DMA2_Stream0_IRQHandler +#define ADC_EXT_SAMPTIME LL_ADC_SAMPLINGTIME_8CYCLES_5 + +#define ADC_VREF_PREC2 330 + +#define ADC_DIRECTION { \ + 0,-1,0,-1, /* gimbals */ \ + -1,-1, /* pots */ \ + 0,-1, /* sliders */ \ + 0,0, /* ext */ \ + 0, /* vbat */ \ + 0, /* rtc_bat */ \ + 0 /* lux sensor */ \ + } + +// Serial gimbal sync port +#define HALL_SYNC GPIO_PIN(GPIOH, 11) + +#define USE_EXTI9_5_IRQ // used for I2C port extender interrupt +#define EXTI9_5_IRQ_Priority 5 + +// Power +#define PWR_SWITCH_GPIO GPIO_PIN(GPIOA, 4) +#define PWR_ON_GPIO GPIO_PIN(GPIOH, 12) + +// Chargers (USB and wireless) +#define UCHARGER_GPIO GPIO_PIN(GPIOD, 11) +#define UCHARGER_EN_GPIO GPIO_PIN(GPIOB, 12) + +// TODO! Check IOLL1 to PI.01 connectivity! + +// S.Port update connector +#define HAS_SPORT_UPDATE_CONNECTOR() (false) + +// Telemetry + #define TELEMETRY_SET_INPUT 0 + #define TELEMETRY_TX_GPIO GPIO_PIN(GPIOA, 9) + #define TELEMETRY_RX_GPIO GPIO_UNDEF + #define TELEMETRY_USART USART1 + #define TELEMETRY_USART_IRQn USART1_IRQn + #define TELEMETRY_DMA DMA1 + #define TELEMETRY_DMA_Stream_TX LL_DMA_STREAM_7 + #define TELEMETRY_DMA_Channel_TX LL_DMAMUX1_REQ_USART1_TX + #define TELEMETRY_DMA_TX_Stream_IRQ DMA1_Stream7_IRQn + #define TELEMETRY_DMA_TX_IRQHandler DMA1_Stream7_IRQHandler + #define TELEMETRY_DMA_Stream_RX LL_DMA_STREAM_3 + #define TELEMETRY_DMA_Channel_RX LL_DMAMUX1_REQ_USART1_RX + #define TELEMETRY_USART_IRQHandler USART1_IRQHandler + +// Software IRQ (Prio 5 -> FreeRTOS compatible) +#define TELEMETRY_USE_CUSTOM_EXTI +#define CUSTOM_EXTI_IRQ_NAME ETH_WKUP_IRQ +#define ETH_WKUP_IRQ_Priority 5 +#define CUSTOM_EXTI_IRQ_LINE 86 +#define TELEMETRY_RX_FRAME_EXTI_LINE CUSTOM_EXTI_IRQ_LINE + +// USB +#define USB_GPIO GPIOA +#define USB_GPIO_VBUS GPIO_PIN(GPIOH, 11) +#define USB_GPIO_DM GPIO_PIN(GPIOA, 11) +#define USB_GPIO_DP GPIO_PIN(GPIOA, 12) +#define USB_GPIO_AF GPIO_AF10 + +// LCD + +#define LTDC_IRQ_PRIO 4 +#define DMA_SCREEN_IRQ_PRIO 6 + +#define LCD_RESET_GPIO GPIOJ +#define LCD_RESET_GPIO_PIN LL_GPIO_PIN_12 + +// Backlight +#define BACKLIGHT_GPIO GPIO_PIN(GPIOA, 10) // TIM1_CH3 +#define BACKLIGHT_TIMER TIM1 +#define BACKLIGHT_TIMER_CHANNEL LL_TIM_CHANNEL_CH3 +#define BACKLIGHT_GPIO_AF GPIO_AF1 +#define BACKLIGHT_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) + +// QSPI Flash +#define QSPI_CLK_GPIO GPIO_PIN(GPIOF, 10) +#define QSPI_CLK_GPIO_AF GPIO_AF9 +#define QSPI_CS_GPIO GPIO_PIN(GPIOG, 6) +#define QSPI_CS_GPIO_AF GPIO_AF10 +#define QSPI_MISO_GPIO GPIO_PIN(GPIOF, 9) +#define QSPI_MISO_GPIO_AF GPIO_AF10 +#define QSPI_MOSI_GPIO GPIO_PIN(GPIOF, 8) +#define QSPI_MOSI_GPIO_AF GPIO_AF10 +#define QSPI_WP_GPIO GPIO_PIN(GPIOF, 7) +#define QSPI_WP_GPIO_AF GPIO_AF9 +#define QSPI_HOLD_GPIO GPIO_PIN(GPIOF, 6) +#define QSPI_HOLD_GPIO_AF GPIO_AF9 +#define QSPI_FLASH_SIZE 0x1000000 + + +// SD +#define SD_SDIO SDMMC1 +#define SD_SDIO_CLK_DIV(fq) (HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SDMMC) / (2 * fq)) +#define SD_SDIO_TRANSFER_CLK_DIV SD_SDIO_CLK_DIV(24000000) // Hz + +#define SD2_PRESENT_GPIO GPIO_PIN(GPIOH, 8) // PH.08 +#define SD2_SDIO SDMMC2 +#define SD2_SDIO_PIN_D0 GPIO_PIN(GPIOB, 14) +#define SD2_SDIO_AF_D0 GPIO_AF9 +#define SD2_SDIO_PIN_D1 GPIO_PIN(GPIOB, 15) +#define SD2_SDIO_AF_D1 GPIO_AF9 +#define SD2_SDIO_PIN_D2 GPIO_PIN(GPIOG, 11) +#define SD2_SDIO_AF_D2 GPIO_AF10 +#define SD2_SDIO_PIN_D3 GPIO_PIN(GPIOB, 4) +#define SD2_SDIO_AF_D3 GPIO_AF9 +#define SD2_SDIO_PIN_CLK GPIO_PIN(GPIOD, 6) +#define SD2_SDIO_AF_CLK GPIO_AF11 +#define SD2_SDIO_PIN_CMD GPIO_PIN(GPIOD, 7) +#define SD2_SDIO_AF_CMD GPIO_AF11 +#define SD2_SDIO_TRANSFER_CLK_DIV SD_SDIO_CLK_DIV(24000000) // Hz + +#define STORAGE_USE_SDIO + + +// AUDIO +#define AUDIO_I2C I2C_Bus_2 +#define AUDIO_SPI SPI2 +#define AUDIO_RESET_PIN GPIO_PIN(GPIOH, 10) +#define AUDIO_HP_DETECT_PIN GPIO_PIN(GPIOH, 14) +#define I2S_DMA DMA1 +#define I2S_DMA_Stream LL_DMA_STREAM_4 +#define I2S_DMA_Stream_Request LL_DMAMUX1_REQ_SPI2_TX +#define I2S_DMA_Stream_IRQn DMA1_Stream4_IRQn +#define I2S_DMA_Stream_IRQHandler DMA1_Stream4_IRQHandler + +// I2C Bus +#define I2C_B1 I2C4 +#define I2C_B1_SDA_GPIO GPIO_PIN(GPIOD, 13) // PD.13 +#define I2C_B1_SCL_GPIO GPIO_PIN(GPIOD, 12) // PD.12 +#define I2C_B1_GPIO_AF LL_GPIO_AF_4 +#define I2C_B1_CLK_RATE 400000 + +#define I2C_B2 I2C1 +#define I2C_B2_SDA_GPIO GPIO_PIN(GPIOB, 9) // PB.09 +#define I2C_B2_SCL_GPIO GPIO_PIN(GPIOB, 8) // PB.08 +#define I2C_B2_GPIO_AF LL_GPIO_AF_4 +#define I2C_B2_CLK_RATE 400000 + +// Haptic: TIM3_CH2 +#define HAPTIC_PWM +#define HAPTIC_GPIO GPIO_PIN(GPIOC, 7) +#define HAPTIC_GPIO_TIMER TIM3 +#define HAPTIC_GPIO_AF GPIO_AF2 +#define HAPTIC_TIMER_OUTPUT_ENABLE TIM_CCER_CC2E | TIM_CCER_CC2NE; +#define HAPTIC_TIMER_MODE TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2PE +#define HAPTIC_TIMER_COMPARE_VALUE HAPTIC_GPIO_TIMER->CCR2 + +// LED Strip +#define LED_STRIP_LENGTH 26 // 6POS + 2 rings of 10 +#define BLING_LED_STRIP_START 6 +#define BLING_LED_STRIP_LENGTH 20 +#define CFS_LED_STRIP_START 0 +#define CFS_LED_STRIP_LENGTH 6 +#define CFS_LEDS_PER_SWITCH 1 +#define LED_STRIP_GPIO GPIO_PIN(GPIOA, 0) // PA.00 / TIM2_CH1 +#define LED_STRIP_GPIO_AF LL_GPIO_AF_1 // TIM1/2/16/17 +#define LED_STRIP_TIMER TIM2 +#define LED_STRIP_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) +#define LED_STRIP_TIMER_CHANNEL LL_TIM_CHANNEL_CH1 +#define LED_STRIP_TIMER_DMA DMA1 +#define LED_STRIP_TIMER_DMA_CHANNEL LL_DMAMUX1_REQ_TIM2_UP +#define LED_STRIP_TIMER_DMA_STREAM LL_DMA_STREAM_0 +#define LED_STRIP_TIMER_DMA_IRQn DMA1_Stream0_IRQn +#define LED_STRIP_TIMER_DMA_IRQHandler DMA1_Stream0_IRQHandler +#define LED_STRIP_REFRESH_PERIOD 50 //ms + +#define STATUS_LEDS +#define GPIO_LED_GPIO_ON gpio_set +#define GPIO_LED_GPIO_OFF gpio_clear +#define LED_RED_GPIO GPIO_PIN(GPIOI, 8) // PI.08 +#define LED_GREEN_GPIO GPIO_PIN(GPIOI, 11) // PI.11 +#define LED_BLUE_GPIO GPIO_PIN(GPIOI, 10) // PI.10 + +// Internal Module +#define INTMODULE_PWR_GPIO GPIO_PIN(GPIOB, 13) // PB.13 +#define INTMODULE_BOOTCMD_GPIO GPIO_PIN(GPIOH, 9) // PH.09 +#define INTMODULE_BOOTCMD_DEFAULT 0 +#define INTMODULE_TX_GPIO GPIO_PIN(GPIOG, 14) +#define INTMODULE_RX_GPIO GPIO_PIN(GPIOG, 9) +#define INTMODULE_USART USART6 +#define INTMODULE_GPIO_AF LL_GPIO_AF_7 +#define INTMODULE_USART_IRQn USART6_IRQn +#define INTMODULE_USART_IRQHandler USART6_IRQHandler +#define INTMODULE_DMA DMA1 +#define INTMODULE_DMA_STREAM LL_DMA_STREAM_1 +#define INTMODULE_DMA_STREAM_IRQ DMA1_Stream1_IRQn +#define INTMODULE_DMA_FLAG_TC DMA_FLAG_TCIF1 +#define INTMODULE_DMA_CHANNEL LL_DMAMUX1_REQ_USART6_TX +#define INTMODULE_RX_DMA DMA1 +#define INTMODULE_RX_DMA_STREAM LL_DMA_STREAM_5 +#define INTMODULE_RX_DMA_CHANNEL LL_DMAMUX1_REQ_USART6_RX +#define INTMODULE_RX_DMA_Stream_IRQn DMA1_Stream5_IRQn +#define INTMODULE_RX_DMA_Stream_IRQHandler DMA1_Stream5_IRQHandler + +// External Module +#define EXTMODULE +#define EXTMODULE_PULSES +#define EXTMODULE_PWR_GPIO GPIO_PIN(GPIOD, 4) // PD.04 +#define EXTMODULE_TX_GPIO GPIO_PIN(GPIOA, 2) // TIM2_CH3, TIM5_CH3,TIM15_CH1, +#define EXTMODULE_RX_GPIO GPIO_PIN(GPIOA, 3) +#define EXTMODULE_TX_GPIO_AF LL_GPIO_AF_3 // TIM5_CH3 +#define EXTMODULE_TIMER TIM5 +#define EXTMODULE_TIMER_32BITS +#define EXTMODULE_TIMER_Channel LL_TIM_CHANNEL_CH3 +#define EXTMODULE_TIMER_IRQn TIM5_IRQn +#define EXTMODULE_TIMER_IRQHandler TIM5_IRQHandler +#define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) +#define EXTMODULE_TIMER_TX_GPIO_AF LL_GPIO_AF_2 + + +//USART +#define EXTMODULE_USART USART2 +#define EXTMODULE_USART_TX_DMA DMA2 +#define EXTMODULE_USART_TX_DMA_CHANNEL LL_DMAMUX1_REQ_USART2_TX +#define EXTMODULE_USART_TX_DMA_STREAM LL_DMA_STREAM_6 +#define EXTMODULE_USART_RX_DMA_CHANNEL LL_DMAMUX1_REQ_USART2_RX +#define EXTMODULE_USART_RX_DMA_STREAM LL_DMA_STREAM_5 +#define EXTMODULE_USART_IRQHandler USART2_IRQHandler +#define EXTMODULE_USART_IRQn USART2_IRQn + +//TIMER +#define EXTMODULE_TIMER_DMA_CHANNEL LL_DMAMUX1_REQ_TIM5_UP +#define EXTMODULE_TIMER_DMA DMA2 +#define EXTMODULE_TIMER_DMA_STREAM LL_DMA_STREAM_6 +#define EXTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream6_IRQn +#define EXTMODULE_TIMER_DMA_IRQHandler DMA2_Stream6_IRQHandler + +// Trainer Port +#define TRAINER_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA) + +#define TRAINER_IN_GPIO GPIO_PIN(GPIOI, 6) +#define TRAINER_IN_TIMER_Channel LL_TIM_CHANNEL_CH2 + +#define TRAINER_OUT_GPIO GPIO_PIN(GPIOI, 5) +#define TRAINER_OUT_TIMER_Channel LL_TIM_CHANNEL_CH1 + +#define TRAINER_TIMER TIM8 +#define TRAINER_TIMER_IRQn TIM8_CC_IRQn +#define TRAINER_TIMER_IRQHandler TIM8_CC_IRQHandler +#define TRAINER_GPIO_AF LL_GPIO_AF_3 +#define TRAINER_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) + +#define TRAINER_DETECT_GPIO GPIO_PIN(GPIOH, 4) + +// AUX ports +#define AUX_SERIAL_TX_GPIO GPIO_PIN(GPIOB, 6) // PB.06 +#define AUX_SERIAL_RX_GPIO GPIO_PIN(GPIOB, 5) // PB.05 +#define AUX_SERIAL_USART UART5 +#define AUX_SERIAL_USART_IRQHandler UART5_IRQHandler +#define AUX_SERIAL_USART_IRQn UART5_IRQn +#define AUX_SERIAL_DMA_TX DMA2 +#define AUX_SERIAL_DMA_TX_STREAM LL_DMA_STREAM_1 +#define AUX_SERIAL_DMA_TX_CHANNEL LL_DMAMUX1_REQ_UART5_TX +#define AUX_SERIAL_DMA_RX DMA2 +#define AUX_SERIAL_DMA_RX_STREAM LL_DMA_STREAM_2 +#define AUX_SERIAL_DMA_RX_CHANNEL LL_DMAMUX1_REQ_UART5_RX +#define AUX_SERIAL_PWR_GPIO GPIO_PIN(GPIOB, 7) // PB.07 + +#define AUX2_SERIAL_TX_GPIO GPIO_PIN(GPIOB, 10) // PB.10 +#define AUX2_SERIAL_RX_GPIO GPIO_PIN(GPIOB, 11) // PB.11 +#define AUX2_SERIAL_USART USART3 +#define AUX2_SERIAL_USART_IRQHandler USART3_IRQHandler +#define AUX2_SERIAL_USART_IRQn USART3_IRQn +#define AUX2_SERIAL_DMA_TX DMA2 +#define AUX2_SERIAL_DMA_TX_STREAM LL_DMA_STREAM_7 +#define AUX2_SERIAL_DMA_TX_CHANNEL LL_DMAMUX1_REQ_USART3_TX +#define AUX2_SERIAL_DMA_RX DMA1 +#define AUX2_SERIAL_DMA_RX_STREAM LL_DMA_STREAM_6 +#define AUX2_SERIAL_DMA_RX_CHANNEL LL_DMAMUX1_REQ_USART3_RX +#define AUX2_SERIAL_PWR_GPIO GPIO_PIN(GPIOC, 13) // PC.13 + +// Touch +#define TOUCH_I2C_BUS I2C_Bus_1 +#define TOUCH_INT_GPIO GPIO_PIN(GPIOE, 2) // PE.02 +#define TOUCH_RST_GPIO GPIO_PIN(GPIOJ, 13) // PJ.13 + +// TOUCH_INT_EXTI IRQ +#if !defined(USE_EXTI2_IRQ) +#define USE_EXTI2_IRQ +#define EXTI2_IRQ_Priority 9 +#endif + +#define IMU_I2C_BUS I2C_Bus_2 +#define IMU_I2C_ADDRESS 0x6A +#define IMU_INT_GPIO GPIO_PIN(GPIOG, 13) // PG.13 +#if !defined(USE_EXTI15_10_IRQ) + #define USE_EXTI15_10_IRQ + #define EXTI15_10_IRQ_Priority 6 +#endif + +//ROTARY emulation for trims as buttons +#define ROTARY_ENCODER_NAVIGATION +// Rotary Encoder +#define ROTARY_ENCODER_INVERTED +#define ROTARY_ENCODER_GPIO_A GPIOI +#define ROTARY_ENCODER_GPIO_PIN_A LL_GPIO_PIN_7 +#define ROTARY_ENCODER_GPIO_B GPIOJ +#define ROTARY_ENCODER_GPIO_PIN_B LL_GPIO_PIN_8 +#define ROTARY_ENCODER_POSITION() (((ROTARY_ENCODER_GPIO_A->IDR >> 7) & 0x01)|((ROTARY_ENCODER_GPIO_B->IDR >> 7) & 0x02)) +#define ROTARY_ENCODER_EXTI_LINE1 LL_EXTI_LINE_7 +#define ROTARY_ENCODER_EXTI_LINE2 LL_EXTI_LINE_8 +#if !defined(USE_EXTI7_IRQ) + #define USE_EXTI7_IRQ + #define EXTI7_IRQ_Priority 5 +#endif +#if !defined(USE_EXTI8_IRQ) + #define USE_EXTI8_IRQ + #define EXTI8_IRQ_Priority 5 +#endif +#define ROTARY_ENCODER_EXTI_PORT_A LL_SYSCFG_EXTI_PORTI +#define ROTARY_ENCODER_EXTI_PORT_B LL_SYSCFG_EXTI_PORTJ +#define ROTARY_ENCODER_EXTI_SYS_LINE1 LL_SYSCFG_EXTI_LINE7 +#define ROTARY_ENCODER_EXTI_SYS_LINE2 LL_SYSCFG_EXTI_LINE8 +#define ROTARY_ENCODER_TIMER TIM17 +#define ROTARY_ENCODER_TIMER_IRQn TIM17_IRQn +#define ROTARY_ENCODER_TIMER_IRQHandler TIM17_IRQHandler + +// Millisecond timer +#define MS_TIMER TIM14 +#define MS_TIMER_IRQn TIM8_TRG_COM_TIM14_IRQn +#define MS_TIMER_IRQHandler TIM8_TRG_COM_TIM14_IRQHandler + +// Mixer scheduler timer +#define MIXER_SCHEDULER_TIMER TIM12 +#define MIXER_SCHEDULER_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) +#define MIXER_SCHEDULER_TIMER_IRQn TIM8_BRK_TIM12_IRQn +#define MIXER_SCHEDULER_TIMER_IRQHandler TIM8_BRK_TIM12_IRQHandler + +#define LCD_W 800 +#define LCD_H 480 + +#define LCD_PHYS_W LCD_W +#define LCD_PHYS_H LCD_H + +#define LCD_DEPTH 16 + +#define LSE_DRIVE_STRENGTH RCC_LSEDRIVE_HIGH + +#endif // _HAL_H_ diff --git a/radio/src/targets/tx16smk3/key_driver.cpp b/radio/src/targets/tx16smk3/key_driver.cpp new file mode 100644 index 000000000..2684f5465 --- /dev/null +++ b/radio/src/targets/tx16smk3/key_driver.cpp @@ -0,0 +1,93 @@ +/* + * 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 "hal/key_driver.h" + +#include "bsp_io.h" +#include "stm32_hal_ll.h" +#include "stm32_gpio_driver.h" +#include "stm32_i2c_driver.h" + +#include "hal.h" +#include "delays_driver.h" +#include "keys.h" + +#include "stm32_keys.inc" +#include "debug.h" + +void keysInit() { + _init_keys(); + _init_trims(); +} + +uint32_t readKeys() { return _read_keys(); } + +/* The output bit-order has to be: + 0 LHL TR3L (Left equals down) + 1 LHR TR3R + 2 LVD TR1D + 3 LVU TR1U + 4 RVD TR2D + 5 RVU TR2U + 6 RHL TR4L + 7 RHR TR4R +*/ + +enum PhysicalTrims { + TR3L = 0, + TR3R, + TR1D = 2, + TR1U, + TR2D = 4, + TR2U, + TR4L = 6, + TR4R, + TR5U = 8, + TR5D, + TR6U = 10, + TR6D +}; + +uint32_t readTrims() +{ + uint32_t result = 0; + uint32_t keys = bsp_get_fs_switches(); + +#define _TRIM(t) \ + if ((keys & BSP_##t) == 0) result |= 1 << t; + + _TRIM(TR1U); + _TRIM(TR1D); + _TRIM(TR3L); + _TRIM(TR3R); + _TRIM(TR2U); + _TRIM(TR2D); + _TRIM(TR4L); + _TRIM(TR4R); + if (!LL_GPIO_IsInputPinSet(GPIOH, LL_GPIO_PIN_15)) result |= (1 << TR5U); + if (!LL_GPIO_IsInputPinSet(GPIOH, LL_GPIO_PIN_13)) result |= (1 << TR5D); + _TRIM(TR6U); + _TRIM(TR6D); + +#undef _TRIM + + return result; +} diff --git a/radio/src/targets/tx16smk3/usb_descriptor.h b/radio/src/targets/tx16smk3/usb_descriptor.h new file mode 100644 index 000000000..58b63795b --- /dev/null +++ b/radio/src/targets/tx16smk3/usb_descriptor.h @@ -0,0 +1,29 @@ +/* + * 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. + */ + +#ifndef _USB_DESCRIPTOR_H_ +#define _USB_DESCRIPTOR_H_ + +#define USB_NAME "TX16SMK3" +#define USB_MANUFACTURER 'R', 'M', ' ', ' ', ' ', ' ', ' ', ' ' /* 8 bytes */ +#define USB_PRODUCT 'T', 'X', '1', '6', 'S', 'M', 'K', '3' /* 8 Bytes */ + +#endif // _USB_DESCRIPTOR_H_ diff --git a/radio/src/tests/images/color/bitmap_800x480.png b/radio/src/tests/images/color/bitmap_800x480.png new file mode 100644 index 000000000..16245115e Binary files /dev/null and b/radio/src/tests/images/color/bitmap_800x480.png differ diff --git a/radio/src/tests/images/color/clipping_800x480.png b/radio/src/tests/images/color/clipping_800x480.png new file mode 100644 index 000000000..1e4350995 Binary files /dev/null and b/radio/src/tests/images/color/clipping_800x480.png differ diff --git a/radio/src/tests/images/color/lines_800x480.png b/radio/src/tests/images/color/lines_800x480.png new file mode 100644 index 000000000..756df429c Binary files /dev/null and b/radio/src/tests/images/color/lines_800x480.png differ diff --git a/radio/src/tests/images/color/masks_800x480.png b/radio/src/tests/images/color/masks_800x480.png new file mode 100644 index 000000000..e2264a779 Binary files /dev/null and b/radio/src/tests/images/color/masks_800x480.png differ diff --git a/radio/src/tests/images/color/primitives_EN_800x480.png b/radio/src/tests/images/color/primitives_EN_800x480.png new file mode 100644 index 000000000..570dcabbf Binary files /dev/null and b/radio/src/tests/images/color/primitives_EN_800x480.png differ diff --git a/radio/src/tests/images/color/transparency_EN_800x480.png b/radio/src/tests/images/color/transparency_EN_800x480.png new file mode 100644 index 000000000..3f3f8b48f Binary files /dev/null and b/radio/src/tests/images/color/transparency_EN_800x480.png differ diff --git a/radio/src/tests/images/color/vline_800x480.png b/radio/src/tests/images/color/vline_800x480.png new file mode 100644 index 000000000..805882d8a Binary files /dev/null and b/radio/src/tests/images/color/vline_800x480.png differ diff --git a/radio/src/translations/i18n/cn.h b/radio/src/translations/i18n/cn.h index 27b150085..65f106064 100644 --- a/radio/src/translations/i18n/cn.h +++ b/radio/src/translations/i18n/cn.h @@ -371,6 +371,7 @@ #define TR_SRC_BATT "Batt" #define TR_SRC_TIME "Time" #define TR_SRC_GPS "GPS" +#define TR_SRC_LIGHT "Ambient light" #define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES_1 "OFF" diff --git a/radio/src/translations/i18n/cz.h b/radio/src/translations/i18n/cz.h index 18119a5c0..f9f43d8fa 100644 --- a/radio/src/translations/i18n/cz.h +++ b/radio/src/translations/i18n/cz.h @@ -372,6 +372,7 @@ #define TR_SRC_BATT "Bat." #define TR_SRC_TIME "Čas" #define TR_SRC_GPS "GPS" +#define TR_SRC_LIGHT "Ambient light" #define TR_SRC_TIMER "Čas" #define TR_VTMRMODES_1 "VYP" diff --git a/radio/src/translations/i18n/da.h b/radio/src/translations/i18n/da.h index 1cd475e74..02d999bb0 100644 --- a/radio/src/translations/i18n/da.h +++ b/radio/src/translations/i18n/da.h @@ -373,6 +373,7 @@ #define TR_SRC_BATT "Bat." #define TR_SRC_TIME "Time" #define TR_SRC_GPS "GPS" +#define TR_SRC_LIGHT "Ambient light" #define TR_SRC_TIMER "Tid" #define TR_VTMRMODES_1 "FRA" diff --git a/radio/src/translations/i18n/de.h b/radio/src/translations/i18n/de.h index 2008185e5..4269701b2 100644 --- a/radio/src/translations/i18n/de.h +++ b/radio/src/translations/i18n/de.h @@ -372,6 +372,7 @@ #define TR_SRC_BATT "Batt" #define TR_SRC_TIME "Time" #define TR_SRC_GPS "GPS" +#define TR_SRC_LIGHT "Ambient light" #define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES_1 "AUS" diff --git a/radio/src/translations/i18n/en.h b/radio/src/translations/i18n/en.h index 166c296f2..5147b5b09 100644 --- a/radio/src/translations/i18n/en.h +++ b/radio/src/translations/i18n/en.h @@ -371,6 +371,7 @@ #define TR_SRC_BATT "Batt" #define TR_SRC_TIME "Time" #define TR_SRC_GPS "GPS" +#define TR_SRC_LIGHT "Ambient light" #define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES_1 "OFF" diff --git a/radio/src/translations/i18n/es.h b/radio/src/translations/i18n/es.h index 82430f41e..cab24542b 100644 --- a/radio/src/translations/i18n/es.h +++ b/radio/src/translations/i18n/es.h @@ -369,6 +369,7 @@ #define TR_SRC_BATT "Batt" #define TR_SRC_TIME "Time" #define TR_SRC_GPS "GPS" +#define TR_SRC_LIGHT "Ambient light" #define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES_1 "OFF" diff --git a/radio/src/translations/i18n/fi.h b/radio/src/translations/i18n/fi.h index 0050b0b47..97ff37eaa 100644 --- a/radio/src/translations/i18n/fi.h +++ b/radio/src/translations/i18n/fi.h @@ -370,6 +370,7 @@ #define TR_SRC_BATT "Batt" #define TR_SRC_TIME "Time" #define TR_SRC_GPS "GPS" +#define TR_SRC_LIGHT "Ambient light" #define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES_1 "OFF" diff --git a/radio/src/translations/i18n/fr.h b/radio/src/translations/i18n/fr.h index e9a391d2c..505e42deb 100644 --- a/radio/src/translations/i18n/fr.h +++ b/radio/src/translations/i18n/fr.h @@ -373,6 +373,7 @@ #define TR_SRC_BATT "Batt" #define TR_SRC_TIME "H_M" #define TR_SRC_GPS "GPS" +#define TR_SRC_LIGHT "Ambient light" #define TR_SRC_TIMER "Chrono" #define TR_VTMRMODES_1 "OFF" diff --git a/radio/src/translations/i18n/he.h b/radio/src/translations/i18n/he.h index 53b30d846..5d4316f4d 100644 --- a/radio/src/translations/i18n/he.h +++ b/radio/src/translations/i18n/he.h @@ -374,6 +374,7 @@ #define TR_SRC_BATT "סוללה" #define TR_SRC_TIME "זמן" #define TR_SRC_GPS "GPS" +#define TR_SRC_LIGHT "Ambient light" #define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES_1 "OFF" diff --git a/radio/src/translations/i18n/it.h b/radio/src/translations/i18n/it.h index 9b41bf899..61e2e53a5 100644 --- a/radio/src/translations/i18n/it.h +++ b/radio/src/translations/i18n/it.h @@ -371,6 +371,7 @@ #define TR_SRC_BATT "Batt" #define TR_SRC_TIME "Time" #define TR_SRC_GPS "GPS" +#define TR_SRC_LIGHT "Ambient light" #define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES_1 "OFF" diff --git a/radio/src/translations/i18n/jp.h b/radio/src/translations/i18n/jp.h index e5ba9c0e8..046a54c37 100644 --- a/radio/src/translations/i18n/jp.h +++ b/radio/src/translations/i18n/jp.h @@ -370,6 +370,7 @@ #define TR_SRC_BATT "Batt" #define TR_SRC_TIME "Time" #define TR_SRC_GPS "GPS" +#define TR_SRC_LIGHT "Ambient light" #define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES_1 "OFF" diff --git a/radio/src/translations/i18n/ko.h b/radio/src/translations/i18n/ko.h index c30d59f27..a43b40830 100644 --- a/radio/src/translations/i18n/ko.h +++ b/radio/src/translations/i18n/ko.h @@ -369,6 +369,7 @@ #define TR_SRC_BATT "배터리" #define TR_SRC_TIME "시간" #define TR_SRC_GPS "GPS" +#define TR_SRC_LIGHT "Ambient light" #define TR_SRC_TIMER "타이머" diff --git a/radio/src/translations/i18n/nl.h b/radio/src/translations/i18n/nl.h index 968f39a88..be767ba75 100644 --- a/radio/src/translations/i18n/nl.h +++ b/radio/src/translations/i18n/nl.h @@ -371,6 +371,7 @@ #define TR_SRC_BATT "Batt" #define TR_SRC_TIME "Time" #define TR_SRC_GPS "GPS" +#define TR_SRC_LIGHT "Ambient light" #define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES_1 "UIT" diff --git a/radio/src/translations/i18n/pl.h b/radio/src/translations/i18n/pl.h index bd3452fb2..2a9817b48 100644 --- a/radio/src/translations/i18n/pl.h +++ b/radio/src/translations/i18n/pl.h @@ -370,6 +370,7 @@ #define TR_SRC_BATT "Batt" #define TR_SRC_TIME "Time" #define TR_SRC_GPS "GPS" +#define TR_SRC_LIGHT "Ambient light" #define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES_1 "WYŁ" diff --git a/radio/src/translations/i18n/pt.h b/radio/src/translations/i18n/pt.h index 649f725a9..03b35b741 100644 --- a/radio/src/translations/i18n/pt.h +++ b/radio/src/translations/i18n/pt.h @@ -371,6 +371,7 @@ #define TR_SRC_BATT "Batt" #define TR_SRC_TIME "Time" #define TR_SRC_GPS "GPS" +#define TR_SRC_LIGHT "Ambient light" #define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES_1 "DESL" diff --git a/radio/src/translations/i18n/ru.h b/radio/src/translations/i18n/ru.h index a478a1e94..5bb7fd742 100644 --- a/radio/src/translations/i18n/ru.h +++ b/radio/src/translations/i18n/ru.h @@ -373,6 +373,7 @@ #define TR_SRC_BATT "АКБ" #define TR_SRC_TIME "Время" #define TR_SRC_GPS "GPS" +#define TR_SRC_LIGHT "Ambient light" #define TR_SRC_TIMER "ТМР" #define TR_VTMRMODES_1 "Вык" diff --git a/radio/src/translations/i18n/se.h b/radio/src/translations/i18n/se.h index 88ad552db..adc2f895c 100644 --- a/radio/src/translations/i18n/se.h +++ b/radio/src/translations/i18n/se.h @@ -373,6 +373,7 @@ #define TR_SRC_BATT "Batt" #define TR_SRC_TIME "Tid" #define TR_SRC_GPS "GPS" +#define TR_SRC_LIGHT "Ambient light" #define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES_1 "Av" diff --git a/radio/src/translations/i18n/tw.h b/radio/src/translations/i18n/tw.h index 48e59e199..dabfbccd3 100644 --- a/radio/src/translations/i18n/tw.h +++ b/radio/src/translations/i18n/tw.h @@ -369,6 +369,7 @@ #define TR_SRC_BATT "Batt" #define TR_SRC_TIME "Time" #define TR_SRC_GPS "GPS" +#define TR_SRC_LIGHT "Ambient light" #define TR_SRC_TIMER "Tmr" #define TR_VTMRMODES_1 "OFF" diff --git a/radio/src/translations/i18n/ua.h b/radio/src/translations/i18n/ua.h index b72428855..50243222a 100644 --- a/radio/src/translations/i18n/ua.h +++ b/radio/src/translations/i18n/ua.h @@ -372,6 +372,7 @@ #define TR_SRC_BATT "Batt" /* use english */ #define TR_SRC_TIME "Час" #define TR_SRC_GPS "GPS" /* use english */ +#define TR_SRC_LIGHT "Ambient light" #define TR_SRC_TIMER "Тмр" #define TR_VTMRMODES_1 "OFF" diff --git a/radio/src/translations/sim_string_list.h b/radio/src/translations/sim_string_list.h index 62ffe7e15..16c05abda 100644 --- a/radio/src/translations/sim_string_list.h +++ b/radio/src/translations/sim_string_list.h @@ -946,6 +946,7 @@ #define STR_SPORT_UPDATE_POWER_MODE currentLangStrings->STR_SPORT_UPDATE_POWER_MODE #define STR_SRC_BATT currentLangStrings->STR_SRC_BATT #define STR_SRC_GPS currentLangStrings->STR_SRC_GPS +#define STR_SRC_LIGHT currentLangStrings->STR_SRC_LIGHT #define STR_SRC_TIME currentLangStrings->STR_SRC_TIME #define STR_SRC_TIMER currentLangStrings->STR_SRC_TIMER #define STR_STACK_AUDIO currentLangStrings->STR_STACK_AUDIO diff --git a/radio/src/translations/string_list.h b/radio/src/translations/string_list.h index dbe30cf43..ac04fc90a 100644 --- a/radio/src/translations/string_list.h +++ b/radio/src/translations/string_list.h @@ -945,6 +945,7 @@ STR(SPLASHSCREEN) STR(SPORT_UPDATE_POWER_MODE) STR(SRC_BATT) STR(SRC_GPS) +STR(SRC_LIGHT) STR(SRC_TIME) STR(SRC_TIMER) STR(STACK_AUDIO) diff --git a/radio/util/hw_defs/hal_adc.py b/radio/util/hw_defs/hal_adc.py index 52aaef290..51b86500d 100644 --- a/radio/util/hw_defs/hal_adc.py +++ b/radio/util/hw_defs/hal_adc.py @@ -100,6 +100,11 @@ class ADCInputParser: 'name': 'RTC_BAT', 'suffix': 'RTC_BAT', }, + { + 'type': 'LUX', + 'name': 'LUX', + 'suffix': 'LUX', + }, { 'range': AZ_seq(), 'type': ADCInput.TYPE_SWITCH, @@ -237,7 +242,7 @@ class ADCInputParser: if 'PWM_STICKS' in self.hw_defs: ch = self.hw_defs.get(f'STICK_PWM_CHANNEL_{adc_input.name}') adc_input.pwm_channel = idx if ch is None else ch - if adc_input.type != 'VBAT' and adc_input.type != 'RTC_BAT': + if adc_input.type != 'VBAT' and adc_input.type != 'RTC_BAT' and adc_input.type != 'LUX': d = self.dirs[idx] if d < 0: adc_input.inverted = True diff --git a/radio/util/hw_defs/hal_adc_inputs.jinja b/radio/util/hw_defs/hal_adc_inputs.jinja index 26d158292..8181ecce5 100644 --- a/radio/util/hw_defs/hal_adc_inputs.jinja +++ b/radio/util/hw_defs/hal_adc_inputs.jinja @@ -48,12 +48,22 @@ static const etx_hal_adc_input_t _rtc_bat_inputs[] = { {% endfor %} }; -{% set n_inputs = rtc_bat_offset + n_rtc_bat %} +{% set lux_offset = rtc_bat_offset + n_rtc_bat %} +{% set lux_inputs = adc_inputs.inputs | selectattr('type', '==', 'LUX') | list %} +{% set n_lux = lux_inputs | count %} +static const etx_hal_adc_input_t _lux_inputs[] = { + {% for input in lux_inputs %} + { "{{ input.name }}", nullptr, nullptr }, + {% endfor %} +}; + +{% set n_inputs = lux_offset + n_lux %} static const etx_hal_adc_inputs_t _hal_inputs[] = { { {{ n_mains }}, 0, _main_inputs }, { {{ n_flex }}, {{ flex_offset }}, _flex_inputs }, { {{ n_vbat }}, {{ vbat_offset }}, _vbat_inputs }, { {{ n_rtc_bat }}, {{ rtc_bat_offset }}, _rtc_bat_inputs }, + { {{ n_lux }}, {{ lux_offset }}, _lux_inputs }, { {{ n_inputs }}, 0, nullptr }, }; diff --git a/radio/util/hw_defs/hal_keys.py b/radio/util/hw_defs/hal_keys.py index 8a00b0a31..6c255a28b 100644 --- a/radio/util/hw_defs/hal_keys.py +++ b/radio/util/hw_defs/hal_keys.py @@ -58,7 +58,7 @@ KEYS = [ KEY_LABELS = [ { - "targets": {"boxer", "f16", "mt12", "gx12", "pocket", "tx12", "tx12mk2", "tx16s", "v16", "zorro"}, + "targets": {"boxer", "f16", "mt12", "gx12", "pocket", "tx12", "tx12mk2", "tx16s", "tx16smk3","v16", "zorro"}, "keys": { "EXIT": { "label": "RTN" } } diff --git a/radio/util/hw_defs/legacy_names.py b/radio/util/hw_defs/legacy_names.py index d0101f382..86f9d6c29 100644 --- a/radio/util/hw_defs/legacy_names.py +++ b/radio/util/hw_defs/legacy_names.py @@ -89,6 +89,73 @@ LEGACY_NAMES = [ } } }, + { + "targets": {"tx16smk3"}, + "inputs": { + "LH": { + "yaml": "Rud", + "lua": "rud", + "description": "Rudder" + }, + "LV": { + "yaml": "Ele", + "lua": "ele", + "description": "Elevator" + }, + "RV": { + "yaml": "Thr", + "lua": "thr", + "description": "Throttle" + }, + "RH": { + "yaml": "Ail", + "lua": "ail", + "description": "Aileron" + }, + "P1": { + "yaml": "S1", + "lua": "s1", + "label": "S1", + "short_label": "1", + "description": "Potentiometer S1" + }, + "P2": { + "yaml": "S2", + "lua": "s2", + "label": "S2", + "short_label": "2", + "description": "Potentiometer S2" + }, + "SL1": { + "yaml": "LS", + "lua": "ls", + "label": "LS", + "short_label": "L", + "description": "Left slider" + }, + "SL2": { + "yaml": "RS", + "lua": "rs", + "label": "RS", + "short_label": "R", + "description": "Right slider" + }, + "EXT1": { + "yaml": "EXT1", + "lua": "ext1", + "label": "EXT1", + "short_label": "E1", + "description": "Ext 1" + }, + "EXT2": { + "yaml": "EXT2", + "lua": "ext2", + "label": "EXT2", + "short_label": "E2", + "description": "Ext 2" + } + } + }, { "targets": {"t15", "t15pro", "tx15"}, "inputs": { diff --git a/radio/util/hw_defs/pot_config.py b/radio/util/hw_defs/pot_config.py index 8f5dcbfcd..bde8cf904 100644 --- a/radio/util/hw_defs/pot_config.py +++ b/radio/util/hw_defs/pot_config.py @@ -157,6 +157,14 @@ POT_CONFIG = { "SL1": {"default": "SLIDER"}, "SL2": {"default": "SLIDER"} }, + "tx16smk3": { + "P1": {"default": "POT_CENTER"}, + "P2": {"default": "POT_CENTER"}, + "SL1": {"default": "SLIDER"}, + "SL2": {"default": "SLIDER"}, + "EXT1": {"default": "NONE"}, + "EXT2": {"default": "NONE"}, + }, "f16": { "P1": {"default": "POT_CENTER"}, "P2": {"default": "MULTIPOS"}, diff --git a/radio/util/hw_defs/switch_config.py b/radio/util/hw_defs/switch_config.py index e72eb24c2..8a0fbab05 100644 --- a/radio/util/hw_defs/switch_config.py +++ b/radio/util/hw_defs/switch_config.py @@ -420,6 +420,26 @@ SWITCH_CONFIG = { "SG": {"default": "3POS"}, "SH": {"default": "TOGGLE"} }, + "tx16smk3": { + "SA": {"default": "3POS"}, + "SB": {"default": "3POS"}, + "SC": {"default": "3POS"}, + "SD": {"default": "3POS"}, + "SE": {"default": "3POS"}, + "SF": {"default": "2POS"}, + "SG": {"default": "3POS"}, + "SH": {"default": "2POS"}, + #optional + "SI": {"default": "NONE"}, + "SJ": {"default": "NONE"}, + # custom switches + "SK": {"default": "2POS"}, + "SL": {"default": "2POS"}, + "SM": {"default": "2POS"}, + "SN": {"default": "2POS"}, + "SO": {"default": "2POS"}, + "SP": {"default": "2POS"}, + }, "f16": { "SA": {"default": "3POS"}, "SB": {"default": "3POS"}, diff --git a/tools/build-common.sh b/tools/build-common.sh index 69f07e57b..ac9fb1524 100644 --- a/tools/build-common.sh +++ b/tools/build-common.sh @@ -125,6 +125,9 @@ get_target_build_options() { tx16s) BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=TX16S" ;; + tx16smk3) + BUILD_OPTIONS+="-DPCB=TX16SMK3" + ;; f16) BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=F16" ;; diff --git a/tools/build-companion.sh b/tools/build-companion.sh index 230249a5e..434452510 100755 --- a/tools/build-companion.sh +++ b/tools/build-companion.sh @@ -219,7 +219,7 @@ declare -a simulator_plugins=( t8 t12 t12max tx12 tx12mk2 t15 t15pro t16 t18 t20 t20v2 xlite xlites x10 x10express x12s - zorro tx16s tx15 + zorro tx16s tx16smk3 tx15 commando8 boxer pocket mt12 gx12 tlite tpro tprov2 tpros bumblebee lr3pro t14 nv14 el18 pl18 pl18ev pl18u st16 pa01 diff --git a/tools/generate-hw-defs.sh b/tools/generate-hw-defs.sh index 811c97454..8c931daaf 100755 --- a/tools/generate-hw-defs.sh +++ b/tools/generate-hw-defs.sh @@ -9,7 +9,7 @@ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" : "${SRCDIR:=$(dirname "$(pwd)/$0")/..}" -: ${FLAVOR:="nv14;el18;pl18;pl18ev;nb4p;st16;t12;t12max;t15;t15pro;t16;t18;t8;zorro;pocket;commando8;tlite;tpro;tprov2;tpros;bumblebee;t20;t20v2;t14;lr3pro;mt12;gx12;tx12;tx12mk2;boxer;tx16s;x10;x10express;x12s;x7;x7access;x9d;x9dp;x9dp2019;x9e;x9lite;x9lites;xlite;xlites;f16;v14;v12;tx15"} +: ${FLAVOR:="nv14;el18;pl18;pl18ev;nb4p;st16;t12;t12max;t15;t15pro;t16;t18;t8;zorro;pocket;commando8;tlite;tpro;tprov2;tpros;bumblebee;t20;t20v2;t14;lr3pro;mt12;gx12;tx12;tx12mk2;boxer;tx16s;tx16smk3;x10;x10express;x12s;x7;x7access;x9d;x9dp;x9dp2019;x9e;x9lite;x9lites;xlite;xlites;f16;v14;v12;tx15"} : ${COMMON_OPTIONS:="-DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_RULE_MESSAGES=OFF -Wno-dev -DCMAKE_MESSAGE_LOG_LEVEL=WARNING"} # wipe build directory clean diff --git a/tools/generate-yaml.sh b/tools/generate-yaml.sh index bc37f1af9..402f2ca1b 100755 --- a/tools/generate-yaml.sh +++ b/tools/generate-yaml.sh @@ -11,7 +11,7 @@ if [[ -n ${GCC_ARM} ]] ; then export PATH=${GCC_ARM}:$PATH fi -: ${FLAVOR:="t15;tx16s;pl18;nv14;pl18u;nb4p;x9d;x9dp2019;x9e;xlite;xlites;x7;tpro;t20;f16;gx12;st16;pa01;tx15;t15pro"} +: ${FLAVOR:="t15;tx16s;pl18;nv14;pl18u;nb4p;x9d;x9dp2019;x9e;xlite;xlites;x7;tpro;t20;f16;gx12;st16;pa01;tx15;t15pro;tx16smk3"} : ${SRCDIR:=$(dirname "$(pwd)/$0")/..} : ${COMMON_OPTIONS:="-DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_RULE_MESSAGES=OFF -Wno-dev -DDISABLE_COMPANION=YES -DCMAKE_MESSAGE_LOG_LEVEL=WARNING"}