1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-13 11:29:51 +03:00

3djc/2.4 add 2.3 pr (#8099)

This commit is contained in:
3djc 2020-11-19 16:32:50 +01:00 committed by GitHub
parent 87cd9047b1
commit 24f93a7cbe
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
94 changed files with 22779 additions and 205 deletions

View file

@ -343,6 +343,8 @@ if(PCB STREQUAL X7 AND PCBREV STREQUAL ACCESS)
set(FLAVOUR x7access)
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL T12)
set(FLAVOUR t12)
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TX12)
set(FLAVOUR tx12)
elseif(PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019)
set(FLAVOUR x9d+2019)
elseif(PCB STREQUAL X10 AND PCBREV STREQUAL EXPRESS)

View file

@ -179,6 +179,17 @@
<file>images/simulator/JumperT12/JumperT12-x.png</file>
<file>images/simulator/JumperT12/JumperT12-center.png</file>
<file>images/simulator/JumperT12/JumperT12-top.png</file>
<file>images/simulator/TX12/left.png</file>
<file>images/simulator/TX12/left-pageup.png</file>
<file>images/simulator/TX12/left-pagedn.png</file>
<file>images/simulator/TX12/left-rtn.png</file>
<file>images/simulator/TX12/left-sys.png</file>
<file>images/simulator/TX12/left-tele.png</file>
<file>images/simulator/TX12/right.png</file>
<file>images/simulator/TX12/right-ent.png</file>
<file>images/simulator/TX12/right-mdl.png</file>
<file>images/simulator/TX12/bottom.png</file>
<file>images/simulator/TX12/top.png</file>
<file>images/simulator/JumperT16/left.png</file>
<file>images/simulator/JumperT16/right.png</file>
<file>images/simulator/JumperT16/top.png</file>

View file

@ -85,6 +85,8 @@ uint32_t Boards::getFourCC(Type board)
return 0x4078746F;
case BOARD_RADIOMASTER_TX16S:
return 0x3878746F;
case BOARD_RADIOMASTER_TX12:
return 0x4178746F;
case BOARD_UNKNOWN:
break;
}
@ -111,6 +113,7 @@ int Boards::getEEpromSize(Board::Type board)
case BOARD_TARANIS_X9DP_2019:
case BOARD_TARANIS_X9E:
case BOARD_JUMPER_T12:
case BOARD_RADIOMASTER_TX12:
return EESIZE_TARANIS;
case BOARD_UNKNOWN:
return EESIZE_MAX;
@ -145,6 +148,7 @@ int Boards::getFlashSize(Type board)
case BOARD_TARANIS_X9DP_2019:
case BOARD_TARANIS_X9E:
case BOARD_JUMPER_T12:
case BOARD_RADIOMASTER_TX12:
return FSIZE_TARANIS;
case BOARD_HORUS_X12S:
case BOARD_X10:
@ -201,6 +205,20 @@ SwitchInfo Boards::getSwitchInfo(Board::Type board, int index)
if (index < DIM(switches))
return switches[index];
}
else if (IS_RADIOMASTER_TX12(board)) {
const Board::SwitchInfo switches[] = {
{SWITCH_TOGGLE, "SA"},
{SWITCH_3POS, "SB"},
{SWITCH_3POS, "SC"},
{SWITCH_TOGGLE, "SD"},
{SWITCH_3POS, "SE"},
{SWITCH_3POS, "SF"},
{SWITCH_2POS, "SI"},
{SWITCH_2POS, "SJ"}
};
if (index < DIM(switches))
return switches[index];
}
else if (IS_JUMPER_T12(board)) {
const Board::SwitchInfo switches[] = {
{SWITCH_3POS, "SA"},
@ -213,7 +231,23 @@ SwitchInfo Boards::getSwitchInfo(Board::Type board, int index)
if (index < DIM(switches))
return switches[index];
}
else if (IS_HORUS_OR_TARANIS(board)) {
else if (IS_FAMILY_HORUS_OR_T16(board)) {
const Board::SwitchInfo switches[] = {
{SWITCH_3POS, "SA"},
{SWITCH_3POS, "SB"},
{SWITCH_3POS, "SC"},
{SWITCH_3POS, "SD"},
{SWITCH_3POS, "SE"},
{SWITCH_2POS, "SF"},
{SWITCH_3POS, "SG"},
{SWITCH_TOGGLE, "SH"},
{SWITCH_2POS, "SI"},
{SWITCH_2POS, "SJ"}
};
if (index < DIM(switches))
return switches[index];
}
else if (IS_TARANIS(board)) {
const Board::SwitchInfo switches[] = {
{SWITCH_3POS, "SA"},
{SWITCH_3POS, "SB"},
@ -263,7 +297,7 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
case Pots:
if (IS_TARANIS_X9LITE(board))
return 1;
else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board))
else if (IS_TARANIS_SMALL(board))
return 2;
else if (IS_TARANIS_X9E(board))
return 4;
@ -318,8 +352,8 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
return 7;
else if (IS_TARANIS_X7(board))
return 8;
else if (IS_JUMPER_T12(board))
return 6;
else if (IS_FAMILY_T12(board))
return 8;
else if (IS_TARANIS_XLITE(board))
return 6;
else if (board == Board::BOARD_TARANIS_X9DP_2019)
@ -334,6 +368,8 @@ int Boards::getCapability(Board::Type board, Board::Capability capability)
case FactoryInstalledSwitches:
if (IS_TARANIS_X9E(board))
return 8;
if (IS_FAMILY_T12(board))
return 6;
if (IS_HORUS_X12S(board))
return 8;
else
@ -515,6 +551,8 @@ QString Boards::getBoardName(Board::Type board)
return "Jumper T18";
case BOARD_RADIOMASTER_TX16S:
return "Radiomaster TX16S";
case BOARD_RADIOMASTER_TX12:
return "Radiomaster TX12";
default:
return tr("Unknown");
}

View file

@ -52,9 +52,10 @@ namespace Board {
BOARD_JUMPER_T16,
BOARD_RADIOMASTER_TX16S,
BOARD_JUMPER_T18,
BOARD_RADIOMASTER_TX12,
};
constexpr int BOARD_TYPE_MAX = BOARD_JUMPER_T18;
constexpr int BOARD_TYPE_MAX = BOARD_RADIOMASTER_TX12;
enum PotType
{
@ -218,11 +219,21 @@ inline bool IS_RADIOMASTER_TX16S(Board::Type board)
return board == Board::BOARD_RADIOMASTER_TX16S;
}
inline bool IS_RADIOMASTER_TX12(Board::Type board)
{
return board == Board::BOARD_RADIOMASTER_TX12;
}
inline bool IS_FAMILY_T16(Board::Type board)
{
return board == Board::BOARD_JUMPER_T16 || board == Board::BOARD_RADIOMASTER_TX16S || board == Board::BOARD_JUMPER_T18;
}
inline bool IS_FAMILY_T12(Board::Type board)
{
return board == Board::BOARD_JUMPER_T12 || board == Board::BOARD_RADIOMASTER_TX12;
}
inline bool IS_TARANIS_XLITE(Board::Type board)
{
return board == Board::BOARD_TARANIS_XLITE || board == Board::BOARD_TARANIS_XLITES;
@ -273,14 +284,14 @@ inline bool IS_TARANIS_X9E(Board::Type board)
return board == Board::BOARD_TARANIS_X9E;
}
inline bool IS_TARANIS(Board::Type board)
{
return IS_TARANIS_X9(board) || IS_TARANIS_X7(board) || IS_TARANIS_X9LITE(board) || IS_TARANIS_XLITE(board) || IS_JUMPER_T12(board);
}
inline bool IS_TARANIS_SMALL(Board::Type board)
{
return IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board) || IS_TARANIS_X9LITE(board) || IS_JUMPER_T12(board);
return IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board) || IS_TARANIS_X9LITE(board) || IS_FAMILY_T12(board);
}
inline bool IS_TARANIS(Board::Type board)
{
return IS_TARANIS_X9(board) || IS_TARANIS_SMALL(board);
}
inline bool IS_HORUS_X10(Board::Type board)

View file

