diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt
index 3d27550e6..3150a86ca 100644
--- a/companion/src/CMakeLists.txt
+++ b/companion/src/CMakeLists.txt
@@ -345,6 +345,8 @@ elseif(PCB STREQUAL X7 AND PCBREV STREQUAL T12)
set(FLAVOUR t12)
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TX12)
set(FLAVOUR tx12)
+elseif(PCB STREQUAL X7 AND PCBREV STREQUAL T8)
+ set(FLAVOUR t8)
elseif(PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019)
set(FLAVOUR x9d+2019)
elseif(PCB STREQUAL X10 AND PCBREV STREQUAL EXPRESS)
diff --git a/companion/src/companion.qrc b/companion/src/companion.qrc
index fbbacdb48..ca17c812c 100644
--- a/companion/src/companion.qrc
+++ b/companion/src/companion.qrc
@@ -190,6 +190,18 @@
images/simulator/TX12/right-mdl.png
images/simulator/TX12/bottom.png
images/simulator/TX12/top.png
+ images/simulator/T8/left.png
+ images/simulator/T8/left-pageup.png
+ images/simulator/T8/left-pagedn.png
+ images/simulator/T8/left-rtn.png
+ images/simulator/T8/left-sys.png
+ images/simulator/T8/right.png
+ images/simulator/T8/right-ent.png
+ images/simulator/T8/right-mdl.png
+ images/simulator/T8/right-up.png
+ images/simulator/T8/right-dn.png
+ images/simulator/T8/bottom.png
+ images/simulator/T8/top.png
images/simulator/JumperT16/left.png
images/simulator/JumperT16/right.png
images/simulator/JumperT16/top.png
diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp
index 82e645d05..d6c010814 100644
--- a/companion/src/firmwares/boards.cpp
+++ b/companion/src/firmwares/boards.cpp
@@ -87,6 +87,8 @@ uint32_t Boards::getFourCC(Type board)
return 0x3878746F;
case BOARD_RADIOMASTER_TX12:
return 0x4178746F;
+ case BOARD_RADIOMASTER_T8:
+ return 0x4378746F;
case BOARD_UNKNOWN:
break;
}
@@ -114,6 +116,7 @@ int Boards::getEEpromSize(Board::Type board)
case BOARD_TARANIS_X9E:
case BOARD_JUMPER_T12:
case BOARD_RADIOMASTER_TX12:
+ case BOARD_RADIOMASTER_T8:
return EESIZE_TARANIS;
case BOARD_UNKNOWN:
return EESIZE_MAX;
@@ -149,6 +152,7 @@ int Boards::getFlashSize(Type board)
case BOARD_TARANIS_X9E:
case BOARD_JUMPER_T12:
case BOARD_RADIOMASTER_TX12:
+ case BOARD_RADIOMASTER_T8:
return FSIZE_TARANIS;
case BOARD_HORUS_X12S:
case BOARD_X10:
@@ -232,6 +236,16 @@ SwitchInfo Boards::getSwitchInfo(Board::Type board, int index)
if (index < DIM(switches))
return switches[index];
}
+ else if (IS_RADIOMASTER_T8(board)) {
+ const Board::SwitchInfo switches[] = {
+ {SWITCH_TOGGLE, "SA"},
+ {SWITCH_3POS, "SB"},
+ {SWITCH_3POS, "SC"},
+ {SWITCH_TOGGLE, "SD"}
+ };
+ if (index < DIM(switches))
+ return switches[index];
+ }
else if (IS_JUMPER_T12(board)) {
const Board::SwitchInfo switches[] = {
{SWITCH_3POS, "SA"},
@@ -568,6 +582,8 @@ QString Boards::getBoardName(Board::Type board)
return "Radiomaster TX16S";
case BOARD_RADIOMASTER_TX12:
return "Radiomaster TX12";
+ case BOARD_RADIOMASTER_T8:
+ return "Radiomaster T8";
default:
return tr("Unknown");
}
diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h
index 1e1588485..fe00e77dd 100644
--- a/companion/src/firmwares/boards.h
+++ b/companion/src/firmwares/boards.h
@@ -53,9 +53,10 @@ namespace Board {
BOARD_RADIOMASTER_TX16S,
BOARD_JUMPER_T18,
BOARD_RADIOMASTER_TX12,
+ BOARD_RADIOMASTER_T8,
};
- constexpr int BOARD_TYPE_MAX = BOARD_RADIOMASTER_TX12;
+ constexpr int BOARD_TYPE_MAX = BOARD_RADIOMASTER_T8;
enum PotType
{
@@ -224,6 +225,11 @@ inline bool IS_RADIOMASTER_TX12(Board::Type board)
return board == Board::BOARD_RADIOMASTER_TX12;
}
+inline bool IS_RADIOMASTER_T8(Board::Type board)
+{
+ return board == Board::BOARD_RADIOMASTER_T8;
+}
+
inline bool IS_FAMILY_T16(Board::Type board)
{
return board == Board::BOARD_JUMPER_T16 || board == Board::BOARD_RADIOMASTER_TX16S || board == Board::BOARD_JUMPER_T18;
@@ -231,7 +237,7 @@ inline bool IS_FAMILY_T16(Board::Type board)
inline bool IS_FAMILY_T12(Board::Type board)
{
- return board == Board::BOARD_JUMPER_T12 || board == Board::BOARD_RADIOMASTER_TX12;
+ return board == Board::BOARD_JUMPER_T12 || board == Board::BOARD_RADIOMASTER_TX12 || board == Board::BOARD_RADIOMASTER_T8;
}
inline bool IS_TARANIS_XLITE(Board::Type board)
diff --git a/companion/src/firmwares/opentx/opentxeeprom.h b/companion/src/firmwares/opentx/opentxeeprom.h
index aabbe2284..fdb5247a5 100644
--- a/companion/src/firmwares/opentx/opentxeeprom.h
+++ b/companion/src/firmwares/opentx/opentxeeprom.h
@@ -37,6 +37,7 @@
#define TARANIS_X9LITES_VARIANT 0x0801
#define JUMPER_T12_VARIANT 0x4001
#define RADIOMASTER_TX12_VARIANT 0x4002
+#define RADIOMASTER_T8_VARIANT 0x4004
class OpenTxGeneralData: public TransformedField {
public:
diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp
index 04f02eb29..f0d50338e 100644
--- a/companion/src/firmwares/opentx/opentxinterface.cpp
+++ b/companion/src/firmwares/opentx/opentxinterface.cpp
@@ -68,6 +68,8 @@ const char * OpenTxEepromInterface::getName()
return "OpenTX for Radiomaster TX16S";
case BOARD_RADIOMASTER_TX12:
return "OpenTX for Radiomaster TX12";
+ case BOARD_RADIOMASTER_T8:
+ return "OpenTX for Radiomaster T8";
case BOARD_TARANIS_X9D:
return "OpenTX for FrSky Taranis X9D";
case BOARD_TARANIS_X9DP:
@@ -339,6 +341,9 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u
else if (IS_RADIOMASTER_TX12(board)) {
variant |= RADIOMASTER_TX12_VARIANT;
}
+ else if (IS_RADIOMASTER_T8(board)) {
+ variant |= RADIOMASTER_T8_VARIANT;
+ }
OpenTxGeneralData generator((GeneralSettings &)radioData.generalSettings, board, version, variant);
// generator.dump();
QByteArray data;
@@ -685,6 +690,8 @@ int OpenTxFirmware::getCapability(::Capability capability)
return JUMPER_T12_VARIANT;
else if (IS_RADIOMASTER_TX12(board))
return RADIOMASTER_TX12_VARIANT;
+ else if (IS_RADIOMASTER_T8(board))
+ return RADIOMASTER_T8_VARIANT;
else
return 0;
case MavlinkTelemetry:
@@ -954,6 +961,11 @@ bool OpenTxEepromInterface::checkVariant(unsigned int version, unsigned int vari
variantError = true;
}
}
+ else if (IS_RADIOMASTER_T8(board)) {
+ if (variant != RADIOMASTER_T8_VARIANT) {
+ variantError = true;
+ }
+ }
else if (IS_TARANIS(board)) {
if (variant != 0) {
variantError = true;
@@ -1294,6 +1306,17 @@ void registerOpenTxFirmwares()
registerOpenTxFirmware(firmware);
addOpenTxRfOptions(firmware, FLEX);
+ /* Radiomaster T8 board */
+ firmware = new OpenTxFirmware("opentx-t8", QCoreApplication::translate("Firmware", "Radiomaster T8"), BOARD_RADIOMASTER_T8);
+ addOpenTxCommonOptions(firmware);
+ firmware->addOption("noheli", Firmware::tr("Disable HELI menu and cyclic mix support"));
+ firmware->addOption("nogvars", Firmware::tr("Disable Global variables"));
+ firmware->addOption("lua", Firmware::tr("Enable Lua custom scripts screen"));
+ addOpenTxFontOptions(firmware);
+ registerOpenTxFirmware(firmware);
+ addOpenTxRfOptions(firmware, NONE);
+ firmware->addOption("bindkey", Firmware::tr("Allow bind using bind key"));
+
/* Radiomaster TX16S board */
firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16S / SE / Hall / Masterfire"), BOARD_RADIOMASTER_TX16S);
addOpenTxFrskyOptions(firmware);
diff --git a/companion/src/images/simulator/T8/bottom.png b/companion/src/images/simulator/T8/bottom.png
new file mode 100644
index 000000000..055c7db62
Binary files /dev/null and b/companion/src/images/simulator/T8/bottom.png differ
diff --git a/companion/src/images/simulator/T8/left-pagedn.png b/companion/src/images/simulator/T8/left-pagedn.png
new file mode 100644
index 000000000..6b290e368
Binary files /dev/null and b/companion/src/images/simulator/T8/left-pagedn.png differ
diff --git a/companion/src/images/simulator/T8/left-pageup.png b/companion/src/images/simulator/T8/left-pageup.png
new file mode 100644
index 000000000..c155649a1
Binary files /dev/null and b/companion/src/images/simulator/T8/left-pageup.png differ
diff --git a/companion/src/images/simulator/T8/left-rtn.png b/companion/src/images/simulator/T8/left-rtn.png
new file mode 100644
index 000000000..95cc700f6
Binary files /dev/null and b/companion/src/images/simulator/T8/left-rtn.png differ
diff --git a/companion/src/images/simulator/T8/left-sys.png b/companion/src/images/simulator/T8/left-sys.png
new file mode 100644
index 000000000..7943ed93d
Binary files /dev/null and b/companion/src/images/simulator/T8/left-sys.png differ
diff --git a/companion/src/images/simulator/T8/left.png b/companion/src/images/simulator/T8/left.png
new file mode 100644
index 000000000..ff25c9543
Binary files /dev/null and b/companion/src/images/simulator/T8/left.png differ
diff --git a/companion/src/images/simulator/T8/right-dn.png b/companion/src/images/simulator/T8/right-dn.png
new file mode 100644
index 000000000..82a383576
Binary files /dev/null and b/companion/src/images/simulator/T8/right-dn.png differ
diff --git a/companion/src/images/simulator/T8/right-ent.png b/companion/src/images/simulator/T8/right-ent.png
new file mode 100644
index 000000000..8c3be3a56
Binary files /dev/null and b/companion/src/images/simulator/T8/right-ent.png differ
diff --git a/companion/src/images/simulator/T8/right-mdl.png b/companion/src/images/simulator/T8/right-mdl.png
new file mode 100644
index 000000000..f385c652e
Binary files /dev/null and b/companion/src/images/simulator/T8/right-mdl.png differ
diff --git a/companion/src/images/simulator/T8/right-up.png b/companion/src/images/simulator/T8/right-up.png
new file mode 100644
index 000000000..5e3bd39ed
Binary files /dev/null and b/companion/src/images/simulator/T8/right-up.png differ
diff --git a/companion/src/images/simulator/T8/right.png b/companion/src/images/simulator/T8/right.png
new file mode 100644
index 000000000..1016d8de5
Binary files /dev/null and b/companion/src/images/simulator/T8/right.png differ
diff --git a/companion/src/images/simulator/T8/top.png b/companion/src/images/simulator/T8/top.png
new file mode 100644
index 000000000..962119223
Binary files /dev/null and b/companion/src/images/simulator/T8/top.png differ
diff --git a/companion/src/simulation/CMakeLists.txt b/companion/src/simulation/CMakeLists.txt
index 9b9cbc130..c2707a5ca 100644
--- a/companion/src/simulation/CMakeLists.txt
+++ b/companion/src/simulation/CMakeLists.txt
@@ -16,6 +16,7 @@ set(simulation_SRCS
simulateduiwidgetJumperT16.cpp
simulateduiwidgetJumperT18.cpp
simulateduiwidgetTX12.cpp
+ simulateduiwidgetT8.cpp
simulateduiwidgetTX16S.cpp
simulatorinterface.cpp
simulatormainwindow.cpp
@@ -43,6 +44,7 @@ set(simulation_UIS
simulateduiwidgetJumperT16.ui
simulateduiwidgetJumperT18.ui
simulateduiwidgetTX12.ui
+ simulateduiwidgetT8.ui
simulateduiwidgetTX16S.ui
simulatormainwindow.ui
simulatorstartupdialog.ui
diff --git a/companion/src/simulation/simulateduiwidget.h b/companion/src/simulation/simulateduiwidget.h
index 66939f429..af965684f 100644
--- a/companion/src/simulation/simulateduiwidget.h
+++ b/companion/src/simulation/simulateduiwidget.h
@@ -116,6 +116,7 @@ namespace Ui {
class SimulatedUIWidgetJumperT18;
class SimulatedUIWidgetTX16S;
class SimulatedUIWidgetTX12;
+ class SimulatedUIWidgetT8;
}
class SimulatedUIWidget9X: public SimulatedUIWidget
@@ -278,6 +279,17 @@ class SimulatedUIWidgetTX12: public SimulatedUIWidget
Ui::SimulatedUIWidgetTX12 * ui;
};
+class SimulatedUIWidgetT8: public SimulatedUIWidget
+{
+Q_OBJECT
+
+public:
+ explicit SimulatedUIWidgetT8(SimulatorInterface * simulator, QWidget * parent = nullptr);
+ virtual ~SimulatedUIWidgetT8();
+
+private:
+ Ui::SimulatedUIWidgetT8 * ui;
+};
class SimulatedUIWidgetTX16S: public SimulatedUIWidget
{
diff --git a/companion/src/simulation/simulateduiwidgetT8.cpp b/companion/src/simulation/simulateduiwidgetT8.cpp
new file mode 100644
index 000000000..ed86889d7
--- /dev/null
+++ b/companion/src/simulation/simulateduiwidgetT8.cpp
@@ -0,0 +1,67 @@
+#include "simulateduiwidget.h"
+#include "ui_simulateduiwidgetT8.h"
+
+// NOTE: RadioUiAction(NUMBER,...): NUMBER relates to enum EnumKeys in the specific board.h
+
+SimulatedUIWidgetT8::SimulatedUIWidgetT8(SimulatorInterface *simulator, QWidget * parent):
+ SimulatedUIWidget(simulator, parent),
+ ui(new Ui::SimulatedUIWidgetT8)
+{
+ RadioUiAction * act;
+
+ ui->setupUi(this);
+
+ // add actions in order of appearance on the help menu
+
+ act = new RadioUiAction(5, QList() << Qt::Key_Up, SIMU_STR_HLP_KEY_UP, SIMU_STR_HLP_ACT_MDL);
+ addRadioWidget(ui->rightbuttons->addArea(QRect(25, 40, 35, 20), "T8/right-mdl.png", act));
+
+ act = new RadioUiAction(6, QList() << Qt::Key_Enter << Qt::Key_Return, SIMU_STR_HLP_KEYS_GO_UP, SIMU_STR_HLP_ACT_UP);
+ addRadioWidget(ui->rightbuttons->addArea(QRect(25, 90, 35, 20), "T8/right-up.png", act));
+
+ act = new RadioUiAction(7, QList() << Qt::Key_Enter << Qt::Key_Return, SIMU_STR_HLP_KEYS_GO_DN, SIMU_STR_HLP_ACT_DN);
+ addRadioWidget(ui->rightbuttons->addArea(QRect(25, 135, 35, 20), "T8/right-dn.png", act));
+
+ act = new RadioUiAction(1, QList() << Qt::Key_Enter << Qt::Key_Return, SIMU_STR_HLP_KEYS_ACTIVATE, SIMU_STR_HLP_ACT_ENT);
+ addRadioWidget(ui->rightbuttons->addArea(QRect(25, 180, 35, 20), "T8/right-ent.png", act));
+
+ act = new RadioUiAction(4, QList() << Qt::Key_Left, SIMU_STR_HLP_KEY_LFT, SIMU_STR_HLP_ACT_SYS);
+ addRadioWidget(ui->leftbuttons->addArea(QRect(60, 45, 35, 20), "T8/left-sys.png", act));
+
+ act = new RadioUiAction(0, QList() << Qt::Key_Down << Qt::Key_Delete << Qt::Key_Escape << Qt::Key_Backspace, SIMU_STR_HLP_KEYS_EXIT, SIMU_STR_HLP_ACT_EXIT);
+ addRadioWidget(ui->leftbuttons->addArea(QRect(60, 85, 35, 20), "T8/left-rtn.png", act));
+
+ act = new RadioUiAction(3, QList() << Qt::Key_PageDown, SIMU_STR_HLP_KEY_PGDN, SIMU_STR_HLP_ACT_PGDN);
+ addRadioWidget(ui->leftbuttons->addArea(QRect(60, 135, 35, 20), "T8/left-pagedn.png", act));
+
+ act = new RadioUiAction(2, QList() << Qt::Key_PageUp, SIMU_STR_HLP_KEY_PGUP, SIMU_STR_HLP_ACT_PGUP);
+ addRadioWidget(ui->leftbuttons->addArea(QRect(60, 180, 35, 20), "T8/left-pageup.png", act));
+
+
+ m_backlightColors << QColor(215, 243, 255); // X7 Blue
+ m_backlightColors << QColor(166,247,159);
+ m_backlightColors << QColor(247,159,166);
+ m_backlightColors << QColor(255,195,151);
+ m_backlightColors << QColor(247,242,159);
+
+ setLcd(ui->lcd);
+
+ QString css = "#radioUiWidget {"
+ "background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:1,"
+ "stop:0 rgba(255, 255, 255, 255),"
+ "stop:0.757062 rgba(241, 238, 238, 255),"
+ "stop:1 rgba(247, 245, 245, 255));"
+ "}";
+
+ QTimer * tim = new QTimer(this);
+ tim->setSingleShot(true);
+ connect(tim, &QTimer::timeout, [this, css]() {
+ emit customStyleRequest(css);
+ });
+ tim->start(100);
+}
+
+SimulatedUIWidgetT8::~SimulatedUIWidgetT8()
+{
+ delete ui;
+}
diff --git a/companion/src/simulation/simulateduiwidgetT8.ui b/companion/src/simulation/simulateduiwidgetT8.ui
new file mode 100644
index 000000000..6370888ea
--- /dev/null
+++ b/companion/src/simulation/simulateduiwidgetT8.ui
@@ -0,0 +1,258 @@
+
+
+ SimulatedUIWidgetT8
+
+
+
+ 0
+ 0
+ 480
+ 300
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 480
+ 300
+
+
+
+
+ 480
+ 300
+
+
+
+ Radiomaster T8 Simulator
+
+
+ background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(255, 255, 255, 255), stop:0.757062 rgba(241, 238, 238, 255), stop:1 rgba(247, 245, 245, 255));
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 113
+ 280
+
+
+
+
+ 113
+ 280
+
+
+
+ background:url(:/images/simulator/T8/left.png);
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 254
+ 158
+
+
+
+
+ 254
+ 158
+
+
+
+ background-color: rgb(215, 243, 255);
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 113
+ 280
+
+
+
+
+ 113
+ 280
+
+
+
+ background:url(:/images/simulator/T8/right.png)
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 254
+ 35
+
+
+
+
+ 254
+ 35
+
+
+
+ background:url(:/images/simulator/T8/top.png)
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 254
+ 113
+
+
+
+
+ 254
+ 113
+
+
+
+ background:url(:/images/simulator/T8/bottom.png)
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 10
+
+
+
+
+ 16777215
+ 12
+
+
+
+
+ 0
+ 12
+
+
+
+ background-color: rgb(255, 255, 255);
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 10
+
+
+
+
+ 16777215
+ 10
+
+
+
+ background-color: rgb(247, 245, 245);
+
+
+
+
+
+
+
+
+
+
+ LcdWidget
+ QWidget
+
+ 1
+
+
+ ButtonsWidget
+ QWidget
+
+ 1
+
+
+
+
+
diff --git a/companion/src/simulation/simulatorwidget.cpp b/companion/src/simulation/simulatorwidget.cpp
index cab7600d4..0b2b6b853 100644
--- a/companion/src/simulation/simulatorwidget.cpp
+++ b/companion/src/simulation/simulatorwidget.cpp
@@ -100,6 +100,9 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato
case Board::BOARD_RADIOMASTER_TX12:
radioUiWidget = new SimulatedUIWidgetTX12(simulator, this);
break;
+ case Board::BOARD_RADIOMASTER_T8:
+ radioUiWidget = new SimulatedUIWidgetT8(simulator, this);
+ break;
case Board::BOARD_RADIOMASTER_TX16S:
radioUiWidget = new SimulatedUIWidgetTX16S(simulator, this);
break;
diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt
index 47a1fed2a..b3a8c1fdb 100644
--- a/radio/src/CMakeLists.txt
+++ b/radio/src/CMakeLists.txt
@@ -345,6 +345,10 @@ if(RADIOMASTER_RELEASE)
add_definitions(-DRADIOMASTER_RELEASE)
endif()
+if(RADIOMASTER_RTF_RELEASE)
+ add_definitions(-DRADIOMASTER_RTF_RELEASE)
+endif()
+
if(TBS_RELEASE)
add_definitions(-DTBS_RELEASE)
endif()
diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h
index dcdd6e5c8..005fbec56 100644
--- a/radio/src/dataconstants.h
+++ b/radio/src/dataconstants.h
@@ -208,7 +208,11 @@ enum TrainerMode {
};
#endif
-#if defined(RADIO_T16) && !defined(INTERNAL_MODULE_MULTI)
+#define TRAINER_MODE_MIN() TRAINER_MODE_MASTER_TRAINER_JACK
+
+#if !defined(HARDWARE_EXTERNAL_MODULE)
+ #define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE
+#elif defined(RADIO_T16) && !defined(INTERNAL_MODULE_MULTI)
#if defined(BLUETOOTH)
#define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE_BLUETOOTH
#else
diff --git a/radio/src/gui/128x64/lcd.h b/radio/src/gui/128x64/lcd.h
index c6b32dd3d..3a94f2365 100644
--- a/radio/src/gui/128x64/lcd.h
+++ b/radio/src/gui/128x64/lcd.h
@@ -181,8 +181,9 @@ uint8_t * lcdLoadBitmap(uint8_t * dest, const char * filename, uint8_t width, ui
#if defined(BOOT)
#define BLINK_ON_PHASE (0)
#else
- #define BLINK_ON_PHASE (g_blinkTmr10ms & (1<<6))
#define SLOW_BLINK_ON_PHASE (g_blinkTmr10ms & (1<<7))
+ #define BLINK_ON_PHASE (g_blinkTmr10ms & (1<<6))
+ #define FAST_BLINK_ON_PHASE (g_blinkTmr10ms & (1<<4))
#endif
inline display_t getPixel(uint8_t x, uint8_t y)
diff --git a/radio/src/gui/128x64/model_curve_edit.cpp b/radio/src/gui/128x64/model_curve_edit.cpp
index 66f153b4d..c2168ed02 100644
--- a/radio/src/gui/128x64/model_curve_edit.cpp
+++ b/radio/src/gui/128x64/model_curve_edit.cpp
@@ -165,7 +165,7 @@ void menuModelCurveOne(event_t event)
}
break;
-#if defined(NAVIGATION_X7_TX12)
+#if defined(KEYS_GPIO_REG_MDL)
case EVT_KEY_FIRST(KEY_MODEL):
pushMenu(menuChannelsView);
killEvents(event);
diff --git a/radio/src/gui/128x64/model_input_edit.cpp b/radio/src/gui/128x64/model_input_edit.cpp
index 840e41a82..ce76e0a89 100644
--- a/radio/src/gui/128x64/model_input_edit.cpp
+++ b/radio/src/gui/128x64/model_input_edit.cpp
@@ -49,7 +49,7 @@ enum ExposFields {
void menuModelExpoOne(event_t event)
{
-#if defined(NAVIGATION_X7_TX12)
+#if defined(KEYS_GPIO_REG_MDL)
if (event == EVT_KEY_FIRST(KEY_MODEL)) {
pushMenu(menuChannelsView);
killEvents(event);
diff --git a/radio/src/gui/128x64/model_mix_edit.cpp b/radio/src/gui/128x64/model_mix_edit.cpp
index 92e10ee69..281256f46 100644
--- a/radio/src/gui/128x64/model_mix_edit.cpp
+++ b/radio/src/gui/128x64/model_mix_edit.cpp
@@ -85,7 +85,7 @@ void drawOffsetBar(uint8_t x, uint8_t y, MixData * md)
void menuModelMixOne(event_t event)
{
-#if defined(NAVIGATION_X7_TX12)
+#if defined(KEYS_GPIO_REG_MDL)
if (event == EVT_KEY_FIRST(KEY_MODEL)) {
pushMenu(menuChannelsView);
killEvents(event);
diff --git a/radio/src/gui/128x64/model_select.cpp b/radio/src/gui/128x64/model_select.cpp
index cf6410d63..bcf04117d 100644
--- a/radio/src/gui/128x64/model_select.cpp
+++ b/radio/src/gui/128x64/model_select.cpp
@@ -203,7 +203,7 @@ void menuModelSelect(event_t event)
}
break;
-#if defined(NAVIGATION_X7_TX12)
+#if defined(KEYS_GPIO_REG_PAGEDN)
case EVT_KEY_FIRST(KEY_PAGEUP):
chainMenu(menuTabModel[DIM(menuTabModel)-1]);
killEvents(event);
@@ -212,7 +212,7 @@ void menuModelSelect(event_t event)
case EVT_KEY_FIRST(KEY_PAGEDN):
chainMenu(menuModelSetup);
break;
-#elif defined(NAVIGATION_X7)
+#elif defined(KEYS_GPIO_REG_PAGE)
case EVT_KEY_LONG(KEY_PAGE):
chainMenu(menuTabModel[DIM(menuTabModel)-1]);
killEvents(event);
@@ -244,7 +244,7 @@ void menuModelSelect(event_t event)
#endif
#endif
-#if defined(NAVIGATION_X7)
+#if defined(ROTARY_ENCODER) && defined(NAVIGATION_X7)
case EVT_ROTARY_LEFT:
case EVT_ROTARY_RIGHT:
#endif
diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp
index 004737515..468597b29 100644
--- a/radio/src/gui/128x64/model_setup.cpp
+++ b/radio/src/gui/128x64/model_setup.cpp
@@ -111,7 +111,7 @@ enum MenuModelSetupItems {
ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_2,
ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_3,
#endif
-
+#if defined(HARDWARE_EXTERNAL_MODULE)
ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL,
ITEM_MODEL_SETUP_EXTERNAL_MODULE_TYPE,
#if defined(MULTIMODULE)
@@ -156,6 +156,7 @@ enum MenuModelSetupItems {
ITEM_MODEL_SETUP_EXTRA_MODULE_CHANNELS,
ITEM_MODEL_SETUP_EXTRA_MODULE_BIND,
#endif
+#endif
#if defined(PCBTARANIS)
ITEM_MODEL_SETUP_TRAINER_LABEL,
@@ -183,13 +184,16 @@ enum MenuModelSetupItems {
#define REGISTRATION_ID_ROWS
#endif
-#if defined(HARDWARE_INTERNAL_MODULE)
+#if defined(HARDWARE_INTERNAL_MODULE) && defined(HARDWARE_EXTERNAL_MODULE)
#define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE)
#define CURRENT_RECEIVER_EDITED(k) (k - (k >= ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL ? ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_1 : ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_1))
#elif defined(PCBSKY9X)
- #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_SETUP_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE)
+ #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_SETUP_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE)
+#elif defined(HARDWARE_INTERNAL_MODULE)
+ #define CURRENT_MODULE_EDITED(k) (INTERNAL_MODULE)
+ #define CURRENT_RECEIVER_EDITED(k) (k - ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_1)
#else
- #define CURRENT_MODULE_EDITED(k) (EXTERNAL_MODULE)
+ #define CURRENT_MODULE_EDITED(k) (EXTERNAL_MODULE)
#define CURRENT_RECEIVER_EDITED(k) (k - ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_1)
#endif
@@ -335,6 +339,32 @@ void onBluetoothConnectMenu(const char * result)
#define INTERNAL_MODULE_ROWS
#endif
+#if defined(HARDWARE_EXTERNAL_MODULE)
+ #define EXTERNAL_MODULE_ROWS \
+ LABEL(ExternalModule), \
+ MODULE_TYPE_ROWS(EXTERNAL_MODULE), \
+ MULTIMODULE_TYPE_ROWS(EXTERNAL_MODULE) /* PROTOCOL */ \
+ MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) /* SUBTYPE */ \
+ MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE) \
+ AFHDS3_PROTOCOL_ROW(EXTERNAL_MODULE) \
+ AFHDS3_MODE_ROWS(EXTERNAL_MODULE) \
+ MODULE_CHANNELS_ROWS(EXTERNAL_MODULE), \
+ IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, MODULE_BIND_ROWS(EXTERNAL_MODULE)), /* line reused for PPM: PPM settings */ \
+ IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), /* RxNum */ \
+ AFHDS3_MODULE_ROWS(EXTERNAL_MODULE) \
+ MODULE_POWER_ROW(EXTERNAL_MODULE), \
+ IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, MODULE_OPTION_ROW(EXTERNAL_MODULE)), \
+ MULTIMODULE_MODULE_ROWS(EXTERNAL_MODULE) \
+ FAILSAFE_ROWS(EXTERNAL_MODULE), /* ITEM_MODEL_SETUP_EXTERNAL_MODULE_FAILSAFE */ \
+ IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 1), /* Range check and Register buttons */ \
+ IF_PXX2_MODULE(EXTERNAL_MODULE, 0), /* Module options */ \
+ IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), /* Receiver 1 */ \
+ IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), /* Receiver 2 */ \
+ IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), /* Receiver 3 */
+#else
+ #define EXTERNAL_MODULE_ROWS
+#endif
+
void menuModelSetup(event_t event)
{
int8_t old_editMode = s_editMode;
@@ -370,26 +400,7 @@ void menuModelSetup(event_t event)
INTERNAL_MODULE_ROWS
- LABEL(ExternalModule),
- MODULE_TYPE_ROWS(EXTERNAL_MODULE),
- MULTIMODULE_TYPE_ROWS(EXTERNAL_MODULE) // PROTOCOL
- MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) // SUBTYPE
- MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE)
- AFHDS3_PROTOCOL_ROW(EXTERNAL_MODULE)
- AFHDS3_MODE_ROWS(EXTERNAL_MODULE)
- MODULE_CHANNELS_ROWS(EXTERNAL_MODULE),
- IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, MODULE_BIND_ROWS(EXTERNAL_MODULE)), // line reused for PPM: PPM settings
- IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // RxNum
- AFHDS3_MODULE_ROWS(EXTERNAL_MODULE)
- MODULE_POWER_ROW(EXTERNAL_MODULE),
- IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, MODULE_OPTION_ROW(EXTERNAL_MODULE)),
- MULTIMODULE_MODULE_ROWS(EXTERNAL_MODULE)
- FAILSAFE_ROWS(EXTERNAL_MODULE), //ITEM_MODEL_SETUP_EXTERNAL_MODULE_FAILSAFE
- IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 1), // Range check and Register buttons
- IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Module options
- IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // Receiver 1
- IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // Receiver 2
- IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // Receiver 3
+ EXTERNAL_MODULE_ROWS
TRAINER_ROWS
});
@@ -912,14 +923,18 @@ void menuModelSetup(event_t event)
break;
#endif
+#if defined(HARDWARE_EXTERNAL_MODULE)
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL:
lcdDrawTextAlignedLeft(y, STR_EXTERNALRF);
break;
+#endif
#if defined(INTERNAL_MODULE_MULTI)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE:
#endif
+#if defined(HARDWARE_EXTERNAL_MODULE)
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_TYPE:
+#endif
lcdDrawTextAlignedLeft(y, INDENT TR_MODE);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_EXTERNAL_MODULE_PROTOCOLS, moduleIdx == EXTERNAL_MODULE ? reusableBuffer.moduleSetup.newType : g_model.moduleData[moduleIdx].type, menuHorizontalPosition==0 ? attr : 0);
if (isModuleXJT(moduleIdx))
@@ -1013,7 +1028,9 @@ void menuModelSetup(event_t event)
#if defined(HARDWARE_INTERNAL_MODULE)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_PROTOCOL:
#endif
+#if defined(HARDWARE_EXTERNAL_MODULE)
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL:
+#endif
{
lcdDrawTextAlignedLeft(y, TR_TYPE);
int multi_rfProto = g_model.moduleData[moduleIdx].getMultiProtocol();
@@ -1052,7 +1069,9 @@ void menuModelSetup(event_t event)
#if defined(HARDWARE_INTERNAL_MODULE)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_SUBTYPE:
#endif
+#if defined(HARDWARE_EXTERNAL_MODULE)
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_SUBTYPE:
+#endif
{
lcdDrawTextAlignedLeft(y, STR_SUBTYPE);
lcdDrawMultiSubProtocolString(MODEL_SETUP_2ND_COLUMN, y, moduleIdx, g_model.moduleData[moduleIdx].subType, attr);
@@ -1095,7 +1114,7 @@ void menuModelSetup(event_t event)
lcdDrawTextAlignedLeft(y, INDENT TR_MODE);
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerData.mode, attr);
if (attr) {
- g_model.trainerData.mode = checkIncDec(event, g_model.trainerData.mode, 0, TRAINER_MODE_MAX(), EE_MODEL, isTrainerModeAvailable);
+ g_model.trainerData.mode = checkIncDec(event, g_model.trainerData.mode, TRAINER_MODE_MIN(), TRAINER_MODE_MAX(), EE_MODEL, isTrainerModeAvailable);
#if defined(BLUETOOTH)
if (checkIncDec_Ret) {
bluetooth.state = BLUETOOTH_STATE_OFF;
@@ -1182,7 +1201,9 @@ void menuModelSetup(event_t event)
#if defined(PCBSKY9X)
case ITEM_MODEL_SETUP_EXTRA_MODULE_CHANNELS:
#endif
+#if defined(HARDWARE_EXTERNAL_MODULE)
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_CHANNELS:
+#endif
{
ModuleData & moduleData = g_model.moduleData[moduleIdx];
lcdDrawTextAlignedLeft(y, STR_CHANNELRANGE);
@@ -1308,7 +1329,9 @@ void menuModelSetup(event_t event)
#if defined(HARDWARE_INTERNAL_MODULE)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE:
#endif
+#if defined(HARDWARE_EXTERNAL_MODULE)
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE:
+#endif
{
ModuleData & moduleData = g_model.moduleData[moduleIdx];
if (isModulePPM(moduleIdx)) {
@@ -1462,7 +1485,9 @@ void menuModelSetup(event_t event)
#if defined(HARDWARE_INTERNAL_MODULE)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_FAILSAFE:
#endif
+#if defined(HARDWARE_EXTERNAL_MODULE)
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_FAILSAFE:
+#endif
{
ModuleData &moduleData = g_model.moduleData[moduleIdx];
lcdDrawTextAlignedLeft(y, STR_FAILSAFE);
@@ -1523,7 +1548,9 @@ void menuModelSetup(event_t event)
#if defined(HARDWARE_INTERNAL_MODULE)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_OPTIONS:
#endif
+#if defined(HARDWARE_EXTERNAL_MODULE)
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_OPTIONS:
+#endif
{
#if defined(MULTIMODULE)
if (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx)) {
@@ -1602,7 +1629,9 @@ void menuModelSetup(event_t event)
#if defined(INTERNAL_MODULE_MULTI)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_POWER:
#endif
+#if defined(HARDWARE_EXTERNAL_MODULE)
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_POWER:
+#endif
{
auto & module = g_model.moduleData[moduleIdx];
// Lite FCC / Lite FLEX / Lite Pro Flex
@@ -1687,7 +1716,9 @@ void menuModelSetup(event_t event)
#if defined(HARDWARE_INTERNAL_MODULE)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_AUTOBIND:
#endif
+#if defined(HARDWARE_EXTERNAL_MODULE)
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AUTOBIND:
+#endif
if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2) {
int8_t value = (g_model.moduleData[moduleIdx].multi.optionValue & 0x02) >> 1;
lcdDrawText(INDENT_WIDTH, y, STR_MULTI_SERVOFREQ);
@@ -1708,13 +1739,17 @@ void menuModelSetup(event_t event)
#if defined(HARDWARE_INTERNAL_MODULE)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_DISABLE_TELEM:
#endif
+#if defined(HARDWARE_EXTERNAL_MODULE)
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_DISABLE_TELEM:
+#endif
g_model.moduleData[moduleIdx].multi.disableTelemetry = editCheckBox(g_model.moduleData[moduleIdx].multi.disableTelemetry, MODEL_SETUP_2ND_COLUMN, y, INDENT TR_DISABLE_TELEM, attr, event);
break;
#if defined(HARDWARE_INTERNAL_MODULE)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_DISABLE_MAPPING:
#endif
+#if defined(HARDWARE_EXTERNAL_MODULE)
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_DISABLE_MAPPING:
+#endif
g_model.moduleData[moduleIdx].multi.disableMapping = editCheckBox(g_model.moduleData[moduleIdx].multi.disableMapping, MODEL_SETUP_2ND_COLUMN, y, INDENT TR_DISABLE_CH_MAP, attr, event);
break;
#endif
@@ -1739,7 +1774,10 @@ void menuModelSetup(event_t event)
#if defined(HARDWARE_INTERNAL_MODULE)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_STATUS:
#endif
- case ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS: {
+#if defined(HARDWARE_EXTERNAL_MODULE)
+ case ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS:
+#endif
+ {
lcdDrawTextAlignedLeft(y, STR_MODULE_STATUS);
char statusText[64];
@@ -1750,7 +1788,10 @@ void menuModelSetup(event_t event)
#if defined(HARDWARE_INTERNAL_MODULE)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_SYNCSTATUS:
#endif
- case ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS: {
+#if defined(HARDWARE_EXTERNAL_MODULE)
+ case ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS:
+#endif
+ {
lcdDrawTextAlignedLeft(y, STR_MODULE_SYNC);
char statusText[64];
getModuleSyncStatusString(moduleIdx, statusText);
@@ -1848,11 +1889,13 @@ void menuModelSetup(event_t event)
checkModelIdUnique(g_eeGeneral.currModel, EXTRA_MODULE);
break;
#endif
+#if defined(HARDWARE_EXTERNAL_MODULE)
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE:
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_MODEL_NUM:
if (menuHorizontalPosition == 0)
checkModelIdUnique(g_eeGeneral.currModel, EXTERNAL_MODULE);
break;
+#endif
}
}
}
diff --git a/radio/src/gui/128x64/radio_diagkeys.cpp b/radio/src/gui/128x64/radio_diagkeys.cpp
index a3d058c3e..803ff7eb7 100644
--- a/radio/src/gui/128x64/radio_diagkeys.cpp
+++ b/radio/src/gui/128x64/radio_diagkeys.cpp
@@ -49,10 +49,15 @@ void menuRadioDiagKeys(event_t event)
displayKeyState(i&1? 20*FW : 18*FW, y, TRM_BASE+i);
}
- if (i <= KEY_MAX) {
- y = MENU_HEADER_HEIGHT + 1 + FH*i;
+ if (i == 7) {
+ y = MENU_HEADER_HEIGHT + 1 + FH * 6;
+ lcdDrawTextAtIndex(8, y, STR_VKEYS, i, 0);
+ displayKeyState(lcdNextPos + 10, y, i);
+ }
+ else if (i <= KEY_MAX) {
+ y = MENU_HEADER_HEIGHT + 1 + FH * i;
lcdDrawTextAtIndex(0, y, STR_VKEYS, i, 0);
- displayKeyState(5*FW+2, y, i);
+ displayKeyState(5 * FW + 2, y, i);
}
#if defined(PCBSKY9X)
diff --git a/radio/src/gui/128x64/radio_setup.cpp b/radio/src/gui/128x64/radio_setup.cpp
index e3fd06bb3..26b80cb0f 100644
--- a/radio/src/gui/128x64/radio_setup.cpp
+++ b/radio/src/gui/128x64/radio_setup.cpp
@@ -79,13 +79,13 @@ enum {
ITEM_RADIO_SETUP_MEMORY_WARNING,
ITEM_RADIO_SETUP_ALARM_WARNING,
ITEM_RADIO_SETUP_RSSI_POWEROFF_ALARM,
- ITEM_RADIO_SETUP_BACKLIGHT_LABEL,
- ITEM_RADIO_SETUP_BACKLIGHT_MODE,
- ITEM_RADIO_SETUP_BACKLIGHT_DELAY,
- ITEM_RADIO_SETUP_BRIGHTNESS,
+ CASE_BACKLIGHT(ITEM_RADIO_SETUP_BACKLIGHT_LABEL)
+ CASE_BACKLIGHT(ITEM_RADIO_SETUP_BACKLIGHT_MODE)
+ CASE_BACKLIGHT(ITEM_RADIO_SETUP_BACKLIGHT_DELAY)
+ CASE_BACKLIGHT(ITEM_RADIO_SETUP_BRIGHTNESS)
CASE_PWM_BACKLIGHT(ITEM_RADIO_SETUP_BACKLIGHT_BRIGHTNESS_OFF)
CASE_PWM_BACKLIGHT(ITEM_RADIO_SETUP_BACKLIGHT_BRIGHTNESS_ON)
- ITEM_RADIO_SETUP_FLASH_BEEP,
+ CASE_BACKLIGHT(ITEM_RADIO_SETUP_FLASH_BEEP)
CASE_SPLASH_PARAM(ITEM_RADIO_SETUP_DISABLE_SPLASH)
CASE_PWR_BUTTON_PRESS(ITEM_RADIO_SETUP_PWR_ON_SPEED)
CASE_PWR_BUTTON_PRESS(ITEM_RADIO_SETUP_PWR_OFF_SPEED)
@@ -152,10 +152,14 @@ void menuRadioSetup(event_t event)
CASE_GYRO(0)
CASE_GYRO(0)
0, LABEL(ALARMS), 0, CASE_CAPACITY(0)
- 0, 0, 0, 0,
- LABEL(BACKLIGHT), 0, 0, 0, CASE_PWM_BACKLIGHT(0)
+ 0, 0, 0, 0, /* ITEM_RADIO_SETUP_INACTIVITY_ALARM ITEM_RADIO_SETUP_MEMORY_WARNING ITEM_RADIO_SETUP_ALARM_WARNING ITEM_RADIO_SETUP_RSSI_POWEROFF_ALARM */
+ CASE_BACKLIGHT(LABEL(BACKLIGHT))
+ CASE_BACKLIGHT(0)
+ CASE_BACKLIGHT(0)
+ CASE_BACKLIGHT(0)
CASE_PWM_BACKLIGHT(0)
- 0,
+ CASE_PWM_BACKLIGHT(0)
+ CASE_BACKLIGHT(0)
CASE_SPLASH_PARAM(0)
CASE_PWR_BUTTON_PRESS(0)
CASE_PWR_BUTTON_PRESS(0)
@@ -251,7 +255,7 @@ void menuRadioSetup(event_t event)
putsVolts(lcdLastRightPos+FW, y, 120+g_eeGeneral.vBatMax, (menuHorizontalPosition>0 ? attr : 0)|LEFT|NO_UNIT);
if (attr && s_editMode>0) {
if (menuHorizontalPosition==0)
- CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatMin, -50, g_eeGeneral.vBatMax+29); // min=4.0V
+ CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatMin, -60, g_eeGeneral.vBatMax+29); // min=3.0V
else
CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatMax, g_eeGeneral.vBatMin-29, +40); // max=16.0V
}
@@ -411,7 +415,7 @@ void menuRadioSetup(event_t event)
case ITEM_RADIO_SETUP_BATTERY_WARNING:
lcdDrawTextAlignedLeft(y, STR_BATTERYWARNING);
putsVolts(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.vBatWarn, attr|LEFT);
- if(attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatWarn, 40, 120); //4-12V
+ if(attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatWarn, 30, 120); //3-12V
break;
case ITEM_RADIO_SETUP_MEMORY_WARNING:
@@ -450,6 +454,7 @@ void menuRadioSetup(event_t event)
if(attr) g_eeGeneral.inactivityTimer = checkIncDec(event, g_eeGeneral.inactivityTimer, 0, 250, EE_GENERAL); //0..250minutes
break;
+#if defined(BACKLIGHT_GPIO)
case ITEM_RADIO_SETUP_BACKLIGHT_LABEL:
lcdDrawTextAlignedLeft(y, STR_BACKLIGHT_LABEL);
break;
@@ -478,6 +483,7 @@ void menuRadioSetup(event_t event)
g_eeGeneral.backlightBright = 100 - b;
}
break;
+#endif
#if defined(PWM_BACKLIGHT)
case ITEM_RADIO_SETUP_BACKLIGHT_BRIGHTNESS_OFF:
diff --git a/radio/src/gui/128x64/view_about.cpp b/radio/src/gui/128x64/view_about.cpp
index 02e8e4508..b168f91fb 100644
--- a/radio/src/gui/128x64/view_about.cpp
+++ b/radio/src/gui/128x64/view_about.cpp
@@ -42,7 +42,7 @@ enum AboutScreens {
#define ABOUT_X 2
#define ABOUT_INDENT 4
-#if defined(NAVIGATION_X7_TX12)
+#if defined(KEYS_GPIO_REG_PAGEDN)
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_PAGEUP)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGEDN)
#elif defined(NAVIGATION_X7)
diff --git a/radio/src/gui/128x64/view_channels.cpp b/radio/src/gui/128x64/view_channels.cpp
index f71d833c1..ffb4d9b33 100644
--- a/radio/src/gui/128x64/view_channels.cpp
+++ b/radio/src/gui/128x64/view_channels.cpp
@@ -26,7 +26,12 @@ constexpr coord_t CHANNEL_GAUGE_OFFSET = CHANNEL_VALUE_OFFSET;
constexpr coord_t CHANNEL_BAR_WIDTH = 70;
constexpr coord_t CHANNEL_PROPERTIES_OFFSET = CHANNEL_GAUGE_OFFSET + CHANNEL_BAR_WIDTH + 2;
-#if defined(NAVIGATION_X7_TX12)
+#if defined(RADIO_T8)
+#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_PAGEUP)
+#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGEDN)
+#define EVT_KEY_NEXT_PAGE EVT_KEY_BREAK(KEY_PLUS)
+#define EVT_KEY_PREVIOUS_PAGE EVT_KEY_BREAK(KEY_MINUS)
+#elif defined(NAVIGATION_X7_TX12)
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_PAGEUP)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGEDN)
#define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT
diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp
index ee486269b..b3cea8de7 100644
--- a/radio/src/gui/128x64/view_main.cpp
+++ b/radio/src/gui/128x64/view_main.cpp
@@ -93,8 +93,9 @@ void doMainScreenGraphics()
if (g_model.throttleReversed && CONVERT_MODE(2) == THR_STICK)
calibStickVert = -calibStickVert;
drawStick(RBOX_CENTERX, calibratedAnalogs[CONVERT_MODE(3)], calibStickVert);
-
+#if defined(HARDWARE_POT1)
drawPotsBars();
+#endif
}
void displayTrims(uint8_t phase)
@@ -213,7 +214,16 @@ void displayVoltageOrAlarm()
#define displayVoltageOrAlarm() displayBattVoltage()
#endif
-#if defined(NAVIGATION_X7_TX12)
+#if defined(RADIO_T8)
+#define EVT_KEY_CONTEXT_MENU EVT_KEY_LONG(KEY_ENTER)
+#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_PAGEUP)
+#define EVT_KEY_NEXT_VIEW EVT_KEY_FIRST(KEY_PAGEDN)
+#define EVT_KEY_NEXT_PAGE EVT_KEY_FIRST(KEY_PLUS)
+#define EVT_KEY_PREVIOUS_PAGE EVT_KEY_FIRST(KEY_MINUS)
+#define EVT_KEY_MODEL_MENU EVT_KEY_LONG(KEY_MODEL)
+#define EVT_KEY_GENERAL_MENU EVT_KEY_LONG(KEY_SYS)
+#define EVT_KEY_TELEMETRY EVT_KEY_LONG(KEY_PAGEUP)
+#elif defined(NAVIGATION_X7_TX12)
#define EVT_KEY_CONTEXT_MENU EVT_KEY_LONG(KEY_ENTER)
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_FIRST(KEY_PAGEUP)
#define EVT_KEY_NEXT_VIEW EVT_KEY_FIRST(KEY_PAGEDN)
@@ -410,6 +420,7 @@ void menuMainView(event_t event)
killEvents(event);
break;
+
case EVT_KEY_FIRST(KEY_EXIT):
#if defined(GVARS)
if (gvarDisplayTimer > 0) {
diff --git a/radio/src/gui/128x64/view_statistics.cpp b/radio/src/gui/128x64/view_statistics.cpp
index 2b46be36e..0765cf9b6 100644
--- a/radio/src/gui/128x64/view_statistics.cpp
+++ b/radio/src/gui/128x64/view_statistics.cpp
@@ -31,7 +31,7 @@ void menuStatisticsView(event_t event)
switch (event) {
case EVT_KEY_FIRST(KEY_UP):
-#if defined(NAVIGATION_X7_TX12)
+#if defined(KEYS_GPIO_REG_PAGEDN)
case EVT_KEY_BREAK(KEY_PAGEDN):
#elif defined(NAVIGATION_X7)
case EVT_KEY_BREAK(KEY_PAGE):
@@ -41,7 +41,7 @@ void menuStatisticsView(event_t event)
break;
case EVT_KEY_FIRST(KEY_DOWN):
-#if defined(NAVIGATION_X7_TX12)
+#if defined(KEYS_GPIO_REG_PAGEUP)
case EVT_KEY_BREAK(KEY_PAGEUP):
killEvents(event);
chainMenu(menuStatisticsDebug2);
@@ -140,7 +140,7 @@ void menuStatisticsDebug(event_t event)
break;
case EVT_KEY_FIRST(KEY_UP):
-#if defined(NAVIGATION_X7_TX12)
+#if defined(KEYS_GPIO_REG_PAGEDN)
case EVT_KEY_BREAK(KEY_PAGEDN):
disableVBatBridge();
chainMenu(menuStatisticsDebug2);
@@ -153,7 +153,7 @@ void menuStatisticsDebug(event_t event)
#endif
case EVT_KEY_FIRST(KEY_DOWN):
-#if defined(NAVIGATION_X7_TX12)
+#if defined(KEYS_GPIO_REG_PAGEUP)
case EVT_KEY_BREAK(KEY_PAGEUP):
#elif defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_PAGE):
@@ -278,7 +278,7 @@ void menuStatisticsDebug2(event_t event)
break;
case EVT_KEY_FIRST(KEY_UP):
-#if defined(NAVIGATION_X7_TX12)
+#if defined(KEYS_GPIO_REG_PAGEDN)
case EVT_KEY_BREAK(KEY_PAGEDN):
#elif defined(NAVIGATION_X7)
case EVT_KEY_BREAK(KEY_PAGE):
@@ -287,7 +287,7 @@ void menuStatisticsDebug2(event_t event)
return;
case EVT_KEY_FIRST(KEY_DOWN):
-#if defined(NAVIGATION_X7_TX12)
+#if defined(KEYS_GPIO_REG_PAGEUP)
case EVT_KEY_BREAK(KEY_PAGEUP):
#elif defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_PAGE):
diff --git a/radio/src/gui/common/stdlcd/radio_hardware.cpp b/radio/src/gui/common/stdlcd/radio_hardware.cpp
index fca6e047c..1bc66768d 100644
--- a/radio/src/gui/common/stdlcd/radio_hardware.cpp
+++ b/radio/src/gui/common/stdlcd/radio_hardware.cpp
@@ -195,7 +195,9 @@ enum {
ITEM_RADIO_HARDWARE_MAX
};
-#if (NUM_POTS + NUM_SLIDERS) == 1
+#if (NUM_POTS + NUM_SLIDERS) == 0
+ #define POTS_ROWS HIDDEN_ROW
+#elif (NUM_POTS + NUM_SLIDERS) == 1
#define POTS_ROWS NAVIGATION_LINE_BY_LINE|1
#elif (NUM_POTS + NUM_SLIDERS) == 2
#define POTS_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
@@ -238,20 +240,20 @@ enum {
#endif
#if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA)
-#define EXTERNAL_ANTENNA_ROW 0,
-void onHardwareAntennaSwitchConfirm(const char * result)
-{
- if (result == STR_OK) {
- // Switch to external antenna confirmation
- g_eeGeneral.antennaMode = reusableBuffer.radioHardware.antennaMode;
- storageDirty(EE_GENERAL);
+ #define EXTERNAL_ANTENNA_ROW 0,
+ void onHardwareAntennaSwitchConfirm(const char * result)
+ {
+ if (result == STR_OK) {
+ // Switch to external antenna confirmation
+ g_eeGeneral.antennaMode = reusableBuffer.radioHardware.antennaMode;
+ storageDirty(EE_GENERAL);
+ }
+ else {
+ reusableBuffer.radioHardware.antennaMode = g_eeGeneral.antennaMode;
+ }
}
- else {
- reusableBuffer.radioHardware.antennaMode = g_eeGeneral.antennaMode;
- }
-}
#else
-#define EXTERNAL_ANTENNA_ROW
+ #define EXTERNAL_ANTENNA_ROW
#endif
#if defined(PCBX9LITE)
@@ -262,7 +264,7 @@ void onHardwareAntennaSwitchConfirm(const char * result)
#define SWITCH_TYPE_MAX(sw) (SWITCH_3POS)
#elif defined(PCBX9E)
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS)
-#elif defined(RADIO_TX12)
+#elif defined(RADIO_TX12) || defined(RADIO_T8)
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SA - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SD - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS)
#else
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH - MIXSRC_FIRST_SWITCH <= sw) ? SWITCH_2POS : SWITCH_3POS)
@@ -322,35 +324,27 @@ void menuRadioHardware(event_t event)
MENU(STR_HARDWARE, menuTabGeneral, MENU_RADIO_HARDWARE, HEADER_LINE + ITEM_RADIO_HARDWARE_MAX, {
HEADER_LINE_COLUMNS
0 /* calibration button */,
- 0 /* stick 1 */,
- 0 /* stick 2 */,
- 0 /* stick 3 */,
- 0 /* stick 4 */,
+ 0 /* stick 1 */,
+ 0 /* stick 2 */,
+ 0 /* stick 3 */,
+ 0 /* stick 4 */,
LABEL(Pots),
- POTS_ROWS,
+ POTS_ROWS,
LABEL(Switches),
- SWITCHES_ROWS,
-
+ SWITCHES_ROWS,
0 /* battery calib */,
RTC_ROW
TX_CAPACITY_MEASUREMENT_ROWS
-
MAX_BAUD_ROWS
-
BLUETOOTH_ROWS
-
EXTERNAL_ANTENNA_ROW
-
AUX_SERIAL_ROWS
-
0 /* ADC filter */,
READONLY_ROW /* RAS */,
SPORT_POWER_ROWS
1 /* debugs */,
-
- 0,
-
- 0
+ 0 /* EEPROM backup */,
+ 0 /* Factory reset */
});
uint8_t sub = menuVerticalPosition - HEADER_LINE;
diff --git a/radio/src/gui/common/stdlcd/view_telemetry.cpp b/radio/src/gui/common/stdlcd/view_telemetry.cpp
index ecdb96aa9..07a31442c 100644
--- a/radio/src/gui/common/stdlcd/view_telemetry.cpp
+++ b/radio/src/gui/common/stdlcd/view_telemetry.cpp
@@ -34,7 +34,7 @@ enum NavigationDirection {
#if defined(NAVIGATION_XLITE)
#define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_LEFT) && IS_SHIFT_PRESSED())
#define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_LONG(KEY_RIGHT) && IS_SHIFT_PRESSED())
-#elif defined(NAVIGATION_X7_TX12)
+#elif defined(KEYS_GPIO_REG_PAGEDN)
#define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_PAGEUP))
#define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_PAGEDN))
#elif defined(NAVIGATION_X7) || defined(NAVIGATION_X9D)
diff --git a/radio/src/gui/navigation/navigation_x7.cpp b/radio/src/gui/navigation/navigation_x7.cpp
index ac4a4bbdd..311a53d9f 100644
--- a/radio/src/gui/navigation/navigation_x7.cpp
+++ b/radio/src/gui/navigation/navigation_x7.cpp
@@ -56,8 +56,11 @@ void onSwitchLongEnterPress(const char * result)
int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_flags, IsValueAvailable isValueAvailable, const CheckIncDecStops &stops)
{
int newval = val;
-
+#if defined(ROTARY_ENCODER_NAVIGATION)
if (s_editMode>0 && event==EVT_ROTARY_RIGHT) {
+#else
+ if (s_editMode>0 && (event==EVT_KEY_FIRST(KEY_MINUS) || event==EVT_KEY_REPT(KEY_MINUS))) {
+#endif
newval += min(rotencSpeed, i_max-val);
while (isValueAvailable && !isValueAvailable(newval) && newval<=i_max) {
newval++;
@@ -67,7 +70,11 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla
AUDIO_KEY_ERROR();
}
}
+#if defined(ROTARY_ENCODER_NAVIGATION)
else if (s_editMode>0 && event==EVT_ROTARY_LEFT) {
+#else
+ if (s_editMode>0 && (event==EVT_KEY_FIRST(KEY_PLUS) || event==EVT_KEY_REPT(KEY_PLUS))) {
+#endif
newval -= min(rotencSpeed, val-i_min);
while (isValueAvailable && !isValueAvailable(newval) && newval>=i_min) {
newval--;
@@ -217,7 +224,7 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t
if (menuTab) {
int cc = curr;
switch (event) {
-#if defined(NAVIGATION_X7_TX12)
+#if defined(KEYS_GPIO_REG_PAGEUP)
case EVT_KEY_FIRST(KEY_PAGEUP):
#else
case EVT_KEY_LONG(KEY_PAGE):
@@ -232,7 +239,7 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t
killEvents(event);
break;
-#if defined(NAVIGATION_X7_TX12)
+#if defined(KEYS_GPIO_REG_PAGEDN)
case EVT_KEY_FIRST(KEY_PAGEDN):
#else
case EVT_KEY_BREAK(KEY_PAGE):
@@ -310,12 +317,14 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t
}
}
break;
-
+#if defined(ROTARY_ENCODER_NAVIGATION)
case EVT_ROTARY_RIGHT:
- case EVT_KEY_FIRST(KEY_RIGHT):
AUDIO_KEY_PRESS();
// no break
- case EVT_KEY_REPT(KEY_RIGHT):
+#else
+ case EVT_KEY_FIRST(KEY_DOWN):
+ case EVT_KEY_REPT(KEY_DOWN):
+#endif
if (s_editMode > 0) break; // TODO it was !=
if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) {
if (l_posHorz >= 0) {
@@ -341,12 +350,14 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t
l_posHorz = POS_HORZ_INIT(l_posVert);
break;
-
+#if defined(ROTARY_ENCODER_NAVIGATION)
case EVT_ROTARY_LEFT:
- case EVT_KEY_FIRST(KEY_LEFT):
AUDIO_KEY_PRESS();
// no break
- case EVT_KEY_REPT(KEY_LEFT):
+#else
+ case EVT_KEY_FIRST(KEY_UP):
+ case EVT_KEY_REPT(KEY_UP):
+#endif
if (s_editMode > 0) break; // TODO it was !=
if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) {
if (l_posHorz >= 0) {
diff --git a/radio/src/keys.h b/radio/src/keys.h
index 44c1e53fe..0d4bc37dc 100644
--- a/radio/src/keys.h
+++ b/radio/src/keys.h
@@ -82,6 +82,11 @@ inline bool IS_KEY_EVT(event_t evt, uint8_t key)
#define EVT_ROTARY_RIGHT 0xDE00
#define IS_NEXT_EVENT(event) (event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN))
#define IS_PREVIOUS_EVENT(event) (event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_UP))
+#elif defined(RADIO_T8)
+ #define EVT_ROTARY_BREAK EVT_KEY_BREAK(KEY_ENTER)
+ #define EVT_ROTARY_LONG EVT_KEY_LONG(KEY_ENTER)
+ #define IS_NEXT_EVENT(event) (event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_REPT(KEY_DOWN))
+ #define IS_PREVIOUS_EVENT(event) (event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_UP))
#elif (defined(PCBHORUS) || defined(PCBTARANIS)) && defined(ROTARY_ENCODER_NAVIGATION)
#define EVT_ROTARY_BREAK EVT_KEY_BREAK(KEY_ENTER)
#define EVT_ROTARY_LONG EVT_KEY_LONG(KEY_ENTER)
diff --git a/radio/src/lua/CMakeLists.txt b/radio/src/lua/CMakeLists.txt
index 5b89c1f65..fee1d9f15 100644
--- a/radio/src/lua/CMakeLists.txt
+++ b/radio/src/lua/CMakeLists.txt
@@ -29,5 +29,6 @@ if(PYTHONINTERP_FOUND)
add_lua_export_target(x12s ${LUA_INCLUDES} -DPCBHORUS -DPCBX12S)
add_lua_export_target(t12 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_T12)
add_lua_export_target(tx12 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_TX12)
+ add_lua_export_target(t8 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_T8)
add_lua_export_target(t16 ${LUA_INCLUDES} -DPCBHORUS -DPCBX10 -DRADIO_T16)
endif()
diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp
index 37634ae1c..b3c3f5ee8 100644
--- a/radio/src/lua/api_general.cpp
+++ b/radio/src/lua/api_general.cpp
@@ -42,6 +42,8 @@
#include "lua/lua_exports_t12.inc"
#elif defined(RADIO_TX12)
#include "lua/lua_exports_tx12.inc"
+#elif defined(RADIO_T8)
+ #include "lua/lua_exports_t8.inc"
#elif defined(PCBX9LITES)
#include "lua/lua_exports_x9lites.inc"
#elif defined(PCBX9LITE)
@@ -1779,11 +1781,11 @@ const luaR_value_entry opentxConstants[] = {
{ "MIXSRC_SE", MIXSRC_SE },
{ "MIXSRC_SG", MIXSRC_SG },
#endif
-#if !defined(PCBXLITE) && !defined(PCBX9LITE)
+#if defined(HARDWARE_SWITCH_F)
{ "MIXSRC_SF", MIXSRC_SF },
-#if !defined(RADIO_TX12)
- { "MIXSRC_SH", MIXSRC_SH },
#endif
+#if defined(HARDWARE_SWITCH_H)
+ { "MIXSRC_SH", MIXSRC_SH },
#endif
{ "MIXSRC_CH1", MIXSRC_CH1 },
{ "SWSRC_LAST", SWSRC_LAST_LOGICAL_SWITCH },
@@ -1845,7 +1847,7 @@ const luaR_value_entry opentxConstants[] = {
{ "ROTENC_LOWSPEED", ROTENC_LOWSPEED },
{ "ROTENC_MIDSPEED", ROTENC_MIDSPEED },
{ "ROTENC_HIGHSPEED", ROTENC_HIGHSPEED },
-#elif defined(PCBX9D) || defined(PCBX9DP) // key reverted between field nav and value change
+#elif defined(PCBX9D) || defined(PCBX9DP) || defined(RADIO_T8) // key reverted between field nav and value change
{ "EVT_VIRTUAL_PREV", EVT_KEY_FIRST(KEY_PLUS) },
{ "EVT_VIRTUAL_PREV_REPT", EVT_KEY_REPT(KEY_PLUS) },
{ "EVT_VIRTUAL_NEXT", EVT_KEY_FIRST(KEY_MINUS) },
@@ -1882,7 +1884,7 @@ const luaR_value_entry opentxConstants[] = {
{ "EVT_VIRTUAL_ENTER_LONG", EVT_KEY_LONG(KEY_ENTER) },
{ "EVT_VIRTUAL_EXIT", EVT_KEY_BREAK(KEY_EXIT) },
#elif defined(NAVIGATION_X7) || defined(NAVIGATION_X9D)
-#if defined(RADIO_TX12)
+#if defined(RADIO_TX12) || defined(RADIO_T8)
{ "EVT_VIRTUAL_PREV_PAGE", EVT_KEY_BREAK(KEY_PAGEUP) },
{ "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_BREAK(KEY_PAGEDN) },
{ "EVT_VIRTUAL_MENU", EVT_KEY_BREAK(KEY_MODEL) },
diff --git a/radio/src/main.cpp b/radio/src/main.cpp
index db12ee20f..8ff9cd736 100644
--- a/radio/src/main.cpp
+++ b/radio/src/main.cpp
@@ -531,6 +531,10 @@ void perMain()
}
#endif
+#if defined(KEYS_GPIO_REG_BIND) && defined(BIND_KEY)
+ bindButtonHandler(evt);
+#endif
+
#if defined(GUI)
DEBUG_TIMER_START(debugTimerGuiMain);
guiMain(evt);
diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp
index 73b39c407..7a222635a 100644
--- a/radio/src/opentx.cpp
+++ b/radio/src/opentx.cpp
@@ -334,6 +334,12 @@ void generalDefault()
setDefaultOwnerId();
#endif
+#if defined(RADIOMASTER_RTF_RELEASE)
+ // Those settings are for headless radio
+ g_eeGeneral.USBMode = USB_JOYSTICK_MODE;
+ g_eeGeneral.disableRtcWarning = 1;
+#endif
+
g_eeGeneral.chkSum = 0xFFFF;
}
@@ -523,6 +529,15 @@ void modelDefault(uint8_t id)
g_model.switchWarningState |= (1 << (3*i));
}
#endif
+
+#if defined(RADIOMASTER_RTF_RELEASE)
+ // Those settings are for headless radio
+ g_model.trainerData.mode = TRAINER_MODE_SLAVE;
+ g_model.moduleData[INTERNAL_MODULE].type = MODULE_TYPE_MULTIMODULE;
+ g_model.moduleData[INTERNAL_MODULE].setMultiProtocol(MODULE_SUBTYPE_MULTI_FRSKY);
+ g_model.moduleData[INTERNAL_MODULE].subType = MM_RF_FRSKY_SUBTYPE_D8;
+ g_model.moduleData[INTERNAL_MODULE].failsafeMode = FAILSAFE_NOPULSES;
+#endif
}
bool isInputRecursive(int index)
@@ -917,7 +932,7 @@ void checkAll()
checkFailsafe();
checkRSSIAlarmsDisabled();
-#if defined(SDCARD)
+#if defined(SDCARD) && !defined(RADIOMASTER_RTF_RELEASE)
checkSDVersion();
#endif
@@ -2183,6 +2198,7 @@ uint32_t pwrCheck()
#endif
event_t evt = getEvent(false);
DISPLAY_WARNING(evt);
+ LED_ERROR_BEGIN();
lcdRefresh();
if (warningResult) {
@@ -2192,6 +2208,7 @@ uint32_t pwrCheck()
else if (!warningText) {
// shutdown has been cancelled
pwr_check_state = PWR_CHECK_PAUSED;
+ LED_ERROR_END();
return e_power_on;
}
}
diff --git a/radio/src/opentx.h b/radio/src/opentx.h
index 52a51719b..bb756305b 100644
--- a/radio/src/opentx.h
+++ b/radio/src/opentx.h
@@ -69,6 +69,12 @@
#define CASE_GYRO(x)
#endif
+#if defined(BACKLIGHT_GPIO)
+#define CASE_BACKLIGHT(x) x,
+#else
+#define CASE_BACKLIGHT(x)
+#endif
+
#if defined(LUA)
#define CASE_LUA(x) x,
#else
@@ -382,6 +388,8 @@ inline bool SPLASH_NEEDED()
#define ROTENC_HIGHSPEED 50
#define ROTENC_DELAY_MIDSPEED 32
#define ROTENC_DELAY_HIGHSPEED 16
+#elif defined(RADIO_T8)
+ constexpr uint8_t rotencSpeed = 1;
#endif
constexpr uint8_t HEART_TIMER_10MS = 0x01;
@@ -437,6 +445,10 @@ extern uint8_t potsPos[NUM_XPOTS];
bool trimDown(uint8_t idx);
void readKeysAndTrims();
+#if defined(KEYS_GPIO_REG_BIND)
+void bindButtonHandler(event_t event);
+#endif
+
uint16_t evalChkSum();
void alert(const char * title, const char * msg, uint8_t sound);
@@ -998,7 +1010,13 @@ constexpr uint8_t OPENTX_START_NO_CHECKS = 0x04;
#if defined(STATUS_LEDS)
#define LED_ERROR_BEGIN() ledRed()
+#if defined(RADIO_T8)
+ // Because of green backlit logo, green is preferred on this radio
+ #define LED_ERROR_END() ledGreen()
+ #define LED_BIND() ledBlue()
+#else
#define LED_ERROR_END() ledBlue()
+#endif
#else
#define LED_ERROR_BEGIN()
#define LED_ERROR_END()
diff --git a/radio/src/options.h b/radio/src/options.h
index acadfd129..4f1a1a077 100644
--- a/radio/src/options.h
+++ b/radio/src/options.h
@@ -97,6 +97,9 @@ static const char * const options[] = {
#endif
#if defined(HARDWARE_EXTERNAL_ACCESS_MOD)
"externalaccessmod",
+#endif
+#if defined(BIND_KEY)
+ "bindkey",
#endif
nullptr //sentinel
};
diff --git a/radio/src/pulses/modules_constants.h b/radio/src/pulses/modules_constants.h
index 15a2c2283..6fbec157e 100644
--- a/radio/src/pulses/modules_constants.h
+++ b/radio/src/pulses/modules_constants.h
@@ -203,6 +203,14 @@ enum MMRFrskySubtypes {
MM_RF_FRSKY_SUBTYPE_D16_CLONED
};
+enum MMRFrskyX2Subtypes {
+ MM_RF_FRSKYX2_SUBTYPE_D16,
+ MM_RF_FRSKYX2_SUBTYPE_D8,
+ MM_RF_FRSKYX2_SUBTYPE_D16_LBT,
+ MM_RF_FRSKYX2_SUBTYPE_D16_LBT_8CH,
+ MM_RF_FRSKYX2_SUBTYPE_D16_CLONED
+};
+
enum ModuleSubtypeDSM2 {
DSM2_PROTO_LP45,
DSM2_PROTO_DSM2,
diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h
index fc9a06b92..b6888f1f8 100644
--- a/radio/src/sdcard.h
+++ b/radio/src/sdcard.h
@@ -145,6 +145,8 @@ const char * getBasename(const char * path);
#define OTX_FOURCC 0x3D78746F // otx for Jumper T12
#elif defined(RADIO_TX12)
#define OTX_FOURCC 0x4178746F // otx for Radiomaster TX12
+#elif defined(RADIO_T8)
+ #define OTX_FOURCC 0x4378746F // otx for Radiomaster T8
#elif defined(PCBX7)
#define OTX_FOURCC 0x3678746F // otx for Taranis X7 / X7S / X7 Express / X7S Express
#elif defined(PCBX9LITES)
diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp
index 6d086e100..2e9c6a89e 100644
--- a/radio/src/simu.cpp
+++ b/radio/src/simu.cpp
@@ -273,6 +273,15 @@ void OpenTxSim::updateKeysAndSwitches(bool start)
KEY_Down, KEY_EXIT,
KEY_Right, KEY_TELE,
KEY_Left, KEY_SYS,
+#elif defined(RADIO_T8)
+ KEY_Page_Up, KEY_PAGEUP,
+ KEY_Page_Down, KEY_PAGEDN,
+ KEY_Return, KEY_ENTER,
+ KEY_Right, KEY_MODEL,
+ KEY_BackSpace, KEY_EXIT,
+ KEY_Left, KEY_SYS,
+ KEY_Up, KEY_PLUS,
+ KEY_Down, KEY_MINUS,
#elif defined(PCBTARANIS)
KEY_Page_Up, KEY_MENU,
#if defined(KEYS_GPIO_REG_PAGE)
diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/adc_driver.cpp
index c6f5ee182..c6dddda75 100644
--- a/radio/src/targets/common/arm/stm32/adc_driver.cpp
+++ b/radio/src/targets/common/arm/stm32/adc_driver.cpp
@@ -125,6 +125,9 @@ void adcInit()
ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT << 0) + (ADC_Channel_Vbat << 5);
ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH << 0) + (ADC_CHANNEL_STICK_LV << 5) + (ADC_CHANNEL_STICK_RV << 10) + (ADC_CHANNEL_STICK_RH << 15) + (ADC_CHANNEL_POT1 << 20) + (ADC_CHANNEL_POT2 << 25);
}
+#elif defined(RADIO_T8)
+ ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT << 0) + (ADC_Channel_Vbat << 5);
+ ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH << 0) + (ADC_CHANNEL_STICK_LV << 5) + (ADC_CHANNEL_STICK_RV << 10) + (ADC_CHANNEL_STICK_RH << 15);
#elif defined(PCBX7)
ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT << 0) + (ADC_Channel_Vbat << 5);
ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH << 0) + (ADC_CHANNEL_STICK_LV << 5) + (ADC_CHANNEL_STICK_RV << 10) + (ADC_CHANNEL_STICK_RH << 15) + (ADC_CHANNEL_POT1 << 20) + (ADC_CHANNEL_POT2 << 25);
diff --git a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt
index 55bcdeb66..1a69afdff 100644
--- a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt
+++ b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt
@@ -89,7 +89,7 @@ set(BOOTLOADER_SRC
bin_files.cpp
)
-if(PCB STREQUAL X12S OR PCB STREQUAL X10 OR PCB STREQUAL X9E OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019) OR (PCB STREQUAL X7 AND NOT (PCBREV STREQUAL T12)) OR PCB STREQUAL X9LITE OR PCB STREQUAL X9LITES)
+if(PCB STREQUAL X12S OR PCB STREQUAL X10 OR PCB STREQUAL X9E OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019) OR (PCB STREQUAL X7 AND NOT (PCBREV STREQUAL T12 OR PCBREV STREQUAL T8)) OR PCB STREQUAL X9LITE OR PCB STREQUAL X9LITES)
set(BOOTLOADER_SRC
${BOOTLOADER_SRC}
../../../../../targets/common/arm/stm32/rotary_encoder_driver.cpp
diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp
index b849fa8a2..e94ae4756 100644
--- a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp
+++ b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp
@@ -218,8 +218,13 @@ int main()
}
}
+#if defined(RADIO_T8) && !defined(RADIOMASTER_RELEASE)
+ // Bind button not pressed
+ if ((~KEYS_GPIO_REG_BIND & KEYS_GPIO_PIN_BIND) == false) {
+#else
// LHR & RHL trims not pressed simultanously
if (readTrims() != BOOTLOADER_KEYS) {
+#endif
// Start main application
jumpTo(APP_START_ADDRESS);
}
diff --git a/radio/src/targets/common/arm/stm32/pwr_driver.cpp b/radio/src/targets/common/arm/stm32/pwr_driver.cpp
index 220b5fdfd..32ff59195 100644
--- a/radio/src/targets/common/arm/stm32/pwr_driver.cpp
+++ b/radio/src/targets/common/arm/stm32/pwr_driver.cpp
@@ -80,7 +80,7 @@ void pwrInit()
GPIO_Init(SD_PRESENT_GPIO, &GPIO_InitStructure);
#endif
-#if defined(INTMODULE_USART) && defined(TRAINER_MODULE_CPPM_GPIO_PIN)
+#if defined(INTMODULE_USART) && defined(TRAINER_MODULE_CPPM)
GPIO_SetBits(TRAINER_MODULE_CPPM_GPIO, TRAINER_MODULE_CPPM_GPIO_PIN);
GPIO_InitStructure.GPIO_Pin = TRAINER_MODULE_CPPM_GPIO_PIN;
GPIO_Init(TRAINER_MODULE_CPPM_GPIO, &GPIO_InitStructure);
diff --git a/radio/src/targets/sky9x/CMakeLists.txt b/radio/src/targets/sky9x/CMakeLists.txt
index 842035bde..d09906965 100644
--- a/radio/src/targets/sky9x/CMakeLists.txt
+++ b/radio/src/targets/sky9x/CMakeLists.txt
@@ -12,6 +12,7 @@ set(PPM_LIMITS_SYMETRICAL YES)
set(PXX1 YES)
set(AFHDS3 NO)
set(GHOST NO)
+add_definitions(-DHARDWARE_EXTERNAL_MODULE)
add_definitions(-DDISABLE_MULTI_UPDATE)
if(PCB STREQUAL 9XRPRO)
diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt
index a287605df..718e3c684 100644
--- a/radio/src/targets/taranis/CMakeLists.txt
+++ b/radio/src/targets/taranis/CMakeLists.txt
@@ -6,6 +6,9 @@ option(AFHDS3 "AFHDS3 TX Module" ON)
option(GHOST "Ghost TX Module" ON)
option(INTERNAL_MODULE_PPM "Support for PPM internal module" OFF)
option(AUTOUPDATE "Auto update internal chips from SD" OFF)
+option(BIND_KEY "Enable bind button" OFF)
+
+set(EXTERNAL_MODULE YES)
if(PCB STREQUAL X9E)
option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON)
@@ -144,6 +147,24 @@ elseif(PCB STREQUAL X7)
add_definitions(-DRADIO_TX12)
add_definitions(-DEEPROM_VARIANT=0x4002)
add_definitions(-DMANUFACTURER_RADIOMASTER)
+ elseif(PCBREV STREQUAL T8)
+ option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" ON)
+ set(EXTERNAL_MODULE NO)
+ set(AFHDS3 NO)
+ set(FLAVOUR t8)
+ set(NAVIGATION_TYPE x7)
+ set(CPU_TYPE STM32F2)
+ set(CPU_TYPE_FULL STM32F205xE) # for size report
+ set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld)
+ set(ROTARY_ENCODER NO)
+ set(LUA_EXPORT lua_export_t8)
+ set(BLUETOOTH NO)
+ if(RADIOMASTER_RELEASE)
+ set(BIND_KEY YES)
+ endif()
+ add_definitions(-DRADIO_T8)
+ add_definitions(-DEEPROM_VARIANT=0x4004)
+ add_definitions(-DMANUFACTURER_RADIOMASTER)
elseif(PCBREV STREQUAL ACCESS)
option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF)
option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" ON)
@@ -334,6 +355,14 @@ if(ROTARY_ENCODER)
)
endif()
+if(BIND_KEY)
+ set(TARGET_SRC
+ ${TARGET_SRC}
+ bind_button_driver.cpp
+ )
+ add_definitions(-DBIND_KEY)
+endif()
+
if(USB_CHARGER)
set(TARGET_SRC ${TARGET_SRC} usb_charger_driver.cpp)
add_definitions(-DUSB_CHARGER)
@@ -454,4 +483,8 @@ if(INTERNAL_MODULE_PPM)
add_definitions(-DINTERNAL_MODULE_PPM)
endif()
+if(EXTERNAL_MODULE)
+ add_definitions(-DHARDWARE_EXTERNAL_MODULE)
+endif()
+
set(RADIO_DEPENDENCIES ${RADIO_DEPENDENCIES} ${BITMAPS_TARGET})
diff --git a/radio/src/targets/taranis/backlight_driver.cpp b/radio/src/targets/taranis/backlight_driver.cpp
index 63a5bfd1a..7c758f818 100644
--- a/radio/src/targets/taranis/backlight_driver.cpp
+++ b/radio/src/targets/taranis/backlight_driver.cpp
@@ -20,7 +20,13 @@
#include "opentx.h"
-#if defined(PCBX9E)
+#if !defined(BACKLIGHT_GPIO)
+ // no backlight
+ void backlightInit() {}
+ void backlightEnable(uint8_t level) {}
+ void backlightDisable() {}
+ uint8_t isBacklightEnabled() {return false;}
+#elif defined(PCBX9E)
void backlightInit()
{
GPIO_InitTypeDef GPIO_InitStructure;
diff --git a/radio/src/targets/taranis/bind_button_driver.cpp b/radio/src/targets/taranis/bind_button_driver.cpp
new file mode 100644
index 000000000..2d3ca63fc
--- /dev/null
+++ b/radio/src/targets/taranis/bind_button_driver.cpp
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) OpenTX
+ *
+ * Based on code named
+ * th9x - http://code.google.com/p/th9x
+ * er9x - http://code.google.com/p/er9x
+ * gruvin9x - http://code.google.com/p/gruvin9x
+ *
+ * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include "opentx.h"
+
+
+bool setBindProtocolSelection()
+{
+ int16_t xPos = calibratedAnalogs[CONVERT_MODE(0)];
+ int16_t yPos = calibratedAnalogs[CONVERT_MODE(1)];
+
+ // Center: D8
+ if (abs(xPos < 50 && abs(yPos) < 50)) {
+ g_model.moduleData[INTERNAL_MODULE].setMultiProtocol(MODULE_SUBTYPE_MULTI_FRSKY);
+ g_model.moduleData[INTERNAL_MODULE].subType = MM_RF_FRSKY_SUBTYPE_D8;
+ storageDirty(EE_MODEL);
+ return true;
+ }
+
+ // Top left: D16 FCC
+ if (xPos < -512 && yPos > 512) {
+ g_model.moduleData[INTERNAL_MODULE].setMultiProtocol(MODULE_SUBTYPE_MULTI_FRSKY);
+ g_model.moduleData[INTERNAL_MODULE].subType = MM_RF_FRSKY_SUBTYPE_D16;
+ g_model.moduleData[INTERNAL_MODULE].failsafeMode = FAILSAFE_NOPULSES;
+ storageDirty(EE_MODEL);
+ return true;
+ }
+
+ // Top right: D16 LBT
+ if (xPos > 512 && yPos > 512) {
+ g_model.moduleData[INTERNAL_MODULE].setMultiProtocol(MODULE_SUBTYPE_MULTI_FRSKY);
+ g_model.moduleData[INTERNAL_MODULE].subType = MM_RF_FRSKY_SUBTYPE_D16_LBT;
+ g_model.moduleData[INTERNAL_MODULE].failsafeMode = FAILSAFE_NOPULSES;
+ storageDirty(EE_MODEL);
+ return true;
+ }
+
+ // Bottom left: V2.1 D16 FCC
+ if (xPos < -512 && yPos < -512) {
+ g_model.moduleData[INTERNAL_MODULE].setMultiProtocol(MODULE_SUBTYPE_MULTI_FRSKYX2);
+ g_model.moduleData[INTERNAL_MODULE].subType = MM_RF_FRSKYX2_SUBTYPE_D16;
+ g_model.moduleData[INTERNAL_MODULE].failsafeMode = FAILSAFE_NOPULSES;
+ storageDirty(EE_MODEL);
+ return true;
+ }
+
+ // Bottom right: V2.1 D16 LBT
+ if (xPos > 512 && yPos < -512) {
+ g_model.moduleData[INTERNAL_MODULE].setMultiProtocol(MODULE_SUBTYPE_MULTI_FRSKYX2);
+ g_model.moduleData[INTERNAL_MODULE].subType = MM_RF_FRSKYX2_SUBTYPE_D16_LBT;
+ g_model.moduleData[INTERNAL_MODULE].failsafeMode = FAILSAFE_NOPULSES;
+ storageDirty(EE_MODEL);
+ return true;
+ }
+
+ return false;
+}
+
+void bindButtonHandler(event_t event)
+{
+ if( !isModuleMultimodule(INTERNAL_MODULE))
+ return;
+
+ if (event == EVT_KEY_LONG(KEY_BIND) && getMultiBindStatus(INTERNAL_MODULE) == MULTI_NORMAL_OPERATION) {
+ if (setBindProtocolSelection()) {
+ setMultiBindStatus(INTERNAL_MODULE, MULTI_BIND_INITIATED);
+ moduleState[INTERNAL_MODULE].mode = MODULE_MODE_BIND;
+ }
+ }
+
+ if (getMultiBindStatus(INTERNAL_MODULE) == MULTI_BIND_INITIATED) {
+ if (FAST_BLINK_ON_PHASE)
+ LED_BIND();
+ else
+ ledOff();
+ }
+
+ if (getMultiBindStatus(INTERNAL_MODULE) == MULTI_BIND_FINISHED) {
+ setMultiBindStatus(INTERNAL_MODULE, MULTI_NORMAL_OPERATION);
+ moduleState[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL;
+ LED_ERROR_END();
+ }
+}
diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp
index d86a82f2d..bec585b25 100644
--- a/radio/src/targets/taranis/board.cpp
+++ b/radio/src/targets/taranis/board.cpp
@@ -272,6 +272,8 @@ void boardOff()
#if defined (RADIO_TX12)
#define BATTERY_DIVIDER 22830
+#elif defined (RADIO_T8)
+ #define BATTERY_DIVIDER 50000
#else
#define BATTERY_DIVIDER 26214
#endif
diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h
index 6ffff9df9..6708b6c89 100644
--- a/radio/src/targets/taranis/board.h
+++ b/radio/src/targets/taranis/board.h
@@ -27,8 +27,8 @@
#include "board_common.h"
#include "hal.h"
-#if defined(RADIO_TX12)
- #define NAVIGATION_X7_TX12
+#if defined(RADIO_TX12) || defined(RADIO_TX12)
+ #define NAVIGATION_X7_TX12
#endif
#if defined(ROTARY_ENCODER_NAVIGATION)
@@ -152,7 +152,7 @@ void extmoduleSendInvertedByte(uint8_t byte);
// Trainer driver
#define SLAVE_MODE() (g_model.trainerData.mode == TRAINER_MODE_SLAVE)
-#if defined(PCBX9D) || (defined(PCBX9DP) && PCBREV < 2019)
+#if defined(TRAINER_DETECT_GPIO)
// Trainer detect is a switch on the jack
#define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_DETECT_GPIO, TRAINER_DETECT_GPIO_PIN) == Bit_RESET)
#elif defined(PCBXLITES)
@@ -270,6 +270,10 @@ enum EnumKeys
KEY_COUNT,
KEY_MAX = KEY_COUNT - 1,
+#if defined(KEYS_GPIO_REG_BIND)
+ KEY_BIND,
+#endif
+
#if defined(ROTARY_ENCODER_NAVIGATION)
KEY_PLUS,
KEY_MINUS,
@@ -355,7 +359,7 @@ enum EnumSwitchesPositions
SW_SE1,
SW_SE2,
#endif
-#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBX7) || defined(PCBXLITES) || defined(PCBX9LITES)
+#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBX7) || defined(PCBXLITES) || defined(PCBX9LITES) || defined(RADIO_T8)
SW_SF0,
SW_SF1,
SW_SF2,
@@ -365,7 +369,7 @@ enum EnumSwitchesPositions
SW_SG1,
SW_SG2,
#endif
-#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || (defined(PCBX7) && !defined(RADIO_TX12))
+#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || (defined(PCBX7) && !defined(RADIO_TX12)) || defined(RADIO_T8)
SW_SH0,
SW_SH1,
SW_SH2,
@@ -442,6 +446,11 @@ enum EnumSwitchesPositions
#define STORAGE_NUM_SWITCHES NUM_SWITCHES
#define DEFAULT_SWITCH_CONFIG (SWITCH_3POS << 10) + (SWITCH_3POS << 8) + (SWITCH_TOGGLE << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_TOGGLE << 0)
#define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2);
+#elif defined(RADIO_T8)
+ #define NUM_SWITCHES 4
+ #define STORAGE_NUM_SWITCHES 8
+ #define DEFAULT_SWITCH_CONFIG (SWITCH_2POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_2POS << 0);
+ #define DEFAULT_POTS_CONFIG (0)
#elif defined(PCBX7ACCESS)
#define NUM_SWITCHES 7
#define STORAGE_NUM_SWITCHES 8
@@ -544,6 +553,11 @@ enum Analogs {
#define NUM_SLIDERS 0
#define STORAGE_NUM_POTS 1
#define STORAGE_NUM_SLIDERS 0
+#elif defined(RADIO_T8)
+ #define NUM_POTS 0
+ #define NUM_SLIDERS 0
+ #define STORAGE_NUM_POTS 2
+ #define STORAGE_NUM_SLIDERS 0
#elif defined(PCBXLITE) || defined(PCBX7)
#define NUM_POTS 2
#define NUM_SLIDERS 0
@@ -644,6 +658,11 @@ extern uint16_t adcValues[NUM_ANALOGS];
#define BATTERY_WARN 66 // 6.6V
#define BATTERY_MIN 67 // 6.7V
#define BATTERY_MAX 83 // 8.3V
+#elif defined(RADIO_T8)
+ // 1S Li-ion / Lipo
+ #define BATTERY_WARN 33 // 3.3V
+ #define BATTERY_MIN 32 // 3.2V
+ #define BATTERY_MAX 42 // 4.2V
#else
// NI-MH 7.2V
#define BATTERY_WARN 65 // 6.5V
@@ -710,6 +729,10 @@ uint8_t isBacklightEnabled();
#define USB_NAME "Radiomaster TX12"
#define USB_MANUFACTURER 'R', 'M', '_', 'T', 'X', ' ', ' ', ' ' /* 8 bytes */
#define USB_PRODUCT 'R', 'M', ' ', 'T', 'X', '1', '2', ' ' /* 8 Bytes */
+#elif defined(RADIO_T8)
+ #define USB_NAME "Radiomaster T8"
+ #define USB_MANUFACTURER 'R', 'M', '_', 'T', 'X', ' ', ' ', ' ' /* 8 bytes */
+ #define USB_PRODUCT 'R', 'M', ' ', 'T', '8', ' ', ' ', ' ' /* 8 Bytes */
#else
#define USB_NAME "FrSky Taranis"
#define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */
@@ -864,8 +887,10 @@ void bluetoothDisable();
#endif
// USB Charger
+#if defined(USB_CHARGER)
void usbChargerInit();
bool usbChargerLed();
+#endif
// LED driver
void ledInit();
@@ -889,7 +914,7 @@ void ledBlue();
#define IS_LCD_RESET_NEEDED() true
#define LCD_CONTRAST_MIN 10
#define LCD_CONTRAST_MAX 30
-#if defined(RADIO_TX12)
+#if defined(RADIO_TX12) || defined(RADIO_T8)
#define LCD_CONTRAST_DEFAULT 21
#else
#define LCD_CONTRAST_DEFAULT 15
diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h
index f70e1e690..0647a236a 100644
--- a/radio/src/targets/taranis/hal.h
+++ b/radio/src/targets/taranis/hal.h
@@ -74,6 +74,25 @@
#define KEYS_GPIO_PIN_MDL GPIO_Pin_11 // PE.11
#define KEYS_GPIO_REG_TELE GPIOD->IDR
#define KEYS_GPIO_PIN_TELE GPIO_Pin_2 // PD.02
+#elif defined(RADIO_T8)
+ #define KEYS_GPIO_REG_PAGEUP GPIOD->IDR
+ #define KEYS_GPIO_PIN_PAGEUP GPIO_Pin_3 // PD.03
+ #define KEYS_GPIO_REG_PAGEDN GPIOD->IDR
+ #define KEYS_GPIO_PIN_PAGEDN GPIO_Pin_7 // PD.07
+ #define KEYS_GPIO_REG_EXIT GPIOB->IDR
+ #define KEYS_GPIO_PIN_EXIT GPIO_Pin_3 // PB.03
+ #define KEYS_GPIO_REG_ENTER GPIOA->IDR
+ #define KEYS_GPIO_PIN_ENTER GPIO_Pin_13 // PA.13
+ #define KEYS_GPIO_REG_SYS GPIOB->IDR
+ #define KEYS_GPIO_PIN_SYS GPIO_Pin_4 // PB.04
+ #define KEYS_GPIO_REG_MDL GPIOE->IDR
+ #define KEYS_GPIO_PIN_MDL GPIO_Pin_11 // PE.11
+ #define KEYS_GPIO_REG_PLUS GPIOE->IDR
+ #define KEYS_GPIO_PIN_PLUS GPIO_Pin_9 // PE.09
+ #define KEYS_GPIO_REG_MINUS GPIOE->IDR
+ #define KEYS_GPIO_PIN_MINUS GPIO_Pin_10 // PE.10
+ #define KEYS_GPIO_REG_BIND GPIOA->IDR
+ #define KEYS_GPIO_PIN_BIND GPIO_Pin_10 // PA.10
#elif defined(PCBX7)
#define KEYS_GPIO_REG_PAGE GPIOD->IDR
#define KEYS_GPIO_PIN_PAGE GPIO_Pin_3 // PD.03
@@ -332,6 +351,11 @@
#define HARDWARE_SWITCH_A
#define SWITCHES_GPIO_REG_A GPIOC->IDR
#define SWITCHES_GPIO_PIN_A GPIO_Pin_13 // PC.13
+#elif defined(RADIO_T8)
+ #define STORAGE_SWITCH_A
+ #define HARDWARE_SWITCH_A
+ #define SWITCHES_GPIO_REG_A GPIOE->IDR
+ #define SWITCHES_GPIO_PIN_A GPIO_Pin_14 // PE.14
#elif defined(PCBX7)
#define STORAGE_SWITCH_A
#define HARDWARE_SWITCH_A
@@ -362,6 +386,13 @@
#define SWITCHES_GPIO_PIN_B_L GPIO_Pin_6 // PA.06
#define SWITCHES_GPIO_REG_B_H GPIOA->IDR
#define SWITCHES_GPIO_PIN_B_H GPIO_Pin_5 // PA.05
+#elif defined(RADIO_T8)
+ #define STORAGE_SWITCH_B
+ #define HARDWARE_SWITCH_B
+ #define SWITCHES_GPIO_REG_B_L GPIOE->IDR
+ #define SWITCHES_GPIO_PIN_B_L GPIO_Pin_7 // PE.07
+ #define SWITCHES_GPIO_REG_B_H GPIOE->IDR
+ #define SWITCHES_GPIO_PIN_B_H GPIO_Pin_13 // PE.13
#elif defined(PCBX7)
#define STORAGE_SWITCH_B
#define HARDWARE_SWITCH_B
@@ -406,6 +437,13 @@
#define SWITCHES_GPIO_PIN_C_L GPIO_Pin_11 // PD.11
#define SWITCHES_GPIO_REG_C_H GPIOE->IDR
#define SWITCHES_GPIO_PIN_C_H GPIO_Pin_0 // PE.00
+#elif defined(RADIO_T8)
+ #define STORAGE_SWITCH_C
+ #define HARDWARE_SWITCH_C
+ #define SWITCHES_GPIO_REG_C_L GPIOE->IDR
+ #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_2 // PE.02
+ #define SWITCHES_GPIO_REG_C_H GPIOE->IDR
+ #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_1 // PE.01
#elif defined(PCBX7)
#define STORAGE_SWITCH_C
#define HARDWARE_SWITCH_C
@@ -448,6 +486,11 @@
#define SWITCHES_GPIO_PIN_D_L GPIO_Pin_4 // PB.04
#define SWITCHES_GPIO_REG_D_H GPIOB->IDR
#define SWITCHES_GPIO_PIN_D_H GPIO_Pin_5 // PB.05
+#elif defined(RADIO_T8)
+ #define STORAGE_SWITCH_D
+ #define HARDWARE_SWITCH_D
+ #define SWITCHES_GPIO_REG_D GPIOD->IDR
+ #define SWITCHES_GPIO_PIN_D GPIO_Pin_14 // PD.14
#elif defined(RADIO_TX12)
#define STORAGE_SWITCH_D
#define HARDWARE_SWITCH_D
@@ -539,6 +582,9 @@
#define SWITCHES_GPIO_PIN_F_L GPIO_Pin_1 // PE.01
#define SWITCHES_GPIO_REG_F_H GPIOE->IDR
#define SWITCHES_GPIO_PIN_F_H GPIO_Pin_2 // PE.02
+#elif defined(RADIO_T8)
+ #define STORAGE_SWITCH_F
+ // no SWF
#elif defined(PCBX7)
#define STORAGE_SWITCH_F
#define HARDWARE_SWITCH_F
@@ -563,7 +609,7 @@
#define HARDWARE_SWITCH_G
#define SWITCHES_GPIO_REG_G GPIOC->IDR
#define SWITCHES_GPIO_PIN_G GPIO_Pin_2 // PC.02
-#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE)
+#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_T8)
// no SWG
#else
#define STORAGE_SWITCH_G
@@ -586,6 +632,9 @@
#define SWITCHES_GPIO_PIN_H GPIO_Pin_14 // PD.14
#elif defined(PCBXLITE) || defined(PCBX9LITE)
// no SWH
+#elif defined(RADIO_T8)
+ #define STORAGE_SWITCH_H
+ // no SWH
#elif defined(RADIO_TX12)
#elif defined(PCBX7)
#define STORAGE_SWITCH_H
@@ -615,6 +664,10 @@
#define SWITCHES_GPIO_REG_I GPIOC->IDR
#define SWITCHES_GPIO_PIN_I GPIO_Pin_13 // PC.13
#define STORAGE_SWITCH_J
+#elif defined(RADIO_T8)
+ #define STORAGE_SWITCH_I
+ #define STORAGE_SWITCH_J
+ // no SWI/J
#elif defined(RADIO_TX12)
#define STORAGE_SWITCH_I
#define HARDWARE_SWITCH_I
@@ -746,6 +799,13 @@
#define KEYS_GPIOC_PINS (GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3|GPIO_Pin_13)
#define KEYS_GPIOD_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_15)
#define KEYS_GPIOE_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 |GPIO_Pin_8| GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15)
+#elif defined(RADIO_T8)
+ #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE)
+ #define KEYS_GPIOA_PINS (KEYS_GPIO_PIN_ENTER | KEYS_GPIO_PIN_BIND)
+ #define KEYS_GPIOB_PINS (KEYS_GPIO_PIN_EXIT | KEYS_GPIO_PIN_SYS)
+ #define KEYS_GPIOC_PINS (TRIMS_GPIO_PIN_LHR | TRIMS_GPIO_PIN_RVU | TRIMS_GPIO_PIN_RVD)
+ #define KEYS_GPIOD_PINS (KEYS_GPIO_PIN_PAGEUP | KEYS_GPIO_PIN_PAGEDN | SWITCHES_GPIO_PIN_D | TRIMS_GPIO_PIN_LHL)
+ #define KEYS_GPIOE_PINS (SWITCHES_GPIO_PIN_C_H | SWITCHES_GPIO_PIN_C_L | TRIMS_GPIO_PIN_RHL | TRIMS_GPIO_PIN_RHR | TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_LVD | SWITCHES_GPIO_PIN_B_L | KEYS_GPIO_PIN_PLUS | KEYS_GPIO_PIN_MINUS | KEYS_GPIO_PIN_MDL | SWITCHES_GPIO_PIN_B_H | SWITCHES_GPIO_PIN_A)
#elif defined(RADIO_X7ACCESS)
#define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE)
#define KEYS_GPIOA_PINS GPIO_Pin_5
@@ -900,6 +960,25 @@
#define ADC_CHANNEL_POT2 ADC_Channel_12 // ADC1_IN12
#define ADC_CHANNEL_BATT ADC_Channel_10 // ADC1_IN10
#define ADC_VREF_PREC2 330
+#elif defined(RADIO_T8)
+ // No pots
+ #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2)
+ #define ADC_RCC_APB1Periph 0
+ #define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1
+ #define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00
+ #define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01
+ #define ADC_GPIO_PIN_STICK_LV GPIO_Pin_2 // PA.02
+ #define ADC_GPIO_PIN_STICK_LH GPIO_Pin_3 // PA.03
+ #define ADC_CHANNEL_STICK_RV ADC_Channel_0 // ADC1_IN0
+ #define ADC_CHANNEL_STICK_RH ADC_Channel_1 // ADC1_IN1
+ #define ADC_CHANNEL_STICK_LV ADC_Channel_2 // ADC1_IN2
+ #define ADC_CHANNEL_STICK_LH ADC_Channel_3 // ADC1_IN3
+ #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00
+ #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV)
+ #define ADC_GPIOB_PINS 0
+ #define ADC_GPIOC_PINS ADC_GPIO_PIN_BATT
+ #define ADC_CHANNEL_BATT ADC_Channel_10
+ #define ADC_VREF_PREC2 300
#elif defined(PCBX7)
#define HARDWARE_POT1
#define HARDWARE_POT2
@@ -1027,6 +1106,16 @@
#define LED_BLUE_GPIO_PIN GPIO_Pin_1 // PB.01
#define LED_RED_GPIO GPIOC
#define LED_RED_GPIO_PIN GPIO_Pin_4 // PC.04
+#elif defined(RADIO_T8)
+ #define STATUS_LEDS
+ #define GPIO_LED_GPIO_ON GPIO_SetBits
+ #define GPIO_LED_GPIO_OFF GPIO_ResetBits
+ #define LED_RED_GPIO GPIOC
+ #define LED_RED_GPIO_PIN GPIO_Pin_4 // PC.04
+ #define LED_BLUE_GPIO GPIOC
+ #define LED_BLUE_GPIO_PIN GPIO_Pin_5 // PC.05
+ #define LED_GREEN_GPIO GPIOB
+ #define LED_GREEN_GPIO_PIN GPIO_Pin_1 // PB.01
#elif defined(PCBX7)
#define STATUS_LEDS
#define GPIO_LED_GPIO_ON GPIO_SetBits
@@ -1152,7 +1241,7 @@
#define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream5_IRQHandler
#define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF5
#define INTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
-#elif defined(RADIO_T12) || defined(RADIO_TX12)
+#elif defined(RADIO_T12) || defined(RADIO_TX12) || defined(RADIO_T8)
#define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1)
#define INTMODULE_RCC_APB1Periph (RCC_APB1Periph_USART3 | RCC_APB1Periph_TIM2)
#define INTMODULE_RCC_APB2Periph 0
@@ -1401,7 +1490,7 @@
#define TELEMETRY_EXTI_IRQn EXTI9_5_IRQn
#define TELEMETRY_EXTI_TRIGGER EXTI_Trigger_Rising
-#if defined(RADIO_X7) || defined(RADIO_X7ACCESS) || defined(RADIO_TX12)
+#if defined(RADIO_X7) || defined(RADIO_X7ACCESS) || defined(RADIO_TX12) || defined(RADIO_T8)
#define TELEMETRY_EXTI_REUSE_INTERRUPT_ROTARY_ENCODER
#elif defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019)
#define TELEMETRY_EXTI_IRQHandler EXTI9_5_IRQHandler
@@ -1477,7 +1566,9 @@
// Heartbeat for iXJT / ISRM synchro
#define INTMODULE_HEARTBEAT_TRIGGER EXTI_Trigger_Falling
-#if defined(PCBXLITE)
+#if !defined(HARDWARE_EXTERNAL_MODULE)
+ // No heartbeat
+#elif defined(PCBXLITE)
#define INTMODULE_HEARTBEAT
#define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOD
#define INTMODULE_HEARTBEAT_GPIO GPIOD
@@ -1507,7 +1598,7 @@
#define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource7
#define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line7
#define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI9_5_IRQn
-#elif defined(RADIO_X7) || defined(RADIO_TX12)
+#elif defined(RADIO_X7) || defined(RADIO_TX12)
#define INTMODULE_HEARTBEAT
#define INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER
#define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOC
@@ -1577,15 +1668,17 @@
#define TRAINER_MODULE_SBUS_DMA_STREAM EXTMODULE_USART_RX_DMA_STREAM
#define TRAINER_MODULE_SBUS_DMA_CHANNEL EXTMODULE_USART_RX_DMA_CHANNEL
#else
+#if defined(HARDWARE_EXTERNAL_MODULE)
#define TRAINER_MODULE_CPPM
#define TRAINER_MODULE_SBUS
- #define TRAINER_MODULE_RCC_AHB1Periph RCC_AHB1Periph_GPIOC
- #define TRAINER_MODULE_RCC_APB2Periph RCC_APB2Periph_USART6
- #define TRAINER_MODULE_RCC_APB1Periph RCC_APB1Periph_TIM3
- #define TRAINER_MODULE_CPPM_TIMER TRAINER_TIMER
- #define TRAINER_MODULE_CPPM_GPIO INTMODULE_HEARTBEAT_GPIO
- #define TRAINER_MODULE_CPPM_GPIO_PIN INTMODULE_HEARTBEAT_GPIO_PIN
- #define TRAINER_MODULE_CPPM_GPIO_PinSource INTMODULE_HEARTBEAT_EXTI_PinSource
+#endif
+ #define TRAINER_MODULE_RCC_AHB1Periph RCC_AHB1Periph_GPIOC
+ #define TRAINER_MODULE_RCC_APB2Periph RCC_APB2Periph_USART6
+ #define TRAINER_MODULE_RCC_APB1Periph RCC_APB1Periph_TIM3
+ #define TRAINER_MODULE_CPPM_TIMER TRAINER_TIMER
+ #define TRAINER_MODULE_CPPM_GPIO INTMODULE_HEARTBEAT_GPIO
+ #define TRAINER_MODULE_CPPM_GPIO_PIN INTMODULE_HEARTBEAT_GPIO_PIN
+ #define TRAINER_MODULE_CPPM_GPIO_PinSource INTMODULE_HEARTBEAT_EXTI_PinSource
#define TRAINER_MODULE_CPPM_INTERRUPT_ENABLE TIM_DIER_CC2IE
#define TRAINER_MODULE_CPPM_INTERRUPT_FLAG TIM_SR_CC2IF
#define TRAINER_MODULE_CPPM_CCMR1 (TIM_CCMR1_IC2F_0 | TIM_CCMR1_IC2F_1 | TIM_CCMR1_CC2S_0)
@@ -1665,6 +1758,10 @@
#define BACKLIGHT_CCMR1 TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 // Channel 1, PWM
#define BACKLIGHT_CCER TIM_CCER_CC1E
#define BACKLIGHT_COUNTER_REGISTER BACKLIGHT_TIMER->CCR1
+#elif defined(RADIO_T8)
+ #define BACKLIGHT_RCC_AHB1Periph 0
+ #define BACKLIGHT_RCC_APB1Periph 0
+ #define BACKLIGHT_RCC_APB2Periph 0
#elif defined(PCBX7)
#define BACKLIGHT_RCC_AHB1Periph RCC_AHB1Periph_GPIOD
#define BACKLIGHT_RCC_APB1Periph RCC_APB1Periph_TIM4
@@ -1692,7 +1789,7 @@
#define KEYS_BACKLIGHT_RCC_AHB1Periph 0
// LCD driver
-#if defined(RADIO_TX12) || defined(RADIO_T12)
+#if defined(RADIO_TX12) || defined(RADIO_T12) || defined(RADIO_T8)
#define LCD_VERTICAL_INVERT
#endif
#if defined(PCBX9E)
@@ -1887,7 +1984,7 @@
#define AUDIO_SPEAKER_ENABLE_GPIO_PIN GPIO_Pin_14 // PD.14
#define HEADPHONE_TRAINER_SWITCH_GPIO GPIOD
#define HEADPHONE_TRAINER_SWITCH_GPIO_PIN GPIO_Pin_9 // PD.09
-#elif defined(RADIO_TX12)
+#elif defined(RADIO_TX12) || defined(RADIO_T8)
#define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1)
#define AUDIO_MUTE_GPIO GPIOE
#define AUDIO_MUTE_GPIO_PIN GPIO_Pin_12 // PE.12
@@ -2013,7 +2110,7 @@
#define BT_USART_IRQn USART3_IRQn
// #define BT_DMA_Stream_RX DMA1_Stream1
// #define BT_DMA_Channel_RX DMA_Channel_4
-#elif defined(PCBX9D) || defined(PCBX9DP) || defined(RADIO_T12) || defined(RADIO_TX12)
+#elif defined(PCBX9D) || defined(PCBX9DP) || defined(RADIO_T12) || defined(RADIO_TX12) | defined(RADIO_T8)
#define STORAGE_BLUETOOTH
#define BT_RCC_AHB1Periph 0
#define BT_RCC_APB1Periph 0
diff --git a/radio/src/targets/taranis/keys_driver.cpp b/radio/src/targets/taranis/keys_driver.cpp
index 6883740c4..d99851441 100644
--- a/radio/src/targets/taranis/keys_driver.cpp
+++ b/radio/src/targets/taranis/keys_driver.cpp
@@ -88,6 +88,10 @@ uint32_t readKeys()
result |= 1 << KEY_SHIFT;
#endif
+#if defined(KEYS_GPIO_PIN_BIND)
+ if (~KEYS_GPIO_REG_BIND & KEYS_GPIO_PIN_BIND)
+ result |= 1 << KEY_BIND;
+#endif
// if (result != 0) TRACE("readKeys(): result=0x%02x", result);
return result;
@@ -200,7 +204,8 @@ uint32_t switchState(uint8_t index)
uint32_t xxx = 0;
switch (index) {
-#if defined(RADIO_TX12)
+
+#if defined(RADIO_TX12) || defined(RADIO_T8)
ADD_2POS_CASE(A);
ADD_3POS_CASE(B, 1);
ADD_3POS_CASE(C, 2);
@@ -235,6 +240,8 @@ uint32_t switchState(uint8_t index)
ADD_2POS_CASE(D);
ADD_3POS_CASE(E, 4);
ADD_3POS_CASE(F, 5);
+#elif defined(RADIO_T8)
+ ADD_2POS_CASE(D);
#elif defined(PCBX7)
ADD_3POS_CASE(D, 3);
ADD_2POS_CASE(F);
diff --git a/radio/src/targets/taranis/lcd_driver_spi.cpp b/radio/src/targets/taranis/lcd_driver_spi.cpp
index e1efa8e15..97f191c2b 100644
--- a/radio/src/targets/taranis/lcd_driver_spi.cpp
+++ b/radio/src/targets/taranis/lcd_driver_spi.cpp
@@ -20,7 +20,7 @@
#include "opentx.h"
-#if defined(RADIO_T12) || defined(RADIO_TX12)
+#if defined(RADIO_T12) || defined(RADIO_TX12) || defined(RADIO_T8)
#define LCD_CONTRAST_OFFSET -10
#else
#define LCD_CONTRAST_OFFSET 160
diff --git a/radio/src/targets/taranis/usb_charger_driver.cpp b/radio/src/targets/taranis/usb_charger_driver.cpp
index 7e92c6dbc..78cc3d6a6 100644
--- a/radio/src/targets/taranis/usb_charger_driver.cpp
+++ b/radio/src/targets/taranis/usb_charger_driver.cpp
@@ -33,5 +33,9 @@ void usbChargerInit()
bool usbChargerLed()
{
+#if defined(SIMU)
+ return true;
+#else
return (GPIO_ReadInputDataBit(USB_CHARGER_GPIO, USB_CHARGER_GPIO_PIN) == Bit_RESET && usbPlugged());
+#endif
}
diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt
index b10aaf1fc..87f83a9e9 100644
--- a/radio/src/translations/cz.h.txt
+++ b/radio/src/translations/cz.h.txt
@@ -294,6 +294,9 @@
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
+#elif defined(RADIO_T8)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "RTN\0 ""ENTER""PGUP\0""PGDN\0""SYS\0 ""MDL\0 ""UP\0 ""DOWN\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Mínus"
diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt
index f42ba76d8..0d30316e3 100644
--- a/radio/src/translations/de.h.txt
+++ b/radio/src/translations/de.h.txt
@@ -300,6 +300,9 @@
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
+#elif defined(RADIO_T8)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "RTN\0 ""ENTER""PGUP\0""PGDN\0""SYS\0 ""MDL\0 ""UP\0 ""DOWN\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt
index f28c96b5c..d0dd3e25c 100644
--- a/radio/src/translations/en.h.txt
+++ b/radio/src/translations/en.h.txt
@@ -300,6 +300,9 @@
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
+#elif defined(RADIO_T8)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "RTN\0 ""ENTER""PGUP\0""PGDN\0""SYS\0 ""MDL\0 ""UP\0 ""DOWN\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt
index 5d4a67fad..cbbe3b591 100644
--- a/radio/src/translations/es.h.txt
+++ b/radio/src/translations/es.h.txt
@@ -297,6 +297,9 @@
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
+#elif defined(RADIO_T8)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "RTN\0 ""ENTER""PGUP\0""PGDN\0""SYS\0 ""MDL\0 ""UP\0 ""DOWN\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt
index b031eda0f..03c1ecf25 100644
--- a/radio/src/translations/fi.h.txt
+++ b/radio/src/translations/fi.h.txt
@@ -318,6 +318,9 @@
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
+#elif defined(RADIO_T8)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "RTN\0 ""ENTER""PGUP\0""PGDN\0""SYS\0 ""MDL\0 ""UP\0 ""DOWN\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt
index a5e5d7180..ce6624b67 100644
--- a/radio/src/translations/fr.h.txt
+++ b/radio/src/translations/fr.h.txt
@@ -320,6 +320,9 @@
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
+#elif defined(RADIO_T8)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "RTN\0 ""ENTER""PGUP\0""PGDN\0""SYS\0 ""MDL\0 ""UP\0 ""DOWN\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Moins"
diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt
index 06f51beee..eeecb347a 100644
--- a/radio/src/translations/it.h.txt
+++ b/radio/src/translations/it.h.txt
@@ -321,6 +321,9 @@
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
+#elif defined(RADIO_T8)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "RTN\0 ""ENTER""PGUP\0""PGDN\0""SYS\0 ""MDL\0 ""UP\0 ""DOWN\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt
index 6f1063d3d..087305944 100644
--- a/radio/src/translations/nl.h.txt
+++ b/radio/src/translations/nl.h.txt
@@ -298,6 +298,9 @@
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
+#elif defined(RADIO_T8)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "RTN\0 ""ENTER""PGUP\0""PGDN\0""SYS\0 ""MDL\0 ""UP\0 ""DOWN\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt
index f87473ef2..4ff16cc53 100644
--- a/radio/src/translations/pl.h.txt
+++ b/radio/src/translations/pl.h.txt
@@ -318,6 +318,9 @@
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
+#elif defined(RADIO_T8)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "RTN\0 ""ENTER""PGUP\0""PGDN\0""SYS\0 ""MDL\0 ""UP\0 ""DOWN\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
@@ -1130,17 +1133,17 @@
#define TR_ABOUT_MARTIN_2 "Projekty graficzne"
#if defined(MANUFACTURER_FRSKY)
- #define TR_ABOUT_HARDWARE_1 "FrSky"
- #define TR_ABOUT_HARDWARE_2 "Proucent/projektant Hardware"
- #define TR_ABOUT_HARDWARE_3 "Współautor firmware"
-#elif defined(MANUFACTURER_RADIOMASTER)
- #define TR_ABOUT_HARDWARE_1 "Radiomaster"
- #define TR_ABOUT_HARDWARE_2 "Proucent/projektant Hardware"
- #define TR_ABOUT_HARDWARE_3 "Współautor firmware"
-#elif defined(MANUFACTURER_JUMPER)
- #define TR_ABOUT_HARDWARE_1 "JumperRC"
- #define TR_ABOUT_HARDWARE_2 "Proucent/projektant Hardware"
- #define TR_ABOUT_HARDWARE_3 "Współautor firmware"
+ #define TR_ABOUT_HARDWARE_1 "FrSky"
+ #define TR_ABOUT_HARDWARE_2 "Proucent/projektant Hardware"
+ #define TR_ABOUT_HARDWARE_3 "Współautor firmware"
+#elif defined(MANUFACTURER_RADI OMASTER)
+ #define TR_ABOUT_HARDWARE_1 "Radiomaster"
+ #define TR_ABOUT_HARDWARE_2 "Proucent/projektant Hardware"
+ #define TR_ABOUT_HARDWARE_3 "Współautor firmware"
+#elif defined(MANUFACTURER_JUMP ER)
+ #define TR_ABOUT_HARDWARE_1 "JumperRC"
+ #define TR_ABOUT_HARDWARE_2 "Proucent/projektant Hardware"
+ #define TR_ABOUT_HARDWARE_3 "Współautor firmware"
#else
#define TR_ABOUT_HARDWARE_1 "Brent Nelson"
#define TR_ABOUT_HARDWARE_2 "Sky9x designer/výrobce"
diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt
index 472a5585e..7ef85235b 100644
--- a/radio/src/translations/pt.h.txt
+++ b/radio/src/translations/pt.h.txt
@@ -311,6 +311,9 @@
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
+#elif defined(RADIO_T8)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "RTN\0 ""ENTER""PGUP\0""PGDN\0""SYS\0 ""MDL\0 ""UP\0 ""DOWN\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt
index ad9606ef1..499fcb41d 100644
--- a/radio/src/translations/se.h.txt
+++ b/radio/src/translations/se.h.txt
@@ -312,6 +312,9 @@
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
+#elif defined(RADIO_T8)
+ #define LEN_VKEYS "\005"
+ #define TR_VKEYS "RTN\0 ""ENTER""PGUP\0""PGDN\0""SYS\0 ""MDL\0 ""UP\0 ""DOWN\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py
index 66d9f053d..b7132d510 100755
--- a/radio/util/build-firmware.py
+++ b/radio/util/build-firmware.py
@@ -148,6 +148,11 @@ def main():
cmake_options["PCBREV"] = "TX12"
firmware_options = options_radiomaster_tx12
maxsize = 65536 * 8
+ elif board_name == "t8":
+ cmake_options["PCB"] = "X7"
+ cmake_options["PCBREV"] = "T8"
+ firmware_options = options_radiomaster_t8
+ maxsize = 65536 * 8
elif board_name == "t16":
cmake_options["PCB"] = "X10"
cmake_options["PCBREV"] = "T16"
diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py
index f4438db44..7b2a01edd 100755
--- a/radio/util/fwoptions.py
+++ b/radio/util/fwoptions.py
@@ -258,6 +258,17 @@ options_radiomaster_tx12 = {
"afhds3": ("AFHDS3", "YES", "NO")
}
+options_radiomaster_t8 = {
+ "noheli": ("HELI", "NO", "YES"),
+ "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"),
+ "lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"),
+ "nogvars": ("GVARS", "NO", "YES"),
+ "faimode": ("FAI", "YES", None),
+ "faichoice": ("FAI", "CHOICE", None),
+ "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"),
+ "bindkey": ("BIND_KEY", "NO", "YES"),
+}
+
options_radiomaster_tx16s = {
"noheli": ("HELI", "NO", "YES"),
"ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"),
diff --git a/tools/build-radiomaster.py b/tools/build-radiomaster.py
index 985bc705a..564463537 100755
--- a/tools/build-radiomaster.py
+++ b/tools/build-radiomaster.py
@@ -28,6 +28,18 @@ boards = {
"PCB": "X7",
"PCBREV": "TX12",
"DEFAULT_MODE": "2",
+ },
+ "T8_1": {
+ "PCB": "X7",
+ "PCBREV": "T8",
+ "DEFAULT_MODE": "1",
+ "RADIOMASTER_RTF_RELEASE": "YES",
+ },
+ "T8_2": {
+ "PCB": "X7",
+ "PCBREV": "T8",
+ "DEFAULT_MODE": "2",
+ "RADIOMASTER_RTF_RELEASE": "YES",
}
}
diff --git a/tools/commit-tests.sh b/tools/commit-tests.sh
index af2e7f040..ca25ac809 100755
--- a/tools/commit-tests.sh
+++ b/tools/commit-tests.sh
@@ -139,6 +139,15 @@ if [[ " TX12 X7 ALL " =~ \ ${FLAVOR}\ ]] ; then
make -j"${CORES}" tests-radio
fi
+if [[ " T8 X7 ALL " =~ \ ${FLAVOR}\ ]] ; then
+ # OpenTX on T8
+ rm -rf ./*
+ cmake "${COMMON_OPTIONS}" -DPCB=X7 -DPCBREV=TX12 -DHELI=YES -DGVARS=YES "${SRCDIR}"
+ make -j"${CORES}" ${FIRMARE_TARGET}
+ make -j"${CORES}" libsimulator
+ make -j"${CORES}" tests-radio
+fi
+
if [[ " XLITE ALL " =~ \ ${FLAVOR}\ ]] ; then
# OpenTX on X-Lite
rm -rf ./*