1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-14 20:10:08 +03:00

Radiomaster Zorro (#8791)

This commit is contained in:
3djc 2021-12-08 18:01:07 +01:00 committed by GitHub
parent 35607154b6
commit 92db767833
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
55 changed files with 698 additions and 67 deletions

View file

@ -347,6 +347,8 @@ elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TLITE)
set(FLAVOUR tlite) set(FLAVOUR tlite)
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TX12) elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TX12)
set(FLAVOUR tx12) set(FLAVOUR tx12)
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL ZORRO)
set(FLAVOUR zorro)
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL T8) elseif(PCB STREQUAL X7 AND PCBREV STREQUAL T8)
set(FLAVOUR t8) set(FLAVOUR t8)
elseif(PCB STREQUAL TANGO) elseif(PCB STREQUAL TANGO)

View file

@ -200,6 +200,17 @@
<file>images/simulator/TX12/right-mdl.png</file> <file>images/simulator/TX12/right-mdl.png</file>
<file>images/simulator/TX12/bottom.png</file> <file>images/simulator/TX12/bottom.png</file>
<file>images/simulator/TX12/top.png</file> <file>images/simulator/TX12/top.png</file>
<file>images/simulator/Zorro/left.png</file>
<file>images/simulator/Zorro/left-pageup.png</file>
<file>images/simulator/Zorro/left-pagedn.png</file>
<file>images/simulator/Zorro/left-rtn.png</file>
<file>images/simulator/Zorro/left-sys.png</file>
<file>images/simulator/Zorro/right-tele.png</file>
<file>images/simulator/Zorro/right.png</file>
<file>images/simulator/Zorro/right-ent.png</file>
<file>images/simulator/Zorro/right-mdl.png</file>
<file>images/simulator/Zorro/bottom.png</file>
<file>images/simulator/Zorro/top.png</file>
<file>images/simulator/T8/left.png</file> <file>images/simulator/T8/left.png</file>
<file>images/simulator/T8/left-pageup.png</file> <file>images/simulator/T8/left-pageup.png</file>
<file>images/simulator/T8/left-pagedn.png</file> <file>images/simulator/T8/left-pagedn.png</file>

View file

