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) set(FLAVOUR x7access)
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL T12) elseif(PCB STREQUAL X7 AND PCBREV STREQUAL T12)
set(FLAVOUR t12) set(FLAVOUR t12)
elseif(PCB STREQUAL X7 AND PCBREV STREQUAL TX12)
set(FLAVOUR tx12)
elseif(PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019) elseif(PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019)
set(FLAVOUR x9d+2019) set(FLAVOUR x9d+2019)
elseif(PCB STREQUAL X10 AND PCBREV STREQUAL EXPRESS) 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-x.png</file>
<file>images/simulator/JumperT12/JumperT12-center.png</file> <file>images/simulator/JumperT12/JumperT12-center.png</file>
<file>images/simulator/JumperT12/JumperT12-top.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/left.png</file>
<file>images/simulator/JumperT16/right.png</file> <file>images/simulator/JumperT16/right.png</file>
<file>images/simulator/JumperT16/top.png</file> <file>images/simulator/JumperT16/top.png</file>

View file

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

View file

@ -52,9 +52,10 @@ namespace Board {
BOARD_JUMPER_T16, BOARD_JUMPER_T16,
BOARD_RADIOMASTER_TX16S, BOARD_RADIOMASTER_TX16S,
BOARD_JUMPER_T18, BOARD_JUMPER_T18,
BOARD_RADIOMASTER_TX12,
}; };
constexpr int BOARD_TYPE_MAX = BOARD_JUMPER_T18; constexpr int BOARD_TYPE_MAX = BOARD_RADIOMASTER_TX12;
enum PotType enum PotType
{ {
@ -218,11 +219,21 @@ inline bool IS_RADIOMASTER_TX16S(Board::Type board)
return board == Board::BOARD_RADIOMASTER_TX16S; 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) inline bool IS_FAMILY_T16(Board::Type board)
{ {
return board == Board::BOARD_JUMPER_T16 || board == Board::BOARD_RADIOMASTER_TX16S || board == Board::BOARD_JUMPER_T18; 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) inline bool IS_TARANIS_XLITE(Board::Type board)
{ {
return board == Board::BOARD_TARANIS_XLITE || board == Board::BOARD_TARANIS_XLITES; 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; 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) 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) 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[0] = Board::POT_WITHOUT_DETENT;
potConfig[1] = Board::POT_WITH_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[0] = Board::POT_WITH_DETENT;
potConfig[1] = 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[0] = Board::POT_WITH_DETENT;
potConfig[1] = 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)) { if (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType)) {
strncpy(switchName[4], switchName[5], sizeof(switchName[0])); strncpy(switchName[4], switchName[5], sizeof(switchName[0]));
strncpy(switchName[5], switchName[7], 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)) { if (IS_TARANIS_X9(cstate.toType) || IS_FAMILY_HORUS_OR_T16(cstate.toType)) {
strncpy(switchName[5], switchName[4], sizeof(switchName[0])); strncpy(switchName[5], switchName[4], sizeof(switchName[0]));
strncpy(switchName[7], switchName[5], 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)) if (IS_TARANIS_X9D(board))
return 9; return 9;
if (IS_JUMPER_T12(board)) if (IS_FAMILY_T12(board))
return 8; return 8;
return Boards::getCapability(board, Board::Switches); return Boards::getCapability(board, Board::Switches);

View file

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

View file

@ -66,6 +66,8 @@ const char * OpenTxEepromInterface::getName()
return "OpenTX for Jumper T18"; return "OpenTX for Jumper T18";
case BOARD_RADIOMASTER_TX16S: case BOARD_RADIOMASTER_TX16S:
return "OpenTX for Radiomaster TX16S"; return "OpenTX for Radiomaster TX16S";
case BOARD_RADIOMASTER_TX12:
return "OpenTX for Radiomaster TX12";
case BOARD_TARANIS_X9D: case BOARD_TARANIS_X9D:
return "OpenTX for FrSky Taranis X9D"; return "OpenTX for FrSky Taranis X9D";
case BOARD_TARANIS_X9DP: case BOARD_TARANIS_X9DP:
@ -334,7 +336,9 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u
else if (IS_JUMPER_T12(board)) { else if (IS_JUMPER_T12(board)) {
variant |= JUMPER_T12_VARIANT; variant |= JUMPER_T12_VARIANT;
} }
else if (IS_RADIOMASTER_TX12(board)) {
variant |= RADIOMASTER_TX12_VARIANT;
}
OpenTxGeneralData generator((GeneralSettings &)radioData.generalSettings, board, version, variant); OpenTxGeneralData generator((GeneralSettings &)radioData.generalSettings, board, version, variant);
// generator.dump(); // generator.dump();
QByteArray data; QByteArray data;
@ -520,7 +524,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case MaxVolume: case MaxVolume:
return 23; return 23;
case MaxContrast: case MaxContrast:
if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board)) if (IS_TARANIS_SMALL(board))
return 30; return 30;
else else
return 45; return 45;
@ -615,7 +619,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case LcdWidth: case LcdWidth:
if (IS_FAMILY_HORUS_OR_T16(board)) if (IS_FAMILY_HORUS_OR_T16(board))
return 480; return 480;
else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board)) else if (IS_TARANIS_SMALL(board))
return 128; return 128;
else if (IS_TARANIS(board)) else if (IS_TARANIS(board))
return 212; return 212;
@ -629,7 +633,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case LcdDepth: case LcdDepth:
if (IS_FAMILY_HORUS_OR_T16(board)) if (IS_FAMILY_HORUS_OR_T16(board))
return 16; return 16;
else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board)) else if (IS_TARANIS_SMALL(board))
return 1; return 1;
else if (IS_TARANIS(board)) else if (IS_TARANIS(board))
return 4; return 4;
@ -679,6 +683,8 @@ int OpenTxFirmware::getCapability(::Capability capability)
return TARANIS_XLITE_VARIANT; return TARANIS_XLITE_VARIANT;
else if (IS_JUMPER_T12(board)) else if (IS_JUMPER_T12(board))
return JUMPER_T12_VARIANT; return JUMPER_T12_VARIANT;
else if (IS_RADIOMASTER_TX12(board))
return RADIOMASTER_TX12_VARIANT;
else else
return 0; return 0;
case MavlinkTelemetry: case MavlinkTelemetry:
@ -733,9 +739,9 @@ bool OpenTxFirmware::isAvailable(PulsesProtocol proto, int port)
return true; return true;
case PULSES_PXX_XJT_X16: case PULSES_PXX_XJT_X16:
case PULSES_PXX_XJT_LR12: 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: 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_ACCESS_ISRM:
case PULSES_ACCST_ISRM_D16: case PULSES_ACCST_ISRM_D16:
return IS_ACCESS_RADIO(board, id); return IS_ACCESS_RADIO(board, id);
@ -943,6 +949,11 @@ bool OpenTxEepromInterface::checkVariant(unsigned int version, unsigned int vari
variantError = true; variantError = true;
} }
} }
else if (IS_RADIOMASTER_TX12(board)) {
if (variant != RADIOMASTER_TX12_VARIANT) {
variantError = true;
}
}
else if (IS_TARANIS(board)) { else if (IS_TARANIS(board)) {
if (variant != 0) { if (variant != 0) {
variantError = true; variantError = true;
@ -1273,6 +1284,16 @@ void registerOpenTxFirmwares()
addOpenTxRfOptions(firmware, FLEX); addOpenTxRfOptions(firmware, FLEX);
registerOpenTxFirmware(firmware); 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 */ /* Radiomaster TX16S board */
firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16S / SE / Hall / Masterfire"), BOARD_RADIOMASTER_TX16S); firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16S / SE / Hall / Masterfire"), BOARD_RADIOMASTER_TX16S);
addOpenTxFrskyOptions(firmware); addOpenTxFrskyOptions(firmware);

View file

@ -364,7 +364,7 @@ RawSource RawSource::convert(RadioDataConversionState & cstate)
if (index >= 0) if (index >= 0)
evt = RadioDataConversionState::EVT_CVRT; 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 // No SE and SG on T12 board
index = toSwitchList.indexOf("SD"); index = toSwitchList.indexOf("SD");
if (index >= 0) if (index >= 0)

View file

@ -200,7 +200,7 @@ RawSwitch RawSwitch::convert(RadioDataConversionState & cstate)
if (newIdx >= 0) if (newIdx >= 0)
evt = RadioDataConversionState::EVT_CVRT; 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 // No SE and SG on T12 board
newIdx = toSwitchList.indexOf("SD"); newIdx = toSwitchList.indexOf("SD");
if (newIdx >= 0) if (newIdx >= 0)

View file

@ -47,7 +47,15 @@ void HardwarePanel::setupSwitchType(int index, QLabel * label, AutoLineEdit * na
label->setText("SJ"); 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) { if (index == 4) {
label->setText("SG"); 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): HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings, Firmware * firmware):
GeneralPanel(parent, generalSettings, firmware), GeneralPanel(parent, generalSettings, firmware),
ui(new Ui::Hardware) ui(new Ui::Hardware)
@ -147,17 +164,17 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings
setupSliderType(2, ui->ls2Label, ui->ls2Name, ui->ls2Type); setupSliderType(2, ui->ls2Label, ui->ls2Name, ui->ls2Type);
setupSliderType(3, ui->rs2Label, ui->rs2Name, ui->rs2Type); setupSliderType(3, ui->rs2Label, ui->rs2Name, ui->rs2Type);
setupSwitchType(0, ui->saLabel, ui->saName, ui->saType); setupSwitchType(0, ui->saLabel, ui->saName, ui->saType, isSwitch3Pos(0));
setupSwitchType(1, ui->sbLabel, ui->sbName, ui->sbType); setupSwitchType(1, ui->sbLabel, ui->sbName, ui->sbType, isSwitch3Pos(1));
setupSwitchType(2, ui->scLabel, ui->scName, ui->scType); setupSwitchType(2, ui->scLabel, ui->scName, ui->scType, isSwitch3Pos(2));
setupSwitchType(3, ui->sdLabel, ui->sdName, ui->sdType); setupSwitchType(3, ui->sdLabel, ui->sdName, ui->sdType, isSwitch3Pos(3));
setupSwitchType(4, ui->seLabel, ui->seName, ui->seType); setupSwitchType(4, ui->seLabel, ui->seName, ui->seType, isSwitch3Pos(4));
setupSwitchType(5, ui->sfLabel, ui->sfName, ui->sfType, false); //switch does not support 3POS setupSwitchType(5, ui->sfLabel, ui->sfName, ui->sfType, isSwitch3Pos(5));
setupSwitchType(6, ui->sgLabel, ui->sgName, ui->sgType); setupSwitchType(6, ui->sgLabel, ui->sgName, ui->sgType, isSwitch3Pos(6));
setupSwitchType(7, ui->shLabel, ui->shName, ui->shType, false); //switch does not support 3POS setupSwitchType(7, ui->shLabel, ui->shName, ui->shType, isSwitch3Pos(7));
setupSwitchType(8, ui->siLabel, ui->siName, ui->siType); setupSwitchType(8, ui->siLabel, ui->siName, ui->siType, isSwitch3Pos(8));
setupSwitchType(9, ui->sjLabel, ui->sjName, ui->sjType); setupSwitchType(9, ui->sjLabel, ui->sjName, ui->sjType, isSwitch3Pos(9));
setupSwitchType(10, ui->skLabel, ui->skName, ui->skType); setupSwitchType(10, ui->skLabel, ui->skName, ui->skType); // Here starts X9E, only 3 switches
setupSwitchType(11, ui->slLabel, ui->slName, ui->slType); setupSwitchType(11, ui->slLabel, ui->slName, ui->slType);
setupSwitchType(12, ui->smLabel, ui->smName, ui->smType); setupSwitchType(12, ui->smLabel, ui->smName, ui->smType);
setupSwitchType(13, ui->snLabel, ui->snName, ui->snType); setupSwitchType(13, ui->snLabel, ui->snName, ui->snType);

View file

@ -63,6 +63,7 @@ class HardwarePanel : public GeneralPanel
Ui::Hardware *ui; Ui::Hardware *ui;
void setValues(); void setValues();
bool isSwitch3Pos(int idx);
}; };
#endif // _HARDWARE_H_ #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].x = spnx[index]->value();
model->curves[currentCurve].points[index].y = spny[index]->value(); model->curves[currentCurve].points[index].y = spny[index]->value();
updateCurve(); updateCurve();
updateCurvePoints();
emit modified(); emit modified();
} }
} }

