diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index a533afa99..c52e7a78d 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -91,6 +91,7 @@ body: options: - BetaFPV LiteRadio3 Pro - iFlight Commando8 + - Fatfish F16 - Flysky EL18 - Flysky NV14 - Flysky PL18/PL18EV diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index b3d32a569..5bf57f489 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -104,6 +104,7 @@ jobs: - t20;t20v2;t14 - tx12;tx12mk2;boxer - tx16s + - f16 - x10;x10-access - x12s - x7;x7-access diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index e9b3ed909..85b3503a8 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -25,6 +25,7 @@ jobs: - t20;t20v2;t14 - tx12;tx12mk2;boxer - tx16s + - f16 - x10;x10-access - x12s - x7;x7-access diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index f41b0873b..f194e151a 100644 --- a/companion/src/CMakeLists.txt +++ b/companion/src/CMakeLists.txt @@ -334,6 +334,8 @@ elseif(PCB STREQUAL X10 AND PCBREV STREQUAL EXPRESS) set(FLAVOUR x10express) elseif(PCB STREQUAL X10 AND PCBREV STREQUAL TX16S) set(FLAVOUR tx16s) +elseif(PCB STREQUAL X10 AND PCBREV STREQUAL F16) + set(FLAVOUR f16) elseif(PCB STREQUAL X7 AND PCBREV STREQUAL T14) set(FLAVOUR t14) elseif(PCB STREQUAL X10 AND PCBREV STREQUAL T15) diff --git a/companion/src/companion.qrc b/companion/src/companion.qrc index 6c4d972a2..4f292828b 100644 --- a/companion/src/companion.qrc +++ b/companion/src/companion.qrc @@ -257,6 +257,10 @@ images/simulator/T8/right-dn.png images/simulator/T8/bottom.png images/simulator/T8/top.png + images/simulator/Fatfish/F16/left.png + images/simulator/Fatfish/F16/right.png + images/simulator/Fatfish/F16/top.png + images/simulator/Fatfish/F16/bottom.png images/simulator/JumperT14/bottom.png images/simulator/JumperT14/left.png images/simulator/JumperT14/right.png diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp index 0bfde994f..09bf2e1ba 100644 --- a/companion/src/firmwares/boards.cpp +++ b/companion/src/firmwares/boards.cpp @@ -209,6 +209,7 @@ int Boards::getEEpromSize(Board::Type board) case BOARD_FLYSKY_NV14: case BOARD_FLYSKY_EL18: case BOARD_FLYSKY_PL18: + case BOARD_FATFISH_F16: return 0; default: return 0; @@ -260,6 +261,7 @@ int Boards::getFlashSize(Type board) case BOARD_FLYSKY_NV14: case BOARD_FLYSKY_EL18: case BOARD_FLYSKY_PL18: + case BOARD_FATFISH_F16: return FSIZE_HORUS; case BOARD_UNKNOWN: return FSIZE_MAX; @@ -568,6 +570,8 @@ QString Boards::getBoardName(Board::Type board) return "BETAFPV LR3PRO"; case BOARD_IFLIGHT_COMMANDO8: return "iFlight Commando 8"; + case BOARD_FATFISH_F16: + return "Fatfish F16"; default: return CPN_STR_UNKNOWN_ITEM; } @@ -675,6 +679,7 @@ int Boards::getDefaultInternalModules(Board::Type board) case BOARD_JUMPER_T15: case BOARD_JUMPER_T20: case BOARD_JUMPER_T20V2: + case BOARD_FATFISH_F16: return (int)MODULE_TYPE_CROSSFIRE; case BOARD_FLYSKY_NV14: diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index 6859053f5..521e0a89d 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -83,6 +83,7 @@ namespace Board { BOARD_JUMPER_TPROV2, BOARD_RADIOMASTER_POCKET, BOARD_JUMPER_T20V2, + BOARD_FATFISH_F16, BOARD_TYPE_COUNT, BOARD_TYPE_MAX = BOARD_TYPE_COUNT - 1 }; @@ -490,15 +491,19 @@ inline bool IS_RADIOMASTER_POCKET(Board::Type board) return board == Board::BOARD_RADIOMASTER_POCKET; } - inline bool IS_RADIOMASTER_T8(Board::Type board) { return board == Board::BOARD_RADIOMASTER_T8; } +inline bool IS_FATFISH_F16(Board::Type board) +{ + return board == Board::BOARD_FATFISH_F16; +} + inline bool IS_FAMILY_T16(Board::Type board) { - return board == Board::BOARD_JUMPER_T15 || board == Board::BOARD_JUMPER_T16 || board == Board::BOARD_RADIOMASTER_TX16S || board == Board::BOARD_JUMPER_T18; + return board == Board::BOARD_JUMPER_T15 || board == Board::BOARD_JUMPER_T16 || board == Board::BOARD_RADIOMASTER_TX16S || board == Board::BOARD_JUMPER_T18 || board == Board::BOARD_FATFISH_F16; } inline bool IS_FAMILY_T12(Board::Type board) diff --git a/companion/src/firmwares/customfunctiondata.cpp b/companion/src/firmwares/customfunctiondata.cpp index 69ddac14a..fc5d939a4 100644 --- a/companion/src/firmwares/customfunctiondata.cpp +++ b/companion/src/firmwares/customfunctiondata.cpp @@ -129,6 +129,8 @@ QString CustomFunctionData::funcToString(const AssignFunc func, const ModelData return tr("Audio Amp Off"); else if (func == FuncRGBLed) return tr("RGB leds"); + else if (func == FuncLCDtoVideo) + return tr("LCD to Video"); else { return QString(CPN_STR_UNKNOWN_ITEM); } @@ -253,9 +255,10 @@ bool CustomFunctionData::isFuncAvailable(const int index, const ModelData * mode ((index >= FuncRangeCheckInternalModule && index <= FuncBindExternalModule) && !fw->getCapability(DangerousFunctions)) || ((index >= FuncAdjustGV1 && index <= FuncAdjustGVLast) && !fw->getCapability(Gvars)) || ((index == FuncDisableTouch) && !IS_HORUS_OR_TARANIS(fw->getBoard())) || - ((index == FuncSetScreen && !Boards::getCapability(fw->getBoard(), Board::HasColorLcd)) || + ((index == FuncSetScreen && !Boards::getCapability(fw->getBoard(), Board::HasColorLcd))) || ((index == FuncDisableAudioAmp && !Boards::getCapability(fw->getBoard(), Board::HasAudioMuteGPIO))) || - ((index == FuncRGBLed && !Boards::getCapability(fw->getBoard(), Board::HasLedStripGPIO)))) + ((index == FuncRGBLed && !Boards::getCapability(fw->getBoard(), Board::HasLedStripGPIO))) || + ((index == FuncLCDtoVideo && !IS_FATFISH_F16(fw->getBoard()))) ); return !ret; } diff --git a/companion/src/firmwares/customfunctiondata.h b/companion/src/firmwares/customfunctiondata.h index b52d9f0cb..0d6c3f1e7 100644 --- a/companion/src/firmwares/customfunctiondata.h +++ b/companion/src/firmwares/customfunctiondata.h @@ -71,6 +71,7 @@ enum AssignFunc { FuncSetScreen, FuncDisableAudioAmp, FuncRGBLed, + FuncLCDtoVideo, FuncCount, FuncReserve = -1 }; diff --git a/companion/src/firmwares/edgetx/yaml_customfunctiondata.cpp b/companion/src/firmwares/edgetx/yaml_customfunctiondata.cpp index cc903f40e..4a64ad22c 100644 --- a/companion/src/firmwares/edgetx/yaml_customfunctiondata.cpp +++ b/companion/src/firmwares/edgetx/yaml_customfunctiondata.cpp @@ -61,6 +61,7 @@ static const YamlLookupTable customFnLut = { { FuncSetScreen, "SET_SCREEN"}, { FuncDisableAudioAmp, "DISABLE_AUDIO_AMP" }, { FuncRGBLed, "RGB_LED" }, + { FuncLCDtoVideo, "LCD_TO_VIDEO" }, }; static const YamlLookupTable trainerLut = { diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index e6dafb015..f72e5f020 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -1648,6 +1648,7 @@ class CustomFunctionsConversionTable: public ConversionTable { addConversion(FuncRacingMode, val++); addConversion(FuncDisableTouch, val++); addConversion(FuncSetScreen, val++); + addConversion(FuncLCDtoVideo, val++); } } }; diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index e8d9d176f..2c1448b11 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -136,6 +136,8 @@ const char * OpenTxEepromInterface::getName() return "EdgeTx for BETAFPV LR3PRO"; case BOARD_IFLIGHT_COMMANDO8: return "EdgeTX for iFlight Commando 8"; + case BOARD_FATFISH_F16: + return "EdgeTX for Fatfish F16"; default: return "Board is unknown to EdgeTX"; } @@ -1254,6 +1256,9 @@ void registerOpenTxFirmwares() { OpenTxFirmware * firmware; + static const Firmware::Option opt_bt("bluetooth", Firmware::tr("Support for bluetooth module")); + static const Firmware::Option opt_internal_gps("internalgps", Firmware::tr("Support internal GPS")); + /* BETAFPV LR3PRO board */ firmware = new OpenTxFirmware(FIRMWAREID("lr3pro"), QCoreApplication::translate("Firmware", "BETAFPV LiteRadio3 Pro"), BOARD_BETAFPV_LR3PRO); addOpenTxCommonOptions(firmware); @@ -1264,24 +1269,32 @@ void registerOpenTxFirmwares() registerOpenTxFirmware(firmware); addOpenTxRfOptions(firmware, FLEX); + /* Fatfish F16 board */ + firmware = new OpenTxFirmware(FIRMWAREID("f16"), Firmware::tr("Fatfish F16"), BOARD_FATFISH_F16); + addOpenTxFrskyOptions(firmware); + addOpenTxRfOptions(firmware, FLEX); + firmware->addOptionsGroup({opt_bt, opt_internal_gps}); + firmware->addOption("flyskygimbals", Firmware::tr("Support hardware mod: FlySky Paladin EV Gimbals")); + registerOpenTxFirmware(firmware); + /* FlySky NV14 board */ firmware = new OpenTxFirmware(FIRMWAREID("nv14"), QCoreApplication::translate("Firmware", "FlySky NV14"), BOARD_FLYSKY_NV14); addOpenTxFrskyOptions(firmware); - firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); + firmware->addOption(opt_bt); addOpenTxRfOptions(firmware, FLEX + AFHDS2A + AFHDS3); registerOpenTxFirmware(firmware); /* FlySky EL18 board */ firmware = new OpenTxFirmware(FIRMWAREID("el18"), QCoreApplication::translate("Firmware", "FlySky EL18"), BOARD_FLYSKY_EL18); addOpenTxFrskyOptions(firmware); - firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); + firmware->addOption(opt_bt); addOpenTxRfOptions(firmware, FLEX + AFHDS2A + AFHDS3); registerOpenTxFirmware(firmware); /* FlySky PL18 board */ firmware = new OpenTxFirmware(FIRMWAREID("pl18"), Firmware::tr("FlySky PL18"), BOARD_FLYSKY_PL18); addOpenTxFrskyOptions(firmware); - firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); + firmware->addOption(opt_bt); addOpenTxRfOptions(firmware, FLEX + AFHDS3); registerOpenTxFirmware(firmware); @@ -1452,14 +1465,14 @@ void registerOpenTxFirmwares() firmware = new OpenTxFirmware(FIRMWAREID("t16"), Firmware::tr("Jumper T16 / T16+ / T16 Pro"), BOARD_JUMPER_T16); addOpenTxFrskyOptions(firmware); firmware->addOption("internalmulti", Firmware::tr("Support for MULTI internal module")); - firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); + firmware->addOption(opt_bt); addOpenTxRfOptions(firmware, FLEX); registerOpenTxFirmware(firmware); /* Jumper T18 board */ firmware = new OpenTxFirmware(FIRMWAREID("t18"), Firmware::tr("Jumper T18"), BOARD_JUMPER_T18); addOpenTxFrskyOptions(firmware); - firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); + firmware->addOption(opt_bt); registerOpenTxFirmware(firmware); addOpenTxRfOptions(firmware, FLEX); @@ -1532,8 +1545,6 @@ void registerOpenTxFirmwares() firmware = new OpenTxFirmware(FIRMWAREID("tx16s"), Firmware::tr("Radiomaster TX16S / SE / Hall / Masterfire"), BOARD_RADIOMASTER_TX16S); addOpenTxFrskyOptions(firmware); addOpenTxRfOptions(firmware, FLEX); - static const Firmware::Option opt_bt("bluetooth", Firmware::tr("Support for bluetooth module")); - static const Firmware::Option opt_internal_gps("internalgps", Firmware::tr("Support internal GPS")); firmware->addOptionsGroup({opt_bt, opt_internal_gps}); firmware->addOption("flyskygimbals", Firmware::tr("Support hardware mod: FlySky Paladin EV Gimbals")); registerOpenTxFirmware(firmware); diff --git a/companion/src/images/simulator/Fatfish/F16/bottom.png b/companion/src/images/simulator/Fatfish/F16/bottom.png new file mode 100644 index 000000000..bbf07f45f Binary files /dev/null and b/companion/src/images/simulator/Fatfish/F16/bottom.png differ diff --git a/companion/src/images/simulator/Fatfish/F16/left.png b/companion/src/images/simulator/Fatfish/F16/left.png new file mode 100644 index 000000000..4e3a72d88 Binary files /dev/null and b/companion/src/images/simulator/Fatfish/F16/left.png differ diff --git a/companion/src/images/simulator/Fatfish/F16/right.png b/companion/src/images/simulator/Fatfish/F16/right.png new file mode 100644 index 000000000..e65f319e0 Binary files /dev/null and b/companion/src/images/simulator/Fatfish/F16/right.png differ diff --git a/companion/src/images/simulator/Fatfish/F16/top.png b/companion/src/images/simulator/Fatfish/F16/top.png new file mode 100644 index 000000000..dcb37e85d Binary files /dev/null and b/companion/src/images/simulator/Fatfish/F16/top.png differ diff --git a/companion/src/simulation/CMakeLists.txt b/companion/src/simulation/CMakeLists.txt index 3d3fee2a8..5a829e652 100644 --- a/companion/src/simulation/CMakeLists.txt +++ b/companion/src/simulation/CMakeLists.txt @@ -33,6 +33,7 @@ set(${PROJECT_NAME}_SRCS simulateduiwidgetBoxer.cpp simulateduiwidgetCommando8.cpp simulateduiwidgetEL18.cpp + simulateduiwidgetFatfishF16.cpp simulateduiwidgetJumperT12.cpp simulateduiwidgetJumperT14.cpp simulateduiwidgetJumperT15.cpp diff --git a/companion/src/simulation/simulateduiwidget.h b/companion/src/simulation/simulateduiwidget.h index 87a681bc0..706a5f043 100644 --- a/companion/src/simulation/simulateduiwidget.h +++ b/companion/src/simulation/simulateduiwidget.h @@ -155,6 +155,7 @@ namespace Ui { class SimulatedUIWidgetBoxer; class SimulatedUIWidgetPocket; class SimulatedUIWidgetT8; + class SimulatedUIWidgetFatfishF16; class SimulatedUIWidgetNV14; class SimulatedUIWidgetEL18; class SimulatedUIWidgetPL18; @@ -404,6 +405,18 @@ class SimulatedUIWidgetTX12: public SimulatedUIWidget Ui::SimulatedUIWidgetTX12 * ui; }; +class SimulatedUIWidgetTX16S: public SimulatedUIWidget +{ + Q_OBJECT + + public: + explicit SimulatedUIWidgetTX16S(SimulatorInterface * simulator, QWidget * parent = nullptr); + virtual ~SimulatedUIWidgetTX16S(); + + private: + Ui::SimulatedUIWidgetTX16S * ui; +}; + class SimulatedUIWidgetZorro: public SimulatedUIWidget { Q_OBJECT @@ -452,16 +465,16 @@ private: Ui::SimulatedUIWidgetT8 * ui; }; -class SimulatedUIWidgetTX16S: public SimulatedUIWidget +class SimulatedUIWidgetFatfishF16: public SimulatedUIWidget { Q_OBJECT public: - explicit SimulatedUIWidgetTX16S(SimulatorInterface * simulator, QWidget * parent = nullptr); - virtual ~SimulatedUIWidgetTX16S(); + explicit SimulatedUIWidgetFatfishF16(SimulatorInterface * simulator, QWidget * parent = nullptr); + virtual ~SimulatedUIWidgetFatfishF16(); private: - Ui::SimulatedUIWidgetTX16S * ui; + Ui::SimulatedUIWidgetFatfishF16 * ui; }; class SimulatedUIWidgetNV14: public SimulatedUIWidget diff --git a/companion/src/simulation/simulateduiwidgetFatfishF16.cpp b/companion/src/simulation/simulateduiwidgetFatfishF16.cpp new file mode 100644 index 000000000..a4eb59c07 --- /dev/null +++ b/companion/src/simulation/simulateduiwidgetFatfishF16.cpp @@ -0,0 +1,70 @@ +/* + * 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 "simulateduiwidget.h" +#include "ui_simulateduiwidgetFatfishF16.h" + +SimulatedUIWidgetFatfishF16::SimulatedUIWidgetFatfishF16(SimulatorInterface *simulator, QWidget * parent): + SimulatedUIWidget(simulator, parent), + ui(new Ui::SimulatedUIWidgetFatfishF16) +{ + RadioUiAction * act; + + ui->setupUi(this); + + // add actions in order of appearance on the help menu + + act = new RadioUiAction(KEY_SYS, QList() << Qt::Key_Left, SIMU_STR_HLP_KEY_LFT, SIMU_STR_HLP_ACT_SYS); + addRadioWidget(ui->leftbuttons->addArea(QRect(60, 10, 90, 50), "Fatfish/F16/left.png", act)); + + act = new RadioUiAction(KEY_MODEL, QList() << Qt::Key_Up, SIMU_STR_HLP_KEY_UP, SIMU_STR_HLP_ACT_MDL); + addRadioWidget(ui->leftbuttons->addArea(QRect(75, 107, 80, 30), "Fatfish/F16/left.png", act)); + + act = new RadioUiAction(KEY_PAGEDN, QList() << Qt::Key_PageDown, SIMU_STR_HLP_KEY_PGDN, SIMU_STR_HLP_ACT_PGDN); + addRadioWidget(ui->leftbuttons->addArea(QRect(75, 172, 80, 30), "Fatfish/F16/left.png", act)); + + act = new RadioUiAction(KEY_PAGEUP, QList() << Qt::Key_PageUp, SIMU_STR_HLP_KEY_PGUP, SIMU_STR_HLP_ACT_PGUP); + addRadioWidget(ui->leftbuttons->addArea(QRect(75, 237, 80, 30), "Fatfish/F16/left.png", act)); + + act = new RadioUiAction(KEY_TELE, QList() << Qt::Key_Right, SIMU_STR_HLP_KEY_RGT, SIMU_STR_HLP_ACT_TELE); + addRadioWidget(ui->leftbuttons->addArea(QRect(75, 302, 80, 30), "Fatfish/F16/left.png", act)); + + m_mouseMidClickAction = new RadioUiAction(KEY_ENTER, QList() << Qt::Key_Enter << Qt::Key_Return, SIMU_STR_HLP_KEYS_ACTIVATE, SIMU_STR_HLP_ACT_ROT_DN); + addRadioWidget(ui->rightbuttons->addArea(QRect(45, 170, 65, 125), "Fatfish/F16/right.png", m_mouseMidClickAction)); + + act = new RadioUiAction(KEY_EXIT, QList() << Qt::Key_Down << Qt::Key_Delete << Qt::Key_Escape << Qt::Key_Backspace, + SIMU_STR_HLP_KEY_DN % "
" % SIMU_STR_HLP_KEYS_EXIT, SIMU_STR_HLP_ACT_RTN); + addRadioWidget(ui->rightbuttons->addArea(QRect(50, 10, 90, 50), "Fatfish/F16/right.png", act)); + + m_scrollUpAction = new RadioUiAction(-1, QList() << Qt::Key_Minus, SIMU_STR_HLP_KEY_MIN % "|" % SIMU_STR_HLP_MOUSE_UP, SIMU_STR_HLP_ACT_ROT_LFT); + m_scrollDnAction = new RadioUiAction(-1, QList() << Qt::Key_Plus << Qt::Key_Equal, SIMU_STR_HLP_KEY_PLS % "|" % SIMU_STR_HLP_MOUSE_DN, SIMU_STR_HLP_ACT_ROT_RGT); + connectScrollActions(); + + m_backlightColors << QColor(47, 123, 227); + + setLcd(ui->lcd); +} + +SimulatedUIWidgetFatfishF16::~SimulatedUIWidgetFatfishF16() +{ + delete ui; +} diff --git a/companion/src/simulation/simulateduiwidgetFatfishF16.ui b/companion/src/simulation/simulateduiwidgetFatfishF16.ui new file mode 100644 index 000000000..00b71129c --- /dev/null +++ b/companion/src/simulation/simulateduiwidgetFatfishF16.ui @@ -0,0 +1,208 @@ + + + SimulatedUIWidgetFatfishF16 + + + + 0 + 0 + 868 + 428 + + + + + 0 + 0 + + + + + 868 + 428 + + + + + 868 + 428 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 480 + 116 + + + + + 480 + 116 + + + + + 5 + + + + background:url(:/images/simulator/Fatfish/F16/top.png) + + + + + + + + 0 + 0 + + + + + 480 + 40 + + + + + 480 + 40 + + + + + 5 + false + + + + background:url(:/images/simulator/Fatfish/F16/bottom.png) + + + + + + + + 0 + 0 + + + + + 480 + 272 + + + + + 480 + 272 + + + + + 5 + + + + + + + + + 0 + 0 + + + + + 194 + 428 + + + + + 194 + 428 + + + + background:url(:/images/simulator/Fatfish/F16/right.png) + + + + + + + + 0 + 0 + + + + + 194 + 428 + + + + + 194 + 428 + + + + true + + + background:url(:/images/simulator/Fatfish/F16/left.png); + + + + + + + + LcdWidget + QWidget +
lcdwidget.h
+ 1 +
+ + ButtonsWidget + QWidget +
buttonswidget.h
+ 1 +
+
+ + + + +
diff --git a/companion/src/simulation/simulatorwidget.cpp b/companion/src/simulation/simulatorwidget.cpp index 12571326c..c5b8f1b58 100644 --- a/companion/src/simulation/simulatorwidget.cpp +++ b/companion/src/simulation/simulatorwidget.cpp @@ -137,6 +137,12 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato case Board::BOARD_RADIOMASTER_TX16S: radioUiWidget = new SimulatedUIWidgetTX16S(simulator, this); break; + case Board::BOARD_RADIOMASTER_POCKET: + radioUiWidget = new SimulatedUIWidgetPocket(simulator, this); + break; + case Board::BOARD_FATFISH_F16: + radioUiWidget = new SimulatedUIWidgetFatfishF16(simulator, this); + break; case Board::BOARD_FLYSKY_NV14: radioUiWidget = new SimulatedUIWidgetNV14(simulator, this); break; @@ -146,9 +152,6 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato case Board::BOARD_FLYSKY_PL18: radioUiWidget = new SimulatedUIWidgetPL18(simulator, this); break; - case Board::BOARD_RADIOMASTER_POCKET: - radioUiWidget = new SimulatedUIWidgetPocket(simulator, this); - break; default: radioUiWidget = new SimulatedUIWidget9X(simulator, this); break; diff --git a/fw.json b/fw.json index 9bdf222b8..1c5aa146d 100644 --- a/fw.json +++ b/fw.json @@ -1,6 +1,7 @@ { "targets": [ ["BETAFPV LiteRadio 3 Pro", "lr3pro-"], + ["Fatfish F16","f16-"], ["Flysky EL18", "el18-"], ["Flysky NV14", "nv14-"], ["Flysky PL18", "pl18-"], diff --git a/radio/src/audio.cpp b/radio/src/audio.cpp index 94b26ce94..4b602d42d 100644 --- a/radio/src/audio.cpp +++ b/radio/src/audio.cpp @@ -448,7 +448,7 @@ void audioTask(void * pdata) setSampleRate(AUDIO_SAMPLE_RATE); -#if defined(PCBX12S) || defined(RADIO_TX16S) +#if defined(PCBX12S) || defined(RADIO_TX16S) || defined(RADIO_F16) // The audio amp needs ~2s to start RTOS_WAIT_MS(1000); // 1s #endif diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index fcc2f59f5..b29926503 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -590,6 +590,7 @@ enum Functions { #endif FUNC_DISABLE_AUDIO_AMP, FUNC_RGB_LED, + FUNC_LCD_TO_VIDEO, FUNC_TEST, // MUST remain last #if defined(DEBUG) FUNC_MAX SKIP diff --git a/radio/src/functions.cpp b/radio/src/functions.cpp index c285778f4..7b635e45f 100644 --- a/radio/src/functions.cpp +++ b/radio/src/functions.cpp @@ -27,6 +27,13 @@ void setRequestedMainView(uint8_t view); #endif +#if defined(VIDEO_SWITCH) +#include "videoswitch_driver.h" +#if defined(SIMU) +void switchToRadio() {}; +void switchToVideo() {}; +#endif +#endif CustomFunctionsContext modelFunctionsContext = { 0 }; CustomFunctionsContext globalFunctionsContext = { 0 }; @@ -150,6 +157,7 @@ void evalFunctions(const CustomFunctionData * functions, CustomFunctionsContext } #endif + bool videoEnabled = false; for (uint8_t i=0; i 0) +#endif + { + // we're only interested in the last flush in direct mode + if (!lv_disp_flush_is_last(disp_drv)) { + lv_disp_flush_ready(disp_drv); + return; + } } #endif @@ -95,7 +100,11 @@ static void flushLcd(lv_disp_drv_t* disp_drv, const lv_area_t* area, lcd_flush_cb(disp_drv, (uint16_t*)color_p, copy_area); -#if !defined(LCD_VERTICAL_INVERT) && !defined(BOOT) +#if (!defined(LCD_VERTICAL_INVERT) || defined(RADIO_F16)) && !defined(BOOT) +#if defined(RADIO_F16) + if (hardwareOptions.pcbrev > 0) +#endif +{ uint16_t* src = (uint16_t*)color_p; uint16_t* dst = nullptr; if ((uint16_t*)color_p == LCD_FIRST_FRAME_BUFFER) @@ -117,6 +126,7 @@ static void flushLcd(lv_disp_drv_t* disp_drv, const lv_area_t* area, } DMAWait(); // wait for the last DMACopyBitmap to be completed before // sending completion message +} #endif } @@ -145,6 +155,8 @@ static void init_lvgl_disp_drv() #if !defined(LCD_VERTICAL_INVERT) disp_drv.direct_mode = 1; +#elif defined(RADIO_F16) + disp_drv.direct_mode = (hardwareOptions.pcbrev > 0) ? 1 : 0; #else disp_drv.direct_mode = 0; #endif diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index ba3a81e91..bd3099147 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -582,6 +582,10 @@ bool isAssignableFunctionAvailable(int function, bool modelFunctions) #if !defined(LED_STRIP_GPIO) case FUNC_RGB_LED: return false; +#endif +#if !defined(VIDEO_SWITCH) + case FUNC_LCD_TO_VIDEO: + return false; #endif default: return true; diff --git a/radio/src/storage/yaml/yaml_datastructs_128x64.cpp b/radio/src/storage/yaml/yaml_datastructs_128x64.cpp index ef61e39d3..2c59383ed 100644 --- a/radio/src/storage/yaml/yaml_datastructs_128x64.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_128x64.cpp @@ -84,6 +84,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_RACING_MODE, "RACING_MODE" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_LCD_TO_VIDEO, "LCD_TO_VIDEO" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index f231c915d..3c83987e9 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -93,6 +93,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_SET_SCREEN, "SET_SCREEN" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_LCD_TO_VIDEO, "LCD_TO_VIDEO" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_pl18.cpp b/radio/src/storage/yaml/yaml_datastructs_pl18.cpp index 29eec76c0..95f3c6476 100644 --- a/radio/src/storage/yaml/yaml_datastructs_pl18.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_pl18.cpp @@ -93,6 +93,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_SET_SCREEN, "SET_SCREEN" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_LCD_TO_VIDEO, "LCD_TO_VIDEO" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_t20.cpp b/radio/src/storage/yaml/yaml_datastructs_t20.cpp index f9eb4df2f..f0ed26934 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t20.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t20.cpp @@ -84,6 +84,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_RACING_MODE, "RACING_MODE" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_LCD_TO_VIDEO, "LCD_TO_VIDEO" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp index 0e7cee8b1..7eaa8a03d 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp @@ -84,6 +84,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_RACING_MODE, "RACING_MODE" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_LCD_TO_VIDEO, "LCD_TO_VIDEO" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 973927677..4a51da3db 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -86,6 +86,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_SET_SCREEN, "SET_SCREEN" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_LCD_TO_VIDEO, "LCD_TO_VIDEO" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index 973927677..4a51da3db 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -86,6 +86,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_SET_SCREEN, "SET_SCREEN" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_LCD_TO_VIDEO, "LCD_TO_VIDEO" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 0113c7d38..7ceaa7f5c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -84,6 +84,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_RACING_MODE, "RACING_MODE" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_LCD_TO_VIDEO, "LCD_TO_VIDEO" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index 1dafe9b6a..d2796fcd5 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -84,6 +84,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_RACING_MODE, "RACING_MODE" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_LCD_TO_VIDEO, "LCD_TO_VIDEO" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index 16c389c8e..b55a1abfd 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -84,6 +84,7 @@ const struct YamlIdStr enum_Functions[] = { { FUNC_RACING_MODE, "RACING_MODE" }, { FUNC_DISABLE_AUDIO_AMP, "DISABLE_AUDIO_AMP" }, { FUNC_RGB_LED, "RGB_LED" }, + { FUNC_LCD_TO_VIDEO, "LCD_TO_VIDEO" }, { FUNC_TEST, "TEST" }, { 0, NULL } }; diff --git a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt index 09fd42806..2caf922df 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt @@ -71,6 +71,12 @@ if(PCB STREQUAL X10 OR PCB STREQUAL X12S OR PCB STREQUAL NV14 OR PCB STREQUAL PL ../../../../../targets/pl18/key_driver.cpp ) endif() + + if(PCBREV STREQUAL F16) + set(BOOTLOADER_SRC ${BOOTLOADER_SRC} + ../../../../../targets/horus/videoswitch_driver.cpp + ) + endif() # Add LVGL sources foreach(LVGL_FILE ${LVGL_SRC_FILES_MINIMAL}) diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index c753f623d..8bac1e9af 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -112,6 +112,18 @@ if (PCB STREQUAL X10) set(INTERNAL_GPS_BAUDRATE "9600" CACHE STRING "Baud rate for internal GPS") set(FLYSKY_GIMBAL ON) set(FLEXSW "2" CACHE STRING "Max flex inputs usable as switches") + elseif (PCBREV STREQUAL F16) + set(FLAVOUR f16) + add_definitions(-DRADIO_F16) + add_definitions(-DRADIO_FAMILY_T16) + set(DEFAULT_INTERNAL_MODULE MULTIMODULE CACHE STRING "Default internal module") + option(BLUETOOTH "Support for bluetooth module" OFF) + option(INTERNAL_GPS "Support for internal NMEA GPS" OFF) + set(DEFAULT_THEME "DARKBLUE") + add_definitions(-DMANUFACTURER_FATFISH) + set(INTERNAL_GPS_BAUDRATE "9600" CACHE STRING "Baud rate for internal GPS") + set(FLEXSW "2" CACHE STRING "Max flex inputs usable as switches") + set(VIDEO_SWITCH ON) elseif (PCBREV STREQUAL T18) set(FLAVOUR t18) add_definitions(-DRADIO_T18) @@ -272,6 +284,14 @@ set(FIRMWARE_SRC drivers/frftl.cpp ) +if (VIDEO_SWITCH) + add_definitions(-DVIDEO_SWITCH) + set(FIRMWARE_SRC + ${FIRMWARE_SRC} + targets/horus/videoswitch_driver.cpp + ) +endif() + if(BOOTLOADER) set(FIRMWARE_SRC ${FIRMWARE_SRC} diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 3a18498f4..dfb5d3505 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -51,6 +51,15 @@ HardwareOptions hardwareOptions; bool boardBacklightOn = false; +#if defined(VIDEO_SWITCH) +#include "videoswitch_driver.h" + +void boardBootloaderInit() +{ + videoSwitchInit(); +} +#endif + #if !defined(BOOT) #include "opentx.h" @@ -160,6 +169,9 @@ void boardInit() bluetoothInit(BLUETOOTH_DEFAULT_BAUDRATE, true); #endif +#if defined(VIDEO_SWITCH) + videoSwitchInit(); +#endif #if defined(DEBUG) // DBGMCU_APB1PeriphConfig(DBGMCU_IWDG_STOP|DBGMCU_TIM1_STOP|DBGMCU_TIM2_STOP|DBGMCU_TIM3_STOP|DBGMCU_TIM4_STOP|DBGMCU_TIM5_STOP|DBGMCU_TIM6_STOP|DBGMCU_TIM7_STOP|DBGMCU_TIM8_STOP|DBGMCU_TIM9_STOP|DBGMCU_TIM10_STOP|DBGMCU_TIM11_STOP|DBGMCU_TIM12_STOP|DBGMCU_TIM13_STOP|DBGMCU_TIM14_STOP, ENABLE); @@ -179,6 +191,10 @@ void boardInit() ledBlue(); #if !defined(LCD_VERTICAL_INVERT) lcdSetInitalFrameBuffer(lcdFront->getData()); +#elif defined(RADIO_F16) + if(hardwareOptions.pcbrev > 0) { + lcdSetInitalFrameBuffer(lcdFront->getData()); + } #endif } #endif diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index ef624a08e..ff3c13fb4 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -61,6 +61,12 @@ extern uint16_t sessionTimer; #define SLAVE_MODE() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) +#if defined(RADIO_F16) +// initilizes the board for the bootloader +#define HAVE_BOARD_BOOTLOADER_INIT 1 +void boardBootloaderInit(); +#endif + // Board driver void boardInit(); void boardOff(); @@ -85,7 +91,7 @@ enum { #elif defined(PCBX10) #if defined(PCBREV_EXPRESS) #define IS_FIRMWARE_COMPATIBLE_WITH_BOARD() (hardwareOptions.pcbrev == PCBREV_X10_EXPRESS) - #elif defined(RADIO_FAMILY_T16) + #elif defined(RADIO_FAMILY_T16) || defined(RADIO_F16) #define IS_FIRMWARE_COMPATIBLE_WITH_BOARD() (true) #else #define IS_FIRMWARE_COMPATIBLE_WITH_BOARD() (hardwareOptions.pcbrev == PCBREV_X10_STD) @@ -150,7 +156,7 @@ uint32_t isBootloaderStart(const uint8_t * buffer); #endif // POTS and SLIDERS default configuration -#if defined(RADIO_TX16S) +#if defined(RADIO_TX16S) || defined(RADIO_F16) #define XPOS_CALIB_DEFAULT {0x3, 0xc, 0x15, 0x1e, 0x26} #endif @@ -293,7 +299,7 @@ void telemetryPortInvertedInit(uint32_t baudrate); // Aux serial port driver -#if defined(RADIO_TX16S) +#if defined(RADIO_TX16S) || defined(RADIO_F16) #define DEBUG_BAUDRATE 400000 #define LUA_DEFAULT_BAUDRATE 115200 #else @@ -320,7 +326,7 @@ void bluetoothWriteWakeup(); uint8_t bluetoothIsWriting(); void bluetoothDisable(); -#if defined (RADIO_TX16S) +#if defined(RADIO_TX16S) || defined(RADIO_F16) #define BATTERY_DIVIDER 1495 #else #define BATTERY_DIVIDER 1629 diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 2f58a95c0..c05836fa3 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -46,7 +46,7 @@ #define KEYS_GPIO_PIN_EXIT LL_GPIO_PIN_6 // PI.06 #define KEYS_GPIO_REG_TELE GPIOC #define KEYS_GPIO_PIN_TELE LL_GPIO_PIN_4 // PC.04 -#elif defined(RADIO_TX16S) +#elif defined(RADIO_TX16S) || defined(RADIO_F16) #define KEYS_GPIO_REG_ENTER GPIOI #define KEYS_GPIO_PIN_ENTER LL_GPIO_PIN_8 // PI.08 #define KEYS_GPIO_REG_PAGEUP GPIOC @@ -241,8 +241,8 @@ #define SWITCHES_E_INVERTED #endif - #if defined(PCBX10) - // Gimbal switch left + #if defined(PCBX10) && !defined(RADIO_F16) + // Gimbal switch left #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I #define SWITCHES_GPIO_REG_I GPIOH @@ -253,7 +253,7 @@ #define SWITCHES_GPIO_REG_J GPIOH #define SWITCHES_GPIO_PIN_J LL_GPIO_PIN_15 // PH.15 #elif defined(PCBX12S) - // Gimbal switch left + // Gimbal switch left #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I #define SWITCHES_GPIO_REG_I GPIOB @@ -310,7 +310,7 @@ #define TRIMS_GPIO_REG_LSU GPIOB #define TRIMS_GPIO_PIN_LSU LL_GPIO_PIN_13 // PB.13 #elif defined(PCBX10) - #if defined(RADIO_TX16S) + #if defined(RADIO_TX16S) || defined(RADIO_F16) #define TRIMS_GPIO_REG_LHL GPIOA #define TRIMS_GPIO_PIN_LHL LL_GPIO_PIN_6 // PA.06 #define TRIMS_GPIO_REG_LHR GPIOC @@ -423,7 +423,7 @@ #define ADC_GPIO_PIN_EXT3 ADC_GPIO_PIN_STICK_RH #define ADC_GPIO_PIN_EXT4 ADC_GPIO_PIN_STICK_RV #endif - #if !defined(RADIO_TX16S) && !defined(RADIO_T15) + #if !(defined(RADIO_TX16S) || defined(RADIO_F16)) && !defined(RADIO_T15) #define PWM_STICKS #define PWM_TIMER TIM5 #define PWM_GPIO GPIOA @@ -481,7 +481,7 @@ #define ADC_DMA_STREAM_IRQHandler DMA2_Stream0_IRQHandler // VBat divider is /4 on F42x and F43x devices - #if defined(RADIO_TX16S) || defined(RADIO_T15) + #if defined(RADIO_TX16S) || defined(RADIO_T15) || defined(RADIO_F16) #define ADC_VREF_PREC2 660 #elif defined(RADIO_T16) || defined(RADIO_T18) #define ADC_VREF_PREC2 600 @@ -496,7 +496,7 @@ #define ADC_DIRECTION {1,-1,1,-1, 1,1,1, -1,1,1,1, -1,1 } #elif defined(RADIO_T18) #define ADC_DIRECTION {1,-1,1,-1, -1,1,-1, -1,1,1,1, -1,1 } -#elif defined(RADIO_TX16S) +#elif defined(RADIO_TX16S) || defined(RADIO_F16) #define ADC_DIRECTION {1,-1,1,-1, 1,1,1, -1,1,1,1, -1,1 } #elif defined(PCBX10) #define ADC_DIRECTION {1,-1,1,-1, -1,1,-1, 1,-1,1,1, 1,-1 } @@ -586,7 +586,7 @@ #define AUX_SERIAL_DMA_RX DMA1 #define AUX_SERIAL_DMA_RX_STREAM LL_DMA_STREAM_1 #define AUX_SERIAL_DMA_RX_CHANNEL LL_DMA_CHANNEL_4 - #if defined(RADIO_TX16S) + #if defined(RADIO_TX16S) || defined(RADIO_F16) #define AUX_SERIAL_PWR_GPIO GPIO_PIN(GPIOA, 15) // PA.15 #endif #endif @@ -813,7 +813,7 @@ #endif #if defined(RADIO_FAMILY_T16) -#if defined(RADIO_TX16S) +#if defined(RADIO_TX16S) || defined(RADIO_F16) #define AUDIO_UNMUTE_DELAY 150 // ms #else #define AUDIO_UNMUTE_DELAY 120 // ms @@ -847,7 +847,7 @@ #endif // HARDWARE_TOUCH // First I2C Bus -#if defined(RADIO_TX16S) || defined(PCBX12S) || defined(RADIO_T15) +#if defined(RADIO_TX16S) || defined(RADIO_F16) || defined(PCBX12S) || defined(RADIO_T15) #define I2C_B1 I2C1 #define I2C_B1_GPIO GPIOB #define I2C_B1_SCL_GPIO_PIN LL_GPIO_PIN_8 // PB.08 @@ -868,7 +868,7 @@ #define I2C_B2_SCL_GPIO_PIN LL_GPIO_PIN_10 // PB.10 #define I2C_B2_SDA_GPIO_PIN LL_GPIO_PIN_11 // PB.11 #define I2C_B2_GPIO_AF LL_GPIO_AF_4 // I2C2 - #if defined(RADIO_TX16S) + #if defined(RADIO_TX16S) || defined(RADIO_F16) #define I2C_B2_PWR_GPIO GPIOA #define I2C_B2_PWR_GPIO_PIN LL_GPIO_PIN_15 // PA.15 #endif @@ -1078,6 +1078,11 @@ #define BT_EN_GPIO GPIO_PIN(GPIOG, 10) // PG.10 #endif +// Video switch +#if defined(RADIO_F16) + #define VIDEO_SWITCH_GPIO GPIO_PIN(GPIOH, 15) // PH.15 +#endif + // SDRAM #define SDRAM_BANK2 diff --git a/radio/src/targets/horus/lcd_driver.cpp b/radio/src/targets/horus/lcd_driver.cpp index 325b88f58..88e87b87f 100644 --- a/radio/src/targets/horus/lcd_driver.cpp +++ b/radio/src/targets/horus/lcd_driver.cpp @@ -26,6 +26,7 @@ #include "opentx_types.h" #include "dma2d.h" +#include "board.h" #include "hal.h" #include "delays_driver.h" @@ -137,6 +138,13 @@ static void startLcdRefresh(lv_disp_drv_t *disp_drv, uint16_t *buffer, const rect_t ©_area) { #if defined(LCD_VERTICAL_INVERT) +#if defined(RADIO_F16) + if(hardwareOptions.pcbrev > 0) { + // Direct mode + _update_frame_buffer_addr(buffer); + } else +#endif + { _copy_rotate_180(_back_buffer, buffer, copy_area); if (lv_disp_flush_is_last(disp_drv)) { @@ -177,6 +185,7 @@ static void startLcdRefresh(lv_disp_drv_t *disp_drv, uint16_t *buffer, area_w, area_h); } } + } #else // Direct mode _update_frame_buffer_addr(buffer); @@ -279,7 +288,7 @@ void LCD_Init_LTDC() clkConfig.PLLSAI.PLLSAIN = 192; clkConfig.PLLSAI.PLLSAIR = 3; clkConfig.PLLSAIDivQ = 6; - #if defined(RADIO_TX16S) + #if defined(RADIO_TX16S) || defined(RADIO_F16) clkConfig.PLLSAIDivR = RCC_PLLSAIDIVR_8; #else clkConfig.PLLSAIDivR = RCC_PLLSAIDIVR_4; @@ -373,7 +382,13 @@ void LCD_LayerInit() /* Start Address configuration : the LCD Frame buffer is defined on SDRAM w/ Offset */ #if defined(LCD_VERTICAL_INVERT) - intptr_t layer_address = (intptr_t)_LCD_BUF_1; + intptr_t layer_address; +#if defined(RADIO_F16) + if (hardwareOptions.pcbrev > 0) + layer_address = (intptr_t)initialFrameBuffer; + else +#endif + layer_address = (intptr_t)_LCD_BUF_1; #else intptr_t layer_address = (intptr_t)initialFrameBuffer; #endif diff --git a/radio/src/targets/horus/usb_descriptor.h b/radio/src/targets/horus/usb_descriptor.h index 397adf9d3..2f344a4b5 100644 --- a/radio/src/targets/horus/usb_descriptor.h +++ b/radio/src/targets/horus/usb_descriptor.h @@ -42,6 +42,10 @@ #define USB_NAME "Radiomaster TX16S" #define USB_MANUFACTURER 'R', 'M', '_', 'T', 'X', ' ', ' ', ' ' /* 8 bytes */ #define USB_PRODUCT 'R', 'M', ' ', 'T', 'X', '1', '6', 'S' /* 8 Bytes */ +#elif defined(RADIO_F16) + #define USB_NAME "Fatfish F16" + #define USB_MANUFACTURER 'F', 'A', 'T', 'F', 'I', 'S', 'H', ' ' /* 8 bytes */ + #define USB_PRODUCT 'F', 'F', ' ', 'F', '1', '6', ' ', ' ' /* 8 Bytes */ #elif defined(PCBX10) #define USB_NAME "FrSky X10" #define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */ diff --git a/radio/src/targets/horus/videoswitch_driver.cpp b/radio/src/targets/horus/videoswitch_driver.cpp new file mode 100644 index 000000000..21d87c2da --- /dev/null +++ b/radio/src/targets/horus/videoswitch_driver.cpp @@ -0,0 +1,41 @@ +/* + * 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/gpio.h" +#include "stm32_gpio.h" +#include "videoswitch_driver.h" +#include "hal.h" + +void videoSwitchInit() +{ + gpio_init(VIDEO_SWITCH_GPIO, GPIO_OUT, GPIO_PIN_SPEED_LOW); + switchToRadio(); +} + +void switchToVideo() +{ + gpio_clear(VIDEO_SWITCH_GPIO); +} + +void switchToRadio() +{ + gpio_set(VIDEO_SWITCH_GPIO); +} diff --git a/radio/src/targets/horus/videoswitch_driver.h b/radio/src/targets/horus/videoswitch_driver.h new file mode 100644 index 000000000..5608e2617 --- /dev/null +++ b/radio/src/targets/horus/videoswitch_driver.h @@ -0,0 +1,25 @@ +/* + * 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 +void videoSwitchInit(); +void switchToVideo(); +void switchToRadio(); diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 7f41de378..54a90dab5 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -36,7 +36,7 @@ enum FrSkyDataState { }; #define FRSKY_SPORT_BAUDRATE 57600 -#if defined(RADIO_TX16S) +#if defined(RADIO_TX16S) || defined(RADIO_F16) #define FRSKY_TELEM_MIRROR_BAUDRATE 115200 #else #define FRSKY_TELEM_MIRROR_BAUDRATE FRSKY_SPORT_BAUDRATE diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index aa77900e9..435446a0a 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -202,6 +202,7 @@ const char STR_SF_RACING_MODE[] = TR_SF_RACING_MODE; const char STR_SF_SAFETY[] = TR_SF_SAFETY; const char STR_SF_SET_SCREEN[] = TR_SF_SET_SCREEN; const char STR_SF_SCREENSHOT[] = TR_SF_SCREENSHOT; +const char STR_SF_LCD_TO_VIDEO[] = TR_SF_LCD_TO_VIDEO; const char STR_SF_TEST[] = TR_SF_TEST; const char STR_TRIMS[] = TR_TRIMS; const char STR_MIRROR[] = TR_MIRROR; diff --git a/radio/src/translations.h b/radio/src/translations.h index a0f9408ec..826bbb980 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -324,6 +324,7 @@ extern const char STR_SF_RGBLEDS[]; extern const char STR_SF_VOLUME[]; extern const char STR_SF_RACING_MODE[]; extern const char STR_SF_SCREENSHOT[]; +extern const char STR_SF_LCD_TO_VIDEO[]; extern const char STR_SF_TEST[]; extern const char STR_TRIMS[]; extern const char STR_MIRROR[]; diff --git a/radio/src/translations/cn.h b/radio/src/translations/cn.h index 4e2c8efa2..71fa3b97d 100644 --- a/radio/src/translations/cn.h +++ b/radio/src/translations/cn.h @@ -110,6 +110,7 @@ #define TR_SF_DISABLE_TOUCH "禁用触摸" #define TR_SF_DISABLE_AUDIO_AMP "关闭音频功放" #define TR_SF_SET_SCREEN "选择主屏" +#define TR_SF_LCD_TO_VIDEO "屏幕显示图传" #define TR_FSW_RESET_TELEM "回传参数" diff --git a/radio/src/translations/cz.h b/radio/src/translations/cz.h index 94d3c178d..053c4a51f 100644 --- a/radio/src/translations/cz.h +++ b/radio/src/translations/cz.h @@ -123,6 +123,7 @@ #define TR_SF_DISABLE_TOUCH "Deaktivace dotyku" #define TR_SF_DISABLE_AUDIO_AMP "Vypnutí zesilovače zvuku" #define TR_SF_SET_SCREEN "Vybrat hlavní obrazovku" +#define TR_SF_LCD_TO_VIDEO "LCD to Video" #define TR_FSW_RESET_TELEM TR("Telm","Telemetrie") diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h index 88df39586..87e77fc13 100644 --- a/radio/src/translations/de.h +++ b/radio/src/translations/de.h @@ -118,6 +118,7 @@ #define TR_SF_DISABLE_TOUCH "Kein Touch" #define TR_SF_DISABLE_AUDIO_AMP "Audio Verst. Aus" #define TR_SF_SET_SCREEN "Set Main Screen" +#define TR_SF_LCD_TO_VIDEO "LCD to Video" #define TR_FSW_RESET_TELEM TR("Telm","Telemetrie") #define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 5f8612caa..f2e60b336 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -119,6 +119,7 @@ #define TR_SF_DISABLE_TOUCH "No Touch" #define TR_SF_DISABLE_AUDIO_AMP "Audio Amp Off" #define TR_SF_SET_SCREEN "Set Main Screen" +#define TR_SF_LCD_TO_VIDEO "LCD to Video" #define TR_FSW_RESET_TELEM TR("Telm", "Telemetry") #define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" diff --git a/radio/src/translations/es.h b/radio/src/translations/es.h index f8e32ed00..9445ee79c 100644 --- a/radio/src/translations/es.h +++ b/radio/src/translations/es.h @@ -116,6 +116,7 @@ #define TR_SF_DISABLE_TOUCH "No Touch" #define TR_SF_DISABLE_AUDIO_AMP "Audio Amp Off" #define TR_SF_SET_SCREEN "Set Main Screen" +#define TR_SF_LCD_TO_VIDEO "LCD to Video" #define TR_FSW_RESET_TELEM TR("Telm", "Telemetría") #define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" diff --git a/radio/src/translations/fi.h b/radio/src/translations/fi.h index 96c709feb..baf02669a 100644 --- a/radio/src/translations/fi.h +++ b/radio/src/translations/fi.h @@ -121,6 +121,7 @@ #define TR_SF_DISABLE_TOUCH "No Touch" #define TR_SF_DISABLE_AUDIO_AMP "Audio Amp Off" #define TR_SF_SET_SCREEN "Set Main Screen" +#define TR_SF_LCD_TO_VIDEO "LCD to Video" #define TR_FSW_RESET_TELEM TR("Telm","Telemetry") #define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" diff --git a/radio/src/translations/fr.h b/radio/src/translations/fr.h index e20d55139..adeb2aa82 100644 --- a/radio/src/translations/fr.h +++ b/radio/src/translations/fr.h @@ -120,6 +120,7 @@ #define TR_SF_DISABLE_TOUCH "Non Tactile" #define TR_SF_DISABLE_AUDIO_AMP "Désact. Ampli Audio" #define TR_SF_SET_SCREEN "Définir Écran Princ." +#define TR_SF_LCD_TO_VIDEO "LCD to Video" #define TR_FSW_RESET_TELEM TR("Télem.", "Télémétrie") #define TR_FSW_RESET_TIMERS "Chr1","Chr2","Chr3" diff --git a/radio/src/translations/he.h b/radio/src/translations/he.h index dbe7b8f0d..67a87c9b5 100644 --- a/radio/src/translations/he.h +++ b/radio/src/translations/he.h @@ -122,6 +122,7 @@ #define TR_SF_DISABLE_TOUCH "ללא מסך מגע" #define TR_SF_DISABLE_AUDIO_AMP "Audio Amp Off" #define TR_SF_SET_SCREEN "הגדרת מסך ראשי" +#define TR_SF_LCD_TO_VIDEO "LCD to Video" #define TR_FSW_RESET_TELEM TR("Telm", "טלמטריה") #define TR_FSW_RESET_TIMERS "שעון 1","שעון 2","שעון 3" diff --git a/radio/src/translations/it.h b/radio/src/translations/it.h index b379a8e5f..dfab54039 100644 --- a/radio/src/translations/it.h +++ b/radio/src/translations/it.h @@ -119,6 +119,7 @@ #define TR_SF_DISABLE_TOUCH "No Touch" #define TR_SF_DISABLE_AUDIO_AMP "Amp Audio Off" #define TR_SF_SET_SCREEN "Setta Schermo Princ." +#define TR_SF_LCD_TO_VIDEO "LCD to Video" #define TR_FSW_RESET_TELEM TR("Telm", "Telemetria") #define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" diff --git a/radio/src/translations/jp.h b/radio/src/translations/jp.h index 08025ecf9..3680ebacd 100644 --- a/radio/src/translations/jp.h +++ b/radio/src/translations/jp.h @@ -119,6 +119,7 @@ #define TR_SF_DISABLE_TOUCH "非タッチ" #define TR_SF_DISABLE_AUDIO_AMP "オーディオアンプ OFF" #define TR_SF_SET_SCREEN "メイン画面設定" +#define TR_SF_LCD_TO_VIDEO "LCD to Video" #define TR_FSW_RESET_TELEM TR("Telm", "テレメトリー") #define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" diff --git a/radio/src/translations/nl.h b/radio/src/translations/nl.h index d779e6a9b..839787b06 100644 --- a/radio/src/translations/nl.h +++ b/radio/src/translations/nl.h @@ -116,6 +116,7 @@ #define TR_SF_DISABLE_TOUCH "No Touch" #define TR_SF_DISABLE_AUDIO_AMP "Audio Amp Off" #define TR_SF_SET_SCREEN "Set Main Screen" +#define TR_SF_LCD_TO_VIDEO "LCD to Video" #define TR_FSW_RESET_TELEM TR("Telm", "Telemetrie") #define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" diff --git a/radio/src/translations/pl.h b/radio/src/translations/pl.h index b2f961ba3..dc46d545a 100644 --- a/radio/src/translations/pl.h +++ b/radio/src/translations/pl.h @@ -115,6 +115,7 @@ #define TR_SF_DISABLE_TOUCH "No Touch" #define TR_SF_DISABLE_AUDIO_AMP TR("Wycisz wzm.", "Wycisz wzmacniacz audio") #define TR_SF_SET_SCREEN "Set Main Screen" +#define TR_SF_LCD_TO_VIDEO "LCD to Video" #define TR_FSW_RESET_TELEM TR("Telm", "Telemetra") #define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" diff --git a/radio/src/translations/pt.h b/radio/src/translations/pt.h index 33be3dd52..4c10c697f 100644 --- a/radio/src/translations/pt.h +++ b/radio/src/translations/pt.h @@ -122,6 +122,7 @@ #define TR_SF_DISABLE_TOUCH "No Touch" #define TR_SF_DISABLE_AUDIO_AMP "Amp Audio Desl" #define TR_SF_SET_SCREEN "Def Tela Princ" +#define TR_SF_LCD_TO_VIDEO "LCD to Video" #define TR_FSW_RESET_TELEM TR("Telm", "Telemetria") #define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" diff --git a/radio/src/translations/ru.h b/radio/src/translations/ru.h index c7f5534f6..f256b9600 100644 --- a/radio/src/translations/ru.h +++ b/radio/src/translations/ru.h @@ -121,6 +121,7 @@ #define TR_SF_DISABLE_TOUCH "Сенсор вык" #define TR_SF_DISABLE_AUDIO_AMP "Вык аудио усил." #define TR_SF_SET_SCREEN "Выбр глав экран" +#define TR_SF_LCD_TO_VIDEO "LCD to Video" #define TR_FSW_RESET_TELEM TR("Телем", "Телеметрия") #define TR_FSW_RESET_TIMERS "Тмр1","Трм2","Трм3" diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h index 0a93c46ed..42a008bb2 100644 --- a/radio/src/translations/se.h +++ b/radio/src/translations/se.h @@ -125,6 +125,7 @@ #define TR_SF_DISABLE_TOUCH "Ej pekskärm" #define TR_SF_DISABLE_AUDIO_AMP TR("Audioförst. av","Audioförstärkare av") #define TR_SF_SET_SCREEN "Sätt huvudskärm" +#define TR_SF_LCD_TO_VIDEO "LCD to Video" #define TR_FSW_RESET_TELEM TR("Telm","Telemetri") #define TR_FSW_RESET_TIMERS "Tmr1","Tmr2","Tmr3" diff --git a/radio/src/translations/tw.h b/radio/src/translations/tw.h index ce3c4961b..4b00dd5c5 100644 --- a/radio/src/translations/tw.h +++ b/radio/src/translations/tw.h @@ -115,6 +115,7 @@ #define TR_SF_DISABLE_TOUCH "禁用觸摸" #define TR_SF_DISABLE_AUDIO_AMP "關閉音頻功放" #define TR_SF_SET_SCREEN "選擇主屏" +#define TR_SF_LCD_TO_VIDEO "屏幕顯示圖傳" #define TR_FSW_RESET_TELEM "回傳參數" diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py index f6113764d..51b86ffe2 100755 --- a/radio/util/build-firmware.py +++ b/radio/util/build-firmware.py @@ -189,6 +189,11 @@ def main(): cmake_options["PCBREV"] = "TX16S" firmware_options = options_radiomaster_tx16s maxsize = 2 * 1024 * 1024 + elif board_name == "f16": + cmake_options["PCB"] = "X10" + cmake_options["PCBREV"] = "F16" + firmware_options = options_fatfish_f16 + maxsize = 2 * 1024 * 1024 else: return INVALID_BOARD diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py index a7a57dea0..466d9ce47 100755 --- a/radio/util/fwoptions.py +++ b/radio/util/fwoptions.py @@ -306,6 +306,19 @@ options_radiomaster_tx16s = { "externalaccessmod": ("HARDWARE_EXTERNAL_ACCESS_MOD", "YES", "NO"), } +options_fatfish_f16 = { + "noheli": ("HELI", "NO", "YES"), + "lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"), + "nogvars": ("GVARS", "NO", "YES"), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), + "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), + "bluetooth": ("BLUETOOTH", "YES", "NO"), + "internalgps": ("INTERNAL_GPS", "YES", "NO"), + "externalaccessmod": ("HARDWARE_EXTERNAL_ACCESS_MOD", "YES", "NO"), +} + options_commando8_t8 = { "noheli": ("HELI", "NO", "YES"), "lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"), diff --git a/radio/util/hw_defs/legacy_names.py b/radio/util/hw_defs/legacy_names.py index 4504d7881..1d52e7ff9 100644 --- a/radio/util/hw_defs/legacy_names.py +++ b/radio/util/hw_defs/legacy_names.py @@ -2,7 +2,7 @@ LEGACY_NAMES = [ { - "targets": {"x10", "x10express", "t16", "tx16s", "t18"}, + "targets": {"x10", "x10express", "t16", "tx16s", "t18", "f16"}, "inputs": { "LH": { "yaml": "Rud", diff --git a/radio/util/hw_defs/pot_config.py b/radio/util/hw_defs/pot_config.py index bd7abbf47..901183e0b 100644 --- a/radio/util/hw_defs/pot_config.py +++ b/radio/util/hw_defs/pot_config.py @@ -103,6 +103,13 @@ POT_CONFIG = { "SL1": {"default": "SLIDER"}, "SL2": {"default": "SLIDER"} }, + "f16": { + "P1": {"default": "POT_CENTER"}, + "P2": {"default": "MULTIPOS"}, + "P3": {"default": "POT_CENTER"}, + "SL1": {"default": "SLIDER"}, + "SL2": {"default": "SLIDER"} + }, "x7": { "P1": {"default": "POT"}, "P2": {"default": "POT_CENTER"} diff --git a/radio/util/hw_defs/switch_config.py b/radio/util/hw_defs/switch_config.py index 589495026..8a3ab965f 100644 --- a/radio/util/hw_defs/switch_config.py +++ b/radio/util/hw_defs/switch_config.py @@ -221,6 +221,16 @@ SWITCH_CONFIG = { "SG": {"default": "3POS"}, "SH": {"default": "TOGGLE"} }, + "f16": { + "SA": {"default": "3POS"}, + "SB": {"default": "3POS"}, + "SC": {"default": "3POS"}, + "SD": {"default": "3POS"}, + "SE": {"default": "3POS"}, + "SF": {"default": "2POS"}, + "SG": {"default": "3POS"}, + "SH": {"default": "TOGGLE"} + }, "tx12mk2": { # left side "SA": {"default": "TOGGLE", "display": [0, 0]}, diff --git a/tools/boards.py b/tools/boards.py index 018bf0b80..063863034 100755 --- a/tools/boards.py +++ b/tools/boards.py @@ -63,6 +63,11 @@ boards = { "PCBREV": "TX16S", "INTERNAL_MODULE_MULTI": "YES" }, + "F16": { + "PCB": "X10", + "PCBREV": "F16", + "INTERNAL_MODULE_MULTI": "YES" + }, "T12": { "PCB": "X7", "PCBREV": "T12", diff --git a/tools/build-companion.sh b/tools/build-companion.sh index 6be81ebb2..074c2ff81 100755 --- a/tools/build-companion.sh +++ b/tools/build-companion.sh @@ -72,7 +72,7 @@ declare -a simulator_plugins=(x9lite x9lites xlite xlites nv14 el18 pl18 pl18ev x10 x10-access x12s - t15 t16 t18 t20 t20v2 tx16s) + t15 t16 t18 t20 t20v2 tx16s f16) for plugin in "${simulator_plugins[@]}" do @@ -176,6 +176,9 @@ do tx16s) BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=TX16S" ;; + f16) + BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=F16" + ;; nv14) BUILD_OPTIONS+="-DPCB=NV14" ;; diff --git a/tools/build-gh.sh b/tools/build-gh.sh index f6a46aa84..784cc6c15 100755 --- a/tools/build-gh.sh +++ b/tools/build-gh.sh @@ -194,6 +194,9 @@ do tx16s) BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=TX16S" ;; + f16) + BUILD_OPTIONS+="-DPCB=X10 -DPCBREV=F16" + ;; nv14) BUILD_OPTIONS+="-DPCB=NV14" ;;