diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt
index 63215807f..6914f667c 100644
--- a/companion/src/CMakeLists.txt
+++ b/companion/src/CMakeLists.txt
@@ -325,6 +325,8 @@ elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TLITE)
set(FLAVOUR tlite)
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TX12)
set(FLAVOUR tx12)
+elseif(PCB STREQUAL X7 AND PCBREV STREQUAL ZORRO)
+ set(FLAVOUR zorro)
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL T8)
set(FLAVOUR t8)
elseif(PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019)
diff --git a/companion/src/companion.qrc b/companion/src/companion.qrc
index 4c39ec17d..c34fcd295 100644
--- a/companion/src/companion.qrc
+++ b/companion/src/companion.qrc
@@ -199,6 +199,17 @@
images/simulator/TX12/right-mdl.png
images/simulator/TX12/bottom.png
images/simulator/TX12/top.png
+ images/simulator/Zorro/left.png
+ images/simulator/Zorro/left-pageup.png
+ images/simulator/Zorro/left-pagedn.png
+ images/simulator/Zorro/left-rtn.png
+ images/simulator/Zorro/left-sys.png
+ images/simulator/Zorro/right-tele.png
+ images/simulator/Zorro/right.png
+ images/simulator/Zorro/right-ent.png
+ images/simulator/Zorro/right-mdl.png
+ images/simulator/Zorro/bottom.png
+ images/simulator/Zorro/top.png
images/simulator/T8/left.png
images/simulator/T8/left-pageup.png
images/simulator/T8/left-pagedn.png
diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp
index 57290628f..18605ea10 100644
--- a/companion/src/firmwares/boards.cpp
+++ b/companion/src/firmwares/boards.cpp
@@ -90,6 +90,8 @@ uint32_t Boards::getFourCC(Type board)
return 0x3878746F;
case BOARD_RADIOMASTER_TX12:
return 0x4178746F;
+ case BOARD_RADIOMASTER_ZORRO:
+ return 0x4778746F;
case BOARD_RADIOMASTER_T8:
return 0x4378746F;
case BOARD_FLYSKY_NV14:
@@ -121,6 +123,7 @@ int Boards::getEEpromSize(Board::Type board)
case BOARD_JUMPER_TLITE:
case BOARD_RADIOMASTER_TX12:
case BOARD_RADIOMASTER_T8:
+ case BOARD_RADIOMASTER_ZORRO:
return EESIZE_TARANIS;
case BOARD_UNKNOWN:
return EESIZE_MAX;
@@ -158,6 +161,7 @@ int Boards::getFlashSize(Type board)
case BOARD_JUMPER_T12:
case BOARD_JUMPER_TLITE:
case BOARD_RADIOMASTER_TX12:
+ case BOARD_RADIOMASTER_ZORRO:
case BOARD_RADIOMASTER_T8:
return FSIZE_TARANIS;
case BOARD_HORUS_X12S:
@@ -243,6 +247,20 @@ SwitchInfo Boards::getSwitchInfo(Board::Type board, int index)
if (index < DIM(switches))
return switches[index];
}
+ else if (IS_RADIOMASTER_ZORRO(board)) {
+ const Board::SwitchInfo switches[] = {
+ {SWITCH_TOGGLE, "SA"},
+ {SWITCH_3POS, "SB"},
+ {SWITCH_3POS, "SC"},
+ {SWITCH_TOGGLE, "SD"},
+ {SWITCH_2POS, "SE"},
+ {SWITCH_2POS, "SF"},
+ {SWITCH_TOGGLE, "SG"},
+ {SWITCH_TOGGLE, "SH"}
+ };
+ if (index < DIM(switches))
+ return switches[index];
+ }
else if (IS_RADIOMASTER_T8(board)) {
const Board::SwitchInfo switches[] = {
{SWITCH_TOGGLE, "SA"},
@@ -431,6 +449,8 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
return 8;
else if (IS_JUMPER_TLITE(board))
return 4;
+ else if(IS_RADIOMASTER_ZORRO(board))
+ return 8;
else if (IS_FAMILY_T12(board))
return 6;
else if (IS_HORUS_X12S(board))
@@ -633,6 +653,8 @@ QString Boards::getBoardName(Board::Type board)
return "Radiomaster TX16S";
case BOARD_RADIOMASTER_TX12:
return "Radiomaster TX12";
+ case BOARD_RADIOMASTER_ZORRO:
+ return "Radiomaster Zorro";
case BOARD_RADIOMASTER_T8:
return "Radiomaster T8";
case BOARD_FLYSKY_NV14:
diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h
index ef9cd0de8..2bc37a458 100644
--- a/companion/src/firmwares/boards.h
+++ b/companion/src/firmwares/boards.h
@@ -62,6 +62,7 @@ namespace Board {
BOARD_RADIOMASTER_T8,
BOARD_JUMPER_TLITE,
BOARD_FLYSKY_NV14,
+ BOARD_RADIOMASTER_ZORRO,
BOARD_TYPE_COUNT,
BOARD_TYPE_MAX = BOARD_TYPE_COUNT - 1
};
@@ -256,6 +257,12 @@ inline bool IS_RADIOMASTER_TX12(Board::Type board)
return board == Board::BOARD_RADIOMASTER_TX12;
}
+inline bool IS_RADIOMASTER_ZORRO(Board::Type board)
+{
+ return board == Board::BOARD_RADIOMASTER_ZORRO;
+}
+
+
inline bool IS_RADIOMASTER_T8(Board::Type board)
{
return board == Board::BOARD_RADIOMASTER_T8;
@@ -268,7 +275,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 || board == Board::BOARD_RADIOMASTER_T8 || board == Board::BOARD_JUMPER_TLITE;
+ return board == Board::BOARD_JUMPER_T12 || board == Board::BOARD_RADIOMASTER_TX12 || board == Board::BOARD_RADIOMASTER_ZORRO || board == Board::BOARD_RADIOMASTER_T8 || board == Board::BOARD_JUMPER_TLITE;
}
inline bool IS_FLYSKY_NV14(Board::Type board)
diff --git a/companion/src/firmwares/generalsettings.cpp b/companion/src/firmwares/generalsettings.cpp
index ceb6d1587..2ccb66254 100644
--- a/companion/src/firmwares/generalsettings.cpp
+++ b/companion/src/firmwares/generalsettings.cpp
@@ -273,6 +273,10 @@ void GeneralSettings::setDefaultControlTypes(Board::Type board)
potConfig[0] = Board::POT_WITHOUT_DETENT;
potConfig[1] = Board::POT_WITH_DETENT;
}
+ else if(IS_RADIOMASTER_ZORRO(board)) {
+ potConfig[0] = Board::POT_WITHOUT_DETENT;
+ potConfig[1] = Board::POT_WITHOUT_DETENT;
+ }
else if (IS_FAMILY_T12(board)) {
potConfig[0] = Board::POT_WITH_DETENT;
potConfig[1] = Board::POT_WITH_DETENT;
diff --git a/companion/src/firmwares/opentx/opentxeeprom.h b/companion/src/firmwares/opentx/opentxeeprom.h
index c3395693d..c3f188eea 100644
--- a/companion/src/firmwares/opentx/opentxeeprom.h
+++ b/companion/src/firmwares/opentx/opentxeeprom.h
@@ -39,6 +39,7 @@
#define RADIOMASTER_TX12_VARIANT 0x4002
#define JUMPER_TLITE_VARIANT 0x4003
#define RADIOMASTER_T8_VARIANT 0x4004
+#define RADIOMASTER_ZORRO_VARIANT 0x4006
class OpenTxGeneralData: public TransformedField {
public:
diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp
index 8da245c6b..59c6bab33 100644
--- a/companion/src/firmwares/opentx/opentxinterface.cpp
+++ b/companion/src/firmwares/opentx/opentxinterface.cpp
@@ -70,6 +70,8 @@ const char * OpenTxEepromInterface::getName()
return "OpenTX for Radiomaster TX16S";
case BOARD_RADIOMASTER_TX12:
return "OpenTX for Radiomaster TX12";
+ case BOARD_RADIOMASTER_ZORRO:
+ return "OpenTX for Radiomaster Zorro";
case BOARD_RADIOMASTER_T8:
return "OpenTX for Radiomaster T8";
case BOARD_TARANIS_X9D:
@@ -348,6 +350,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_ZORRO(board)) {
+ variant |= RADIOMASTER_ZORRO_VARIANT;
+ }
else if (IS_RADIOMASTER_T8(board)) {
variant |= RADIOMASTER_T8_VARIANT;
}
@@ -1025,6 +1030,11 @@ bool OpenTxEepromInterface::checkVariant(unsigned int version, unsigned int vari
variantError = true;
}
}
+ else if (IS_RADIOMASTER_ZORRO(board)) {
+ if (variant != RADIOMASTER_ZORRO_VARIANT) {
+ variantError = true;
+ }
+ }
else if (IS_RADIOMASTER_T8(board)) {
if (variant != RADIOMASTER_T8_VARIANT) {
variantError = true;
@@ -1380,6 +1390,17 @@ void registerOpenTxFirmwares()
registerOpenTxFirmware(firmware);
addOpenTxRfOptions(firmware, FLEX);
+ /* Radiomaster Zorro board */
+ firmware = new OpenTxFirmware("opentx-zorro", QCoreApplication::translate("Firmware", "Radiomaster Zorro"), Board::BOARD_RADIOMASTER_ZORRO);
+ 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"));
+ firmware->addOption("internalelrs", Firmware::tr("Select if internal ELRS module is installed"));
+ addOpenTxFontOptions(firmware);
+ registerOpenTxFirmware(firmware);
+ addOpenTxRfOptions(firmware, FLEX + AFHDS3);
+
/* Radiomaster T8 board */
firmware = new OpenTxFirmware("opentx-t8", QCoreApplication::translate("Firmware", "Radiomaster T8"), BOARD_RADIOMASTER_T8);
addOpenTxCommonOptions(firmware);
diff --git a/companion/src/images/simulator/Zorro/bottom.png b/companion/src/images/simulator/Zorro/bottom.png
new file mode 100644
index 000000000..15c9630e1
Binary files /dev/null and b/companion/src/images/simulator/Zorro/bottom.png differ
diff --git a/companion/src/images/simulator/Zorro/left-pagedn.png b/companion/src/images/simulator/Zorro/left-pagedn.png
new file mode 100644
index 000000000..e16d2256c
Binary files /dev/null and b/companion/src/images/simulator/Zorro/left-pagedn.png differ
diff --git a/companion/src/images/simulator/Zorro/left-pageup.png b/companion/src/images/simulator/Zorro/left-pageup.png
new file mode 100644
index 000000000..a5c474b8e
Binary files /dev/null and b/companion/src/images/simulator/Zorro/left-pageup.png differ
diff --git a/companion/src/images/simulator/Zorro/left-rtn.png b/companion/src/images/simulator/Zorro/left-rtn.png
new file mode 100644
index 000000000..551af92c2
Binary files /dev/null and b/companion/src/images/simulator/Zorro/left-rtn.png differ
diff --git a/companion/src/images/simulator/Zorro/left-sys.png b/companion/src/images/simulator/Zorro/left-sys.png
new file mode 100644
index 000000000..c5c785a1b
Binary files /dev/null and b/companion/src/images/simulator/Zorro/left-sys.png differ
diff --git a/companion/src/images/simulator/Zorro/left.png b/companion/src/images/simulator/Zorro/left.png
new file mode 100644
index 000000000..eef3f9a72
Binary files /dev/null and b/companion/src/images/simulator/Zorro/left.png differ
diff --git a/companion/src/images/simulator/Zorro/right-ent.png b/companion/src/images/simulator/Zorro/right-ent.png
new file mode 100644
index 000000000..349ea0513
Binary files /dev/null and b/companion/src/images/simulator/Zorro/right-ent.png differ
diff --git a/companion/src/images/simulator/Zorro/right-mdl.png b/companion/src/images/simulator/Zorro/right-mdl.png
new file mode 100644
index 000000000..80d701e05
Binary files /dev/null and b/companion/src/images/simulator/Zorro/right-mdl.png differ
diff --git a/companion/src/images/simulator/Zorro/right-tele.png b/companion/src/images/simulator/Zorro/right-tele.png
new file mode 100644
index 000000000..330fbfcef
Binary files /dev/null and b/companion/src/images/simulator/Zorro/right-tele.png differ
diff --git a/companion/src/images/simulator/Zorro/right.png b/companion/src/images/simulator/Zorro/right.png
new file mode 100644
index 000000000..ee592bae5
Binary files /dev/null and b/companion/src/images/simulator/Zorro/right.png differ
diff --git a/companion/src/images/simulator/Zorro/top.png b/companion/src/images/simulator/Zorro/top.png
new file mode 100644
index 000000000..00fdd86cb
Binary files /dev/null and b/companion/src/images/simulator/Zorro/top.png differ
diff --git a/companion/src/simulation/CMakeLists.txt b/companion/src/simulation/CMakeLists.txt
index 8963c0ef5..cc605abbb 100644
--- a/companion/src/simulation/CMakeLists.txt
+++ b/companion/src/simulation/CMakeLists.txt
@@ -17,6 +17,7 @@ set(simulation_SRCS
simulateduiwidgetJumperT16.cpp
simulateduiwidgetJumperT18.cpp
simulateduiwidgetTX12.cpp
+ simulateduiwidgetZorro.cpp
simulateduiwidgetT8.cpp
simulateduiwidgetTX16S.cpp
simulateduiwidgetNV14.cpp
@@ -48,6 +49,7 @@ set(simulation_UIS
simulateduiwidgetJumperT16.ui
simulateduiwidgetJumperT18.ui
simulateduiwidgetTX12.ui
+ simulateduiwidgetZorro.ui
simulateduiwidgetT8.ui
simulateduiwidgetTX16S.ui
simulateduiwidgetNV14.ui
diff --git a/companion/src/simulation/simulateduiwidget.h b/companion/src/simulation/simulateduiwidget.h
index b6e1e9024..579ad567f 100644
--- a/companion/src/simulation/simulateduiwidget.h
+++ b/companion/src/simulation/simulateduiwidget.h
@@ -117,6 +117,7 @@ namespace Ui {
class SimulatedUIWidgetJumperT18;
class SimulatedUIWidgetTX16S;
class SimulatedUIWidgetTX12;
+ class SimulatedUIWidgetZorro;
class SimulatedUIWidgetT8;
class SimulatedUIWidgetNV14;
}
@@ -293,6 +294,19 @@ class SimulatedUIWidgetTX12: public SimulatedUIWidget
Ui::SimulatedUIWidgetTX12 * ui;
};
+class SimulatedUIWidgetZorro: public SimulatedUIWidget
+{
+ Q_OBJECT
+
+ public:
+ explicit SimulatedUIWidgetZorro(SimulatorInterface * simulator, QWidget * parent = nullptr);
+ virtual ~SimulatedUIWidgetZorro();
+
+ private:
+ Ui::SimulatedUIWidgetZorro * ui;
+};
+
+
class SimulatedUIWidgetT8: public SimulatedUIWidget
{
Q_OBJECT
diff --git a/companion/src/simulation/simulateduiwidgetZorro.cpp b/companion/src/simulation/simulateduiwidgetZorro.cpp
new file mode 100644
index 000000000..61605623b
--- /dev/null
+++ b/companion/src/simulation/simulateduiwidgetZorro.cpp
@@ -0,0 +1,67 @@
+#include "simulateduiwidget.h"
+#include "ui_simulateduiwidgetZorro.h"
+
+// NOTE: RadioUiAction(NUMBER,...): NUMBER relates to enum EnumKeys in the specific board.h
+
+SimulatedUIWidgetZorro::SimulatedUIWidgetZorro(SimulatorInterface *simulator, QWidget * parent):
+ SimulatedUIWidget(simulator, parent),
+ ui(new Ui::SimulatedUIWidgetZorro)
+{
+ 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(65, 35, 90, 45), "Zorro/right-mdl.png", act));
+
+ m_mouseMidClickAction = new RadioUiAction(1, QList() << Qt::Key_Enter << Qt::Key_Return, SIMU_STR_HLP_KEYS_ACTIVATE, SIMU_STR_HLP_ACT_ROT_DN);
+ addRadioWidget(ui->rightbuttons->addArea(QRect(7, 84, 110, 90), "Zorro/right-ent.png", m_mouseMidClickAction));
+
+ act = new RadioUiAction(4, QList() << Qt::Key_Left, SIMU_STR_HLP_KEY_LFT, SIMU_STR_HLP_ACT_SYS);
+ addRadioWidget(ui->leftbuttons->addArea(QRect(52, 39, 70, 50), "Zorro/left-sys.png", act));
+
+ act = new RadioUiAction(6, QList() << Qt::Key_Right, SIMU_STR_HLP_KEY_RGT, SIMU_STR_HLP_ACT_TELE);
+ addRadioWidget(ui->rightbuttons->addArea(QRect(75, 180, 80, 35), "Zorro/right-tele.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(70, 145, 80, 35), "Zorro/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, 185, 80, 35), "Zorro/left-pageup.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(85, 105, 80, 35), "Zorro/left-rtn.png", act));
+
+ m_scrollUpAction = new RadioUiAction(-1, QList() << Qt::Key_Minus << Qt::Key_Equal << Qt::Key_Left, SIMU_STR_HLP_KEYS_GO_LFT, SIMU_STR_HLP_ACT_ROT_LFT);
+ m_scrollDnAction = new RadioUiAction(-1, QList() << Qt::Key_Plus << Qt::Key_Right, SIMU_STR_HLP_KEYS_GO_RGT, SIMU_STR_HLP_ACT_ROT_RGT);
+ connectScrollActions();
+
+ 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);
+}
+
+SimulatedUIWidgetZorro::~SimulatedUIWidgetZorro()
+{
+ delete ui;
+}
diff --git a/companion/src/simulation/simulateduiwidgetZorro.ui b/companion/src/simulation/simulateduiwidgetZorro.ui
new file mode 100644
index 000000000..329008deb
--- /dev/null
+++ b/companion/src/simulation/simulateduiwidgetZorro.ui
@@ -0,0 +1,258 @@
+
+
+ SimulatedUIWidgetZorro
+
+
+
+ 0
+ 0
+ 641
+ 253
+
+
+
+
+ 0
+ 0
+
+
+
+
+ 641
+ 253
+
+
+
+
+ 641
+ 253
+
+
+
+ Taranis Zorro 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
+
+
+
+
+ 196
+ 253
+
+
+
+
+ 196
+ 253
+
+
+
+ background:url(:/images/simulator/Zorro/left.png);
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 256
+ 180
+
+
+
+
+ 424
+ 180
+
+
+
+ background-color: rgb(215, 243, 255);
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 189
+ 253
+
+
+
+
+ 189
+ 253
+
+
+
+ background:url(:/images/simulator/Zorro/right.png)
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 256
+ 48
+
+
+
+
+ 256
+ 48
+
+
+
+ background:url(:/images/simulator/Zorro/top.png)
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 261
+ 55
+
+
+
+
+ 261
+ 55
+
+
+
+ background:url(:/images/simulator/Zorro/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 1d1d3dbba..b087c7055 100644
--- a/companion/src/simulation/simulatorwidget.cpp
+++ b/companion/src/simulation/simulatorwidget.cpp
@@ -103,6 +103,9 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato
case Board::BOARD_RADIOMASTER_TX12:
radioUiWidget = new SimulatedUIWidgetTX12(simulator, this);
break;
+ case Board::BOARD_RADIOMASTER_ZORRO:
+ radioUiWidget = new SimulatedUIWidgetZorro(simulator, this);
+ break;
case Board::BOARD_RADIOMASTER_T8:
radioUiWidget = new SimulatedUIWidgetT8(simulator, this);
break;
diff --git a/companion/src/storage/appdata.h b/companion/src/storage/appdata.h
index 25aaa25d0..49d8f0658 100644
--- a/companion/src/storage/appdata.h
+++ b/companion/src/storage/appdata.h
@@ -64,7 +64,7 @@
#define CPN_URL_DOWNLOAD_CUR_RC CPN_URL_DOWNLOAD_CUR_VERS "rc/"
#define CPN_URL_DOWNLOAD_CUR_UNST CPN_URL_DOWNLOAD_CUR_VERS "nightlies/"
-#define MAX_PROFILES 15
+#define MAX_PROFILES 20
#define MAX_JOYSTICKS 8
// It important that these function names are consistent everywhere.
diff --git a/radio/src/gui/common/stdlcd/radio_hardware.cpp b/radio/src/gui/common/stdlcd/radio_hardware.cpp
index 22b24515c..48bb47246 100644
--- a/radio/src/gui/common/stdlcd/radio_hardware.cpp
+++ b/radio/src/gui/common/stdlcd/radio_hardware.cpp
@@ -203,6 +203,8 @@ enum {
#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_ZORRO)
+ #define SWITCH_TYPE_MAX(sw) ((MIXSRC_SB - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SC - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_3POS : SWITCH_2POS)
#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)
#elif defined(RADIO_T12)
diff --git a/radio/src/hal/adc_driver.cpp b/radio/src/hal/adc_driver.cpp
index 28373e8bc..a7e5dc6c9 100644
--- a/radio/src/hal/adc_driver.cpp
+++ b/radio/src/hal/adc_driver.cpp
@@ -57,6 +57,8 @@ const etx_hal_adc_driver_t* etx_hal_adc_driver = nullptr;
const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,0, 1,1, 1, 1};
#elif defined(RADIO_TX12)
const int8_t adcDirection[NUM_ANALOGS] = {-1,1,-1,1, -1,-1, 1, 1};
+#elif defined(RADIO_ZORRO)
+ const int8_t adcDirection[NUM_ANALOGS] = {-1, 1, 1, -1, -1, 1, 1, 1};
#elif defined(PCBX7)
const int8_t adcDirection[NUM_ANALOGS] = {-1,1,-1,1, 1,1, 1, 1};
#elif defined(PCBX9LITE)
diff --git a/radio/src/lua/CMakeLists.txt b/radio/src/lua/CMakeLists.txt
index ac6f0176d..8a75d379c 100644
--- a/radio/src/lua/CMakeLists.txt
+++ b/radio/src/lua/CMakeLists.txt
@@ -31,6 +31,7 @@ if(PYTHONINTERP_FOUND)
add_lua_export_target(t12 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_T12)
add_lua_export_target(tlite ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_TLITE)
add_lua_export_target(tx12 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_TX12)
+ add_lua_export_target(zorro ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_ZORRO)
add_lua_export_target(t8 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_T8)
add_lua_export_target(t16 ${LUA_INCLUDES} -DPCBHORUS -DPCBX10 -DRADIO_T16)
add_lua_export_target(nv14 ${LUA_INCLUDES} -I${RADIO_SRC_DIR}/targets/nv14 -DPCBNV14)
diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp
index bd6843aa4..8ac29f153 100644
--- a/radio/src/lua/api_general.cpp
+++ b/radio/src/lua/api_general.cpp
@@ -52,6 +52,8 @@
#include "lua/lua_exports_tlite.inc"
#elif defined(RADIO_TX12)
#include "lua/lua_exports_tx12.inc"
+#elif defined(RADIO_ZORRO)
+ #include "lua/lua_exports_zorro.inc"
#elif defined(RADIO_T8)
#include "lua/lua_exports_t8.inc"
#elif defined(PCBX9LITES)
@@ -2316,7 +2318,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) || defined(RADIO_T8)
+#if defined(RADIO_TX12) || defined(RADIO_ZORRO) || 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/sdcard.h b/radio/src/sdcard.h
index 3d590ad66..2ac4f5dc6 100644
--- a/radio/src/sdcard.h
+++ b/radio/src/sdcard.h
@@ -154,6 +154,8 @@ const char * getBasename(const char * path);
#define OTX_FOURCC 0x4278746F // otx for Jumper TLite
#elif defined(RADIO_TX12)
#define OTX_FOURCC 0x4178746F // otx for Radiomaster TX12
+#elif defined(RADIO_ZORRO)
+ #define OTX_FOURCC 0x4778746F // otx for Radiomaster Zorro
#elif defined(RADIO_T8)
#define OTX_FOURCC 0x4378746F // otx for Radiomaster T8
#elif defined(PCBX7)
diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp
index 99df475f0..53410cb2e 100644
--- a/radio/src/simu.cpp
+++ b/radio/src/simu.cpp
@@ -361,7 +361,7 @@ void OpenTxSim::updateKeysAndSwitches(bool start)
KEY_Left, KEY_LEFT,
KEY_Up, KEY_UP,
KEY_Down, KEY_DOWN,
-#elif defined(RADIO_TX12)
+#elif defined(RADIO_TX12) || defined(RADIO_ZORRO)
KEY_Page_Up, KEY_PAGEUP,
KEY_Page_Down, KEY_PAGEDN,
KEY_Return, KEY_ENTER,
diff --git a/radio/src/storage/conversions/CMakeLists.txt b/radio/src/storage/conversions/CMakeLists.txt
index 23bb4582c..601482530 100644
--- a/radio/src/storage/conversions/CMakeLists.txt
+++ b/radio/src/storage/conversions/CMakeLists.txt
@@ -1,5 +1,9 @@
set(STORAGE_CONVERSIONS 219)
+if(PCB STREQUAL X7 AND PCBREV STREQUAL ZORRO)
+ set(STORAGE_CONVERSIONS 221)
+endif()
+
if(STORAGE_CONVERSIONS)
add_definitions(-DSTORAGE_CONVERSIONS=${STORAGE_CONVERSIONS})
set(SRC
diff --git a/radio/src/strhelpers.cpp b/radio/src/strhelpers.cpp
index b1774da19..291e109ae 100644
--- a/radio/src/strhelpers.cpp
+++ b/radio/src/strhelpers.cpp
@@ -426,7 +426,7 @@ int getRawSwitchIdx(char sw)
if (sw < 'A' || sw > 'Z')
return -1;
-#if defined(PCBX7) && !defined(RADIO_TX12)
+#if defined(PCBX7) && !defined(RADIO_TX12) && !defined(RADIO_ZORRO)
if (sw >= 'H')
return sw - 'H' + 5;
#if defined(RADIO_T12)
@@ -444,7 +444,7 @@ int getRawSwitchIdx(char sw)
char getRawSwitchFromIdx(int idx)
{
-#if defined(PCBX7) && !defined(RADIO_TX12)
+#if defined(PCBX7) && !defined(RADIO_TX12) && !defined(RADIO_ZORRO)
if (idx >= 5)
return 'H' + idx - 5;
else if (idx == 4)
diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp
index 219d43a3a..5d77bb168 100644
--- a/radio/src/switches.cpp
+++ b/radio/src/switches.cpp
@@ -129,7 +129,7 @@ uint64_t check3PosSwitchPosition(uint8_t idx, uint8_t sw, bool startup)
void getSwitchesPosition(bool startup)
{
uint64_t newPos = 0;
-#if defined(RADIO_TX12)
+#if defined(RADIO_TX12) || defined(RADIO_ZORRO)
CHECK_2POS(SW_SA);
CHECK_3POS(0, SW_SB);
CHECK_3POS(1, SW_SC);
@@ -155,6 +155,12 @@ void getSwitchesPosition(bool startup)
#elif defined(PCBXLITE)
CHECK_3POS(3, SW_SD);
// no SWE, SWF, SWG and SWH on XLITE
+#elif defined(RADIO_ZORRO)
+ CHECK_2POS(SW_SD);
+ CHECK_2POS(SW_SE);
+ CHECK_2POS(SW_SF);
+ CHECK_2POS(SW_SG);
+ CHECK_2POS(SW_SH);
#elif defined(RADIO_TX12)
CHECK_2POS(SW_SD);
CHECK_3POS(2, SW_SE);
@@ -181,7 +187,7 @@ void getSwitchesPosition(bool startup)
#if defined(PCBX7ACCESS)
CHECK_2POS(SW_SI);
-#elif defined(PCBHORUS) || defined(PCBX7)
+#elif defined(PCBHORUS) || (defined(PCBX7) && !defined(RADIO_ZORRO))
CHECK_2POS(SW_SI);
CHECK_2POS(SW_SJ);
#endif
diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt
index 907e47cd4..5d959c2c1 100644
--- a/radio/src/targets/taranis/CMakeLists.txt
+++ b/radio/src/targets/taranis/CMakeLists.txt
@@ -166,6 +166,27 @@ elseif(PCB STREQUAL X7)
add_definitions(-DRADIO_TX12)
add_definitions(-DEEPROM_VARIANT=0x4002)
add_definitions(-DMANUFACTURER_RADIOMASTER)
+ elseif(PCBREV STREQUAL ZORRO)
+ set(DEFAULT_INTERNAL_MODULE CROSSFIRE CACHE STRING "Default internal module")
+ set(INTERNAL_MODULE_SERIAL YES)
+ set(FLAVOUR zorro)
+ set(NAVIGATION_TYPE x7)
+ set(CPU_TYPE STM32F4)
+ set(CPU_TYPE_FULL STM32F407xE) # for size report
+ set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld)
+ set(FIRMWARE_TARGET_SRC
+ ${FIRMWARE_TARGET_SRC}
+ startup_stm32f40_41xxx.s
+ )
+ add_definitions(-DSTM32F40_41xxx)
+ set(ROTARY_ENCODER YES)
+ set(LUA_EXPORT lua_export_zorro)
+ set(BLUETOOTH NO)
+ set(USB_CHARGER YES)
+ set(AUX_SERIAL_DRIVER ../common/arm/stm32/aux_serial_driver.cpp)
+ add_definitions(-DRADIO_ZORRO)
+ add_definitions(-DEEPROM_VARIANT=0x4006)
+ add_definitions(-DMANUFACTURER_RADIOMASTER)
elseif(PCBREV STREQUAL T8)
set(DEFAULT_INTERNAL_MODULE MULTIMODULE CACHE STRING "Default internal module")
set(INTERNAL_MODULE_SERIAL YES)
diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h
index ff85cc531..01df37927 100644
--- a/radio/src/targets/taranis/board.h
+++ b/radio/src/targets/taranis/board.h
@@ -28,7 +28,7 @@
#include "board_common.h"
#include "hal.h"
-#if defined(RADIO_TX12) || defined(RADIO_TX12)
+#if defined(RADIO_TX12) || defined(RADIO_ZORRO)
#define NAVIGATION_X7_TX12
#endif
@@ -38,6 +38,10 @@ void rotaryEncoderInit();
void rotaryEncoderCheck();
#endif
+#if defined(RADIO_ZORRO)
+#define ROTARY_ENCODER_INVERT
+#endif
+
#define FLASHSIZE 0x80000
#define BOOTLOADER_SIZE 0x8000
#define FIRMWARE_ADDRESS 0x08000000
@@ -330,6 +334,8 @@ enum EnumSwitches
};
#if defined(RADIO_TX12)
#define IS_3POS(x) ((x) != SW_SA && (x) != SW_SD)
+#elif defined(RADIO_ZORRO)
+ #define IS_3POS(x) ((x) == SW_SB || (x) == SW_SC)
#else
#define IS_3POS(x) ((x) != SW_SF && (x) != SW_SH)
#endif
@@ -347,22 +353,22 @@ enum EnumSwitchesPositions
SW_SD0,
SW_SD1,
SW_SD2,
-#if defined(PCBX9) || defined(PCBXLITES) || defined(PCBX9LITES) || defined(RADIO_TX12)
+#if defined(PCBX9) || defined(PCBXLITES) || defined(PCBX9LITES) || defined(RADIO_TX12) || defined(RADIO_ZORRO)
SW_SE0,
SW_SE1,
SW_SE2,
#endif
-#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || (defined(PCBX7) && !defined(RADIO_T12)) || defined(PCBXLITES) || defined(PCBX9LITES) || defined(RADIO_T8)
+#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || (defined(PCBX7) && !defined(RADIO_T12)) || defined(PCBXLITES) || defined(PCBX9LITES) || defined(RADIO_T8) || defined(RADIO_ZORRO)
SW_SF0,
SW_SF1,
SW_SF2,
#endif
-#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBX9LITES) || defined(RADIO_T12)
+#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBX9LITES) || defined(RADIO_T12) || defined(RADIO_ZORRO)
SW_SG0,
SW_SG1,
SW_SG2,
#endif
-#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || (defined(PCBX7) && !defined(RADIO_TX12)) || defined(RADIO_T8)
+#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || (defined(PCBX7) && !defined(RADIO_TX12)) || defined(RADIO_T8) || defined(RADIO_ZORRO)
SW_SH0,
SW_SH1,
SW_SH2,
@@ -376,7 +382,7 @@ enum EnumSwitchesPositions
SW_SI0,
SW_SI1,
SW_SI2,
-#elif defined(PCBX7)
+#elif defined(PCBX7) && !defined(RADIO_ZORRO)
SW_SI0,
SW_SI1,
SW_SI2,
@@ -444,6 +450,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_ZORRO)
+ #define NUM_SWITCHES 8
+ #define STORAGE_NUM_SWITCHES NUM_SWITCHES
+ #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 14) + (SWITCH_TOGGLE << 12) + (SWITCH_2POS << 10) + (SWITCH_2POS << 8) + (SWITCH_TOGGLE << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_TOGGLE << 0)
+ #define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 0) + (POT_WITHOUT_DETENT << 2);
#elif defined(RADIO_T8)
#define NUM_SWITCHES 4
#define STORAGE_NUM_SWITCHES 8
@@ -493,6 +504,11 @@ enum EnumSwitchesPositions
void keysInit();
uint32_t switchState(uint8_t index);
+#if defined(RADIO_ZORRO)
+static const uint8_t switchReOrder[] = {1, 0, 4, 2, 3, 5};
+#else
+static const uint8_t switchReOrder[] = {0, 1, 2, 3, 4, 5};
+#endif
uint32_t readKeys();
uint32_t readTrims();
#define TRIMS_PRESSED() (readTrims())
@@ -729,6 +745,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_ZORRO)
+ #define USB_NAME "Radiomaster Zorro"
+ #define USB_MANUFACTURER 'R', 'M', '_', 'T', 'X', ' ', ' ', ' ' /* 8 bytes */
+ #define USB_PRODUCT 'R', 'M', ' ', 'Z', 'O', 'R', 'R', 'O' /* 8 Bytes */
#elif defined(RADIO_T8)
#define USB_NAME "Radiomaster T8"
#define USB_MANUFACTURER 'R', 'M', '_', 'T', 'X', ' ', ' ', ' ' /* 8 bytes */
diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h
index d7256bf17..c354e3a61 100644
--- a/radio/src/targets/taranis/hal.h
+++ b/radio/src/targets/taranis/hal.h
@@ -66,13 +66,18 @@
#define KEYS_GPIO_PIN_LEFT GPIO_Pin_7 // PD.07
#define KEYS_GPIO_REG_RIGHT GPIOD->IDR
#define KEYS_GPIO_PIN_RIGHT GPIO_Pin_3 // PD.03
-#elif defined(RADIO_TX12)
+#elif defined(RADIO_TX12) || defined(RADIO_ZORRO)
#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
+#if defined(RADIO_TX12)
#define KEYS_GPIO_REG_EXIT GPIOB->IDR
#define KEYS_GPIO_PIN_EXIT GPIO_Pin_3 // PB.03
+#else
+ #define KEYS_GPIO_REG_EXIT GPIOC->IDR
+ #define KEYS_GPIO_PIN_EXIT GPIO_Pin_5 // PC.05
+#endif
#define KEYS_GPIO_REG_ENTER GPIOA->IDR
#define KEYS_GPIO_PIN_ENTER GPIO_Pin_13 // PA.13
#define KEYS_GPIO_REG_SYS GPIOB->IDR
@@ -197,7 +202,7 @@
#define ROTARY_ENCODER_EXTI_PortSource EXTI_PortSourceGPIOE
#define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource10
#define ROTARY_ENCODER_EXTI_PinSource2 EXTI_PinSource12
-#elif defined(RADIO_TX12)
+#elif defined(RADIO_TX12) || defined(RADIO_ZORRO)
#define ROTARY_ENCODER_NAVIGATION
#define ROTARY_ENCODER_GPIO GPIOE
#define ROTARY_ENCODER_GPIO_PIN_A GPIO_Pin_9 // PE.9
@@ -353,7 +358,7 @@
#define SWITCHES_GPIO_PIN_A_H GPIO_Pin_1 // PE.01
#define SWITCHES_GPIO_REG_A_L GPIOE->IDR
#define SWITCHES_GPIO_PIN_A_L GPIO_Pin_0 // PE.00
-#elif defined(RADIO_TX12)
+#elif defined(RADIO_TX12) || defined(RADIO_ZORRO)
#define STORAGE_SWITCH_A
#define HARDWARE_SWITCH_A
#define SWITCHES_GPIO_REG_A GPIOC->IDR
@@ -451,6 +456,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_ZORRO)
+ #define STORAGE_SWITCH_C
+ #define HARDWARE_SWITCH_C
+ #define SWITCHES_GPIO_REG_C_L GPIOE->IDR
+ #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_0 // PE.00
+ #define SWITCHES_GPIO_REG_C_H GPIOD->IDR
+ #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_11 // PD.11
#elif defined(RADIO_T8)
#define STORAGE_SWITCH_C
#define HARDWARE_SWITCH_C
@@ -510,7 +522,7 @@
#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)
+#elif defined(RADIO_TX12) || defined(RADIO_ZORRO)
#define STORAGE_SWITCH_D
#define HARDWARE_SWITCH_D
#define SWITCHES_GPIO_REG_D GPIOE->IDR
@@ -561,6 +573,11 @@
#define HARDWARE_SWITCH_E
#define SWITCHES_GPIO_REG_E GPIOA->IDR
#define SWITCHES_GPIO_PIN_E GPIO_Pin_5 // PA.05
+#elif defined(RADIO_ZORRO)
+ #define STORAGE_SWITCH_E
+ #define HARDWARE_SWITCH_E
+ #define SWITCHES_GPIO_REG_E GPIOE->IDR
+ #define SWITCHES_GPIO_PIN_E GPIO_Pin_7 // PE.07
#elif defined(RADIO_TX12)
#define STORAGE_SWITCH_E
#define HARDWARE_SWITCH_E
@@ -599,6 +616,11 @@
#define SWITCHES_GPIO_PIN_F GPIO_Pin_3 // PC.03
#elif defined(PCBX9LITE)
// no SWF
+#elif defined(RADIO_ZORRO)
+ #define STORAGE_SWITCH_F
+ #define HARDWARE_SWITCH_F
+ #define SWITCHES_GPIO_REG_F GPIOE->IDR
+ #define SWITCHES_GPIO_PIN_F GPIO_Pin_1 // PE.01
#elif defined(RADIO_TX12)
#define STORAGE_SWITCH_F
#define HARDWARE_SWITCH_F
@@ -635,7 +657,7 @@
#define HARDWARE_SWITCH_G
#define SWITCHES_GPIO_REG_G GPIOC->IDR
#define SWITCHES_GPIO_PIN_G GPIO_Pin_2 // PC.02
-#elif defined(RADIO_T12)
+#elif defined(RADIO_T12) || defined(RADIO_ZORRO)
#define STORAGE_SWITCH_G
#define HARDWARE_SWITCH_G
#define SWITCHES_GPIO_REG_G GPIOE->IDR
@@ -716,6 +738,8 @@
#define STORAGE_SWITCH_I
// no SWJ
#define STORAGE_SWITCH_J
+#elif defined(RADIO_ZORRO)
+ // No I/J
#elif defined(PCBX7)
#define STORAGE_SWITCH_I
#define HARDWARE_SWITCH_I
@@ -831,6 +855,13 @@
#define KEYS_GPIOC_PINS (GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3)
#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_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15)
+#elif defined(RADIO_ZORRO)
+ #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 | SWITCHES_GPIO_PIN_B_H)
+ #define KEYS_GPIOB_PINS (KEYS_GPIO_PIN_SYS)
+ #define KEYS_GPIOC_PINS (KEYS_GPIO_PIN_EXIT | TRIMS_GPIO_PIN_LHR | TRIMS_GPIO_PIN_RVD | TRIMS_GPIO_PIN_RVU | SWITCHES_GPIO_PIN_A)
+ #define KEYS_GPIOD_PINS (KEYS_GPIO_PIN_PAGEUP | KEYS_GPIO_PIN_PAGEDN | KEYS_GPIO_PIN_TELE | TRIMS_GPIO_PIN_LHL |SWITCHES_GPIO_PIN_C_H | SWITCHES_GPIO_PIN_H)
+ #define KEYS_GPIOE_PINS (KEYS_GPIO_PIN_MDL | TRIMS_GPIO_PIN_LVD | TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_RHL | TRIMS_GPIO_PIN_RHR | SWITCHES_GPIO_PIN_B_L | SWITCHES_GPIO_PIN_C_L | SWITCHES_GPIO_PIN_D | SWITCHES_GPIO_PIN_E | SWITCHES_GPIO_PIN_F | SWITCHES_GPIO_PIN_G | ROTARY_ENCODER_GPIO_PIN_A | ROTARY_ENCODER_GPIO_PIN_B)
#elif defined(RADIO_TX12)
#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_13 | GPIO_Pin_5)
@@ -1173,6 +1204,16 @@
#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(RADIO_ZORRO)
+ #define STATUS_LEDS
+ #define GPIO_LED_GPIO_ON GPIO_SetBits
+ #define GPIO_LED_GPIO_OFF GPIO_ResetBits
+ #define LED_GREEN_GPIO GPIOA
+ #define LED_GREEN_GPIO_PIN GPIO_Pin_7 // PA.07
+ #define LED_RED_GPIO GPIOE
+ #define LED_RED_GPIO_PIN GPIO_Pin_13 // PE.13
+ #define LED_BLUE_GPIO GPIOE
+ #define LED_BLUE_GPIO_PIN GPIO_Pin_2 // PE.02
#elif defined(PCBX7)
#define STATUS_LEDS
#define GPIO_LED_GPIO_ON GPIO_SetBits
@@ -1278,6 +1319,26 @@
#define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream7_IRQHandler
#define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF7
#define INTMODULE_DMA_CHANNEL DMA_Channel_4
+#elif defined(RADIO_ZORRO)
+ #define INTMODULE_RCC_APB1Periph 0
+ #define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1
+ #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2)
+ #define INTMODULE_PWR_GPIO GPIOC
+ #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_4 // PC.04
+ #define INTMODULE_GPIO GPIOB
+ #define INTMODULE_TX_GPIO_PIN GPIO_Pin_6 // PB.06
+ #define INTMODULE_RX_GPIO_PIN GPIO_Pin_7 // PB.07
+ #define INTMODULE_GPIO_PinSource_TX GPIO_PinSource6
+ #define INTMODULE_GPIO_PinSource_RX GPIO_PinSource7
+ #define INTMODULE_USART USART1
+ #define INTMODULE_GPIO_AF GPIO_AF_USART1
+ #define INTMODULE_USART_IRQHandler USART1_IRQHandler
+ #define INTMODULE_USART_IRQn USART1_IRQn
+ #define INTMODULE_DMA_STREAM DMA2_Stream7
+ #define INTMODULE_DMA_STREAM_IRQ DMA2_Stream7_IRQn
+ #define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream7_IRQHandler
+ #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF7
+ #define INTMODULE_DMA_CHANNEL DMA_Channel_4
#elif defined(PCBX9E) || defined(PCBX9DP) || defined(RADIO_X7)
#define INTMODULE_PULSES
#define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2)
@@ -1298,7 +1359,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_FAMILY_JUMPER_T12) && defined(HARDWARE_INTERNAL_MODULE))|| defined(RADIO_TX12) || defined(RADIO_T8)
+#elif (defined(RADIO_FAMILY_JUMPER_T12) && defined(HARDWARE_INTERNAL_MODULE)) || defined(RADIO_TX12) || defined(RADIO_ZORRO) || 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
@@ -1342,9 +1403,9 @@
#endif
// External Module
-#if defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019) || defined(PCBX7ACCESS)
+#if defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019) || defined(PCBX7ACCESS) || defined(RADIO_ZORRO)
#define EXTMODULE_RCC_APB2Periph (RCC_APB2Periph_TIM8 | RCC_APB2Periph_USART6)
- #if defined(RADIO_X9DP2019) || defined(RADIO_X7ACCESS)
+ #if defined(RADIO_X9DP2019) || defined(RADIO_X7ACCESS) || defined(RADIO_ZORRO)
#define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
#define EXTMODULE_PWR_GPIO GPIOD
#define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08
@@ -1488,7 +1549,7 @@
#endif
// Serial Port
-#if defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019)
+#if (defined(PCBX7) && !defined(RADIO_ZORRO)) || defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019)
#define AUX_SERIAL_RCC_AHB1Periph 0
#define AUX_SERIAL_RCC_APB1Periph 0
#define AUX_SERIAL_RCC_APB2Periph 0
@@ -1548,7 +1609,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) || defined(RADIO_T8)
+#if defined(RADIO_X7) || defined(RADIO_X7ACCESS) || defined(RADIO_TX12) || defined(RADIO_ZORRO) || 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
@@ -1656,6 +1717,16 @@
#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_X9DP2019) || defined(RADIO_ZORRO)
+ #define INTMODULE_HEARTBEAT
+ #define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOB
+ #define INTMODULE_HEARTBEAT_GPIO GPIOB
+ #define INTMODULE_HEARTBEAT_GPIO_PIN GPIO_Pin_1 // PB.01
+ #define INTMODULE_HEARTBEAT_EXTI_PortSource EXTI_PortSourceGPIOB
+ #define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource1
+ #define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line1
+ #define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI1_IRQn
+ #define INTMODULE_HEARTBEAT_EXTI_IRQHandler EXTI1_IRQHandler
#elif defined(RADIO_X7) || defined(RADIO_TX12)
#define INTMODULE_HEARTBEAT
#define INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER
@@ -1666,16 +1737,6 @@
#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_X9DP2019)
- #define INTMODULE_HEARTBEAT
- #define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOB
- #define INTMODULE_HEARTBEAT_GPIO GPIOB
- #define INTMODULE_HEARTBEAT_GPIO_PIN GPIO_Pin_1 // PB.01
- #define INTMODULE_HEARTBEAT_EXTI_PortSource EXTI_PortSourceGPIOB
- #define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource1
- #define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line1
- #define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI1_IRQn
- #define INTMODULE_HEARTBEAT_EXTI_IRQHandler EXTI1_IRQHandler
#else
#define INTMODULE_HEARTBEAT
#define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOC
@@ -1847,7 +1908,7 @@
#define KEYS_BACKLIGHT_RCC_AHB1Periph 0
// LCD driver
-#if defined(RADIO_TX12) || defined(RADIO_FAMILY_JUMPER_T12) || defined(RADIO_T8)
+#if defined(RADIO_TX12) || defined(RADIO_ZORRO) || defined(RADIO_FAMILY_JUMPER_T12) || defined(RADIO_T8)
#define LCD_VERTICAL_INVERT
#endif
#if defined(PCBX9E)
@@ -1949,6 +2010,15 @@
#define I2C_B1_WP_GPIO_PIN GPIO_Pin_5 // PB.05
#define I2C_B1_SDA_GPIO_PinSource GPIO_PinSource9
#define I2C_B1_SCL_GPIO_PinSource GPIO_PinSource8
+#elif defined(RADIO_ZORRO)
+ #define I2C_B1_RCC_AHB1Periph RCC_AHB1Periph_GPIOB
+ #define I2C_B1_SPI_GPIO GPIOB
+ #define I2C_B1_SDA_GPIO_PIN GPIO_Pin_9 // PB.09
+ #define I2C_B1_SCL_GPIO_PIN GPIO_Pin_8 // PB.08
+ #define I2C_B1_WP_GPIO GPIOD
+ #define I2C_B1_WP_GPIO_PIN GPIO_Pin_10 // PD.10
+ #define I2C_B1_SDA_GPIO_PinSource GPIO_PinSource9
+ #define I2C_B1_SCL_GPIO_PinSource GPIO_PinSource8
#elif defined(RADIO_X9DP2019)
#define I2C_B1_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOF)
#define I2C_B1_SPI_GPIO GPIOB
@@ -2042,7 +2112,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) || defined(RADIO_T8) || defined(RADIO_TLITE)
+#elif defined(RADIO_TX12) || defined(RADIO_ZORRO) || defined(RADIO_T8) || defined(RADIO_TLITE)
#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
@@ -2057,7 +2127,7 @@
#endif
// Haptic
-#if defined(PCBXLITE) || defined(PCBX9LITE)
+#if defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_ZORRO)
#define HAPTIC_PWM
#define HAPTIC_RCC_AHB1Periph RCC_AHB1Periph_GPIOB
#define HAPTIC_RCC_APB1Periph RCC_APB1Periph_TIM2
@@ -2172,7 +2242,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_FAMILY_JUMPER_T12) || defined(RADIO_TX12) || defined(RADIO_T8)
+#elif defined(PCBX9D) || defined(PCBX9DP) || defined(RADIO_FAMILY_JUMPER_T12) || defined(RADIO_TX12) || defined(RADIO_T8) || defined(RADIO_ZORRO)
#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 ae7b1b431..3dc4260eb 100644
--- a/radio/src/targets/taranis/keys_driver.cpp
+++ b/radio/src/targets/taranis/keys_driver.cpp
@@ -206,7 +206,7 @@ uint32_t switchState(uint8_t index)
switch (index) {
-#if defined(RADIO_TX12) || defined(RADIO_T8)
+#if defined(RADIO_TX12) || defined(RADIO_ZORRO) || defined(RADIO_T8)
ADD_2POS_CASE(A);
ADD_3POS_CASE(B, 1);
ADD_3POS_CASE(C, 2);
@@ -242,7 +242,13 @@ uint32_t switchState(uint8_t index)
ADD_2POS_CASE(H);
ADD_2POS_CASE(I);
// no SWJ on XLITE
-#elif defined(RADIO_TX12)
+#elif defined(RADIO_ZORRO)
+ ADD_2POS_CASE(D);
+ ADD_2POS_CASE(E);
+ ADD_2POS_CASE(F);
+ ADD_2POS_CASE(G);
+ ADD_2POS_CASE(H);
+#elif defined(RADIO_TX12) || defined(RADIO_ZORRO)
ADD_2POS_CASE(D);
ADD_3POS_CASE(E, 4);
ADD_3POS_CASE(F, 5);
diff --git a/radio/src/targets/taranis/lcd_driver_spi.cpp b/radio/src/targets/taranis/lcd_driver_spi.cpp
index 7a764bfd8..53ac9ac25 100644
--- a/radio/src/targets/taranis/lcd_driver_spi.cpp
+++ b/radio/src/targets/taranis/lcd_driver_spi.cpp
@@ -21,7 +21,7 @@
#include "opentx.h"
-#if defined(RADIO_FAMILY_JUMPER_T12) || defined(RADIO_TX12) || defined(RADIO_T8)
+#if defined(RADIO_FAMILY_JUMPER_T12) || defined(RADIO_TX12) || defined(RADIO_ZORRO) || defined(RADIO_T8)
#define LCD_CONTRAST_OFFSET -10
#else
#define LCD_CONTRAST_OFFSET 160
diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h
index c4754fb4c..0e1277a64 100644
--- a/radio/src/translations/untranslated.h
+++ b/radio/src/translations/untranslated.h
@@ -46,9 +46,9 @@
#elif defined(RADIO_TX12)
#define TR_POTS_VSRCRAW STR_CHAR_POT "S1\0" STR_CHAR_POT "S2\0"
#define TR_SW_VSRCRAW STR_CHAR_SWITCH "SA\0" STR_CHAR_SWITCH "SB\0" STR_CHAR_SWITCH "SC\0" STR_CHAR_SWITCH "SD\0" STR_CHAR_SWITCH "SE\0" STR_CHAR_SWITCH "SF\0" STR_CHAR_SWITCH "SI\0" STR_CHAR_SWITCH "SJ\0"
-#elif defined(RADIO_TX12)
- #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0"
- #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SI\0""\312SJ\0"
+#elif defined(RADIO_ZORRO)
+ #define TR_POTS_VSRCRAW STR_CHAR_POT"S1\0" STR_CHAR_POT"S2\0"
+ #define TR_SW_VSRCRAW STR_CHAR_SWITCH "SA\0" STR_CHAR_SWITCH "SB\0" STR_CHAR_SWITCH "SC\0" STR_CHAR_SWITCH "SD\0" STR_CHAR_SWITCH "SE\0" STR_CHAR_SWITCH "SF\0" STR_CHAR_SWITCH "SG\0" STR_CHAR_SWITCH "SH\0"
#elif defined(PCBX7)
#define TR_POTS_VSRCRAW STR_CHAR_POT"S1\0" STR_CHAR_POT"S2\0"
#define TR_SW_VSRCRAW STR_CHAR_SWITCH"SA\0" STR_CHAR_SWITCH"SB\0" STR_CHAR_SWITCH"SC\0" STR_CHAR_SWITCH"SD\0" STR_CHAR_SWITCH"SF\0" STR_CHAR_SWITCH"SH\0" STR_CHAR_SWITCH"SI\0" STR_CHAR_SWITCH"SJ\0"
diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py
index 5d577092c..4ae44a808 100755
--- a/radio/util/build-firmware.py
+++ b/radio/util/build-firmware.py
@@ -153,6 +153,11 @@ def main():
cmake_options["PCBREV"] = "TX12"
firmware_options = options_radiomaster_tx12
maxsize = 65536 * 8
+ elif board_name == "zorro":
+ cmake_options["PCB"] = "X7"
+ cmake_options["PCBREV"] = "ZORRO"
+ firmware_options = options_radiomaster_zorro
+ maxsize = 65536 * 8
elif board_name == "t8":
cmake_options["PCB"] = "X7"
cmake_options["PCBREV"] = "T8"
diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py
index 761e42373..753a6e52e 100755
--- a/radio/util/fwoptions.py
+++ b/radio/util/fwoptions.py
@@ -271,6 +271,19 @@ options_radiomaster_tx12 = {
"afhds3": ("AFHDS3", "YES", "NO")
}
+options_radiomaster_zorro = {
+ "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"),
+ "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None),
+ "afhds3": ("AFHDS3", "YES", "NO"),
+ "internalelrs": ("INTERNAL_MODULE_ELRS", "YES", "NO"),
+}
+
options_radiomaster_t8 = {
"noheli": ("HELI", "NO", "YES"),
"ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"),
diff --git a/tools/build-radiomaster.py b/tools/build-radiomaster.py
index 564463537..f1db01305 100755
--- a/tools/build-radiomaster.py
+++ b/tools/build-radiomaster.py
@@ -29,6 +29,16 @@ boards = {
"PCBREV": "TX12",
"DEFAULT_MODE": "2",
},
+ "ZORRO_1": {
+ "PCB": "X7",
+ "PCBREV": "ZORRO",
+ "DEFAULT_MODE": "1",
+ },
+ "ZORRO_2": {
+ "PCB": "X7",
+ "PCBREV": "ZORRO",
+ "DEFAULT_MODE": "2",
+ },
"T8_1": {
"PCB": "X7",
"PCBREV": "T8",