View file

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

View file

@ -115,6 +115,7 @@ namespace Ui {
class SimulatedUIWidgetJumperT16; class SimulatedUIWidgetJumperT16;
class SimulatedUIWidgetJumperT18; class SimulatedUIWidgetJumperT18;
class SimulatedUIWidgetTX16S; class SimulatedUIWidgetTX16S;
class SimulatedUIWidgetTX12;
} }
class SimulatedUIWidget9X: public SimulatedUIWidget class SimulatedUIWidget9X: public SimulatedUIWidget
@ -265,6 +266,19 @@ class SimulatedUIWidgetJumperT18: public SimulatedUIWidget
Ui::SimulatedUIWidgetJumperT18 * ui; 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 class SimulatedUIWidgetTX16S: public SimulatedUIWidget
{ {
Q_OBJECT 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: case Board::BOARD_JUMPER_T18:
radioUiWidget = new SimulatedUIWidgetJumperT18(simulator, this); radioUiWidget = new SimulatedUIWidgetJumperT18(simulator, this);
break; break;
case Board::BOARD_RADIOMASTER_TX12:
radioUiWidget = new SimulatedUIWidgetTX12(simulator, this);
break;
case Board::BOARD_RADIOMASTER_TX16S: case Board::BOARD_RADIOMASTER_TX16S:
radioUiWidget = new SimulatedUIWidgetTX16S(simulator, this); radioUiWidget = new SimulatedUIWidgetTX16S(simulator, this);
break; break;

View file

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

File diff suppressed because it is too large Load diff

View file

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

View file

@ -214,7 +214,13 @@ enum ModuleIndex {
}; };
#endif #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 #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

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

View file

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

View file

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

View file

@ -203,7 +203,16 @@ void menuModelSelect(event_t event)
} }
break; 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): case EVT_KEY_LONG(KEY_PAGE):
chainMenu(menuTabModel[DIM(menuTabModel)-1]); chainMenu(menuTabModel[DIM(menuTabModel)-1]);
killEvents(event); killEvents(event);