@ -253,11 +253,11 @@ void GeneralSettings::setDefaultControlTypes(Board::Type board)
potConfig[0] = Board::POT_WITHOUT_DETENT;
potConfig[1] = Board::POT_WITH_DETENT;
}
else if (IS_TARANIS(board)) {
else if (IS_FAMILY_T12(board)) {
potConfig[0] = Board::POT_WITH_DETENT;
potConfig[1] = Board::POT_WITH_DETENT;
}
else if (IS_JUMPER_T12(board)) {
else if (IS_TARANIS(board)) {
potConfig[0] = Board::POT_WITH_DETENT;
potConfig[1] = Board::POT_WITH_DETENT;
}
@ -329,14 +329,14 @@ void GeneralSettings::convert(RadioDataConversionState & cstate)
}
}
if (IS_JUMPER_T12(cstate.toType)) {
if (IS_FAMILY_T12(cstate.toType)) {
if (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType)) {
strncpy(switchName[4], switchName[5], sizeof(switchName[0]));
strncpy(switchName[5], switchName[7], sizeof(switchName[0]));
}
}
else if (IS_JUMPER_T12(cstate.fromType)) {
else if (IS_FAMILY_T12(cstate.fromType)) {
if (IS_TARANIS_X9(cstate.toType) || IS_FAMILY_HORUS_OR_T16(cstate.toType)) {
strncpy(switchName[5], switchName[4], sizeof(switchName[0]));
strncpy(switchName[7], switchName[5], sizeof(switchName[0]));

View file

@ -45,7 +45,7 @@ inline int MAX_SWITCHES(Board::Type board, int version)
if (IS_TARANIS_X9D(board))
return 9;
if (IS_JUMPER_T12(board))
if (IS_FAMILY_T12(board))
return 8;
return Boards::getCapability(board, Board::Switches);

View file

@ -36,6 +36,7 @@
#define TARANIS_X9LITE_VARIANT 0x0800
#define TARANIS_X9LITES_VARIANT 0x0801
#define JUMPER_T12_VARIANT 0x4001
#define RADIOMASTER_TX12_VARIANT 0x4002
class OpenTxGeneralData: public TransformedField {
public:

View file

@ -66,6 +66,8 @@ const char * OpenTxEepromInterface::getName()
return "OpenTX for Jumper T18";
case BOARD_RADIOMASTER_TX16S:
return "OpenTX for Radiomaster TX16S";
case BOARD_RADIOMASTER_TX12:
return "OpenTX for Radiomaster TX12";
case BOARD_TARANIS_X9D:
return "OpenTX for FrSky Taranis X9D";
case BOARD_TARANIS_X9DP:
@ -334,7 +336,9 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u
else if (IS_JUMPER_T12(board)) {
variant |= JUMPER_T12_VARIANT;
}
else if (IS_RADIOMASTER_TX12(board)) {
variant |= RADIOMASTER_TX12_VARIANT;
}
OpenTxGeneralData generator((GeneralSettings &)radioData.generalSettings, board, version, variant);
// generator.dump();
QByteArray data;
@ -520,7 +524,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case MaxVolume:
return 23;
case MaxContrast:
if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board))
if (IS_TARANIS_SMALL(board))
return 30;
else
return 45;
@ -615,7 +619,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case LcdWidth:
if (IS_FAMILY_HORUS_OR_T16(board))
return 480;
else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board))
else if (IS_TARANIS_SMALL(board))
return 128;
else if (IS_TARANIS(board))
return 212;
@ -629,7 +633,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case LcdDepth:
if (IS_FAMILY_HORUS_OR_T16(board))
return 16;
else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board))
else if (IS_TARANIS_SMALL(board))
return 1;
else if (IS_TARANIS(board))
return 4;
@ -679,6 +683,8 @@ int OpenTxFirmware::getCapability(::Capability capability)
return TARANIS_XLITE_VARIANT;
else if (IS_JUMPER_T12(board))
return JUMPER_T12_VARIANT;
else if (IS_RADIOMASTER_TX12(board))
return RADIOMASTER_TX12_VARIANT;
else
return 0;
case MavlinkTelemetry:
@ -733,9 +739,9 @@ bool OpenTxFirmware::isAvailable(PulsesProtocol proto, int port)
return true;
case PULSES_PXX_XJT_X16:
case PULSES_PXX_XJT_LR12:
return !IS_ACCESS_RADIO(board, id) && !IS_FAMILY_T16(board) && !IS_JUMPER_T12(board);
return !IS_ACCESS_RADIO(board, id) && !IS_FAMILY_T16(board) && !IS_FAMILY_T12(board);
case PULSES_PXX_XJT_D8:
return !(IS_ACCESS_RADIO(board, id) || id.contains("eu")) && !IS_FAMILY_T16(board) && !IS_JUMPER_T12(board);
return !(IS_ACCESS_RADIO(board, id) || id.contains("eu")) && !IS_FAMILY_T16(board) && !IS_FAMILY_T12(board);
case PULSES_ACCESS_ISRM:
case PULSES_ACCST_ISRM_D16:
return IS_ACCESS_RADIO(board, id);
@ -943,6 +949,11 @@ bool OpenTxEepromInterface::checkVariant(unsigned int version, unsigned int vari
variantError = true;
}
}
else if (IS_RADIOMASTER_TX12(board)) {
if (variant != RADIOMASTER_TX12_VARIANT) {
variantError = true;
}
}
else if (IS_TARANIS(board)) {
if (variant != 0) {
variantError = true;
@ -1273,6 +1284,16 @@ void registerOpenTxFirmwares()
addOpenTxRfOptions(firmware, FLEX);
registerOpenTxFirmware(firmware);
/* Radiomaster TX12 board */
firmware = new OpenTxFirmware("opentx-tx12", QCoreApplication::translate("Firmware", "Radiomaster TX12"), BOARD_RADIOMASTER_TX12);
addOpenTxCommonOptions(firmware);
firmware->addOption("noheli", Firmware::tr("Disable HELI menu and cyclic mix support"));
firmware->addOption("nogvars", Firmware::tr("Disable Global variables"));
firmware->addOption("lua", Firmware::tr("Enable Lua custom scripts screen"));
addOpenTxFontOptions(firmware);
registerOpenTxFirmware(firmware);
addOpenTxRfOptions(firmware, FLEX + AFHDS3);
/* Radiomaster TX16S board */
firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16S / SE / Hall / Masterfire"), BOARD_RADIOMASTER_TX16S);
addOpenTxFrskyOptions(firmware);

View file

@ -364,7 +364,7 @@ RawSource RawSource::convert(RadioDataConversionState & cstate)
if (index >= 0)
evt = RadioDataConversionState::EVT_CVRT;
}
else if (IS_JUMPER_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) {
else if (IS_FAMILY_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) {
// No SE and SG on T12 board
index = toSwitchList.indexOf("SD");
if (index >= 0)

View file

@ -200,7 +200,7 @@ RawSwitch RawSwitch::convert(RadioDataConversionState & cstate)
if (newIdx >= 0)
evt = RadioDataConversionState::EVT_CVRT;
}
else if (IS_JUMPER_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) {
else if (IS_FAMILY_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) {
// No SE and SG on T12 board
newIdx = toSwitchList.indexOf("SD");
if (newIdx >= 0)

View file

@ -47,7 +47,15 @@ void HardwarePanel::setupSwitchType(int index, QLabel * label, AutoLineEdit * na
label->setText("SJ");
}
}
if (IS_JUMPER_T12(board)) {
else if (IS_RADIOMASTER_TX12(board)) {
if (index == 6) {
label->setText("SI");
}
else if (index == 7) {
label->setText("SJ");
}
}
else if (IS_FAMILY_T12(board)) {
if (index == 4) {
label->setText("SG");
}
@ -101,6 +109,15 @@ void HardwarePanel::setupSliderType(int index, QLabel *label, AutoLineEdit *name
}
}
bool HardwarePanel::isSwitch3Pos(int idx)
{
Board::Type board = firmware->getBoard();
Board::SwitchInfo switchInfo = Boards::getSwitchInfo(board, idx);
switchInfo.config = Board::SwitchType(generalSettings.switchConfig[idx]);
return switchInfo.config == Board::SWITCH_3POS;
};
HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings, Firmware * firmware):
GeneralPanel(parent, generalSettings, firmware),
ui(new Ui::Hardware)
@ -147,17 +164,17 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings
setupSliderType(2, ui->ls2Label, ui->ls2Name, ui->ls2Type);
setupSliderType(3, ui->rs2Label, ui->rs2Name, ui->rs2Type);
setupSwitchType(0, ui->saLabel, ui->saName, ui->saType);
setupSwitchType(1, ui->sbLabel, ui->sbName, ui->sbType);
setupSwitchType(2, ui->scLabel, ui->scName, ui->scType);
setupSwitchType(3, ui->sdLabel, ui->sdName, ui->sdType);
setupSwitchType(4, ui->seLabel, ui->seName, ui->seType);
setupSwitchType(5, ui->sfLabel, ui->sfName, ui->sfType, false); //switch does not support 3POS
setupSwitchType(6, ui->sgLabel, ui->sgName, ui->sgType);
setupSwitchType(7, ui->shLabel, ui->shName, ui->shType, false); //switch does not support 3POS
setupSwitchType(8, ui->siLabel, ui->siName, ui->siType);
setupSwitchType(9, ui->sjLabel, ui->sjName, ui->sjType);
setupSwitchType(10, ui->skLabel, ui->skName, ui->skType);
setupSwitchType(0, ui->saLabel, ui->saName, ui->saType, isSwitch3Pos(0));
setupSwitchType(1, ui->sbLabel, ui->sbName, ui->sbType, isSwitch3Pos(1));
setupSwitchType(2, ui->scLabel, ui->scName, ui->scType, isSwitch3Pos(2));
setupSwitchType(3, ui->sdLabel, ui->sdName, ui->sdType, isSwitch3Pos(3));
setupSwitchType(4, ui->seLabel, ui->seName, ui->seType, isSwitch3Pos(4));
setupSwitchType(5, ui->sfLabel, ui->sfName, ui->sfType, isSwitch3Pos(5));
setupSwitchType(6, ui->sgLabel, ui->sgName, ui->sgType, isSwitch3Pos(6));
setupSwitchType(7, ui->shLabel, ui->shName, ui->shType, isSwitch3Pos(7));
setupSwitchType(8, ui->siLabel, ui->siName, ui->siType, isSwitch3Pos(8));
setupSwitchType(9, ui->sjLabel, ui->sjName, ui->sjType, isSwitch3Pos(9));
setupSwitchType(10, ui->skLabel, ui->skName, ui->skType); // Here starts X9E, only 3 switches
setupSwitchType(11, ui->slLabel, ui->slName, ui->slType);
setupSwitchType(12, ui->smLabel, ui->smName, ui->smType);
setupSwitchType(13, ui->snLabel, ui->snName, ui->snType);

View file

@ -63,6 +63,7 @@ class HardwarePanel : public GeneralPanel
Ui::Hardware *ui;
void setValues();
bool isSwitch3Pos(int idx);
};
#endif // _HARDWARE_H_

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View file

@ -412,6 +412,7 @@ void Curves::onPointEdited()
model->curves[currentCurve].points[index].x = spnx[index]->value();
model->curves[currentCurve].points[index].y = spny[index]->value();
updateCurve();
updateCurvePoints();
emit modified();
}
}

View file

