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
+
+ 1
+
+
+ ButtonsWidget
+ QWidget
+
+ 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"
;;