View file

@ -236,14 +236,7 @@ void menuModelTelemetry(event_t event)
break; break;
case ITEM_TELEMETRY_RSSI_LABEL: case ITEM_TELEMETRY_RSSI_LABEL:
#if defined(MULTIMODULE) lcdDrawTextAlignedLeft(y, getRssiLabel());
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
break; break;
case ITEM_TELEMETRY_RSSI_SOURCE: { case ITEM_TELEMETRY_RSSI_SOURCE: {

View file

@ -42,7 +42,10 @@ enum AboutScreens {
#define ABOUT_X 2 #define ABOUT_X 2
#define ABOUT_INDENT 4 #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_PREVIOUS_VIEW EVT_KEY_LONG(KEY_PAGE)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE) #define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE)
#else #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_BAR_WIDTH = 70;
constexpr coord_t CHANNEL_PROPERTIES_OFFSET = CHANNEL_GAUGE_OFFSET + CHANNEL_BAR_WIDTH + 2; 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_PREVIOUS_VIEW EVT_KEY_LONG(KEY_PAGE)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE) #define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE)
#define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT #define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT
@ -54,7 +59,7 @@ void menuChannelsViewCommon(event_t event)
memclear(&reusableBuffer.viewChannels, sizeof(reusableBuffer.viewChannels)); memclear(&reusableBuffer.viewChannels, sizeof(reusableBuffer.viewChannels));
break; break;
case EVT_KEY_FIRST(KEY_ENTER): case EVT_KEY_BREAK(KEY_ENTER):
reusableBuffer.viewChannels.mixersView = !reusableBuffer.viewChannels.mixersView; reusableBuffer.viewChannels.mixersView = !reusableBuffer.viewChannels.mixersView;
break; break;
} }

View file

@ -286,7 +286,16 @@ void displayVoltageOrAlarm()
#define displayVoltageOrAlarm() displayBattVoltage() #define displayVoltageOrAlarm() displayBattVoltage()
#endif #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_CONTEXT_MENU EVT_KEY_LONG(KEY_ENTER)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE) #define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE)
#define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT #define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT

View file

@ -31,14 +31,21 @@ void menuStatisticsView(event_t event)
switch (event) { switch (event) {
case EVT_KEY_FIRST(KEY_UP): 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): case EVT_KEY_BREAK(KEY_PAGE):
#endif #endif
chainMenu(menuStatisticsDebug); chainMenu(menuStatisticsDebug);
break; break;
case EVT_KEY_FIRST(KEY_DOWN): 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): case EVT_KEY_LONG(KEY_PAGE):
killEvents(event); killEvents(event);
chainMenu(menuStatisticsDebug2); chainMenu(menuStatisticsDebug2);
@ -133,7 +140,12 @@ void menuStatisticsDebug(event_t event)
break; break;
case EVT_KEY_FIRST(KEY_UP): 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): case EVT_KEY_BREAK(KEY_PAGE):
disableVBatBridge(); disableVBatBridge();
chainMenu(menuStatisticsDebug2); chainMenu(menuStatisticsDebug2);
@ -141,7 +153,9 @@ void menuStatisticsDebug(event_t event)
#endif #endif
case EVT_KEY_FIRST(KEY_DOWN): 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): case EVT_KEY_LONG(KEY_PAGE):
#endif #endif
killEvents(event); killEvents(event);
@ -264,14 +278,18 @@ void menuStatisticsDebug2(event_t event)
break; break;
case EVT_KEY_FIRST(KEY_UP): 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): case EVT_KEY_BREAK(KEY_PAGE):
#endif #endif
chainMenu(menuStatisticsView); chainMenu(menuStatisticsView);
return; return;
case EVT_KEY_FIRST(KEY_DOWN): 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): case EVT_KEY_LONG(KEY_PAGE):
#endif #endif
killEvents(event); killEvents(event);

View file