@ -15,6 +15,7 @@ set(simulation_SRCS
simulateduiwidgetJumperT12.cpp
simulateduiwidgetJumperT16.cpp
simulateduiwidgetJumperT18.cpp
simulateduiwidgetTX12.cpp
simulateduiwidgetTX16S.cpp
simulatorinterface.cpp
simulatormainwindow.cpp
@ -41,6 +42,7 @@ set(simulation_UIS
simulateduiwidgetJumperT12.ui
simulateduiwidgetJumperT16.ui
simulateduiwidgetJumperT18.ui
simulateduiwidgetTX12.ui
simulateduiwidgetTX16S.ui
simulatormainwindow.ui
simulatorstartupdialog.ui

View file

@ -115,6 +115,7 @@ namespace Ui {
class SimulatedUIWidgetJumperT16;
class SimulatedUIWidgetJumperT18;
class SimulatedUIWidgetTX16S;
class SimulatedUIWidgetTX12;
}
class SimulatedUIWidget9X: public SimulatedUIWidget
@ -265,6 +266,19 @@ class SimulatedUIWidgetJumperT18: public SimulatedUIWidget
Ui::SimulatedUIWidgetJumperT18 * ui;
};
class SimulatedUIWidgetTX12: public SimulatedUIWidget
{
Q_OBJECT
public:
explicit SimulatedUIWidgetTX12(SimulatorInterface * simulator, QWidget * parent = nullptr);
virtual ~SimulatedUIWidgetTX12();
private:
Ui::SimulatedUIWidgetTX12 * ui;
};
class SimulatedUIWidgetTX16S: public SimulatedUIWidget
{
Q_OBJECT

View file

@ -0,0 +1,67 @@
#include "simulateduiwidget.h"
#include "ui_simulateduiwidgetTX12.h"
// NOTE: RadioUiAction(NUMBER,...): NUMBER relates to enum EnumKeys in the specific board.h
SimulatedUIWidgetTX12::SimulatedUIWidgetTX12(SimulatorInterface *simulator, QWidget * parent):
SimulatedUIWidget(simulator, parent),
ui(new Ui::SimulatedUIWidgetTX12)
{
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(60, 5, 90, 60), "TX12/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(45, 100, 70, 120), "TX12/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(35, 5, 80, 50), "TX12/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->leftbuttons->addArea(QRect(90, 210, 80, 35), "TX12/left-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(75, 125, 80, 35), "TX12/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(80, 170, 80, 35), "TX12/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(70, 85, 80, 35), "TX12/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);
}
SimulatedUIWidgetTX12::~SimulatedUIWidgetTX12()
{
delete ui;
}

View file

@ -0,0 +1,258 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SimulatedUIWidgetTX12</class>
<widget class="QWidget" name="SimulatedUIWidgetTX12">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>641</width>
<height>272</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>272</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>641</width>
<height>272</height>
</size>
</property>
<property name="windowTitle">
<string notr="true">Taranis TX12 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/TX12/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>128</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>424</width>
<height>128</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/TX12/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>261</width>
<height>101</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>261</width>
<height>101</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background:url(:/images/simulator/TX12/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>24</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>261</width>
<height>24</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background:url(:/images/simulator/TX12/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

@ -97,6 +97,9 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato
case Board::BOARD_JUMPER_T18:
radioUiWidget = new SimulatedUIWidgetJumperT18(simulator, this);
break;
case Board::BOARD_RADIOMASTER_TX12:
radioUiWidget = new SimulatedUIWidgetTX12(simulator, this);
break;
case Board::BOARD_RADIOMASTER_TX16S:
radioUiWidget = new SimulatedUIWidgetTX16S(simulator, this);
break;

View file

@ -48,6 +48,7 @@ QStringList const Translations::getAvailableTranslations()
<< "ru_RU"
<< "sv_SE"
<< "zh_CN"
<< "zh_TW"
<< "ja_JP" ;
}
return locales;

File diff suppressed because it is too large Load diff

View file

@ -518,8 +518,6 @@ AudioQueue::AudioQueue()
#if !defined(SIMU)
void audioTask(void * pdata)
{
audioWaitReady();
while (!audioQueue.started()) {
RTOS_WAIT_TICKS(1);
}

View file

@ -214,7 +214,13 @@ enum ModuleIndex {
};
#endif
#if defined(RADIO_FAMILY_T16) || (defined(RADIO_T12) && defined(INTERNAL_MODULE_MULTI)) || defined(ALLOW_TRAINER_MULTI)
#if defined(RADIO_T16) && !defined(INTERNAL_MODULE_MULTI)
#if defined(BLUETOOTH)
#define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE_BLUETOOTH
#else
#define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE
#endif
#elif defined(INTERNAL_MODULE_MULTI) || defined(ALLOW_TRAINER_MULTI)
#define TRAINER_MODE_MAX() TRAINER_MODE_MULTI
#elif defined(BLUETOOTH)
#define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE_BLUETOOTH

View file

@ -165,8 +165,13 @@ void menuModelCurveOne(event_t event)
}
break;
#if defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_MENU):
#if defined(NAVIGATION_X7_TX12)
case EVT_KEY_FIRST(KEY_MODEL):
pushMenu(menuChannelsView);
killEvents(event);
break;
#elif defined(NAVIGATION_X7)
case EVT_KEY_FIRST(KEY_MENU):
pushMenu(menuChannelsView);
killEvents(event);
break;

View file

@ -49,8 +49,13 @@ enum ExposFields {
void menuModelExpoOne(event_t event)
{
#if defined(NAVIGATION_X7)
if (event == EVT_KEY_LONG(KEY_MENU)) {
#if defined(NAVIGATION_X7_TX12)
if (event == EVT_KEY_FIRST(KEY_MODEL)) {
pushMenu(menuChannelsView);
killEvents(event);
}
#elif defined(NAVIGATION_X7)
if (event == EVT_KEY_FIRST(KEY_MENU)) {
pushMenu(menuChannelsView);
killEvents(event);
}

View file

@ -85,8 +85,13 @@ void drawOffsetBar(uint8_t x, uint8_t y, MixData * md)
void menuModelMixOne(event_t event)
{
#if defined(NAVIGATION_X7)
if (event == EVT_KEY_LONG(KEY_MENU)) {
#if defined(NAVIGATION_X7_TX12)
if (event == EVT_KEY_FIRST(KEY_MODEL)) {
pushMenu(menuChannelsView);
killEvents(event);
}
#elif defined(NAVIGATION_X7)
if (event == EVT_KEY_FIRST(KEY_MENU)) {
pushMenu(menuChannelsView);
killEvents(event);
}

View file

@ -203,7 +203,16 @@ void menuModelSelect(event_t event)
}
break;
#if defined(NAVIGATION_X7)
#if defined(NAVIGATION_X7_TX12)
case EVT_KEY_FIRST(KEY_PAGEUP):
chainMenu(menuTabModel[DIM(menuTabModel)-1]);
killEvents(event);
break;
case EVT_KEY_FIRST(KEY_PAGEDN):
chainMenu(menuModelSetup);
break;
#elif defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_PAGE):
chainMenu(menuTabModel[DIM(menuTabModel)-1]);
killEvents(event);

View file

@ -236,14 +236,7 @@ void menuModelTelemetry(event_t event)
break;
case ITEM_TELEMETRY_RSSI_LABEL:
#if defined(MULTIMODULE)
if (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FS_AFHDS2A || g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MODULE_SUBTYPE_MULTI_HOTT))
lcdDrawTextAlignedLeft(y, "RQly");
else
lcdDrawTextAlignedLeft(y, "RSSI");
#else
lcdDrawTextAlignedLeft(y, "RSSI");
#endif
lcdDrawTextAlignedLeft(y, getRssiLabel());
break;
case ITEM_TELEMETRY_RSSI_SOURCE: {

View file

@ -42,7 +42,10 @@ enum AboutScreens {
#define ABOUT_X 2
#define ABOUT_INDENT 4
#if defined(NAVIGATION_X7)
#if defined(NAVIGATION_X7_TX12)
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_PAGEUP)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGEDN)
#elif defined(NAVIGATION_X7)
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_LONG(KEY_PAGE)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE)
#else

View file

@ -26,7 +26,12 @@ constexpr coord_t CHANNEL_GAUGE_OFFSET = CHANNEL_VALUE_OFFSET;
constexpr coord_t CHANNEL_BAR_WIDTH = 70;
constexpr coord_t CHANNEL_PROPERTIES_OFFSET = CHANNEL_GAUGE_OFFSET + CHANNEL_BAR_WIDTH + 2;
#if defined(NAVIGATION_X7)
#if defined(NAVIGATION_X7_TX12)
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_PAGEUP)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGEDN)
#define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT
#define EVT_KEY_PREVIOUS_PAGE EVT_ROTARY_LEFT
#elif defined(NAVIGATION_X7)
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_LONG(KEY_PAGE)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE)
#define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT
@ -54,7 +59,7 @@ void menuChannelsViewCommon(event_t event)
memclear(&reusableBuffer.viewChannels, sizeof(reusableBuffer.viewChannels));
break;
case EVT_KEY_FIRST(KEY_ENTER):
case EVT_KEY_BREAK(KEY_ENTER):
reusableBuffer.viewChannels.mixersView = !reusableBuffer.viewChannels.mixersView;
break;
}

View file

@ -286,7 +286,16 @@ void displayVoltageOrAlarm()
#define displayVoltageOrAlarm() displayBattVoltage()
#endif
#if defined(NAVIGATION_X7) || defined(NAVIGATION_TBS)
#if defined(NAVIGATION_X7_TX12)
#define EVT_KEY_CONTEXT_MENU EVT_KEY_LONG(KEY_ENTER)
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_FIRST(KEY_PAGEUP)
#define EVT_KEY_NEXT_VIEW EVT_KEY_FIRST(KEY_PAGEDN)
#define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT
#define EVT_KEY_PREVIOUS_PAGE EVT_ROTARY_LEFT
#define EVT_KEY_MODEL_MENU EVT_KEY_LONG(KEY_MODEL)
#define EVT_KEY_GENERAL_MENU EVT_KEY_LONG(KEY_SYS)
#define EVT_KEY_TELEMETRY EVT_KEY_FIRST(KEY_TELE)
#elif defined(NAVIGATION_X7) || defined(NAVIGATION_TBS)
#define EVT_KEY_CONTEXT_MENU EVT_KEY_LONG(KEY_ENTER)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE)
#define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT

View file

@ -31,14 +31,21 @@ void menuStatisticsView(event_t event)
switch (event) {
case EVT_KEY_FIRST(KEY_UP):
#if defined(NAVIGATION_X7)
#if defined(NAVIGATION_X7_TX12)
case EVT_KEY_BREAK(KEY_PAGEDN):
#elif defined(NAVIGATION_X7)
case EVT_KEY_BREAK(KEY_PAGE):
#endif
chainMenu(menuStatisticsDebug);
break;
case EVT_KEY_FIRST(KEY_DOWN):
#if defined(NAVIGATION_X7)
#if defined(NAVIGATION_X7_TX12)
case EVT_KEY_BREAK(KEY_PAGEUP):
killEvents(event);
chainMenu(menuStatisticsDebug2);
#elif defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_PAGE):
killEvents(event);
chainMenu(menuStatisticsDebug2);
@ -133,7 +140,12 @@ void menuStatisticsDebug(event_t event)
break;
case EVT_KEY_FIRST(KEY_UP):
#if defined(NAVIGATION_X7)
#if defined(NAVIGATION_X7_TX12)
case EVT_KEY_BREAK(KEY_PAGEDN):
disableVBatBridge();
chainMenu(menuStatisticsDebug2);
break;
#elif defined(NAVIGATION_X7)
case EVT_KEY_BREAK(KEY_PAGE):
disableVBatBridge();
chainMenu(menuStatisticsDebug2);
@ -141,7 +153,9 @@ void menuStatisticsDebug(event_t event)
#endif
case EVT_KEY_FIRST(KEY_DOWN):
#if defined(NAVIGATION_X7)
#if defined(NAVIGATION_X7_TX12)
case EVT_KEY_BREAK(KEY_PAGEUP):
#elif defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_PAGE):
#endif
killEvents(event);
@ -264,14 +278,18 @@ void menuStatisticsDebug2(event_t event)
break;
case EVT_KEY_FIRST(KEY_UP):
#if defined(NAVIGATION_X7)
#if defined(NAVIGATION_X7_TX12)
case EVT_KEY_BREAK(KEY_PAGEDN):
#elif defined(NAVIGATION_X7)
case EVT_KEY_BREAK(KEY_PAGE):
#endif
chainMenu(menuStatisticsView);
return;
case EVT_KEY_FIRST(KEY_DOWN):
#if defined(NAVIGATION_X7)
#if defined(NAVIGATION_X7_TX12)
case EVT_KEY_BREAK(KEY_PAGEUP):
#elif defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_PAGE):
#endif
killEvents(event);

View file

@ -227,14 +227,7 @@ void menuModelTelemetry(event_t event)
break;
case ITEM_TELEMETRY_RSSI_LABEL:
#if defined(MULTIMODULE)
if (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FS_AFHDS2A || g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MODULE_SUBTYPE_MULTI_HOTT))
lcdDrawTextAlignedLeft(y, "RQly");
else
lcdDrawTextAlignedLeft(y, "RSSI");
#else
lcdDrawTextAlignedLeft(y, "RSSI");
#endif
lcdDrawTextAlignedLeft(y, getRssiLabel());
break;
case ITEM_TELEMETRY_RSSI_SOURCE: {

View file

@ -393,11 +393,7 @@ void ModelTelemetryPage::build(FormWindow * window, int8_t focusSensorIndex)
this->window = window;
// RSSI
if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE &&
g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FS_AFHDS2A)
new Subtitle(window, grid.getLineSlot(), "RSNR");
else
new Subtitle(window, grid.getLineSlot(), "RSSI");
new Subtitle(window, grid.getLineSlot(), getRssiLabel());
grid.nextLine();
new StaticText(window, grid.getLabelSlot(true), STR_LOWALARM);

View file

@ -479,6 +479,13 @@ void menuModelMixAll(event_t event)
s_currCh = ch;
if (!s_copyMode) {
attr = INVERS;
displayHeaderChannelName(ch - 1);
#if LCD_W >= 212
if (g_model.limitData[ch - 1].name[0] != '\0') {
coord_t xPos = MIX_HDR_GAUGE_POS_X - FWNUM * 5 - 50;
lcdDrawFilledRect(lcdNextPos, 0, lcdNextPos - xPos, MENU_HEADER_HEIGHT, SOLID, FILL_WHITE | GREY_DEFAULT);
}
#endif
}
}
if (cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES) {

View file

@ -262,6 +262,8 @@ void onHardwareAntennaSwitchConfirm(const char * result)
#define SWITCH_TYPE_MAX(sw) (SWITCH_3POS)
#elif defined(PCBX9E)
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS)
#elif defined(RADIO_TX12)
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SA - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SD - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS)
#else
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SF - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SH - MIXSRC_FIRST_SWITCH <= sw) ? SWITCH_2POS : SWITCH_3POS)
#endif