@ -90,6 +90,8 @@ uint32_t Boards::getFourCC(Type board)
return 0x3878746F; return 0x3878746F;
case BOARD_RADIOMASTER_TX12: case BOARD_RADIOMASTER_TX12:
return 0x4178746F; return 0x4178746F;
case BOARD_RADIOMASTER_ZORRO:
return 0x4778746F;
case BOARD_RADIOMASTER_T8: case BOARD_RADIOMASTER_T8:
return 0x4378746F; return 0x4378746F;
default: default:
@ -119,6 +121,7 @@ int Boards::getEEpromSize(Board::Type board)
case BOARD_JUMPER_TLITE: case BOARD_JUMPER_TLITE:
case BOARD_RADIOMASTER_TX12: case BOARD_RADIOMASTER_TX12:
case BOARD_RADIOMASTER_T8: case BOARD_RADIOMASTER_T8:
case BOARD_RADIOMASTER_ZORRO:
return EESIZE_TARANIS; return EESIZE_TARANIS;
case BOARD_UNKNOWN: case BOARD_UNKNOWN:
return EESIZE_MAX; return EESIZE_MAX;
@ -155,6 +158,7 @@ int Boards::getFlashSize(Type board)
case BOARD_JUMPER_T12: case BOARD_JUMPER_T12:
case BOARD_JUMPER_TLITE: case BOARD_JUMPER_TLITE:
case BOARD_RADIOMASTER_TX12: case BOARD_RADIOMASTER_TX12:
case BOARD_RADIOMASTER_ZORRO:
case BOARD_RADIOMASTER_T8: case BOARD_RADIOMASTER_T8:
return FSIZE_TARANIS; return FSIZE_TARANIS;
case BOARD_HORUS_X12S: case BOARD_HORUS_X12S:
@ -239,6 +243,20 @@ SwitchInfo Boards::getSwitchInfo(Board::Type board, int index)
if (index < DIM(switches)) if (index < DIM(switches))
return switches[index]; 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)) { else if (IS_RADIOMASTER_T8(board)) {
const Board::SwitchInfo switches[] = { const Board::SwitchInfo switches[] = {
{SWITCH_TOGGLE, "SA"}, {SWITCH_TOGGLE, "SA"},
@ -406,6 +424,8 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
return 8; return 8;
else if (IS_JUMPER_TLITE(board)) else if (IS_JUMPER_TLITE(board))
return 4; return 4;
else if(IS_RADIOMASTER_ZORRO(board))
return 8;
else if (IS_FAMILY_T12(board)) else if (IS_FAMILY_T12(board))
return 6; return 6;
else if (IS_HORUS_X12S(board)) else if (IS_HORUS_X12S(board))
@ -600,6 +620,8 @@ QString Boards::getBoardName(Board::Type board)
return "Radiomaster TX16S"; return "Radiomaster TX16S";
case BOARD_RADIOMASTER_TX12: case BOARD_RADIOMASTER_TX12:
return "Radiomaster TX12"; return "Radiomaster TX12";
case BOARD_RADIOMASTER_ZORRO:
return "Radiomaster Zorro";
case BOARD_RADIOMASTER_T8: case BOARD_RADIOMASTER_T8:
return "Radiomaster T8"; return "Radiomaster T8";
default: default:

View file

@ -61,6 +61,7 @@ namespace Board {
BOARD_RADIOMASTER_TX12, BOARD_RADIOMASTER_TX12,
BOARD_RADIOMASTER_T8, BOARD_RADIOMASTER_T8,
BOARD_JUMPER_TLITE, BOARD_JUMPER_TLITE,
BOARD_RADIOMASTER_ZORRO,
BOARD_TYPE_COUNT, BOARD_TYPE_COUNT,
BOARD_TYPE_MAX = BOARD_TYPE_COUNT - 1 BOARD_TYPE_MAX = BOARD_TYPE_COUNT - 1
}; };
@ -255,6 +256,12 @@ inline bool IS_RADIOMASTER_TX12(Board::Type board)
return board == Board::BOARD_RADIOMASTER_TX12; 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) inline bool IS_RADIOMASTER_T8(Board::Type board)
{ {
return board == Board::BOARD_RADIOMASTER_T8; return board == Board::BOARD_RADIOMASTER_T8;
@ -267,7 +274,7 @@ inline bool IS_FAMILY_T16(Board::Type board)
inline bool IS_FAMILY_T12(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_TARANIS_XLITE(Board::Type board) inline bool IS_TARANIS_XLITE(Board::Type board)

View file

@ -264,6 +264,10 @@ void GeneralSettings::setDefaultControlTypes(Board::Type board)
potConfig[0] = Board::POT_WITHOUT_DETENT; potConfig[0] = Board::POT_WITHOUT_DETENT;
potConfig[1] = Board::POT_WITH_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)) { else if (IS_FAMILY_T12(board)) {
potConfig[0] = Board::POT_WITH_DETENT; potConfig[0] = Board::POT_WITH_DETENT;
potConfig[1] = Board::POT_WITH_DETENT; potConfig[1] = Board::POT_WITH_DETENT;

View file

@ -39,6 +39,7 @@
#define RADIOMASTER_TX12_VARIANT 0x4002 #define RADIOMASTER_TX12_VARIANT 0x4002
#define JUMPER_TLITE_VARIANT 0x4003 #define JUMPER_TLITE_VARIANT 0x4003
#define RADIOMASTER_T8_VARIANT 0x4004 #define RADIOMASTER_T8_VARIANT 0x4004
#define RADIOMASTER_ZORRO_VARIANT 0x4006
class OpenTxGeneralData: public TransformedField { class OpenTxGeneralData: public TransformedField {
public: public:

View file

@ -70,6 +70,8 @@ const char * OpenTxEepromInterface::getName()
return "OpenTX for Radiomaster TX16S"; return "OpenTX for Radiomaster TX16S";
case BOARD_RADIOMASTER_TX12: case BOARD_RADIOMASTER_TX12:
return "OpenTX for Radiomaster TX12"; return "OpenTX for Radiomaster TX12";
case BOARD_RADIOMASTER_ZORRO:
return "OpenTX for Radiomaster Zorro";
case BOARD_RADIOMASTER_T8: case BOARD_RADIOMASTER_T8:
return "OpenTX for Radiomaster T8"; return "OpenTX for Radiomaster T8";
case BOARD_TARANIS_X9D: case BOARD_TARANIS_X9D:
@ -346,6 +348,9 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u
else if (IS_RADIOMASTER_TX12(board)) { else if (IS_RADIOMASTER_TX12(board)) {
variant |= RADIOMASTER_TX12_VARIANT; variant |= RADIOMASTER_TX12_VARIANT;
} }
else if (IS_RADIOMASTER_ZORRO(board)) {
variant |= RADIOMASTER_ZORRO_VARIANT;
}
else if (IS_RADIOMASTER_T8(board)) { else if (IS_RADIOMASTER_T8(board)) {
variant |= RADIOMASTER_T8_VARIANT; variant |= RADIOMASTER_T8_VARIANT;
} }
@ -998,6 +1003,11 @@ bool OpenTxEepromInterface::checkVariant(unsigned int version, unsigned int vari
variantError = true; variantError = true;
} }
} }
else if (IS_RADIOMASTER_ZORRO(board)) {
if (variant != RADIOMASTER_ZORRO_VARIANT) {
variantError = true;
}
}
else if (IS_RADIOMASTER_T8(board)) { else if (IS_RADIOMASTER_T8(board)) {
if (variant != RADIOMASTER_T8_VARIANT) { if (variant != RADIOMASTER_T8_VARIANT) {
variantError = true; variantError = true;
@ -1353,6 +1363,17 @@ void registerOpenTxFirmwares()
registerOpenTxFirmware(firmware); registerOpenTxFirmware(firmware);
addOpenTxRfOptions(firmware, FLEX + AFHDS3); addOpenTxRfOptions(firmware, FLEX + AFHDS3);
/* 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 */ /* Radiomaster T8 board */
firmware = new OpenTxFirmware("opentx-t8", QCoreApplication::translate("Firmware", "Radiomaster T8 / T8 Pro"), BOARD_RADIOMASTER_T8); firmware = new OpenTxFirmware("opentx-t8", QCoreApplication::translate("Firmware", "Radiomaster T8 / T8 Pro"), BOARD_RADIOMASTER_T8);
addOpenTxCommonOptions(firmware); addOpenTxCommonOptions(firmware);

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8 KiB

View file

@ -17,6 +17,7 @@ set(simulation_SRCS
simulateduiwidgetJumperT16.cpp simulateduiwidgetJumperT16.cpp
simulateduiwidgetJumperT18.cpp simulateduiwidgetJumperT18.cpp
simulateduiwidgetTX12.cpp simulateduiwidgetTX12.cpp
simulateduiwidgetZorro.cpp
simulateduiwidgetT8.cpp simulateduiwidgetT8.cpp
simulateduiwidgetTX16S.cpp simulateduiwidgetTX16S.cpp
simulatorinterface.cpp simulatorinterface.cpp
@ -46,6 +47,7 @@ set(simulation_UIS
simulateduiwidgetJumperT16.ui simulateduiwidgetJumperT16.ui
simulateduiwidgetJumperT18.ui simulateduiwidgetJumperT18.ui
simulateduiwidgetTX12.ui simulateduiwidgetTX12.ui
simulateduiwidgetZorro.ui
simulateduiwidgetT8.ui simulateduiwidgetT8.ui
simulateduiwidgetTX16S.ui simulateduiwidgetTX16S.ui
simulatormainwindow.ui simulatormainwindow.ui

View file

@ -117,6 +117,7 @@ namespace Ui {
class SimulatedUIWidgetJumperT18; class SimulatedUIWidgetJumperT18;
class SimulatedUIWidgetTX16S; class SimulatedUIWidgetTX16S;
class SimulatedUIWidgetTX12; class SimulatedUIWidgetTX12;
class SimulatedUIWidgetZorro;
class SimulatedUIWidgetT8; class SimulatedUIWidgetT8;
} }
@ -292,6 +293,19 @@ class SimulatedUIWidgetTX12: public SimulatedUIWidget
Ui::SimulatedUIWidgetTX12 * ui; 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 class SimulatedUIWidgetT8: public SimulatedUIWidget
{ {
Q_OBJECT Q_OBJECT

View file

@ -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<int>() << 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<int>() << 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<int>() << 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<int>() << 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<int>() << 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<int>() << 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<int>() << 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<int>() << 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<int>() << 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;
}

View file

@ -0,0 +1,258 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SimulatedUIWidgetZorro</class>
<widget class="QWidget" name="SimulatedUIWidgetZorro">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>641</width>
<height>253</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>641</width>
<height>253</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>641</width>
<height>253</height>
</size>
</property>
<property name="windowTitle">
<string notr="true">Taranis Zorro Simulator</string>
</property>
<property name="styleSheet">
<string notr="true">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));</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="1" column="0" rowspan="3">
<widget class="ButtonsWidget" name="leftbuttons" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>196</width>
<height>253</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>196</width>
<height>253</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background:url(:/images/simulator/Zorro/left.png);</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="LcdWidget" name="lcd" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>256</width>
<height>180</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>424</width>
<height>180</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(215, 243, 255);</string>
</property>
</widget>
</item>
<item row="1" column="2" rowspan="3">
<widget class="ButtonsWidget" name="rightbuttons" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>189</width>
<height>253</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>189</width>
<height>253</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background:url(:/images/simulator/Zorro/right.png)</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QWidget" name="top" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>256</width>
<height>48</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>256</width>
<height>48</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background:url(:/images/simulator/Zorro/top.png)</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QWidget" name="bottom" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>261</width>
<height>55</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>261</width>
<height>55</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background:url(:/images/simulator/Zorro/bottom.png)</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="3">
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>10</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>12</height>
</size>
</property>
<property name="baseSize">
<size>
<width>0</width>
<height>12</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 255, 255);</string>
</property>
<property name="text">
<string notr="true"/>
</property>
</widget>
</item>
<item row="4" column="0" colspan="3">
<widget class="QLabel" name="label_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>10</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>10</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(247, 245, 245);</string>
</property>
<property name="text">
<string notr="true"/>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>LcdWidget</class>
<extends>QWidget</extends>
<header>lcdwidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>ButtonsWidget</class>
<extends>QWidget</extends>
<header>buttonswidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View file

@ -103,6 +103,9 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato
case Board::BOARD_RADIOMASTER_TX12: case Board::BOARD_RADIOMASTER_TX12:
radioUiWidget = new SimulatedUIWidgetTX12(simulator, this); radioUiWidget = new SimulatedUIWidgetTX12(simulator, this);
break; break;
case Board::BOARD_RADIOMASTER_ZORRO:
radioUiWidget = new SimulatedUIWidgetZorro(simulator, this);
break;
case Board::BOARD_RADIOMASTER_T8: case Board::BOARD_RADIOMASTER_T8:
radioUiWidget = new SimulatedUIWidgetT8(simulator, this); radioUiWidget = new SimulatedUIWidgetT8(simulator, this);
break; break;

View file

@ -64,7 +64,7 @@
#define CPN_URL_DOWNLOAD_CUR_RC CPN_URL_DOWNLOAD_CUR_VERS "rc/" #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 CPN_URL_DOWNLOAD_CUR_UNST CPN_URL_DOWNLOAD_CUR_VERS "nightlies/"
#define MAX_PROFILES 15 #define MAX_PROFILES 20
#define MAX_JOYSTICKS 8 #define MAX_JOYSTICKS 8
// It important that these function names are consistent everywhere. // It important that these function names are consistent everywhere.

View file

@ -227,7 +227,7 @@ enum TrainerMode {
#endif #endif
#elif defined(TRAINER_SPORT_SBUS) #elif defined(TRAINER_SPORT_SBUS)
#define TRAINER_MODE_MAX() TRAINER_MODE_MASTER_SBUS_SPORT #define TRAINER_MODE_MAX() TRAINER_MODE_MASTER_SBUS_SPORT
#elif defined(INTERNAL_MODULE_MULTI) || defined(INTERNAL_MODULE_CRSF) || defined(HARDWARE_TRAINER_MULTI_MOD) #elif defined(INTERNAL_MODULE_MULTI) || defined(INTERNAL_MODULE_CRSF) || defined(INTERNAL_MODULE_ELRS) || defined(HARDWARE_TRAINER_MULTI_MOD)
#define TRAINER_MODE_MAX() TRAINER_MODE_MULTI #define TRAINER_MODE_MAX() TRAINER_MODE_MULTI
#elif defined(BLUETOOTH) #elif defined(BLUETOOTH)
#define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE_BLUETOOTH #define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE_BLUETOOTH

View file

@ -858,7 +858,7 @@ void menuModelSetup(event_t event)
lcdDrawTextAlignedLeft(y, STR_INTERNALRF); lcdDrawTextAlignedLeft(y, STR_INTERNALRF);
break; break;
#if !defined(INTERNAL_MODULE_MULTI) #if !defined(INTERNAL_MODULE_MULTI) && !defined(INTERNAL_MODULE_ELRS)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE: case ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE:
{ {
lcdDrawText(INDENT_WIDTH, y, STR_MODE); lcdDrawText(INDENT_WIDTH, y, STR_MODE);
@ -937,7 +937,7 @@ void menuModelSetup(event_t event)
break; break;
#endif #endif
#if defined(INTERNAL_MODULE_MULTI) #if defined(INTERNAL_MODULE_MULTI) || defined(INTERNAL_MODULE_ELRS)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE: case ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE:
#endif #endif
#if defined(HARDWARE_EXTERNAL_MODULE) #if defined(HARDWARE_EXTERNAL_MODULE)
@ -970,8 +970,7 @@ void menuModelSetup(event_t event)
case 0: case 0:
#if defined(HARDWARE_INTERNAL_MODULE) #if defined(HARDWARE_INTERNAL_MODULE)
if (moduleIdx == INTERNAL_MODULE) { if (moduleIdx == INTERNAL_MODULE) {
uint8_t moduleType = checkIncDec(event, g_model.moduleData[moduleIdx].type, MODULE_TYPE_NONE, MODULE_TYPE_MAX, EE_MODEL, uint8_t moduleType = checkIncDec(event, g_model.moduleData[moduleIdx].type, MODULE_TYPE_NONE, MODULE_TYPE_MAX, EE_MODEL, isInternalModuleAvailable);
isInternalModuleAvailable);
if (checkIncDec_Ret) { if (checkIncDec_Ret) {
setModuleType(moduleIdx, moduleType); setModuleType(moduleIdx, moduleType);
} }

View file

@ -311,9 +311,13 @@ void menuStatisticsDebug2(event_t event)
uint8_t y = FH + 1; uint8_t y = FH + 1;
lcdDrawTextAlignedLeft(y, "Tlm RX Err"); lcdDrawTextAlignedLeft(y, "Tlm RX Err");
lcdDrawNumber(MENU_DEBUG_COL1_OFS, y, telemetryErrors, RIGHT); lcdDrawNumber(MENU_DEBUG_COL1_OFS, y, telemetryErrors);
y += FH; y += FH;
#if defined(DEBUG)
lcdDrawTextAlignedLeft(y, "SD Card");
lcdDrawText(MENU_DEBUG_COL1_OFS, y, SD_CARD_PRESENT() ? "Inserted" : "Not inserted");
y += FH;
#endif
#if defined(BLUETOOTH) #if defined(BLUETOOTH)
lcdDrawTextAlignedLeft(y, "BT status"); lcdDrawTextAlignedLeft(y, "BT status");
lcdDrawNumber(MENU_DEBUG_COL1_OFS, y, IS_BLUETOOTH_CHIP_PRESENT(), RIGHT); lcdDrawNumber(MENU_DEBUG_COL1_OFS, y, IS_BLUETOOTH_CHIP_PRESENT(), RIGHT);

View file

@ -126,7 +126,7 @@ void onHardwareAntennaSwitchConfirm(const char * result)
#define EXTERNAL_ANTENNA_ROW #define EXTERNAL_ANTENNA_ROW
#endif #endif
#if (defined(CROSSFIRE) || defined(GHOST)) && (SPORT_MAX_BAUDRATE < 400000 || defined(DEBUG)) #if defined(CROSSFIRE) || defined(GHOST)
#define MAX_BAUDRATE_ROW 0 #define MAX_BAUDRATE_ROW 0
#else #else
#define MAX_BAUDRATE_ROW HIDDEN_ROW #define MAX_BAUDRATE_ROW HIDDEN_ROW
@ -299,7 +299,7 @@ bool menuRadioHardware(event_t event)
case ITEM_RADIO_HARDWARE_SERIAL_BAUDRATE: case ITEM_RADIO_HARDWARE_SERIAL_BAUDRATE:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MAXBAUDRATE); lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MAXBAUDRATE);
lcdDrawNumber(HW_SETTINGS_COLUMN2, y, CROSSFIRE_BAUDRATES[g_eeGeneral.telemetryBaudrate], attr|LEFT); displayTelemetryBaudrate(HW_SETTINGS_COLUMN2, y, g_eeGeneral.telemetryBaudrate, attr|LEFT);
if (attr) { if (attr) {
g_eeGeneral.telemetryBaudrate = DIM(CROSSFIRE_BAUDRATES) - 1 - checkIncDecModel(event, DIM(CROSSFIRE_BAUDRATES) - 1 - g_eeGeneral.telemetryBaudrate, 0, DIM(CROSSFIRE_BAUDRATES) - 1); g_eeGeneral.telemetryBaudrate = DIM(CROSSFIRE_BAUDRATES) - 1 - checkIncDecModel(event, DIM(CROSSFIRE_BAUDRATES) - 1 - g_eeGeneral.telemetryBaudrate, 0, DIM(CROSSFIRE_BAUDRATES) - 1);
if (checkIncDec_Ret && IS_EXTERNAL_MODULE_ON()) { if (checkIncDec_Ret && IS_EXTERNAL_MODULE_ON()) {

View file

@ -164,7 +164,7 @@ enum {
ITEM_RADIO_HARDWARE_CAPACITY_CALIB, ITEM_RADIO_HARDWARE_CAPACITY_CALIB,
#endif #endif
#if (defined(CROSSFIRE) || defined(GHOST)) && SPORT_MAX_BAUDRATE < 400000 #if defined(CROSSFIRE) || defined(GHOST)
ITEM_RADIO_HARDWARE_SERIAL_BAUDRATE, ITEM_RADIO_HARDWARE_SERIAL_BAUDRATE,
#endif #endif
@ -274,6 +274,8 @@ enum {
#define SWITCH_TYPE_MAX(sw) (SWITCH_3POS) #define SWITCH_TYPE_MAX(sw) (SWITCH_3POS)
#elif defined(PCBX9E) #elif defined(PCBX9E)
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS) #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) #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) #define SWITCH_TYPE_MAX(sw) ((MIXSRC_SA - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SD - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS)
#else #else
@ -292,7 +294,7 @@ enum {
#define TX_CAPACITY_MEASUREMENT_ROWS #define TX_CAPACITY_MEASUREMENT_ROWS
#endif #endif
#if (defined(CROSSFIRE) || defined(GHOST)) && (SPORT_MAX_BAUDRATE < 400000 || defined(DEBUG)) #if defined(CROSSFIRE) || defined(GHOST)
#define MAX_BAUD_ROWS 0, #define MAX_BAUD_ROWS 0,
#else #else
#define MAX_BAUD_ROWS #define MAX_BAUD_ROWS
@ -575,10 +577,10 @@ void menuRadioHardware(event_t event)
break; break;
#endif #endif
#if (defined(CROSSFIRE) || defined(GHOST)) && SPORT_MAX_BAUDRATE < 400000 #if defined(CROSSFIRE) || defined(GHOST)
case ITEM_RADIO_HARDWARE_SERIAL_BAUDRATE: case ITEM_RADIO_HARDWARE_SERIAL_BAUDRATE:
lcdDrawTextAlignedLeft(y, STR_MAXBAUDRATE); lcdDrawTextAlignedLeft(y, STR_MAXBAUDRATE);
lcdDrawNumber(HW_SETTINGS_COLUMN2, y, CROSSFIRE_BAUDRATES[g_eeGeneral.telemetryBaudrate], attr|LEFT); displayTelemetryBaudrate(HW_SETTINGS_COLUMN2, y, g_eeGeneral.telemetryBaudrate, attr|LEFT);
if (attr) { if (attr) {
g_eeGeneral.telemetryBaudrate = DIM(CROSSFIRE_BAUDRATES) - 1 - checkIncDecModel(event, DIM(CROSSFIRE_BAUDRATES) - 1 - g_eeGeneral.telemetryBaudrate, 0, DIM(CROSSFIRE_BAUDRATES) - 1); g_eeGeneral.telemetryBaudrate = DIM(CROSSFIRE_BAUDRATES) - 1 - checkIncDecModel(event, DIM(CROSSFIRE_BAUDRATES) - 1 - g_eeGeneral.telemetryBaudrate, 0, DIM(CROSSFIRE_BAUDRATES) - 1);
if (checkIncDec_Ret && IS_EXTERNAL_MODULE_ON()) { if (checkIncDec_Ret && IS_EXTERNAL_MODULE_ON()) {

View file

@ -604,13 +604,18 @@ bool isInternalModuleAvailable(int moduleType)
if (moduleType == MODULE_TYPE_NONE) if (moduleType == MODULE_TYPE_NONE)
return true; return true;
#if defined(INTERNAL_MODULE_CRSF) #if defined(INTERNAL_MODULE_CRSF) || defined(INTERNAL_MODULE_ELRS)
if (moduleType == MODULE_TYPE_CROSSFIRE) { if (moduleType == MODULE_TYPE_CROSSFIRE) {
if (g_model.moduleData[EXTERNAL_MODULE].type != MODULE_TYPE_CROSSFIRE) if (g_model.moduleData[EXTERNAL_MODULE].type != MODULE_TYPE_CROSSFIRE)
return true; return true;
} }
#endif #endif
#if defined(INTERNAL_MODULE_ELRS)
if (moduleType == MODULE_TYPE_CROSSFIRE)
return true;
#endif
#if defined(INTERNAL_MODULE_MULTI) #if defined(INTERNAL_MODULE_MULTI)
if (moduleType == MODULE_TYPE_MULTIMODULE) if (moduleType == MODULE_TYPE_MULTIMODULE)
return true; return true;
@ -1144,3 +1149,15 @@ const char * getMultiOptionTitle(uint8_t moduleIdx)
} }
} }
#endif #endif
void displayTelemetryBaudrate(coord_t x, coord_t y, uint8_t baudrate, LcdFlags flags) {
if (CROSSFIRE_BAUDRATES[baudrate] >= 1000000) {
lcdDrawNumber(x, y, CROSSFIRE_BAUDRATES[baudrate] / 10000, flags | PREC2);
lcdDrawText(lcdNextPos, y, "MBps", flags);
}
else {
lcdDrawNumber(x, y, CROSSFIRE_BAUDRATES[baudrate] / 1000, flags);
lcdDrawText(lcdNextPos, y, "KBps", flags);
}
}

View file

@ -360,6 +360,7 @@ inline uint8_t MODULE_OPTION_ROW(uint8_t moduleIdx) {
void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags); void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags);
const char * getMultiOptionTitle(uint8_t moduleIdx); const char * getMultiOptionTitle(uint8_t moduleIdx);
void displayTelemetryBaudrate(coord_t x, coord_t y, uint8_t baudrate, LcdFlags flags);
const char * writeScreenshot(); const char * writeScreenshot();

View file

@ -33,6 +33,7 @@ if(PYTHONINTERP_FOUND)
add_lua_export_target(t12 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_T12) 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(tlite ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_TLITE)
add_lua_export_target(tx12 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_TX12) 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(t8 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_T8)
add_lua_export_target(t16 ${LUA_INCLUDES} -DPCBHORUS -DPCBX10 -DRADIO_T16) add_lua_export_target(t16 ${LUA_INCLUDES} -DPCBHORUS -DPCBX10 -DRADIO_T16)
endif() endif()

View file

@ -44,6 +44,8 @@
#include "lua/lua_exports_tlite.inc" #include "lua/lua_exports_tlite.inc"
#elif defined(RADIO_TX12) #elif defined(RADIO_TX12)
#include "lua/lua_exports_tx12.inc" #include "lua/lua_exports_tx12.inc"
#elif defined(RADIO_ZORRO)
#include "lua/lua_exports_zorro.inc"
#elif defined(RADIO_T8) #elif defined(RADIO_T8)
#include "lua/lua_exports_t8.inc" #include "lua/lua_exports_t8.inc"
#elif defined(RADIO_TANGO) #elif defined(RADIO_TANGO)
@ -2012,7 +2014,7 @@ const luaR_value_entry opentxConstants[] = {
{ "EVT_VIRTUAL_ENTER_LONG", EVT_KEY_LONG(KEY_ENTER) }, { "EVT_VIRTUAL_ENTER_LONG", EVT_KEY_LONG(KEY_ENTER) },
{ "EVT_VIRTUAL_EXIT", EVT_KEY_BREAK(KEY_EXIT) }, { "EVT_VIRTUAL_EXIT", EVT_KEY_BREAK(KEY_EXIT) },
#elif defined(NAVIGATION_X7) || defined(NAVIGATION_X9D) #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_PREV_PAGE", EVT_KEY_BREAK(KEY_PAGEUP) },
{ "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_BREAK(KEY_PAGEDN) }, { "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_BREAK(KEY_PAGEDN) },
{ "EVT_VIRTUAL_MENU", EVT_KEY_BREAK(KEY_MODEL) }, { "EVT_VIRTUAL_MENU", EVT_KEY_BREAK(KEY_MODEL) },

View file

@ -460,7 +460,7 @@ static void enablePulsesInternalModule(uint8_t protocol)
// start new protocol hardware here // start new protocol hardware here
switch (protocol) { switch (protocol) {
#if defined(INTERNAL_MODULE_CRSF) #if defined(INTERNAL_MODULE_CRSF) || defined(INTERNAL_MODULE_ELRS)
case PROTOCOL_CHANNELS_CROSSFIRE: case PROTOCOL_CHANNELS_CROSSFIRE:
break; break;
#elif defined(PXX1) && !defined(INTMODULE_USART) #elif defined(PXX1) && !defined(INTMODULE_USART)
@ -571,7 +571,7 @@ bool setupPulsesInternalModule(uint8_t protocol)
return true; return true;
#endif #endif
#if defined(INTERNAL_MODULE_CRSF) #if defined(INTERNAL_MODULE_CRSF) || defined(INTERNAL_MODULE_ELRS)
case PROTOCOL_CHANNELS_CROSSFIRE: case PROTOCOL_CHANNELS_CROSSFIRE:
mixerSchedulerSetPeriod(INTERNAL_MODULE, CROSSFIRE_PERIOD); mixerSchedulerSetPeriod(INTERNAL_MODULE, CROSSFIRE_PERIOD);
return true; return true;

View file

@ -151,6 +151,8 @@ const char * getBasename(const char * path);
#define OTX_FOURCC 0x4278746F // otx for Jumper TLite #define OTX_FOURCC 0x4278746F // otx for Jumper TLite
#elif defined(RADIO_TX12) #elif defined(RADIO_TX12)
#define OTX_FOURCC 0x4178746F // otx for Radiomaster 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) #elif defined(RADIO_T8)
#define OTX_FOURCC 0x4378746F // otx for Radiomaster T8 #define OTX_FOURCC 0x4378746F // otx for Radiomaster T8
#elif defined(PCBX7) #elif defined(PCBX7)

View file

@ -265,7 +265,7 @@ void OpenTxSim::updateKeysAndSwitches(bool start)
KEY_Left, KEY_LEFT, KEY_Left, KEY_LEFT,
KEY_Up, KEY_UP, KEY_Up, KEY_UP,
KEY_Down, KEY_DOWN, KEY_Down, KEY_DOWN,
#elif defined(RADIO_TX12) #elif defined(RADIO_TX12) || defined(RADIO_ZORRO)
KEY_Page_Up, KEY_PAGEUP, KEY_Page_Up, KEY_PAGEUP,
KEY_Page_Down, KEY_PAGEDN, KEY_Page_Down, KEY_PAGEDN,
KEY_Return, KEY_ENTER, KEY_Return, KEY_ENTER,

View file

@ -18,6 +18,10 @@ if(PCB STREQUAL TANGO OR PCB STREQUAL MAMBO)
set(EEPROM_CONVERSIONS 219) set(EEPROM_CONVERSIONS 219)
endif() endif()
if(PCB STREQUAL X7 AND PCBREV STREQUAL ZORRO)
set(EEPROM_CONVERSIONS 219)
endif()
if(EEPROM_CONVERSIONS) if(EEPROM_CONVERSIONS)
add_definitions(-DEEPROM_CONVERSIONS=${EEPROM_CONVERSIONS}) add_definitions(-DEEPROM_CONVERSIONS=${EEPROM_CONVERSIONS})
set(SRC set(SRC

View file

@ -290,7 +290,7 @@ char * getSwitchName(char * dest, swsrc_t idx)
} }
else { else {
*dest++ = 'S'; *dest++ = 'S';
#if defined(PCBX7) && !defined(RADIO_TX12) && !defined(RADIO_FAMILY_TBS) #if defined(PCBX7) && !defined(RADIO_TX12) && !defined(RADIO_ZORRO) && !defined(RADIO_FAMILY_TBS)
if (swinfo.quot >= 5) if (swinfo.quot >= 5)
*dest++ = 'H' + swinfo.quot - 5; *dest++ = 'H' + swinfo.quot - 5;
else if (swinfo.quot == 4) else if (swinfo.quot == 4)

View file

@ -141,7 +141,7 @@ void getSwitchesPosition(bool startup)
CHECK_2POS(SW_SE); CHECK_2POS(SW_SE);
CHECK_2POS(SW_SF); CHECK_2POS(SW_SF);
#else #else
#if defined(RADIO_TX12) #if defined(RADIO_TX12) || defined(RADIO_ZORRO)
CHECK_2POS(SW_SA); CHECK_2POS(SW_SA);
CHECK_3POS(0, SW_SB); CHECK_3POS(0, SW_SB);
CHECK_3POS(1, SW_SC); CHECK_3POS(1, SW_SC);
@ -167,6 +167,12 @@ void getSwitchesPosition(bool startup)
#elif defined(PCBXLITE) #elif defined(PCBXLITE)
CHECK_3POS(3, SW_SD); CHECK_3POS(3, SW_SD);
// no SWE, SWF, SWG and SWH on XLITE // 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) #elif defined(RADIO_TX12)
CHECK_2POS(SW_SD); CHECK_2POS(SW_SD);
CHECK_3POS(2, SW_SE); CHECK_3POS(2, SW_SE);
@ -189,7 +195,7 @@ void getSwitchesPosition(bool startup)
#if defined(PCBX7ACCESS) #if defined(PCBX7ACCESS)
CHECK_2POS(SW_SI); CHECK_2POS(SW_SI);
#elif defined(PCBHORUS) || defined(PCBX7) #elif defined(PCBHORUS) || (defined(PCBX7) && !defined(RADIO_ZORRO))
CHECK_2POS(SW_SI); CHECK_2POS(SW_SI);
CHECK_2POS(SW_SJ); CHECK_2POS(SW_SJ);
#endif #endif

View file

@ -46,6 +46,8 @@
const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,0, 1,1, 1, 1}; const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,0, 1,1, 1, 1};
#elif defined(RADIO_TX12) #elif defined(RADIO_TX12)
const int8_t adcDirection[NUM_ANALOGS] = {-1,1,-1,1, -1,-1, 1, 1}; 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(RADIO_TANGO) #elif defined(RADIO_TANGO)
const int8_t adcDirection[NUM_ANALOGS] = {1,1,1,1, 1,1}; const int8_t adcDirection[NUM_ANALOGS] = {1,1,1,1, 1,1};
#elif defined(RADIO_MAMBO) #elif defined(RADIO_MAMBO)

View file

@ -177,6 +177,11 @@ if(INTERNAL_MODULE_MULTI)
add_definitions(-DTRAINER_SPORT_SBUS) add_definitions(-DTRAINER_SPORT_SBUS)
endif() endif()
if(INTERNAL_MODULE_ELRS)
add_definitions(-DHARDWARE_INTERNAL_MODULE)
add_definitions(-DINTERNAL_MODULE_ELRS)
endif()
if(EXTERNAL_MODULE) if(EXTERNAL_MODULE)
add_definitions(-DHARDWARE_EXTERNAL_MODULE) add_definitions(-DHARDWARE_EXTERNAL_MODULE)
endif() endif()

View file

@ -66,11 +66,15 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Speed = baudrate <= 400000 ? GPIO_Speed_2MHz : GPIO_Speed_25MHz;
GPIO_Init(TELEMETRY_GPIO, &GPIO_InitStructure); GPIO_Init(TELEMETRY_GPIO, &GPIO_InitStructure);
telemetryInitDirPin(); telemetryInitDirPin();
USART_DeInit(TELEMETRY_USART);
USART_OverSampling8Cmd(TELEMETRY_USART, baudrate <= 400000 ? DISABLE : ENABLE);
USART_InitStructure.USART_BaudRate = baudrate; USART_InitStructure.USART_BaudRate = baudrate;
if (baudrate == SBUS_BAUDRATE) { if (baudrate == SBUS_BAUDRATE) {
USART_InitStructure.USART_WordLength = USART_WordLength_9b; USART_InitStructure.USART_WordLength = USART_WordLength_9b;

View file

@ -163,6 +163,27 @@ elseif(PCB STREQUAL X7)
add_definitions(-DRADIO_TX12) add_definitions(-DRADIO_TX12)
add_definitions(-DEEPROM_VARIANT=0x4002) add_definitions(-DEEPROM_VARIANT=0x4002)
add_definitions(-DMANUFACTURER_RADIOMASTER) add_definitions(-DMANUFACTURER_RADIOMASTER)
elseif(PCBREV STREQUAL ZORRO)
option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" ON)
option(INTERNAL_MODULE_ELRS "Support for ELRS internal module" OFF)
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) elseif(PCBREV STREQUAL T8)
option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" ON) option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" ON)
set(EXTERNAL_MODULE NO) set(EXTERNAL_MODULE NO)
@ -485,6 +506,16 @@ if(INTERNAL_MODULE_PXX2)
add_definitions(-DINTERNAL_MODULE_PXX2) add_definitions(-DINTERNAL_MODULE_PXX2)
endif() endif()
if(INTERNAL_MODULE_ELRS)
add_definitions(-DHARDWARE_INTERNAL_MODULE)
add_definitions(-DINTERNAL_MODULE_ELRS)
set(INTERNAL_MODULE_MULTI NO)
set(TARGET_SRC
${TARGET_SRC}
../common/arm/stm32/intmodule_serial_driver.cpp
)
endif()
if(INTERNAL_MODULE_MULTI) if(INTERNAL_MODULE_MULTI)
add_definitions(-DHARDWARE_INTERNAL_MODULE) add_definitions(-DHARDWARE_INTERNAL_MODULE)
add_definitions(-DINTERNAL_MODULE_MULTI) add_definitions(-DINTERNAL_MODULE_MULTI)
@ -499,6 +530,11 @@ if(INTERNAL_MODULE_PPM)
add_definitions(-DINTERNAL_MODULE_PPM) add_definitions(-DINTERNAL_MODULE_PPM)
endif() endif()
if(INTERNAL_MODULE_ELRS)
add_definitions(-DHARDWARE_INTERNAL_MODULE)
add_definitions(-DINTERNAL_MODULE_ELRS)
endif()
if(EXTERNAL_MODULE) if(EXTERNAL_MODULE)
set(TARGET_SRC set(TARGET_SRC
${TARGET_SRC} ${TARGET_SRC}

View file

@ -27,7 +27,7 @@
#include "board_common.h" #include "board_common.h"
#include "hal.h" #include "hal.h"
#if defined(RADIO_TX12) || defined(RADIO_TX12) #if defined(RADIO_TX12) || defined(RADIO_ZORRO)
#define NAVIGATION_X7_TX12 #define NAVIGATION_X7_TX12
#endif #endif
@ -37,6 +37,10 @@ void rotaryEncoderInit();
void rotaryEncoderCheck(); void rotaryEncoderCheck();
#endif #endif
#if defined(RADIO_ZORRO)
#define ROTARY_ENCODER_INVERT
#endif
#define FLASHSIZE 0x80000 #define FLASHSIZE 0x80000
#define BOOTLOADER_SIZE 0x8000 #define BOOTLOADER_SIZE 0x8000
#define FIRMWARE_ADDRESS 0x08000000 #define FIRMWARE_ADDRESS 0x08000000
@ -337,6 +341,8 @@ enum EnumSwitches
}; };
#if defined(RADIO_TX12) #if defined(RADIO_TX12)
#define IS_3POS(x) ((x) != SW_SA && (x) != SW_SD) #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 #else
#define IS_3POS(x) ((x) != SW_SF && (x) != SW_SH) #define IS_3POS(x) ((x) != SW_SF && (x) != SW_SH)
#endif #endif
@ -354,22 +360,22 @@ enum EnumSwitchesPositions
SW_SD0, SW_SD0,
SW_SD1, SW_SD1,
SW_SD2, 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_SE0,
SW_SE1, SW_SE1,
SW_SE2, SW_SE2,
#endif #endif
#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBX7) || defined(PCBXLITES) || defined(PCBX9LITES) || defined(RADIO_T8) #if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBX7) || defined(PCBXLITES) || defined(PCBX9LITES) || defined(RADIO_T8) || defined(RADIO_ZORRO)
SW_SF0, SW_SF0,
SW_SF1, SW_SF1,
SW_SF2, SW_SF2,
#endif #endif
#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBX9LITES) #if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBX9LITES) || defined(RADIO_ZORRO)
SW_SG0, SW_SG0,
SW_SG1, SW_SG1,
SW_SG2, SW_SG2,
#endif #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_SH0,
SW_SH1, SW_SH1,
SW_SH2, SW_SH2,
@ -383,7 +389,7 @@ enum EnumSwitchesPositions
SW_SI0, SW_SI0,
SW_SI1, SW_SI1,
SW_SI2, SW_SI2,
#elif defined(PCBX7) #elif defined(PCBX7) && !defined(RADIO_ZORRO)
SW_SI0, SW_SI0,
SW_SI1, SW_SI1,
SW_SI2, SW_SI2,
@ -451,6 +457,11 @@ enum EnumSwitchesPositions
#define STORAGE_NUM_SWITCHES NUM_SWITCHES #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_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); #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) #elif defined(RADIO_T8)
#define NUM_SWITCHES 4 #define NUM_SWITCHES 4
#define STORAGE_NUM_SWITCHES 8 #define STORAGE_NUM_SWITCHES 8
@ -500,7 +511,11 @@ enum EnumSwitchesPositions
void keysInit(); void keysInit();
uint32_t switchState(uint8_t index); 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}; static const uint8_t switchReOrder[] = {0, 1, 2, 3, 4, 5};
#endif
uint32_t readKeys(); uint32_t readKeys();
uint32_t readTrims(); uint32_t readTrims();
#define TRIMS_PRESSED() (readTrims()) #define TRIMS_PRESSED() (readTrims())
@ -737,6 +752,10 @@ uint8_t isBacklightEnabled();
#define USB_NAME "Radiomaster TX12" #define USB_NAME "Radiomaster TX12"
#define USB_MANUFACTURER 'R', 'M', '_', 'T', 'X', ' ', ' ', ' ' /* 8 bytes */ #define USB_MANUFACTURER 'R', 'M', '_', 'T', 'X', ' ', ' ', ' ' /* 8 bytes */
#define USB_PRODUCT 'R', 'M', ' ', 'T', 'X', '1', '2', ' ' /* 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) #elif defined(RADIO_T8)
#define USB_NAME "Radiomaster T8" #define USB_NAME "Radiomaster T8"
#define USB_MANUFACTURER 'R', 'M', '_', 'T', 'X', ' ', ' ', ' ' /* 8 bytes */ #define USB_MANUFACTURER 'R', 'M', '_', 'T', 'X', ' ', ' ', ' ' /* 8 bytes */

View file

@ -59,13 +59,18 @@
#define KEYS_GPIO_PIN_LEFT GPIO_Pin_7 // PD.07 #define KEYS_GPIO_PIN_LEFT GPIO_Pin_7 // PD.07
#define KEYS_GPIO_REG_RIGHT GPIOD->IDR #define KEYS_GPIO_REG_RIGHT GPIOD->IDR
#define KEYS_GPIO_PIN_RIGHT GPIO_Pin_3 // PD.03 #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_REG_PAGEUP GPIOD->IDR
#define KEYS_GPIO_PIN_PAGEUP GPIO_Pin_3 // PD.03 #define KEYS_GPIO_PIN_PAGEUP GPIO_Pin_3 // PD.03
#define KEYS_GPIO_REG_PAGEDN GPIOD->IDR #define KEYS_GPIO_REG_PAGEDN GPIOD->IDR
#define KEYS_GPIO_PIN_PAGEDN GPIO_Pin_7 // PD.07 #define KEYS_GPIO_PIN_PAGEDN GPIO_Pin_7 // PD.07
#if defined(RADIO_TX12)
#define KEYS_GPIO_REG_EXIT GPIOB->IDR #define KEYS_GPIO_REG_EXIT GPIOB->IDR
#define KEYS_GPIO_PIN_EXIT GPIO_Pin_3 // PB.03 #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_REG_ENTER GPIOA->IDR
#define KEYS_GPIO_PIN_ENTER GPIO_Pin_13 // PA.13 #define KEYS_GPIO_PIN_ENTER GPIO_Pin_13 // PA.13
#define KEYS_GPIO_REG_SYS GPIOB->IDR #define KEYS_GPIO_REG_SYS GPIOB->IDR
@ -190,7 +195,7 @@
#define ROTARY_ENCODER_EXTI_PortSource EXTI_PortSourceGPIOE #define ROTARY_ENCODER_EXTI_PortSource EXTI_PortSourceGPIOE
#define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource10 #define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource10
#define ROTARY_ENCODER_EXTI_PinSource2 EXTI_PinSource12 #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_NAVIGATION
#define ROTARY_ENCODER_GPIO GPIOE #define ROTARY_ENCODER_GPIO GPIOE
#define ROTARY_ENCODER_GPIO_PIN_A GPIO_Pin_9 // PE.9 #define ROTARY_ENCODER_GPIO_PIN_A GPIO_Pin_9 // PE.9
@ -346,7 +351,7 @@
#define SWITCHES_GPIO_PIN_A_H GPIO_Pin_1 // PE.01 #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_1 // PE.01
#define SWITCHES_GPIO_REG_A_L GPIOE->IDR #define SWITCHES_GPIO_REG_A_L GPIOE->IDR
#define SWITCHES_GPIO_PIN_A_L GPIO_Pin_0 // PE.00 #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 STORAGE_SWITCH_A
#define HARDWARE_SWITCH_A #define HARDWARE_SWITCH_A
#define SWITCHES_GPIO_REG_A GPIOC->IDR #define SWITCHES_GPIO_REG_A GPIOC->IDR
@ -444,6 +449,13 @@
#define SWITCHES_GPIO_PIN_C_L GPIO_Pin_11 // PD.11 #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_11 // PD.11
#define SWITCHES_GPIO_REG_C_H GPIOE->IDR #define SWITCHES_GPIO_REG_C_H GPIOE->IDR
#define SWITCHES_GPIO_PIN_C_H GPIO_Pin_0 // PE.00 #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) #elif defined(RADIO_T8)
#define STORAGE_SWITCH_C #define STORAGE_SWITCH_C
#define HARDWARE_SWITCH_C #define HARDWARE_SWITCH_C
@ -503,7 +515,7 @@
#define HARDWARE_SWITCH_D #define HARDWARE_SWITCH_D
#define SWITCHES_GPIO_REG_D GPIOD->IDR #define SWITCHES_GPIO_REG_D GPIOD->IDR
#define SWITCHES_GPIO_PIN_D GPIO_Pin_14 // PD.14 #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 STORAGE_SWITCH_D
#define HARDWARE_SWITCH_D #define HARDWARE_SWITCH_D
#define SWITCHES_GPIO_REG_D GPIOE->IDR #define SWITCHES_GPIO_REG_D GPIOE->IDR
@ -554,6 +566,11 @@
#define HARDWARE_SWITCH_E #define HARDWARE_SWITCH_E
#define SWITCHES_GPIO_REG_E GPIOA->IDR #define SWITCHES_GPIO_REG_E GPIOA->IDR
#define SWITCHES_GPIO_PIN_E GPIO_Pin_5 // PA.05 #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) #elif defined(RADIO_TX12)
#define STORAGE_SWITCH_E #define STORAGE_SWITCH_E
#define HARDWARE_SWITCH_E #define HARDWARE_SWITCH_E
@ -592,6 +609,11 @@
#define SWITCHES_GPIO_PIN_F GPIO_Pin_3 // PC.03 #define SWITCHES_GPIO_PIN_F GPIO_Pin_3 // PC.03
#elif defined(PCBX9LITE) #elif defined(PCBX9LITE)
// no SWF // 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) #elif defined(RADIO_TX12)
#define STORAGE_SWITCH_F #define STORAGE_SWITCH_F
#define HARDWARE_SWITCH_F #define HARDWARE_SWITCH_F
@ -626,6 +648,11 @@
#define HARDWARE_SWITCH_G #define HARDWARE_SWITCH_G
#define SWITCHES_GPIO_REG_G GPIOC->IDR #define SWITCHES_GPIO_REG_G GPIOC->IDR
#define SWITCHES_GPIO_PIN_G GPIO_Pin_2 // PC.02 #define SWITCHES_GPIO_PIN_G GPIO_Pin_2 // PC.02
#elif defined(RADIO_ZORRO)
#define STORAGE_SWITCH_G
#define HARDWARE_SWITCH_G
#define SWITCHES_GPIO_REG_G GPIOE->IDR
#define SWITCHES_GPIO_PIN_G GPIO_Pin_14 // PE.14
#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_T8) #elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_T8)
// no SWG // no SWG
#else #else
@ -702,6 +729,8 @@
#define STORAGE_SWITCH_I #define STORAGE_SWITCH_I
// no SWJ // no SWJ
#define STORAGE_SWITCH_J #define STORAGE_SWITCH_J
#elif defined(RADIO_ZORRO)
// No I/J
#elif defined(PCBX7) #elif defined(PCBX7)
#define STORAGE_SWITCH_I #define STORAGE_SWITCH_I
#define HARDWARE_SWITCH_I #define HARDWARE_SWITCH_I
@ -817,6 +846,13 @@
#define KEYS_GPIOC_PINS (GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3) #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_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) #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) #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_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) #define KEYS_GPIOA_PINS (GPIO_Pin_13 | GPIO_Pin_5)
@ -1166,6 +1202,16 @@
#define LED_BLUE_GPIO_PIN GPIO_Pin_5 // PC.05 #define LED_BLUE_GPIO_PIN GPIO_Pin_5 // PC.05
#define LED_GREEN_GPIO GPIOB #define LED_GREEN_GPIO GPIOB
#define LED_GREEN_GPIO_PIN GPIO_Pin_1 // PB.01 #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) #elif defined(PCBX7)
#define STATUS_LEDS #define STATUS_LEDS
#define GPIO_LED_GPIO_ON GPIO_SetBits #define GPIO_LED_GPIO_ON GPIO_SetBits
@ -1271,6 +1317,26 @@
#define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream7_IRQHandler #define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream7_IRQHandler
#define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF7 #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF7
#define INTMODULE_DMA_CHANNEL DMA_Channel_4 #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) #elif defined(PCBX9E) || defined(PCBX9DP) || defined(RADIO_X7)
#define INTMODULE_PULSES #define INTMODULE_PULSES
#define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2)
@ -1291,7 +1357,7 @@
#define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream5_IRQHandler #define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream5_IRQHandler
#define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF5 #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF5
#define INTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) #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_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1)
#define INTMODULE_RCC_APB1Periph (RCC_APB1Periph_USART3 | RCC_APB1Periph_TIM2) #define INTMODULE_RCC_APB1Periph (RCC_APB1Periph_USART3 | RCC_APB1Periph_TIM2)
#define INTMODULE_RCC_APB2Periph 0 #define INTMODULE_RCC_APB2Periph 0
@ -1335,9 +1401,9 @@
#endif #endif
// External Module // 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) #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_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
#define EXTMODULE_PWR_GPIO GPIOD #define EXTMODULE_PWR_GPIO GPIOD
#define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08 #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08
@ -1486,7 +1552,7 @@
#endif #endif
// Serial Port // 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_AHB1Periph 0
#define AUX_SERIAL_RCC_APB1Periph 0 #define AUX_SERIAL_RCC_APB1Periph 0
#define AUX_SERIAL_RCC_APB2Periph 0 #define AUX_SERIAL_RCC_APB2Periph 0
@ -1546,7 +1612,7 @@
#define TELEMETRY_EXTI_IRQn EXTI9_5_IRQn #define TELEMETRY_EXTI_IRQn EXTI9_5_IRQn
#define TELEMETRY_EXTI_TRIGGER EXTI_Trigger_Rising #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 #define TELEMETRY_EXTI_REUSE_INTERRUPT_ROTARY_ENCODER
#elif defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019) #elif defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019)
#define TELEMETRY_EXTI_IRQHandler EXTI9_5_IRQHandler #define TELEMETRY_EXTI_IRQHandler EXTI9_5_IRQHandler
@ -1657,6 +1723,16 @@
#define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource7 #define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource7
#define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line7 #define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line7
#define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI9_5_IRQn #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) #elif defined(RADIO_X7) || defined(RADIO_TX12)
#define INTMODULE_HEARTBEAT #define INTMODULE_HEARTBEAT
#define INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER #define INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER
@ -1667,16 +1743,6 @@
#define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource7 #define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource7
#define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line7 #define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line7
#define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI9_5_IRQn #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 #else
#define INTMODULE_HEARTBEAT #define INTMODULE_HEARTBEAT
#define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOC #define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOC
@ -1850,7 +1916,7 @@
#define KEYS_BACKLIGHT_RCC_AHB1Periph 0 #define KEYS_BACKLIGHT_RCC_AHB1Periph 0
// LCD driver // 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 #define LCD_VERTICAL_INVERT
#endif #endif
#if defined(PCBX9E) #if defined(PCBX9E)
@ -1952,6 +2018,15 @@
#define I2C_WP_GPIO_PIN GPIO_Pin_5 // PB.05 #define I2C_WP_GPIO_PIN GPIO_Pin_5 // PB.05
#define I2C_SDA_GPIO_PinSource GPIO_PinSource9 #define I2C_SDA_GPIO_PinSource GPIO_PinSource9
#define I2C_SCL_GPIO_PinSource GPIO_PinSource8 #define I2C_SCL_GPIO_PinSource GPIO_PinSource8
#elif defined(RADIO_ZORRO)
#define I2C_RCC_AHB1Periph RCC_AHB1Periph_GPIOB
#define I2C_SPI_GPIO GPIOB
#define I2C_SDA_GPIO_PIN GPIO_Pin_9 // PB.09
#define I2C_SCL_GPIO_PIN GPIO_Pin_8 // PB.08
#define I2C_WP_GPIO GPIOD
#define I2C_WP_GPIO_PIN GPIO_Pin_10 // PD.10
#define I2C_SDA_GPIO_PinSource GPIO_PinSource9
#define I2C_SCL_GPIO_PinSource GPIO_PinSource8
#elif defined(RADIO_X9DP2019) #elif defined(RADIO_X9DP2019)
#define I2C_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOF) #define I2C_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOF)
#define I2C_SPI_GPIO GPIOB #define I2C_SPI_GPIO GPIOB
@ -2045,7 +2120,7 @@
#define AUDIO_SPEAKER_ENABLE_GPIO_PIN GPIO_Pin_14 // PD.14 #define AUDIO_SPEAKER_ENABLE_GPIO_PIN GPIO_Pin_14 // PD.14
#define HEADPHONE_TRAINER_SWITCH_GPIO GPIOD #define HEADPHONE_TRAINER_SWITCH_GPIO GPIOD
#define HEADPHONE_TRAINER_SWITCH_GPIO_PIN GPIO_Pin_9 // PD.09 #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_RCC_AHB1Periph (RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1)
#define AUDIO_MUTE_GPIO GPIOE #define AUDIO_MUTE_GPIO GPIOE
#define AUDIO_MUTE_GPIO_PIN GPIO_Pin_12 // PE.12 #define AUDIO_MUTE_GPIO_PIN GPIO_Pin_12 // PE.12
@ -2060,7 +2135,7 @@
#endif #endif
// Haptic // Haptic
#if defined(PCBXLITE) || defined(PCBX9LITE) #if defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_ZORRO)
#define HAPTIC_PWM #define HAPTIC_PWM
#define HAPTIC_RCC_AHB1Periph RCC_AHB1Periph_GPIOB #define HAPTIC_RCC_AHB1Periph RCC_AHB1Periph_GPIOB
#define HAPTIC_RCC_APB1Periph RCC_APB1Periph_TIM2 #define HAPTIC_RCC_APB1Periph RCC_APB1Periph_TIM2
@ -2175,7 +2250,7 @@
#define BT_USART_IRQn USART3_IRQn #define BT_USART_IRQn USART3_IRQn
// #define BT_DMA_Stream_RX DMA1_Stream1 // #define BT_DMA_Stream_RX DMA1_Stream1
// #define BT_DMA_Channel_RX DMA_Channel_4 // #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 STORAGE_BLUETOOTH
#define BT_RCC_AHB1Periph 0 #define BT_RCC_AHB1Periph 0
#define BT_RCC_APB1Periph 0 #define BT_RCC_APB1Periph 0

View file

@ -205,7 +205,7 @@ uint32_t switchState(uint8_t index)
switch (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_2POS_CASE(A);
ADD_3POS_CASE(B, 1); ADD_3POS_CASE(B, 1);
ADD_3POS_CASE(C, 2); ADD_3POS_CASE(C, 2);
@ -241,7 +241,13 @@ uint32_t switchState(uint8_t index)
ADD_2POS_CASE(H); ADD_2POS_CASE(H);
ADD_2POS_CASE(I); ADD_2POS_CASE(I);
// no SWJ on XLITE // 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_2POS_CASE(D);
ADD_3POS_CASE(E, 4); ADD_3POS_CASE(E, 4);
ADD_3POS_CASE(F, 5); ADD_3POS_CASE(F, 5);

View file

@ -20,7 +20,7 @@
#include "opentx.h" #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 #define LCD_CONTRAST_OFFSET -10
#else #else
#define LCD_CONTRAST_OFFSET 160 #define LCD_CONTRAST_OFFSET 160

View file

@ -57,12 +57,15 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Speed = baudrate <= 400000 ? GPIO_Speed_2MHz : GPIO_Speed_25MHz;
GPIO_Init(TELEMETRY_GPIO, &GPIO_InitStructure); GPIO_Init(TELEMETRY_GPIO, &GPIO_InitStructure);
telemetryInitDirPin(); telemetryInitDirPin();
USART_DeInit(TELEMETRY_USART); USART_DeInit(TELEMETRY_USART);
USART_OverSampling8Cmd(TELEMETRY_USART, baudrate <= 400000 ? DISABLE : ENABLE);
USART_InitTypeDef USART_InitStructure; USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = baudrate; USART_InitStructure.USART_BaudRate = baudrate;
if (mode & TELEMETRY_SERIAL_8E2) { if (mode & TELEMETRY_SERIAL_8E2) {

View file

@ -20,7 +20,7 @@
#include "opentx.h" #include "opentx.h"
#if defined(INTERNAL_MODULE_CRSF) #if defined(INTERNAL_MODULE_CRSF) || defined(INTERNAL_MODULE_ELRS)
uint8_t intTelemetryRxBuffer[TELEMETRY_RX_PACKET_SIZE]; uint8_t intTelemetryRxBuffer[TELEMETRY_RX_PACKET_SIZE];
uint8_t intTelemetryRxBufferCount; uint8_t intTelemetryRxBufferCount;
#endif #endif
@ -83,7 +83,7 @@ const CrossfireSensor & getCrossfireSensor(uint8_t id, uint8_t subId)
static uint8_t * getRxBuffer(uint8_t moduleIdx) static uint8_t * getRxBuffer(uint8_t moduleIdx)
{ {
#if defined(INTERNAL_MODULE_CRSF) #if defined(INTERNAL_MODULE_CRSF) || defined(INTERNAL_MODULE_ELRS)
if (moduleIdx == INTERNAL_MODULE) if (moduleIdx == INTERNAL_MODULE)
return intTelemetryRxBuffer; return intTelemetryRxBuffer;
#endif #endif
@ -92,7 +92,7 @@ static uint8_t * getRxBuffer(uint8_t moduleIdx)
static uint8_t &getRxBufferCount(uint8_t moduleIdx) static uint8_t &getRxBufferCount(uint8_t moduleIdx)
{ {
#if defined(INTERNAL_MODULE_CRSF) #if defined(INTERNAL_MODULE_CRSF) || defined(INTERNAL_MODULE_ELRS)
if (moduleIdx == INTERNAL_MODULE) if (moduleIdx == INTERNAL_MODULE)
return intTelemetryRxBufferCount; return intTelemetryRxBufferCount;
#endif #endif

View file

@ -104,18 +104,18 @@ uint8_t createCrossfireModelIDFrame(uint8_t * frame);
const uint32_t CROSSFIRE_BAUDRATES[] = { const uint32_t CROSSFIRE_BAUDRATES[] = {
400000, 400000,
115200, 115200,
921600,
1870000,
3750000,
5250000,
}; };
const uint8_t CROSSFIRE_PERIODS[] = { const uint8_t CROSSFIRE_PERIODS[] = {
4, 4,
16, 16,
}; };
#if SPORT_MAX_BAUDRATE < 400000 || defined(DEBUG)
#define CROSSFIRE_BAUDRATE CROSSFIRE_BAUDRATES[g_eeGeneral.telemetryBaudrate] #define CROSSFIRE_BAUDRATE CROSSFIRE_BAUDRATES[g_eeGeneral.telemetryBaudrate]
#define CROSSFIRE_PERIOD (CROSSFIRE_PERIODS[g_eeGeneral.telemetryBaudrate] * 1000) #define CROSSFIRE_PERIOD (CROSSFIRE_PERIODS[g_eeGeneral.telemetryBaudrate] * 1000)
#else
#define CROSSFIRE_BAUDRATE 400000
#define CROSSFIRE_PERIOD 4000 /* us; 250 Hz */
#endif
#define CROSSFIRE_TELEM_MIRROR_BAUDRATE 115200 #define CROSSFIRE_TELEM_MIRROR_BAUDRATE 115200

View file

@ -66,7 +66,7 @@ constexpr uint8_t TELEMETRY_TIMEOUT10ms = 100; // 1 second
#define TELEMETRY_RX_PACKET_SIZE 19 // 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1) #define TELEMETRY_RX_PACKET_SIZE 19 // 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1)
#endif #endif
#if defined(INTERNAL_MODULE_CRSF) #if defined(INTERNAL_MODULE_CRSF) || defined(INTERNAL_MODULE_ELRS)
extern uint8_t intTelemetryRxBuffer[TELEMETRY_RX_PACKET_SIZE]; extern uint8_t intTelemetryRxBuffer[TELEMETRY_RX_PACKET_SIZE];
extern uint8_t intTelemetryRxBufferCount; extern uint8_t intTelemetryRxBufferCount;
#endif #endif

View file

@ -50,6 +50,9 @@
#elif defined(RADIO_FAMILY_JUMPER_T12) #elif defined(RADIO_FAMILY_JUMPER_T12)
#define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0"
#elif defined(RADIO_ZORRO)
#define TR_POTS_VSRCRAW "\310S1\0""\310S2\0"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0"
#elif defined(RADIO_TX12) #elif defined(RADIO_TX12)
#define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #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" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SI\0""\312SJ\0"
@ -102,7 +105,7 @@
#endif #endif
#define LEN_EXTERNAL_MODULE_PROTOCOLS "\014" #define LEN_EXTERNAL_MODULE_PROTOCOLS "\014"
#define TR_EXTERNAL_MODULE_PROTOCOLS "OFF\0 ""PPM\0 ""XJT\0 ""ISRM\0 ""DSM2\0 ""CRSF\0 ""MULTI\0 ""R9M\0 ""R9M ACCESS\0 " TR_MODULE_R9M_LITE "R9ML ACCESS\0""GHST\0 ""R9MLP ACCESS""SBUS\0 ""XJT Lite\0 ""AFHDS3\0 " #define TR_EXTERNAL_MODULE_PROTOCOLS "OFF\0 ""PPM\0 ""XJT\0 ""ISRM\0 ""DSM2\0 ""CRSF/ELRS\0 ""MULTI\0 ""R9M\0 ""R9M ACCESS\0 " TR_MODULE_R9M_LITE "R9ML ACCESS\0""GHST\0 ""R9MLP ACCESS""SBUS\0 ""XJT Lite\0 ""AFHDS3\0 "
#define LEN_INTERNAL_MODULE_PROTOCOLS LEN_EXTERNAL_MODULE_PROTOCOLS #define LEN_INTERNAL_MODULE_PROTOCOLS LEN_EXTERNAL_MODULE_PROTOCOLS
#define TR_INTERNAL_MODULE_PROTOCOLS TR_EXTERNAL_MODULE_PROTOCOLS #define TR_INTERNAL_MODULE_PROTOCOLS TR_EXTERNAL_MODULE_PROTOCOLS

View file

@ -153,6 +153,11 @@ def main():
cmake_options["PCBREV"] = "TX12" cmake_options["PCBREV"] = "TX12"
firmware_options = options_radiomaster_tx12 firmware_options = options_radiomaster_tx12
maxsize = 65536 * 8 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": elif board_name == "t8":
cmake_options["PCB"] = "X7" cmake_options["PCB"] = "X7"
cmake_options["PCBREV"] = "T8" cmake_options["PCBREV"] = "T8"

View file

@ -273,6 +273,19 @@ options_radiomaster_tx12 = {
"afhds3": ("AFHDS3", "YES", "NO") "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 = { options_radiomaster_t8 = {
"noheli": ("HELI", "NO", "YES"), "noheli": ("HELI", "NO", "YES"),
"ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"),

View file

@ -29,6 +29,16 @@ boards = {
"PCBREV": "TX12", "PCBREV": "TX12",
"DEFAULT_MODE": "2", "DEFAULT_MODE": "2",
}, },
"ZORRO_1": {
"PCB": "X7",
"PCBREV": "ZORRO",
"DEFAULT_MODE": "1",
},
"ZORRO_2": {
"PCB": "X7",
"PCBREV": "ZORRO",
"DEFAULT_MODE": "2",
},
"T8_1": { "T8_1": {
"PCB": "X7", "PCB": "X7",
"PCBREV": "T8", "PCBREV": "T8",