@ -227,14 +227,7 @@ void menuModelTelemetry(event_t event)
break; break;
case ITEM_TELEMETRY_RSSI_LABEL: case ITEM_TELEMETRY_RSSI_LABEL:
#if defined(MULTIMODULE) lcdDrawTextAlignedLeft(y, getRssiLabel());
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
break; break;
case ITEM_TELEMETRY_RSSI_SOURCE: { case ITEM_TELEMETRY_RSSI_SOURCE: {

View file

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

View file

@ -479,6 +479,13 @@ void menuModelMixAll(event_t event)
s_currCh = ch; s_currCh = ch;
if (!s_copyMode) { if (!s_copyMode) {
attr = INVERS; 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) { 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) #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_TX12)
#define SWITCH_TYPE_MAX(sw) ((MIXSRC_SA - MIXSRC_FIRST_SWITCH == sw || MIXSRC_SD - MIXSRC_FIRST_SWITCH == sw) ? SWITCH_2POS : SWITCH_3POS)
#else #else
#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)
#endif #endif

View file

@ -34,6 +34,9 @@ enum NavigationDirection {
#if defined(NAVIGATION_XLITE) #if defined(NAVIGATION_XLITE)
#define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_LEFT) && IS_SHIFT_PRESSED()) #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()) #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) #elif defined(NAVIGATION_X7) || defined(NAVIGATION_X9D)
#define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_PAGE)) #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_PAGE))
#define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_BREAK(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) { if (menuTab) {
int cc = curr; int cc = curr;
switch (event) { switch (event) {
#if defined(NAVIGATION_X7_TX12)
case EVT_KEY_FIRST(KEY_PAGEUP):
#else
case EVT_KEY_LONG(KEY_PAGE): case EVT_KEY_LONG(KEY_PAGE):
#endif
if (s_editMode>0) if (s_editMode>0)
break; break;
@ -228,7 +232,11 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t
killEvents(event); killEvents(event);
break; break;
#if defined(NAVIGATION_X7_TX12)
case EVT_KEY_FIRST(KEY_PAGEDN):
#else
case EVT_KEY_BREAK(KEY_PAGE): case EVT_KEY_BREAK(KEY_PAGE):
#endif
if (s_editMode>0) if (s_editMode>0)
break; break;

View file

@ -28,5 +28,6 @@ if(PYTHONINTERP_FOUND)
add_lua_export_target(x10 ${LUA_INCLUDES} -DPCBHORUS -DPCBX10) add_lua_export_target(x10 ${LUA_INCLUDES} -DPCBHORUS -DPCBX10)
add_lua_export_target(x12s ${LUA_INCLUDES} -DPCBHORUS -DPCBX12S) add_lua_export_target(x12s ${LUA_INCLUDES} -DPCBHORUS -DPCBX12S)
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(tx12 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_TX12)
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

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

View file

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

View file

@ -52,7 +52,7 @@ uint8_t createGhostChannelsFrame(uint8_t * frame, int16_t * pulses)
uint32_t bits = 0; uint32_t bits = 0;
uint8_t bitsavailable = 0; uint8_t bitsavailable = 0;
for (int i = 0; i < 4; i++) { 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; bits |= value << bitsavailable;
bitsavailable += GHST_CH_BITS_12; bitsavailable += GHST_CH_BITS_12;
while (bitsavailable >= 8) { while (bitsavailable >= 8) {
@ -64,7 +64,8 @@ uint8_t createGhostChannelsFrame(uint8_t * frame, int16_t * pulses)
// second 4 lower speed, 8 bit channels // second 4 lower speed, 8 bit channels
for (int i = 4; i < 8; ++i) { 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); *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 #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_ #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 #define OTX_FOURCC 0x3978746F // otx for Taranis X-Lite
#elif defined(RADIO_T12) #elif defined(RADIO_T12)
#define OTX_FOURCC 0x3D78746F // otx for Jumper T12 #define OTX_FOURCC 0x3D78746F // otx for Jumper T12
#elif defined(RADIO_TX12)
#define OTX_FOURCC 0x4178746F // otx for Radiomaster TX12
#elif defined(PCBX7) #elif defined(PCBX7)
#define OTX_FOURCC 0x3678746F // otx for Taranis X7 / X7S / X7 Express / X7S Express #define OTX_FOURCC 0x3678746F // otx for Taranis X7 / X7S / X7 Express / X7S Express
#elif defined(PCBX9LITES) #elif defined(PCBX9LITES)

View file

@ -334,6 +334,14 @@ 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)
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) #elif defined(PCBTARANIS)
KEY_Page_Up, KEY_MENU, KEY_Page_Up, KEY_MENU,
#if defined(KEYS_GPIO_REG_PAGE) #if defined(KEYS_GPIO_REG_PAGE)

View file

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

View file

@ -313,7 +313,7 @@ char * getSwitchName(char * dest, swsrc_t idx)
} }
else { else {
*dest++ = 'S'; *dest++ = 'S';
#if defined(PCBX7) #if defined(PCBX7) && !defined(RADIO_TX12)
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

@ -126,9 +126,15 @@ uint64_t check3PosSwitchPosition(uint8_t idx, uint8_t sw, bool startup)
void getSwitchesPosition(bool startup) void getSwitchesPosition(bool startup)
{ {
uint64_t newPos = 0; 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(0, SW_SA);
CHECK_3POS(1, SW_SB); CHECK_3POS(1, SW_SB);
CHECK_3POS(2, SW_SC); CHECK_3POS(2, SW_SC);
#endif
#if defined(PCBX9LITES) #if defined(PCBX9LITES)
CHECK_2POS(SW_SD); CHECK_2POS(SW_SD);
@ -146,6 +152,10 @@ 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_TX12)
CHECK_2POS(SW_SD);
CHECK_3POS(2, SW_SE);
CHECK_3POS(3, SW_SF);
#elif defined(PCBX7) #elif defined(PCBX7)
CHECK_3POS(3, SW_SD); CHECK_3POS(3, SW_SD);
CHECK_2POS(SW_SF); 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}; const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,-1, 1,1, 1, 1};
#elif defined(PCBX9D) #elif defined(PCBX9D)
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)
const int8_t adcDirection[NUM_ANALOGS] = {-1,1,-1,1, -1,-1, 1, 1};
#elif defined(PCBX7) #elif defined(PCBX7)
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(PCBX9LITE) #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() endif()
if(PCB STREQUAL X7 OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES) if(BLUETOOTH)
set(BOOTLOADER_SRC set(BOOTLOADER_SRC
${BOOTLOADER_SRC} ${BOOTLOADER_SRC}
../../../../../targets/common/arm/stm32/bluetooth_driver.cpp ../../../../../targets/common/arm/stm32/bluetooth_driver.cpp

View file

@ -247,7 +247,7 @@ int main()
backlightInit(); backlightInit();
backlightEnable(); 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 // we shutdown the bluetooth module now to be sure it will be detected on firmware start
bluetoothInit(BLUETOOTH_DEFAULT_BAUDRATE, false); bluetoothInit(BLUETOOTH_DEFAULT_BAUDRATE, false);
#endif #endif

View file

@ -71,7 +71,7 @@ void rotaryEncoderInit()
void rotaryEncoderCheck() 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; static uint8_t state = 0;
uint8_t pins = ROTARY_ENCODER_POSITION(); 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_MANUFACTURER 'J', 'u', 'm', 'p', 'e', 'r', ' ', ' ' /* 8 bytes */
#define USB_PRODUCT 'T', '1', '8', ' ', ' ', ' ', ' ', ' ' /* 8 Bytes */ #define USB_PRODUCT 'T', '1', '8', ' ', ' ', ' ', ' ', ' ' /* 8 Bytes */
#elif defined(RADIO_TX16S) #elif defined(RADIO_TX16S)
#define USB_NAME "RadioMas TX16S" #define USB_NAME "RM TX16S"
#define USB_MANUFACTURER 'R', 'a', 'd', 'i', 'o', 'M', 'a', 's' /* 8 bytes */ #define USB_MANUFACTURER 'R', 'M', '_', 'T', 'X', ' ', ' ', ' ' /* 8 bytes */
#define USB_PRODUCT 'T', 'X', '1', '6', 'S', ' ', ' ', ' ' /* 8 Bytes */ #define USB_PRODUCT 'R', 'M', ' ', 'T', 'X', '1', '6', 'S' /* 8 Bytes */
#elif defined(PCBX10) #elif defined(PCBX10)
#define USB_NAME "FrSky X10" #define USB_NAME "FrSky X10"
#define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */ #define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */
@ -596,7 +596,6 @@ void audioConsumeCurrentBuffer();
#define audioEnableIrq() // interrupts must stay enabled on Horus #define audioEnableIrq() // interrupts must stay enabled on Horus
#if defined(PCBX12S) #if defined(PCBX12S)
#define setSampleRate(freq) #define setSampleRate(freq)
void audioWaitReady();
#else #else
void setSampleRate(uint32_t frequency); void setSampleRate(uint32_t frequency);
#define audioWaitReady() #define audioWaitReady()

View file

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

View file

@ -130,6 +130,18 @@ elseif(PCB STREQUAL X7)
set(LUA_EXPORT lua_export_t12) set(LUA_EXPORT lua_export_t12)
add_definitions(-DRADIO_T12) add_definitions(-DRADIO_T12)
add_definitions(-DEEPROM_VARIANT=0x4001) 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) elseif(PCBREV STREQUAL ACCESS)
option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF)
option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" ON) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" ON)
@ -308,7 +320,7 @@ if(INTERNAL_MODULE_SERIAL)
${TARGET_SRC} ${TARGET_SRC}
../common/arm/stm32/intmodule_serial_driver.cpp ../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 set(TARGET_SRC
${TARGET_SRC} ${TARGET_SRC}
intmodule_pulses_driver.cpp intmodule_pulses_driver.cpp

View file

@ -265,10 +265,16 @@ void boardOff()
// this function must not return! // this function must not return!
} }
#if defined (RADIO_TX12)
#define BATTERY_DIVIDER 22830
#else
#define BATTERY_DIVIDER 26214
#endif
uint16_t getBatteryVoltage() uint16_t getBatteryVoltage()
{ {
int32_t instant_vbat = anaIn(TX_VOLTAGE); // using filtered ADC value on purpose 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! 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; return (uint16_t)instant_vbat;
} }

View file

@ -24,8 +24,12 @@
#include <inttypes.h> #include <inttypes.h>
#include "definitions.h" #include "definitions.h"
#include "opentx_constants.h" #include "opentx_constants.h"
#include "hal.h"
#include "board_common.h" #include "board_common.h"
#include "hal.h"
#if defined(RADIO_TX12)
#define NAVIGATION_X7_TX12
#endif
#if defined(ROTARY_ENCODER_NAVIGATION) #if defined(ROTARY_ENCODER_NAVIGATION)
// Rotary Encoder driver // Rotary Encoder driver
@ -238,6 +242,26 @@ enum EnumKeys
KEY_PAGE, KEY_PAGE,
#endif #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) #if defined(KEYS_GPIO_REG_PLUS)
KEY_PLUS, KEY_PLUS,
KEY_MINUS, KEY_MINUS,
@ -307,8 +331,11 @@ enum EnumSwitches
SW_SG, SW_SG,
SW_SH 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 enum EnumSwitchesPositions
{ {
SW_SA0, SW_SA0,
@ -323,7 +350,7 @@ enum EnumSwitchesPositions
SW_SD0, SW_SD0,
SW_SD1, SW_SD1,
SW_SD2, SW_SD2,
#if defined(PCBX9) || defined(PCBXLITES) || defined(PCBX9LITES) #if defined(PCBX9) || defined(PCBXLITES) || defined(PCBX9LITES) || defined(RADIO_TX12)
SW_SE0, SW_SE0,
SW_SE1, SW_SE1,
SW_SE2, SW_SE2,
@ -338,7 +365,7 @@ enum EnumSwitchesPositions
SW_SG1, SW_SG1,
SW_SG2, SW_SG2,
#endif #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_SH0,
SW_SH1, SW_SH1,
SW_SH2, SW_SH2,
@ -410,6 +437,11 @@ enum EnumSwitchesPositions
#define STORAGE_NUM_SWITCHES NUM_SWITCHES #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_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 #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) #elif defined(PCBX7ACCESS)
#define NUM_SWITCHES 7 #define NUM_SWITCHES 7
#define STORAGE_NUM_SWITCHES 8 #define STORAGE_NUM_SWITCHES 8
@ -434,8 +466,8 @@ enum EnumSwitchesPositions
#define NUM_SWITCHES 18 // yes, it's perfect like that ! #define NUM_SWITCHES 18 // yes, it's perfect like that !
#define STORAGE_NUM_SWITCHES NUM_SWITCHES #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_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_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 << 3) + (SLIDER_WITH_DETENT << 2) + (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0) #define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 3) + (SLIDER_WITH_DETENT << 2) + (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0)
#elif defined(RADIO_X9DP2019) #elif defined(RADIO_X9DP2019)
#define NUM_SWITCHES 9 #define NUM_SWITCHES 9
#define STORAGE_NUM_SWITCHES NUM_SWITCHES #define STORAGE_NUM_SWITCHES NUM_SWITCHES
@ -674,9 +706,15 @@ uint8_t isBacklightEnabled();
#if !defined(SIMU) #if !defined(SIMU)
void usbJoystickUpdate(); void usbJoystickUpdate();
#endif #endif
#define USB_NAME "FrSky Taranis" #if defined(RADIO_TX12)
#define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */ #define USB_NAME "Radiomaster TX12"
#define USB_PRODUCT 'T', 'a', 'r', 'a', 'n', 'i', 's', ' ' /* 8 Bytes */ #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) #if defined(__cplusplus) && !defined(SIMU)
} }
@ -744,7 +782,6 @@ void audioEnd() ;
void dacStart(); void dacStart();
void dacStop(); void dacStop();
void setSampleRate(uint32_t frequency); void setSampleRate(uint32_t frequency);
#define audioWaitReady()
#define VOLUME_LEVEL_MAX 23 #define VOLUME_LEVEL_MAX 23
#define VOLUME_LEVEL_DEF 12 #define VOLUME_LEVEL_DEF 12
#if !defined(SOFTWARE_VOLUME) #if !defined(SOFTWARE_VOLUME)
@ -848,7 +885,11 @@ void ledBlue();
#define IS_LCD_RESET_NEEDED() true #define IS_LCD_RESET_NEEDED() true
#define LCD_CONTRAST_MIN 10 #define LCD_CONTRAST_MIN 10
#define LCD_CONTRAST_MAX 30 #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 #endif
#if defined(PCBX9D) || defined(PCBX9E) || (defined(PCBX9DP) && PCBREV < 2019) #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_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)
#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) #elif defined(PCBX7)
#define KEYS_GPIO_REG_PAGE GPIOD->IDR #define KEYS_GPIO_REG_PAGE GPIOD->IDR
#define KEYS_GPIO_PIN_PAGE GPIO_Pin_3 // PD.03 #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_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)
#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 #endif
#if defined(ROTARY_ENCODER_NAVIGATION) #if defined(ROTARY_ENCODER_NAVIGATION)
#define ROTARY_ENCODER_RCC_APB1Periph RCC_APB1Periph_TIM5 #define ROTARY_ENCODER_RCC_APB1Periph RCC_APB1Periph_TIM5
#define ROTARY_ENCODER_TIMER TIM5 #define ROTARY_ENCODER_TIMER TIM5
@ -302,6 +333,11 @@
#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)
#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) #elif defined(PCBX7)
#define STORAGE_SWITCH_A #define STORAGE_SWITCH_A
#define HARDWARE_SWITCH_A #define HARDWARE_SWITCH_A
@ -369,6 +405,13 @@
#define SWITCHES_GPIO_PIN_C_L GPIO_Pin_2 // PE.02 #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_2 // PE.02
#define SWITCHES_GPIO_REG_C_H GPIOE->IDR #define SWITCHES_GPIO_REG_C_H GPIOE->IDR
#define SWITCHES_GPIO_PIN_C_H GPIO_Pin_3 // PE.03 #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) #elif defined(PCBX7)
#define STORAGE_SWITCH_C #define STORAGE_SWITCH_C
#define HARDWARE_SWITCH_C #define HARDWARE_SWITCH_C
@ -411,6 +454,11 @@
#define SWITCHES_GPIO_PIN_D_L GPIO_Pin_4 // PB.04 #define SWITCHES_GPIO_PIN_D_L GPIO_Pin_4 // PB.04
#define SWITCHES_GPIO_REG_D_H GPIOB->IDR #define SWITCHES_GPIO_REG_D_H GPIOB->IDR
#define SWITCHES_GPIO_PIN_D_H GPIO_Pin_5 // PB.05 #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) #elif defined(PCBX7)
#define STORAGE_SWITCH_D #define STORAGE_SWITCH_D
#define HARDWARE_SWITCH_D #define HARDWARE_SWITCH_D
@ -452,6 +500,13 @@
#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_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) #elif defined(PCBX7)
// no SWE // no SWE
#else #else
@ -483,6 +538,13 @@
#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_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) #elif defined(PCBX7)
#define STORAGE_SWITCH_F #define STORAGE_SWITCH_F
#define HARDWARE_SWITCH_F #define HARDWARE_SWITCH_F
@ -530,6 +592,7 @@
#define SWITCHES_GPIO_PIN_H GPIO_Pin_14 // PD.14 #define SWITCHES_GPIO_PIN_H GPIO_Pin_14 // PD.14
#elif defined(PCBXLITE) || defined(PCBX9LITE) #elif defined(PCBXLITE) || defined(PCBX9LITE)
// no SWH // no SWH
#elif defined(RADIO_TX12)
#elif defined(PCBX7) #elif defined(PCBX7)
#define STORAGE_SWITCH_H #define STORAGE_SWITCH_H
#define HARDWARE_SWITCH_H #define HARDWARE_SWITCH_H
@ -558,7 +621,16 @@
#define SWITCHES_GPIO_REG_I GPIOC->IDR #define SWITCHES_GPIO_REG_I GPIOC->IDR
#define SWITCHES_GPIO_PIN_I GPIO_Pin_13 // PC.13 #define SWITCHES_GPIO_PIN_I GPIO_Pin_13 // PC.13
#define STORAGE_SWITCH_J #define STORAGE_SWITCH_J
#elif defined(PCBX7) #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 STORAGE_SWITCH_I
#define HARDWARE_SWITCH_I #define HARDWARE_SWITCH_I
#define SWITCHES_GPIO_REG_I GPIOC->IDR #define SWITCHES_GPIO_REG_I GPIOC->IDR
@ -668,11 +740,18 @@
#define KEYS_GPIOC_PINS (GPIO_Pin_4 | GPIO_Pin_5) #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) #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) #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_GPIOA_PINS GPIO_Pin_5
#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_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) #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_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_GPIOA_PINS GPIO_Pin_5
@ -1079,8 +1158,10 @@
#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_T12) #elif defined(RADIO_T12) || defined(RADIO_TX12)
#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_APB2Periph 0
#define INTMODULE_PWR_GPIO GPIOC #define INTMODULE_PWR_GPIO GPIOC
#define INTMODULE_PWR_GPIO_PIN GPIO_Pin_6 // PC.06 #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_6 // PC.06
#define INTMODULE_GPIO GPIOB #define INTMODULE_GPIO GPIOB
@ -1092,8 +1173,6 @@
#define INTMODULE_GPIO_AF GPIO_AF_USART3 #define INTMODULE_GPIO_AF GPIO_AF_USART3
#define INTMODULE_USART_IRQn USART3_IRQn #define INTMODULE_USART_IRQn USART3_IRQn
#define INTMODULE_USART_IRQHandler USART3_IRQHandler #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 TIM2
#define INTMODULE_TIMER_IRQn TIM2_IRQn #define INTMODULE_TIMER_IRQn TIM2_IRQn
#define INTMODULE_TIMER_IRQHandler TIM2_IRQHandler #define INTMODULE_TIMER_IRQHandler TIM2_IRQHandler
@ -1169,30 +1248,6 @@
#define EXTMODULE_USART_TX_DMA_STREAM DMA2_Stream6 #define EXTMODULE_USART_TX_DMA_STREAM DMA2_Stream6
#define EXTMODULE_USART_RX_DMA_CHANNEL DMA_Channel_5 #define EXTMODULE_USART_RX_DMA_CHANNEL DMA_Channel_5
#define EXTMODULE_USART_RX_DMA_STREAM DMA2_Stream1 #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) #elif defined(RADIO_X9DP2019)
#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_RCC_APB2Periph (RCC_APB2Periph_TIM8 | RCC_APB2Periph_USART6) #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_OUTPUT_POLARITY TIM_CCER_CC2NP
#define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) #define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#else #else
#define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
#define EXTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM8 #define EXTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM8
#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
#define EXTERNAL_MODULE_PWR_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) #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 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 IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET)
#define EXTMODULE_TX_GPIO GPIOA #define EXTMODULE_TX_GPIO GPIOA
#define EXTMODULE_TX_GPIO_PIN GPIO_Pin_7 // PA.07 #define EXTMODULE_TX_GPIO_PIN GPIO_Pin_7
#define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource7 #define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource7 // PA.07
#define EXTMODULE_TIMER TIM8 #define EXTMODULE_TIMER TIM8
#define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM8 // TIM8_CH1N #define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM8 // TIM8_CH1N
#define EXTMODULE_TIMER_CC_IRQn TIM8_CC_IRQn #define EXTMODULE_TIMER_CC_IRQn TIM8_CC_IRQn
#define EXTMODULE_TIMER_CC_IRQHandler TIM8_CC_IRQHandler #define EXTMODULE_TIMER_CC_IRQHandler TIM8_CC_IRQHandler
#define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7 // TIM8_UP #define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7
#define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1 // TIM8_UP #define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1
#define EXTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream1_IRQn #define EXTMODULE_TIMER_DMA_STREAM_IRQn DMA2_Stream1_IRQn
#define EXTMODULE_TIMER_DMA_STREAM_IRQHandler DMA2_Stream1_IRQHandler #define EXTMODULE_TIMER_DMA_STREAM_IRQHandler DMA2_Stream1_IRQHandler
#define EXTMODULE_TIMER_DMA_FLAG_TC DMA_IT_TCIF1 #define EXTMODULE_TIMER_DMA_FLAG_TC DMA_IT_TCIF1
@ -1376,7 +1431,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) #if defined(RADIO_X7) || defined(RADIO_X7ACCESS) || defined(RADIO_TX12)
#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
@ -1389,7 +1444,7 @@
#define TELEMETRY_TIMER_IRQHandler TIM1_TRG_COM_TIM11_IRQHandler #define TELEMETRY_TIMER_IRQHandler TIM1_TRG_COM_TIM11_IRQHandler
// PCBREV // PCBREV
#if defined(PCBX7) #if defined(RADIO_X7)
#define PCBREV_RCC_AHB1Periph RCC_AHB1Periph_GPIOA #define PCBREV_RCC_AHB1Periph RCC_AHB1Periph_GPIOA
#define PCBREV_GPIO GPIOA #define PCBREV_GPIO GPIOA
#define PCBREV_GPIO_PIN GPIO_Pin_14 // PA.14 #define PCBREV_GPIO_PIN GPIO_Pin_14 // PA.14
@ -1472,7 +1527,7 @@
#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_X7) #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
#define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOC #define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOC
@ -1657,6 +1712,9 @@
#define KEYS_BACKLIGHT_RCC_AHB1Periph 0 #define KEYS_BACKLIGHT_RCC_AHB1Periph 0
// LCD driver // LCD driver
#if defined(RADIO_TX12) || defined(RADIO_T12)
#define LCD_VERTICAL_INVERT
#endif
#if defined(PCBX9E) #if defined(PCBX9E)
#define LCD_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1) #define LCD_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1)
#define LCD_RCC_APB1Periph RCC_APB1Periph_SPI3 #define LCD_RCC_APB1Periph RCC_APB1Periph_SPI3
@ -1849,6 +1907,12 @@
#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)
#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 #else
#define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1) #define AUDIO_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_DMA1)
#endif #endif
@ -1937,7 +2001,7 @@
#define BT_TX_GPIO_PinSource GPIO_PinSource14 #define BT_TX_GPIO_PinSource GPIO_PinSource14
#define BT_RX_GPIO_PinSource GPIO_PinSource9 #define BT_RX_GPIO_PinSource GPIO_PinSource9
#define BT_USART_IRQHandler USART6_IRQHandler #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 STORAGE_BLUETOOTH
#define BT_RCC_APB1Periph RCC_APB1Periph_USART3 #define BT_RCC_APB1Periph RCC_APB1Periph_USART3
#define BT_RCC_APB2Periph 0 #define BT_RCC_APB2Periph 0
@ -1969,7 +2033,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) #elif defined(PCBX9D) || defined(PCBX9DP) || defined(RADIO_T12) || defined(RADIO_TX12)
#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

@ -37,6 +37,31 @@ uint32_t readKeys()
result |= 1 << KEY_PAGE; result |= 1 << KEY_PAGE;
#endif #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) if (~KEYS_GPIO_REG_EXIT & KEYS_GPIO_PIN_EXIT)
result |= 1 << KEY_EXIT; result |= 1 << KEY_EXIT;
@ -115,7 +140,7 @@ void readKeysAndTrims()
{ {
uint8_t index = 0; uint8_t index = 0;
uint32_t keys_input = readKeys(); 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); keys[index++].input(keys_input & i);
} }
@ -175,10 +200,15 @@ uint32_t switchState(uint8_t index)
uint32_t xxx = 0; uint32_t xxx = 0;
switch (index) { 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(A, 0);
ADD_3POS_CASE(B, 1); ADD_3POS_CASE(B, 1);
ADD_3POS_CASE(C, 2); ADD_3POS_CASE(C, 2);
#endif
#if defined(PCBX9LITES) #if defined(PCBX9LITES)
ADD_2POS_CASE(D); ADD_2POS_CASE(D);
ADD_2POS_CASE(E); ADD_2POS_CASE(E);
@ -201,6 +231,10 @@ 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)
ADD_2POS_CASE(D);
ADD_3POS_CASE(E, 4);
ADD_3POS_CASE(F, 5);
#elif defined(PCBX7) #elif defined(PCBX7)
ADD_3POS_CASE(D, 3); ADD_3POS_CASE(D, 3);
ADD_2POS_CASE(F); ADD_2POS_CASE(F);

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -48,6 +48,11 @@ void checkTrainerSignalWarning()
} }
#if defined(PCBSKY9X) #if defined(PCBSKY9X)
void stopTrainer()
{
stop_trainer_capture();
}
void checkTrainerSettings() void checkTrainerSettings()
{ {
uint8_t requiredTrainerMode = SLAVE_MODE(); uint8_t requiredTrainerMode = SLAVE_MODE();
@ -55,50 +60,59 @@ void checkTrainerSettings()
if (requiredTrainerMode != currentTrainerMode) { if (requiredTrainerMode != currentTrainerMode) {
currentTrainerMode = requiredTrainerMode; currentTrainerMode = requiredTrainerMode;
if (requiredTrainerMode) if (requiredTrainerMode)
stop_trainer_capture(); stopTrainer();
else else
init_trainer_capture(); init_trainer_capture();
} }
} }
#else #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() void checkTrainerSettings()
{ {
uint8_t requiredTrainerMode = g_model.trainerData.mode; uint8_t requiredTrainerMode = g_model.trainerData.mode;
if (requiredTrainerMode != currentTrainerMode) { if (requiredTrainerMode != currentTrainerMode) {
switch (currentTrainerMode) { if (currentTrainerMode != 0xFF) {
case TRAINER_MODE_MASTER_TRAINER_JACK: stopTrainer();
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
} }
currentTrainerMode = requiredTrainerMode; currentTrainerMode = requiredTrainerMode;
@ -120,7 +134,7 @@ void checkTrainerSettings()
break; break;
#endif #endif
#if defined(HARDWARE_TRAINER_AUX_SERIAL) #if defined(TRAINER_BATTERY_COMPARTMENT)
case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT:
#if defined(AUX_SERIAL) #if defined(AUX_SERIAL)
if (g_eeGeneral.auxSerialMode == UART_MODE_SBUS_TRAINER) if (g_eeGeneral.auxSerialMode == UART_MODE_SBUS_TRAINER)

View file

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

View file

@ -291,6 +291,9 @@
#elif defined(RADIO_T12) #elif defined(RADIO_T12)
#define LEN_VKEYS "\005" #define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Dolů\0""Nhoru""Vprvo""Vlevo" #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) #elif defined(PCBTARANIS)
#define LEN_VKEYS "\005" #define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Mínus" #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Mínus"

View file

@ -300,6 +300,9 @@
#elif defined(RADIO_T12) #elif defined(RADIO_T12)
#define LEN_VKEYS "\005" #define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" #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) #elif defined(PCBTARANIS)
#define LEN_VKEYS "\005" #define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus" #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"

View file

@ -300,6 +300,9 @@
#elif defined(RADIO_T12) #elif defined(RADIO_T12)
#define LEN_VKEYS "\005" #define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" #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) #elif defined(PCBTARANIS)
#define LEN_VKEYS "\005" #define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus" #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"

View file

@ -297,6 +297,9 @@
#elif defined(RADIO_T12) #elif defined(RADIO_T12)
#define LEN_VKEYS "\005" #define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" #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) #elif defined(PCBTARANIS)
#define LEN_VKEYS "\005" #define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus" #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"

View file

@ -318,6 +318,9 @@
#elif defined(RADIO_T12) #elif defined(RADIO_T12)
#define LEN_VKEYS "\005" #define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" #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) #elif defined(PCBTARANIS)
#define LEN_VKEYS "\005" #define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus" #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"

View file

@ -320,6 +320,9 @@
#elif defined(RADIO_T12) #elif defined(RADIO_T12)
#define LEN_VKEYS "\005" #define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" #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) #elif defined(PCBTARANIS)
#define LEN_VKEYS "\005" #define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Moins" #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Moins"

View file

@ -324,6 +324,9 @@
#elif defined(RADIO_T12) #elif defined(RADIO_T12)
#define LEN_VKEYS "\005" #define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" #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) #elif defined(PCBTARANIS)
#define LEN_VKEYS "\005" #define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus" #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"

View file

@ -298,6 +298,9 @@
#elif defined(RADIO_T12) #elif defined(RADIO_T12)
#define LEN_VKEYS "\005" #define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" #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) #elif defined(PCBTARANIS)
#define LEN_VKEYS "\005" #define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus" #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"

View file

@ -318,6 +318,9 @@
#elif defined(RADIO_T12) #elif defined(RADIO_T12)
#define LEN_VKEYS "\005" #define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" #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) #elif defined(PCBTARANIS)
#define LEN_VKEYS "\005" #define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus" #define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"

View file

@ -305,8 +305,22 @@
#define LEN_VSWASHTYPE "\004" #define LEN_VSWASHTYPE "\004"
#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0" #define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0"
#define LEN_VKEYS "\005" #if defined(PCBHORUS)
#define TR_VKEYS TR("Menu\0""Sair\0""Desce""Sobe\0""Direi""Esqda", "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus") #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_VSWITCHES "\003"
#define LEN_VSRCRAW "\004" #define LEN_VSRCRAW "\004"

View file

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

View file

@ -44,6 +44,9 @@
#elif defined(RADIO_T12) #elif defined(RADIO_T12)
#define TR_POTS_VSRCRAW STR_CHAR_POT"S1\0" STR_CHAR_POT"S2\0" #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" #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) #elif defined(PCBX7)
#define TR_POTS_VSRCRAW STR_CHAR_POT"S1\0" STR_CHAR_POT"S2\0" #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" #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" cmake_options["PCBREV"] = "T12"
firmware_options = options_jumper_t12 firmware_options = options_jumper_t12
maxsize = 65536 * 8 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": elif board_name == "t16":
cmake_options["PCB"] = "X10" cmake_options["PCB"] = "X10"
cmake_options["PCBREV"] = "T16" cmake_options["PCBREV"] = "T16"

View file

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

View file

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

View file

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

View file

@ -18,6 +18,16 @@ boards = {
"PCB": "X10", "PCB": "X10",
"PCBREV": "TX16S", "PCBREV": "TX16S",
"DEFAULT_MODE": "2", "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 make -j"${CORES}" tests-radio
fi 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 if [[ " T12 X7 ALL " =~ \ ${FLAVOR}\ ]] ; then
# OpenTX on T12 # OpenTX on T12
rm -rf ./* || true rm -rf ./* || true
@ -121,6 +130,15 @@ if [[ " T12 X7 ALL " =~ \ ${FLAVOR}\ ]] ; then
make -j"${CORES}" tests-radio make -j"${CORES}" tests-radio
fi 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 if [[ " XLITE ALL " =~ \ ${FLAVOR}\ ]] ; then
# OpenTX on X-Lite # OpenTX on X-Lite
rm -rf ./* || true rm -rf ./* || true