View file

@ -34,6 +34,9 @@ enum NavigationDirection {
#if defined(NAVIGATION_XLITE)
#define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_LEFT) && IS_SHIFT_PRESSED())
#define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_LONG(KEY_RIGHT) && IS_SHIFT_PRESSED())
#elif defined(NAVIGATION_X7_TX12)
#define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_UP))
#define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_DOWN))
#elif defined(NAVIGATION_X7) || defined(NAVIGATION_X9D)
#define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_PAGE))
#define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_BREAK(KEY_PAGE))

View file

@ -217,7 +217,11 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t
if (menuTab) {
int cc = curr;
switch (event) {
#if defined(NAVIGATION_X7_TX12)
case EVT_KEY_FIRST(KEY_PAGEUP):
#else
case EVT_KEY_LONG(KEY_PAGE):
#endif
if (s_editMode>0)
break;
@ -228,7 +232,11 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t
killEvents(event);
break;
#if defined(NAVIGATION_X7_TX12)
case EVT_KEY_FIRST(KEY_PAGEDN):
#else
case EVT_KEY_BREAK(KEY_PAGE):
#endif
if (s_editMode>0)
break;

View file

@ -28,5 +28,6 @@ if(PYTHONINTERP_FOUND)
add_lua_export_target(x10 ${LUA_INCLUDES} -DPCBHORUS -DPCBX10)
add_lua_export_target(x12s ${LUA_INCLUDES} -DPCBHORUS -DPCBX12S)
add_lua_export_target(t12 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_T12)
add_lua_export_target(tx12 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_TX12)
add_lua_export_target(t16 ${LUA_INCLUDES} -DPCBHORUS -DPCBX10 -DRADIO_T16)
endif()

View file

@ -40,6 +40,8 @@
#include "lua/lua_exports_x7.inc"
#elif defined(RADIO_T12)
#include "lua/lua_exports_t12.inc"
#elif defined(RADIO_TX12)
#include "lua/lua_exports_tx12.inc"
#elif defined(PCBX9LITES)
#include "lua/lua_exports_x9lites.inc"
#elif defined(PCBX9LITE)
@ -1788,7 +1790,9 @@ const luaR_value_entry opentxConstants[] = {
#endif
#if !defined(PCBXLITE) && !defined(PCBX9LITE)
{ "MIXSRC_SF", MIXSRC_SF },
#if !defined(RADIO_TX12)
{ "MIXSRC_SH", MIXSRC_SH },
#endif
#endif
{ "MIXSRC_CH1", MIXSRC_CH1 },
{ "SWSRC_LAST", SWSRC_LAST_LOGICAL_SWITCH },
@ -1876,10 +1880,17 @@ 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)
{ "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) },
{ "EVT_VIRTUAL_MENU_LONG", EVT_KEY_LONG(KEY_MODEL) },
#else
{ "EVT_VIRTUAL_PREV_PAGE", EVT_KEY_LONG(KEY_PAGE) },
{ "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_BREAK(KEY_PAGE) },
{ "EVT_VIRTUAL_MENU", EVT_KEY_BREAK(KEY_MENU) },
{ "EVT_VIRTUAL_MENU_LONG", EVT_KEY_LONG(KEY_MENU) },
#endif
{ "EVT_VIRTUAL_ENTER", EVT_KEY_BREAK(KEY_ENTER) },
{ "EVT_VIRTUAL_ENTER_LONG", EVT_KEY_LONG(KEY_ENTER) },
{ "EVT_VIRTUAL_EXIT", EVT_KEY_BREAK(KEY_EXIT) },

View file

@ -553,6 +553,8 @@ bool setTrimValue(uint8_t phase, uint8_t idx, int trim);
#define ROTARY_ENCODER_GRANULARITY (2 << g_eeGeneral.rotarySteps)
#elif defined(RADIO_FAMILY_T16) && !defined(RADIO_T18)
#define ROTARY_ENCODER_GRANULARITY (1)
#elif defined(RADIO_TX12)
#define ROTARY_ENCODER_GRANULARITY (1)
#else
#define ROTARY_ENCODER_GRANULARITY (2)
#endif

View file

@ -52,7 +52,7 @@ uint8_t createGhostChannelsFrame(uint8_t * frame, int16_t * pulses)
uint32_t bits = 0;
uint8_t bitsavailable = 0;
for (int i = 0; i < 4; i++) {
uint32_t value = limit(0, GHST_RC_CTR_VAL_12BIT + (((pulses[i]) << 3) / 5), 2 * GHST_RC_CTR_VAL_12BIT);
uint32_t value = limit(0, GHST_RC_CTR_VAL_12BIT + (((pulses[i] + 2 * PPM_CH_CENTER(i) - 2 * PPM_CENTER) << 3) / 5), 2 * GHST_RC_CTR_VAL_12BIT);
bits |= value << bitsavailable;
bitsavailable += GHST_CH_BITS_12;
while (bitsavailable >= 8) {
@ -64,7 +64,8 @@ uint8_t createGhostChannelsFrame(uint8_t * frame, int16_t * pulses)
// second 4 lower speed, 8 bit channels
for (int i = 4; i < 8; ++i) {
*buf++ = limit(0, GHST_RC_CTR_VAL_8BIT + (((pulses[i + ghostUpper4Offset]) >> 1) / 5), 2 * GHST_RC_CTR_VAL_8BIT);
uint8_t channelIndex = i + ghostUpper4Offset;
*buf++ = limit(0, GHST_RC_CTR_VAL_8BIT + (((pulses[channelIndex] + 2 * PPM_CH_CENTER(channelIndex) - 2 * PPM_CENTER) >> 1) / 5), 2 * GHST_RC_CTR_VAL_8BIT);
}
*buf++ = crc8(crc_start, GHST_UL_RC_CHANS_SIZE - 1);

View file

@ -715,4 +715,20 @@ inline void getMultiOptionValues(int8_t multi_proto, int8_t & min, int8_t & max)
}
#endif
inline const char * getRssiLabel()
{
#if defined(MULTIMODULE)
if (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FS_AFHDS2A
|| g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MODULE_SUBTYPE_MULTI_HOTT)) {
return "RQly";
}
#endif
#if defined(GHOST)
if (telemetryProtocol == PROTOCOL_TELEMETRY_GHOST) {
return "RQly";
}
#endif
return "RSSI";
}
#endif // _MODULES_HELPERS_H_

View file

@ -144,6 +144,8 @@ const char * getBasename(const char * path);
#define OTX_FOURCC 0x3978746F // otx for Taranis X-Lite
#elif defined(RADIO_T12)
#define OTX_FOURCC 0x3D78746F // otx for Jumper T12
#elif defined(RADIO_TX12)
#define OTX_FOURCC 0x4178746F // otx for Radiomaster TX12
#elif defined(PCBX7)
#define OTX_FOURCC 0x3678746F // otx for Taranis X7 / X7S / X7 Express / X7S Express
#elif defined(PCBX9LITES)

View file

@ -334,6 +334,14 @@ void OpenTxSim::updateKeysAndSwitches(bool start)
KEY_Left, KEY_LEFT,
KEY_Up, KEY_UP,
KEY_Down, KEY_DOWN,
#elif defined(RADIO_TX12)
KEY_Page_Up, KEY_PAGEUP,
KEY_Page_Down, KEY_PAGEDN,
KEY_Return, KEY_ENTER,
KEY_Up, KEY_MODEL,
KEY_Down, KEY_EXIT,
KEY_Right, KEY_TELE,
KEY_Left, KEY_SYS,
#elif defined(PCBTARANIS)
KEY_Page_Up, KEY_MENU,
#if defined(KEYS_GPIO_REG_PAGE)

View file

@ -51,8 +51,9 @@ void preModelLoad()
if (pulsesStarted()) {
pausePulses();
}
pauseMixerCalculations();
stopTrainer();
}
void postRadioSettingsLoad()

View file

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

View file

@ -126,9 +126,15 @@ uint64_t check3PosSwitchPosition(uint8_t idx, uint8_t sw, bool startup)
void getSwitchesPosition(bool startup)
{
uint64_t newPos = 0;
#if defined(RADIO_TX12)
CHECK_2POS(SW_SA);
CHECK_3POS(0, SW_SB);
CHECK_3POS(1, SW_SC);
#else
CHECK_3POS(0, SW_SA);
CHECK_3POS(1, SW_SB);
CHECK_3POS(2, SW_SC);
#endif
#if defined(PCBX9LITES)
CHECK_2POS(SW_SD);
@ -146,6 +152,10 @@ void getSwitchesPosition(bool startup)
#elif defined(PCBXLITE)
CHECK_3POS(3, SW_SD);
// no SWE, SWF, SWG and SWH on XLITE
#elif defined(RADIO_TX12)
CHECK_2POS(SW_SD);
CHECK_3POS(2, SW_SE);
CHECK_3POS(3, SW_SF);
#elif defined(PCBX7)
CHECK_3POS(3, SW_SD);
CHECK_2POS(SW_SF);

View file

@ -44,6 +44,8 @@
const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,-1, 1,1, 1, 1};
#elif defined(PCBX9D)
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(PCBX7)
const int8_t adcDirection[NUM_ANALOGS] = {-1,1,-1,1, 1,1, 1, 1};
#elif defined(PCBX9LITE)

View file

@ -95,7 +95,7 @@ if(PCB STREQUAL X12S OR PCB STREQUAL X10 OR PCB STREQUAL X9E OR (PCB STREQUAL X9
)
endif()
if(PCB STREQUAL X7 OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES)
if(BLUETOOTH)
set(BOOTLOADER_SRC
${BOOTLOADER_SRC}
../../../../../targets/common/arm/stm32/bluetooth_driver.cpp

View file

@ -247,7 +247,7 @@ int main()
backlightInit();
backlightEnable();
#if defined(PCBX7) || defined(PCBXLITE)
#if defined(BLUETOOTH)
// we shutdown the bluetooth module now to be sure it will be detected on firmware start
bluetoothInit(BLUETOOTH_DEFAULT_BAUDRATE, false);
#endif

View file

@ -71,7 +71,7 @@ void rotaryEncoderInit()
void rotaryEncoderCheck()
{
#if defined(RADIO_FAMILY_T16) && !defined(RADIO_T18)
#if (defined(RADIO_FAMILY_T16) && !defined(RADIO_T18)) || defined(RADIO_TX12)
static uint8_t state = 0;
uint8_t pins = ROTARY_ENCODER_POSITION();

View file

@ -576,9 +576,9 @@ void usbJoystickUpdate();
#define USB_MANUFACTURER 'J', 'u', 'm', 'p', 'e', 'r', ' ', ' ' /* 8 bytes */
#define USB_PRODUCT 'T', '1', '8', ' ', ' ', ' ', ' ', ' ' /* 8 Bytes */
#elif defined(RADIO_TX16S)
#define USB_NAME "RadioMas TX16S"
#define USB_MANUFACTURER 'R', 'a', 'd', 'i', 'o', 'M', 'a', 's' /* 8 bytes */
#define USB_PRODUCT 'T', 'X', '1', '6', 'S', ' ', ' ', ' ' /* 8 Bytes */
#define USB_NAME "RM TX16S"
#define USB_MANUFACTURER 'R', 'M', '_', 'T', 'X', ' ', ' ', ' ' /* 8 bytes */
#define USB_PRODUCT 'R', 'M', ' ', 'T', 'X', '1', '6', 'S' /* 8 Bytes */
#elif defined(PCBX10)
#define USB_NAME "FrSky X10"
#define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */
@ -596,7 +596,6 @@ void audioConsumeCurrentBuffer();
#define audioEnableIrq() // interrupts must stay enabled on Horus
#if defined(PCBX12S)
#define setSampleRate(freq)
void audioWaitReady();
#else
void setSampleRate(uint32_t frequency);
#define audioWaitReady()

View file

@ -443,7 +443,6 @@ void audioOn();
void audioOff();
bool isAudioReady();
bool audioChipReset();
void audioWaitReady();
#define SPI_SPEED_2 0
#define SPI_SPEED_4 1

View file

@ -130,6 +130,18 @@ elseif(PCB STREQUAL X7)
set(LUA_EXPORT lua_export_t12)
add_definitions(-DRADIO_T12)
add_definitions(-DEEPROM_VARIANT=0x4001)
elseif(PCBREV STREQUAL TX12)
option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" ON)
set(FLAVOUR tx12)
set(NAVIGATION_TYPE x7)
set(CPU_TYPE STM32F2)
set(CPU_TYPE_FULL STM32F205xE) # for size report
set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld)
set(ROTARY_ENCODER YES)
set(LUA_EXPORT lua_export_tx12)
set(BLUETOOTH NO)
add_definitions(-DRADIO_TX12)
add_definitions(-DEEPROM_VARIANT=0x4002)
elseif(PCBREV STREQUAL ACCESS)
option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF)
option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" ON)
@ -308,7 +320,7 @@ if(INTERNAL_MODULE_SERIAL)
${TARGET_SRC}
../common/arm/stm32/intmodule_serial_driver.cpp
)
elseif(NOT (PCB STREQUAL X7 AND PCBREV STREQUAL T12))
elseif(INTERNAL_MODULE_PXX1 OR INTERNAL_MODULE_PXX2)
set(TARGET_SRC
${TARGET_SRC}
intmodule_pulses_driver.cpp

View file

@ -265,10 +265,16 @@ void boardOff()
// this function must not return!
}
#if defined (RADIO_TX12)
#define BATTERY_DIVIDER 22830
#else
#define BATTERY_DIVIDER 26214
#endif
uint16_t getBatteryVoltage()
{
int32_t instant_vbat = anaIn(TX_VOLTAGE); // using filtered ADC value on purpose
instant_vbat = (instant_vbat * BATT_SCALE * (128 + g_eeGeneral.txVoltageCalibration) ) / 26214;
instant_vbat = (instant_vbat * BATT_SCALE * (128 + g_eeGeneral.txVoltageCalibration) ) / BATTERY_DIVIDER;
instant_vbat += 20; // add 0.2V because of the diode TODO check if this is needed, but removal will break existing calibrations!
return (uint16_t)instant_vbat;
}

View file

@ -24,8 +24,12 @@
#include <inttypes.h>
#include "definitions.h"
#include "opentx_constants.h"
#include "hal.h"
#include "board_common.h"
#include "hal.h"
#if defined(RADIO_TX12)
#define NAVIGATION_X7_TX12
#endif
#if defined(ROTARY_ENCODER_NAVIGATION)
// Rotary Encoder driver
@ -238,6 +242,26 @@ enum EnumKeys
KEY_PAGE,
#endif
#if defined(KEYS_GPIO_REG_PAGEUP)
KEY_PAGEUP,
#endif
#if defined(KEYS_GPIO_REG_PAGEDN)
KEY_PAGEDN,
#endif
#if defined(KEYS_GPIO_REG_SYS)
KEY_SYS,
#endif
#if defined(KEYS_GPIO_REG_MDL)
KEY_MODEL,
#endif
#if defined(KEYS_GPIO_REG_TELE)
KEY_TELE,
#endif
#if defined(KEYS_GPIO_REG_PLUS)
KEY_PLUS,
KEY_MINUS,
@ -307,8 +331,11 @@ enum EnumSwitches
SW_SG,
SW_SH
};
#define IS_3POS(x) ((x) != SW_SF && (x) != SW_SH)
#if defined(RADIO_TX12)
#define IS_3POS(x) ((x) != SW_SA && (x) != SW_SD)
#else
#define IS_3POS(x) ((x) != SW_SF && (x) != SW_SH)
#endif
enum EnumSwitchesPositions
{
SW_SA0,
@ -323,7 +350,7 @@ enum EnumSwitchesPositions
SW_SD0,
SW_SD1,
SW_SD2,
#if defined(PCBX9) || defined(PCBXLITES) || defined(PCBX9LITES)
#if defined(PCBX9) || defined(PCBXLITES) || defined(PCBX9LITES) || defined(RADIO_TX12)
SW_SE0,
SW_SE1,
SW_SE2,
@ -338,7 +365,7 @@ enum EnumSwitchesPositions
SW_SG1,
SW_SG2,
#endif
#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBX7)
#if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || (defined(PCBX7) && !defined(RADIO_TX12))
SW_SH0,
SW_SH1,
SW_SH2,
@ -410,6 +437,11 @@ enum EnumSwitchesPositions
#define STORAGE_NUM_SWITCHES NUM_SWITCHES
#define DEFAULT_SWITCH_CONFIG (SWITCH_2POS << 10) + (SWITCH_2POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0)
#define DEFAULT_POTS_CONFIG (POT_WITHOUT_DETENT << 0) + (POT_WITHOUT_DETENT << 2); // S1 = pot without detent, S2 = pot with detent
#elif defined(RADIO_TX12)
#define NUM_SWITCHES 8
#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(PCBX7ACCESS)
#define NUM_SWITCHES 7
#define STORAGE_NUM_SWITCHES 8
@ -434,8 +466,8 @@ enum EnumSwitchesPositions
#define NUM_SWITCHES 18 // yes, it's perfect like that !
#define STORAGE_NUM_SWITCHES NUM_SWITCHES
#define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 14) + (SWITCH_3POS << 12) + (SWITCH_2POS << 10) + (SWITCH_3POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0)
#define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2);
#define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 3) + (SLIDER_WITH_DETENT << 2) + (SLIDER_WITH_DETENT << 3) + (SLIDER_WITH_DETENT << 2) + (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0)
#define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent
#define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 3) + (SLIDER_WITH_DETENT << 2) + (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0)
#elif defined(RADIO_X9DP2019)
#define NUM_SWITCHES 9
#define STORAGE_NUM_SWITCHES NUM_SWITCHES
@ -674,9 +706,15 @@ uint8_t isBacklightEnabled();
#if !defined(SIMU)
void usbJoystickUpdate();
#endif
#define USB_NAME "FrSky Taranis"
#define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */
#define USB_PRODUCT 'T', 'a', 'r', 'a', 'n', 'i', 's', ' ' /* 8 Bytes */
#if defined(RADIO_TX12)
#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 */
#else
#define USB_NAME "FrSky Taranis"
#define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */
#define USB_PRODUCT 'T', 'a', 'r', 'a', 'n', 'i', 's', ' ' /* 8 Bytes */
#endif
#if defined(__cplusplus) && !defined(SIMU)
}
@ -744,7 +782,6 @@ void audioEnd() ;
void dacStart();
void dacStop();
void setSampleRate(uint32_t frequency);
#define audioWaitReady()
#define VOLUME_LEVEL_MAX 23
#define VOLUME_LEVEL_DEF 12
#if !defined(SOFTWARE_VOLUME)
@ -848,7 +885,11 @@ void ledBlue();
#define IS_LCD_RESET_NEEDED() true
#define LCD_CONTRAST_MIN 10
#define LCD_CONTRAST_MAX 30
#define LCD_CONTRAST_DEFAULT 15
#if defined(RADIO_TX12)
#define LCD_CONTRAST_DEFAULT 21
#else
#define LCD_CONTRAST_DEFAULT 15
#endif
#endif
#if defined(PCBX9D) || defined(PCBX9E) || (defined(PCBX9DP) && PCBREV < 2019)

View file

@ -65,6 +65,21 @@
#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)
#define KEYS_GPIO_REG_PAGEUP GPIOD->IDR
#define KEYS_GPIO_PIN_PAGEUP GPIO_Pin_3 // PD.03
#define KEYS_GPIO_REG_PAGEDN GPIOD->IDR
#define KEYS_GPIO_PIN_PAGEDN GPIO_Pin_7 // PD.07
#define KEYS_GPIO_REG_EXIT GPIOB->IDR
#define KEYS_GPIO_PIN_EXIT GPIO_Pin_3 // PB.03
#define KEYS_GPIO_REG_ENTER GPIOA->IDR
#define KEYS_GPIO_PIN_ENTER GPIO_Pin_13 // PA.13
#define KEYS_GPIO_REG_SYS GPIOB->IDR
#define KEYS_GPIO_PIN_SYS GPIO_Pin_4 // PB.04
#define KEYS_GPIO_REG_MDL GPIOE->IDR
#define KEYS_GPIO_PIN_MDL GPIO_Pin_11 // PE.11
#define KEYS_GPIO_REG_TELE GPIOD->IDR
#define KEYS_GPIO_PIN_TELE GPIO_Pin_2 // PD.02
#elif defined(PCBX7)
#define KEYS_GPIO_REG_PAGE GPIOD->IDR
#define KEYS_GPIO_PIN_PAGE GPIO_Pin_3 // PD.03
@ -162,7 +177,23 @@
#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)
#define ROTARY_ENCODER_NAVIGATION
#define ROTARY_ENCODER_GPIO GPIOE
#define ROTARY_ENCODER_GPIO_PIN_A GPIO_Pin_9 // PE.9
#define ROTARY_ENCODER_GPIO_PIN_B GPIO_Pin_10 // PE.10
#define ROTARY_ENCODER_POSITION() ((ROTARY_ENCODER_GPIO->IDR >> 9) & 0x03)
#define ROTARY_ENCODER_EXTI_LINE1 EXTI_Line9
#define ROTARY_ENCODER_EXTI_LINE2 EXTI_Line10
#define ROTARY_ENCODER_EXTI_IRQn1 EXTI9_5_IRQn
#define ROTARY_ENCODER_EXTI_IRQHandler1 EXTI9_5_IRQHandler
#define ROTARY_ENCODER_EXTI_IRQn2 EXTI15_10_IRQn
#define ROTARY_ENCODER_EXTI_IRQHandler2 EXTI15_10_IRQHandler
#define ROTARY_ENCODER_EXTI_PortSource EXTI_PortSourceGPIOE
#define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource9
#define ROTARY_ENCODER_EXTI_PinSource2 EXTI_PinSource10
#endif
#if defined(ROTARY_ENCODER_NAVIGATION)
#define ROTARY_ENCODER_RCC_APB1Periph RCC_APB1Periph_TIM5
#define ROTARY_ENCODER_TIMER TIM5
@ -302,6 +333,11 @@
#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)
#define STORAGE_SWITCH_A
#define HARDWARE_SWITCH_A
#define SWITCHES_GPIO_REG_A GPIOC->IDR
#define SWITCHES_GPIO_PIN_A GPIO_Pin_13 // PC.13
#elif defined(PCBX7)
#define STORAGE_SWITCH_A
#define HARDWARE_SWITCH_A
@ -369,6 +405,13 @@
#define SWITCHES_GPIO_PIN_C_L GPIO_Pin_2 // PE.02
#define SWITCHES_GPIO_REG_C_H GPIOE->IDR
#define SWITCHES_GPIO_PIN_C_H GPIO_Pin_3 // PE.03
#elif defined(RADIO_TX12)
#define STORAGE_SWITCH_C
#define HARDWARE_SWITCH_C
#define SWITCHES_GPIO_REG_C_L GPIOD->IDR
#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(PCBX7)
#define STORAGE_SWITCH_C
#define HARDWARE_SWITCH_C
@ -411,6 +454,11 @@
#define SWITCHES_GPIO_PIN_D_L GPIO_Pin_4 // PB.04
#define SWITCHES_GPIO_REG_D_H GPIOB->IDR
#define SWITCHES_GPIO_PIN_D_H GPIO_Pin_5 // PB.05
#elif defined(RADIO_TX12)
#define STORAGE_SWITCH_D
#define HARDWARE_SWITCH_D
#define SWITCHES_GPIO_REG_D GPIOE->IDR
#define SWITCHES_GPIO_PIN_D GPIO_Pin_8 // PE.08
#elif defined(PCBX7)
#define STORAGE_SWITCH_D
#define HARDWARE_SWITCH_D
@ -452,6 +500,13 @@
#define HARDWARE_SWITCH_E
#define SWITCHES_GPIO_REG_E GPIOA->IDR
#define SWITCHES_GPIO_PIN_E GPIO_Pin_5 // PA.05
#elif defined(RADIO_TX12)
#define STORAGE_SWITCH_E
#define HARDWARE_SWITCH_E
#define SWITCHES_GPIO_REG_E_H GPIOE->IDR
#define SWITCHES_GPIO_PIN_E_H GPIO_Pin_13 // PE.13
#define SWITCHES_GPIO_REG_E_L GPIOE->IDR
#define SWITCHES_GPIO_PIN_E_L GPIO_Pin_7 // PE.07
#elif defined(PCBX7)
// no SWE
#else
@ -483,6 +538,13 @@
#define SWITCHES_GPIO_PIN_F GPIO_Pin_3 // PC.03
#elif defined(PCBX9LITE)
// no SWF
#elif defined(RADIO_TX12)
#define STORAGE_SWITCH_F
#define HARDWARE_SWITCH_F
#define SWITCHES_GPIO_REG_F_L GPIOE->IDR
#define SWITCHES_GPIO_PIN_F_L GPIO_Pin_1 // PE.01
#define SWITCHES_GPIO_REG_F_H GPIOE->IDR
#define SWITCHES_GPIO_PIN_F_H GPIO_Pin_2 // PE.02
#elif defined(PCBX7)
#define STORAGE_SWITCH_F
#define HARDWARE_SWITCH_F
@ -530,6 +592,7 @@
#define SWITCHES_GPIO_PIN_H GPIO_Pin_14 // PD.14
#elif defined(PCBXLITE) || defined(PCBX9LITE)
// no SWH
#elif defined(RADIO_TX12)
#elif defined(PCBX7)
#define STORAGE_SWITCH_H
#define HARDWARE_SWITCH_H
@ -558,6 +621,15 @@
#define SWITCHES_GPIO_REG_I GPIOC->IDR
#define SWITCHES_GPIO_PIN_I GPIO_Pin_13 // PC.13
#define STORAGE_SWITCH_J
#elif defined(RADIO_TX12)
#define STORAGE_SWITCH_I
#define HARDWARE_SWITCH_I
#define SWITCHES_GPIO_REG_I GPIOE->IDR
#define SWITCHES_GPIO_PIN_I GPIO_Pin_14 // PE.14
#define STORAGE_SWITCH_J
#define HARDWARE_SWITCH_J
#define SWITCHES_GPIO_REG_J GPIOD->IDR
#define SWITCHES_GPIO_PIN_J GPIO_Pin_14 // PD.14
#elif defined(PCBX7)
#define STORAGE_SWITCH_I
#define HARDWARE_SWITCH_I
@ -668,11 +740,18 @@
#define KEYS_GPIOC_PINS (GPIO_Pin_4 | GPIO_Pin_5)
#define KEYS_GPIOE_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14)
#elif defined(RADIO_T12)
#define KEYS_RCC_AHB1Periph (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_5
#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_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)
#define KEYS_GPIOB_PINS (GPIO_Pin_3 | GPIO_Pin_4)
#define KEYS_GPIOC_PINS (GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3|GPIO_Pin_13)
#define KEYS_GPIOD_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_15)
#define KEYS_GPIOE_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 |GPIO_Pin_8| GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15)
#elif defined(RADIO_X7ACCESS)
#define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE)
#define KEYS_GPIOA_PINS GPIO_Pin_5
@ -1079,8 +1158,10 @@
#define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream5_IRQHandler
#define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF5
#define INTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#elif defined(RADIO_T12)
#elif defined(RADIO_T12) || defined(RADIO_TX12)
#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
#define INTMODULE_PWR_GPIO GPIOC
#define INTMODULE_PWR_GPIO_PIN GPIO_Pin_6 // PC.06
#define INTMODULE_GPIO GPIOB
@ -1092,8 +1173,6 @@
#define INTMODULE_GPIO_AF GPIO_AF_USART3
#define INTMODULE_USART_IRQn USART3_IRQn
#define INTMODULE_USART_IRQHandler USART3_IRQHandler
#define INTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM2
#define INTMODULE_RCC_APB2Periph RCC_APB1Periph_USART3
#define INTMODULE_TIMER TIM2
#define INTMODULE_TIMER_IRQn TIM2_IRQn
#define INTMODULE_TIMER_IRQHandler TIM2_IRQHandler
@ -1169,30 +1248,6 @@
#define EXTMODULE_USART_TX_DMA_STREAM DMA2_Stream6
#define EXTMODULE_USART_RX_DMA_CHANNEL DMA_Channel_5
#define EXTMODULE_USART_RX_DMA_STREAM DMA2_Stream1
#elif defined(RADIO_T12)
//Jumper T12v2 external module configured
#define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
#define EXTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM8
#define EXTMODULE_PWR_GPIO GPIOD
#define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // JUMPER EXT PD.08 // X7 EXT is PD.08
#define EXTERNAL_MODULE_PWR_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN)
#define EXTERNAL_MODULE_PWR_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN)
#define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET)
#define EXTMODULE_TX_GPIO GPIOA
#define EXTMODULE_TX_GPIO_PIN GPIO_Pin_7 // JUMPER EXT PA.07 // X7 EXT is PA.07
#define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource7
#define EXTMODULE_TIMER TIM8
#define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM8 // TIM8_CH1N
#define EXTMODULE_TIMER_CC_IRQn TIM8_CC_IRQn
#define EXTMODULE_TIMER_CC_IRQHandler TIM8_CC_IRQHandler
#define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7
#define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1
#define EXTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream1_IRQn
#define EXTMODULE_TIMER_DMA_STREAM_IRQHandler DMA2_Stream1_IRQHandler
#define EXTMODULE_TIMER_DMA_FLAG_TC DMA_IT_TCIF1
#define EXTMODULE_TIMER_OUTPUT_ENABLE TIM_CCER_CC1NE
#define EXTMODULE_TIMER_OUTPUT_POLARITY TIM_CCER_CC1NP
#define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#elif defined(RADIO_X9DP2019)
#define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
#define EXTMODULE_RCC_APB2Periph (RCC_APB2Periph_TIM8 | RCC_APB2Periph_USART6)
@ -1217,22 +1272,22 @@
#define EXTMODULE_TIMER_OUTPUT_POLARITY TIM_CCER_CC2NP
#define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#else
#define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
#define EXTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM8
#define EXTMODULE_PWR_GPIO GPIOD
#define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08
#define EXTERNAL_MODULE_PWR_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN)
#define EXTERNAL_MODULE_PWR_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN)
#define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET)
#define EXTMODULE_TX_GPIO GPIOA
#define EXTMODULE_TX_GPIO_PIN GPIO_Pin_7 // PA.07
#define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource7
#define EXTMODULE_TIMER TIM8
#define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM8 // TIM8_CH1N
#define EXTMODULE_TIMER_CC_IRQn TIM8_CC_IRQn
#define EXTMODULE_TIMER_CC_IRQHandler TIM8_CC_IRQHandler
#define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7 // TIM8_UP
#define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1 // TIM8_UP
#define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
#define EXTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM8
#define EXTMODULE_PWR_GPIO GPIOD
#define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08
#define EXTERNAL_MODULE_PWR_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN)
#define EXTERNAL_MODULE_PWR_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN)
#define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET)
#define EXTMODULE_TX_GPIO GPIOA
#define EXTMODULE_TX_GPIO_PIN GPIO_Pin_7
#define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource7 // PA.07
#define EXTMODULE_TIMER TIM8
#define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM8 // TIM8_CH1N
#define EXTMODULE_TIMER_CC_IRQn TIM8_CC_IRQn
#define EXTMODULE_TIMER_CC_IRQHandler TIM8_CC_IRQHandler
#define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7
#define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1
#define EXTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream1_IRQn
#define EXTMODULE_TIMER_DMA_STREAM_IRQHandler DMA2_Stream1_IRQHandler
#define EXTMODULE_TIMER_DMA_FLAG_TC DMA_IT_TCIF1
@ -1376,7 +1431,7 @@
#define TELEMETRY_EXTI_IRQn EXTI9_5_IRQn
#define TELEMETRY_EXTI_TRIGGER EXTI_Trigger_Rising
#if defined(RADIO_X7) || defined(RADIO_X7ACCESS)
#if defined(RADIO_X7) || defined(RADIO_X7ACCESS) || defined(RADIO_TX12)
#define TELEMETRY_EXTI_REUSE_INTERRUPT_ROTARY_ENCODER
#elif defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019)
#define TELEMETRY_EXTI_IRQHandler EXTI9_5_IRQHandler
@ -1389,7 +1444,7 @@
#define TELEMETRY_TIMER_IRQHandler TIM1_TRG_COM_TIM11_IRQHandler
// PCBREV
#if defined(PCBX7)
#if defined(RADIO_X7)
#define PCBREV_RCC_AHB1Periph RCC_AHB1Periph_GPIOA
#define PCBREV_GPIO GPIOA
#define PCBREV_GPIO_PIN GPIO_Pin_14 // PA.14
@ -1472,7 +1527,7 @@
#define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource7
#define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line7
#define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI9_5_IRQn
#elif defined(RADIO_X7)
#elif defined(RADIO_X7) || defined(RADIO_TX12)
#define INTMODULE_HEARTBEAT
#define INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER
#define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOC
@ -1657,6 +1712,9 @@
#define KEYS_BACKLIGHT_RCC_AHB1Periph 0
// LCD driver
#if defined(RADIO_TX12) || defined(RADIO_T12)
#define LCD_VERTICAL_INVERT
#endif
#if defined(PCBX9E)
#define LCD_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1)
#define LCD_RCC_APB1Periph RCC_APB1Periph_SPI3
@ -1849,6 +1907,12 @@
#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)
#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
#define AUDIO_UNMUTE_DELAY 150 // ms
#define AUDIO_MUTE_DELAY 500 // ms
#else
#define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1)
#endif
@ -1937,7 +2001,7 @@
#define BT_TX_GPIO_PinSource GPIO_PinSource14
#define BT_RX_GPIO_PinSource GPIO_PinSource9
#define BT_USART_IRQHandler USART6_IRQHandler
#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITES) || defined(RADIO_X9DP2019)
#elif defined(RADIO_X7) || defined(RADIO_X7ACCESS) || defined(PCBXLITE) || defined(PCBX9LITES) || defined(RADIO_X9DP2019)
#define STORAGE_BLUETOOTH
#define BT_RCC_APB1Periph RCC_APB1Periph_USART3
#define BT_RCC_APB2Periph 0
@ -1969,7 +2033,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)
#elif defined(PCBX9D) || defined(PCBX9DP) || defined(RADIO_T12) || defined(RADIO_TX12)
#define STORAGE_BLUETOOTH
#define BT_RCC_AHB1Periph 0
#define BT_RCC_APB1Periph 0

View file

@ -37,6 +37,31 @@ uint32_t readKeys()
result |= 1 << KEY_PAGE;
#endif
#if defined(KEYS_GPIO_PIN_PAGEUP)
if (~KEYS_GPIO_REG_PAGEUP & KEYS_GPIO_PIN_PAGEUP)
result |= 1 << KEY_PAGEUP;
#endif
#if defined(KEYS_GPIO_PIN_PAGEDN)
if (~KEYS_GPIO_REG_PAGEDN & KEYS_GPIO_PIN_PAGEDN)
result |= 1 << KEY_PAGEDN;
#endif
#if defined(KEYS_GPIO_PIN_SYS)
if (~KEYS_GPIO_REG_SYS & KEYS_GPIO_PIN_SYS)
result |= 1 << KEY_SYS;
#endif
#if defined(KEYS_GPIO_PIN_MDL)
if (~KEYS_GPIO_REG_MDL & KEYS_GPIO_PIN_MDL)
result |= 1 << KEY_MODEL;
#endif
#if defined(KEYS_GPIO_PIN_TELE)
if (~KEYS_GPIO_REG_TELE & KEYS_GPIO_PIN_TELE)
result |= 1 << KEY_TELE;
#endif
if (~KEYS_GPIO_REG_EXIT & KEYS_GPIO_PIN_EXIT)
result |= 1 << KEY_EXIT;
@ -115,7 +140,7 @@ void readKeysAndTrims()
{
uint8_t index = 0;
uint32_t keys_input = readKeys();
for (uint8_t i = 1; i != uint8_t(1 << TRM_BASE); i <<= 1) {
for (unsigned i = 1; i != unsigned(1 << TRM_BASE); i <<= 1) {
keys[index++].input(keys_input & i);
}
@ -175,10 +200,15 @@ uint32_t switchState(uint8_t index)
uint32_t xxx = 0;
switch (index) {
#if defined(RADIO_TX12)
ADD_2POS_CASE(A);
ADD_3POS_CASE(B, 1);
ADD_3POS_CASE(C, 2);
#else
ADD_3POS_CASE(A, 0);
ADD_3POS_CASE(B, 1);
ADD_3POS_CASE(C, 2);
#endif
#if defined(PCBX9LITES)
ADD_2POS_CASE(D);
ADD_2POS_CASE(E);
@ -201,6 +231,10 @@ uint32_t switchState(uint8_t index)
ADD_2POS_CASE(H);
ADD_2POS_CASE(I);
// no SWJ on XLITE
#elif defined(RADIO_TX12)
ADD_2POS_CASE(D);
ADD_3POS_CASE(E, 4);
ADD_3POS_CASE(F, 5);
#elif defined(PCBX7)
ADD_3POS_CASE(D, 3);
ADD_2POS_CASE(F);

View file

@ -20,7 +20,7 @@
#include "opentx.h"
#if defined(RADIO_T12)
#if defined(RADIO_T12) || defined(RADIO_TX12)
#define LCD_CONTRAST_OFFSET -10
#else
#define LCD_CONTRAST_OFFSET 160
@ -107,8 +107,8 @@ void lcdHardwareInit()
#if LCD_W == 128
void lcdStart()
{
#if defined(RADIO_T12)
// Jumper has the screen inverted.
#if defined(LCD_VERTICAL_INVERT)
// T12 and TX12 have the screen inverted.
lcdWriteCommand(0xe2); // (14) Soft reset
lcdWriteCommand(0xa0); // Set seg
lcdWriteCommand(0xc8); // Set com
@ -201,7 +201,7 @@ void lcdRefresh(bool wait)
for (uint8_t y=0; y < 8; y++, p+=LCD_W) {
lcdWriteCommand(0x10); // Column addr 0
lcdWriteCommand(0xB0 | y); // Page addr y
#if !defined(RADIO_T12)
#if !defined(LCD_VERTICAL_INVERT)
lcdWriteCommand(0x04);
#endif

View file

@ -122,8 +122,8 @@ void telemetryPortInvertedInit(uint32_t baudrate)
probeTimeFromStartBit = 25;
break;
case 57600:
bitLength = 35; //34 was used before - I prefer to use use 35 because of lower error
probeTimeFromStartBit = 52; //round down - 48 used in original implementation
bitLength = 35;
probeTimeFromStartBit = 48;
break;
default:
bitLength = 2000000/baudrate; //because of 0,5 us tick

View file

@ -178,10 +178,9 @@ void processCrossfireTelemetryFrame()
case FLIGHT_MODE_ID:
{
const CrossfireSensor & sensor = crossfireSensors[FLIGHT_MODE_INDEX];
for (int i=0; i<min<int>(16, telemetryRxBuffer[1]-2); i+=4) {
uint32_t value = *((uint32_t *)&telemetryRxBuffer[3+i]);
setTelemetryValue(PROTOCOL_TELEMETRY_CROSSFIRE, sensor.id, 0, sensor.subId, value, sensor.unit, i);
}
auto textLength = min<int>(16, telemetryRxBuffer[1]);
telemetryRxBuffer[textLength] = '\0';
setTelemetryText(PROTOCOL_TELEMETRY_CROSSFIRE, sensor.id, 0, sensor.subId, (const char *)telemetryRxBuffer + 3);
break;
}

View file

@ -204,6 +204,7 @@ void TelemetryItem::setValue(const TelemetrySensor & sensor, int32_t val, uint32
}
}
else if (unit == UNIT_TEXT) {
// Should be handled at telemetry protocol level
return;
}
else {

View file

@ -26,6 +26,7 @@
constexpr int8_t TELEMETRY_SENSOR_TIMEOUT_UNAVAILABLE = -2;
constexpr int8_t TELEMETRY_SENSOR_TIMEOUT_OLD = -1;
constexpr int8_t TELEMETRY_SENSOR_TIMEOUT_START = 125; // * 160ms = 20s
constexpr uint8_t TELEMETRY_SENSOR_TEXT_LENGTH = 16;
class TelemetryItem
{
@ -74,7 +75,7 @@ class TelemetryItem
// pilot latitude is stored in max
// distFromEarthAxis is stored in value
} gps;
char text[16];
char text[TELEMETRY_SENSOR_TEXT_LENGTH];
};
TelemetryItem()

View file

@ -48,6 +48,11 @@ void checkTrainerSignalWarning()
}
#if defined(PCBSKY9X)
void stopTrainer()
{
stop_trainer_capture();
}
void checkTrainerSettings()
{
uint8_t requiredTrainerMode = SLAVE_MODE();
@ -55,50 +60,59 @@ void checkTrainerSettings()
if (requiredTrainerMode != currentTrainerMode) {
currentTrainerMode = requiredTrainerMode;
if (requiredTrainerMode)
stop_trainer_capture();
stopTrainer();
else
init_trainer_capture();
}
}
#else
void stopTrainer()
{
switch (currentTrainerMode) {
case TRAINER_MODE_MASTER_TRAINER_JACK:
stop_trainer_capture();
break;
case TRAINER_MODE_SLAVE:
stop_trainer_ppm();
break;
#if defined(TRAINER_MODULE_CPPM)
case TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE:
stop_trainer_module_cppm();
break;
#endif
#if defined(TRAINER_MODULE_SBUS)
case TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE:
stop_trainer_module_sbus();
break;
#endif
#if defined(TRAINER_BATTERY_COMPARTMENT)
case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT:
#if defined(AUX_SERIAL)
if (g_eeGeneral.auxSerialMode == UART_MODE_SBUS_TRAINER)
auxSerialStop();
#endif
#if defined(AUX2_SERIAL)
if (g_eeGeneral.aux2SerialMode == UART_MODE_SBUS_TRAINER)
aux2SerialStop();
#endif
break;
#endif
}
currentTrainerMode = 0xFF;
}
void checkTrainerSettings()
{
uint8_t requiredTrainerMode = g_model.trainerData.mode;
if (requiredTrainerMode != currentTrainerMode) {
switch (currentTrainerMode) {
case TRAINER_MODE_MASTER_TRAINER_JACK:
stop_trainer_capture();
break;
case TRAINER_MODE_SLAVE:
stop_trainer_ppm();
break;
#if defined(TRAINER_MODULE_CPPM)
case TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE:
stop_trainer_module_cppm();
break;
#endif
#if defined(TRAINER_MODULE_SBUS)
case TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE:
stop_trainer_module_sbus();
break;
#endif
#if defined(HARDWARE_TRAINER_AUX_SERIAL)
case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT:
#if defined(AUX_SERIAL)
if (g_eeGeneral.auxSerialMode == UART_MODE_SBUS_TRAINER)
auxSerialStop();
#endif
#if defined(AUX2_SERIAL)
if (g_eeGeneral.aux2SerialMode == UART_MODE_SBUS_TRAINER)
aux2SerialStop();
#endif
break;
#endif
if (currentTrainerMode != 0xFF) {
stopTrainer();
}
currentTrainerMode = requiredTrainerMode;
@ -120,7 +134,7 @@ void checkTrainerSettings()
break;
#endif
#if defined(HARDWARE_TRAINER_AUX_SERIAL)
#if defined(TRAINER_BATTERY_COMPARTMENT)
case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT:
#if defined(AUX_SERIAL)
if (g_eeGeneral.auxSerialMode == UART_MODE_SBUS_TRAINER)

View file

@ -35,6 +35,7 @@ extern uint8_t currentTrainerMode;
void checkTrainerSignalWarning();
void checkTrainerSettings();
void stopTrainer();
void forceResetTrainerSettings();
// Needs to be inlined to avoid slow function calls in ISR routines

View file

@ -291,6 +291,9 @@
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Dolů\0""Nhoru""Vprvo""Vlevo"
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Mínus"

View file

@ -300,6 +300,9 @@
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"

View file

@ -300,6 +300,9 @@
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"

View file

@ -297,6 +297,9 @@
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"

View file

@ -318,6 +318,9 @@
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"

View file

@ -320,6 +320,9 @@
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Moins"

View file

@ -324,6 +324,9 @@
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"

View file

@ -298,6 +298,9 @@
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"

View file

@ -318,6 +318,9 @@
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"

View file

@ -305,8 +305,22 @@
#define LEN_VSWASHTYPE "\004"
#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0"
#define LEN_VKEYS "\005"
#define TR_VKEYS TR("Menu\0""Sair\0""Desce""Sobe\0""Direi""Esqda", "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus")
#if defined(PCBHORUS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "PGUP\0""PGDN\0""ENTER""MDL\0 ""RTN\0 ""TELE\0""SYS\0 "
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
#else
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Ned\0 ""Upp\0 ""Höger""Vänst"
#endif
#define LEN_VSWITCHES "\003"
#define LEN_VSRCRAW "\004"

View file

@ -310,11 +310,14 @@
#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0 "
#if defined(PCBHORUS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "PGUP\0""PGDN\0""ENTER""MDL\0 ""RTN\0 ""TELE\0""SYS\0 "
#define LEN_VKEYS "\005"
#define TR_VKEYS "PGUP\0""PGDN\0""ENTER""MDL\0 ""RTN\0 ""TELE\0""SYS\0 "
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(RADIO_TX12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Up\0 ""Down\0""SYS\0 ""MDL\0 ""TELE\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"

View file

@ -44,6 +44,9 @@
#elif defined(RADIO_T12)
#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"SG\0" STR_CHAR_SWITCH"SH\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(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"

View file

@ -146,6 +146,11 @@ def main():
cmake_options["PCBREV"] = "T12"
firmware_options = options_jumper_t12
maxsize = 65536 * 8
elif board_name == "tx12":
cmake_options["PCB"] = "X7"
cmake_options["PCBREV"] = "TX12"
firmware_options = options_radiomaster_tx12
maxsize = 65536 * 8
elif board_name == "t16":
cmake_options["PCB"] = "X10"
cmake_options["PCBREV"] = "T16"

View file

@ -246,6 +246,18 @@ options_jumper_t18 = {
"bluetooth": ("BLUETOOTH", "YES", "NO"),
}
options_radiomaster_tx12 = {
"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")
}
options_radiomaster_tx16s = {
"noheli": ("HELI", "NO", "YES"),
"ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"),

View file

@ -70,6 +70,10 @@ cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=T12 ${SRCDIR}
make -j${JOBS} libsimulator
rm CMakeCache.txt
cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=TX12 ${SRCDIR}
make -j${JOBS} libsimulator
rm CMakeCache.txt
cmake ${COMMON_OPTIONS} -DPCB=X9D ${SRCDIR}
make -j${JOBS} libsimulator
rm CMakeCache.txt

View file

@ -70,6 +70,10 @@ cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=T12 ${SRCDIR}
make -j${JOBS} libsimulator
rm CMakeCache.txt
cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=TX12 ${SRCDIR}
make -j${JOBS} libsimulator
rm CMakeCache.txt
cmake ${COMMON_OPTIONS} -DPCB=X9D ${SRCDIR}
make -j${JOBS} libsimulator
rm CMakeCache.txt

View file

@ -18,6 +18,16 @@ boards = {
"PCB": "X10",
"PCBREV": "TX16S",
"DEFAULT_MODE": "2",
},
"TX12_1": {
"PCB": "X7",
"PCBREV": "TX12",
"DEFAULT_MODE": "1",
},
"TX12_2": {
"PCB": "X7",
"PCBREV": "TX12",
"DEFAULT_MODE": "2",
}
}

View file

@ -112,6 +112,15 @@ if [[ " X7 ALL " =~ \ ${FLAVOR}\ ]] ; then
make -j"${CORES}" tests-radio
fi
if [[ " X7ACCESS X7 ALL " =~ \ ${FLAVOR}\ ]] ; then
# OpenTX on X7 ACCESS
rm -rf ./*
cmake "${COMMON_OPTIONS}" -DPCB=X7 -DPCBREV=ACCESS -DHELI=YES -DGVARS=YES "${SRCDIR}"
make -j"${CORES}" ${FIRMARE_TARGET}
make -j"${CORES}" libsimulator
make -j"${CORES}" tests-radio
fi
if [[ " T12 X7 ALL " =~ \ ${FLAVOR}\ ]] ; then
# OpenTX on T12
rm -rf ./* || true
@ -121,6 +130,15 @@ if [[ " T12 X7 ALL " =~ \ ${FLAVOR}\ ]] ; then
make -j"${CORES}" tests-radio
fi
if [[ " TX12 X7 ALL " =~ \ ${FLAVOR}\ ]] ; then
# OpenTX on TX12
rm -rf ./*
cmake "${COMMON_OPTIONS}" -DPCB=X7 -DPCBREV=TX12 -DHELI=YES -DGVARS=YES "${SRCDIR}"
make -j"${CORES}" ${FIRMARE_TARGET}
make -j"${CORES}" libsimulator
make -j"${CORES}" tests-radio
fi
if [[ " XLITE ALL " =~ \ ${FLAVOR}\ ]] ; then
# OpenTX on X-Lite
rm -rf ./* || true