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

Add Jumper t12 support by 3djc (#6451)

* Jumper T12 - companion part

* more work

* Add definitions

* fix libsimulator key handling

* Fix simu keys handling

* Cosmetics

* Continued

* Fix wrong regplace

* Fix wrong regplace

* Please travis

* Please travis

* Add T12 to Travis
Switch naming and display

* Cosmetics

* Work on modules

* Work on modules

* typo

* Fix navigation

* Cosmetics

* Introduce NAVIGATION_type

* Fix

* Make NAVIGATION_type more future proof

* Lots of cleanups and improvements

* Cosmetics

* Fix internal module menu

* Cosmetics

* Fix screen reversed

* Small fixes

* Fix navigation issue

* Please travis

* Fix LCD contrast

* Fix T12 switch layout

* Fix T12 keys screen and all radios keys translations

* Complete rework of SWITCHES screen for all radios

* comsetics

* VC++ compilation
This commit is contained in:
3djc 2019-05-26 19:51:17 +02:00 committed by Andre Bernet
parent f0998ff52f
commit cd3c4ac654
80 changed files with 975 additions and 208 deletions

View file

@ -25,6 +25,7 @@ env:
# - FLAVOR=9XRPRO
- FLAVOR=X9LITE
- FLAVOR=X7
- FLAVOR=T12
- FLAVOR=XLITE
- FLAVOR=XLITES
- FLAVOR=X9

View file

@ -333,7 +333,11 @@ file(GLOB simulator_plugins "${CMAKE_BINARY_DIR}/Release/*opentx-*simulator${CMA
# the current flavour is not automatically added if build in the current cmake iteration, so always
# add its library name to be sure
string(TOLOWER ${PCB} FLAVOUR)
if(PCB STREQUAL X7 AND PCBREV STREQUAL T12)
set(FLAVOUR t12)
else()
string(TOLOWER ${PCB} FLAVOUR)
endif()
if(POLICY CMP0026)
cmake_policy(SET CMP0026 OLD) # https://cmake.org/cmake/help/v3.0/policy/CMP0026.html
endif()

View file

@ -72,7 +72,7 @@
<file>images/simulator/X10/left_rtn.png</file>
<file>images/simulator/X10/left_sys.png</file>
<file>images/simulator/X10/left_tele.png</file>
<file>images/simulator/X10/right_ent.png</file>
<file>images/simulator/X10/right_ent.png</file>
<file>images/simulator/9X/9xdb.png</file>
<file>images/simulator/9X/9xdl.png</file>
<file>images/simulator/9X/9xdr.png</file>
@ -157,15 +157,28 @@
<file>images/simulator/XLITE/right_left.png</file>
<file>images/simulator/XLITE/right_up.png</file>
<file>images/simulator/XLITE/right_down.png</file>
<file>images/simulator/JumperT12/right_up.png</file>
<file>images/simulator/JumperT12/right_down.png</file>
<file>images/simulator/JumperT12/right_right.png</file>
<file>images/simulator/JumperT12/right_left.png</file>
<file>images/simulator/JumperT12/left_ent.png</file>
<file>images/simulator/JumperT12/left_exit.png</file>
<file>images/simulator/JumperT12/JumperT12.png</file>
<file>images/simulator/JumperT12/JumperT12-208.png</file>
<file>images/simulator/JumperT12/JumperT12-left.png</file>
<file>images/simulator/JumperT12/JumperT12-right.png</file>
<file>images/simulator/JumperT12/JumperT12-x.png</file>
<file>images/simulator/JumperT12/JumperT12-center.png</file>
<file>images/simulator/JumperT12/JumperT12-top.png</file>
<file>images/wizard/ailerons.png</file>
<file>images/wizard/airbrakes.png</file>
<file>images/wizard/elevons.png</file>
<file>images/wizard/elevons.png</file>
<file>images/wizard/conclusion.png</file>
<file>images/wizard/cyclic.png</file>
<file>images/wizard/fblheli.png</file>
<file>images/wizard/flaps.png</file>
<file>images/wizard/flybar.png</file>
<file>images/wizard/gyro.png</file>
<file>images/wizard/gyro.png</file>
<file>images/wizard/helictrl.png</file>
<file>images/wizard/models.png</file>
<file>images/wizard/multirotor.png</file>
@ -1136,6 +1149,6 @@
<file>themes/yerico/48/contributors.png</file>
<file>themes/yerico/48/stop.png</file>
<file>themes/yerico/48/write_eeprom.png</file>
<file>themes/yerico/48/sdsync.png</file>
<file>themes/yerico/48/sdsync.png</file>
</qresource>
</RCC>

View file

@ -83,6 +83,8 @@ uint32_t Boards::getFourCC(Type board)
case BOARD_STOCK:
case BOARD_M128:
return 0;
case BOARD_JUMPER_T12:
return 0x3D78746F;
case BOARD_UNKNOWN:
break;
}
@ -112,6 +114,7 @@ const int Boards::getEEpromSize(Board::Type board)
case BOARD_TARANIS_X9D:
case BOARD_TARANIS_X9DP:
case BOARD_TARANIS_X9E:
case BOARD_JUMPER_T12:
return EESIZE_TARANIS;
case BOARD_UNKNOWN:
return EESIZE_MAX;
@ -221,6 +224,18 @@ const SwitchInfo Boards::getSwitchInfo(Board::Type board, int index)
if (index < DIM(switches))
return switches[index];
}
else if (IS_JUMPER_T12(board)) {
const Board::SwitchInfo switches[] = {
{SWITCH_3POS, "SA"},
{SWITCH_3POS, "SB"},
{SWITCH_3POS, "SC"},
{SWITCH_3POS, "SD"},
{SWITCH_2POS, "SG"},
{SWITCH_2POS, "SH"}
};
if (index < DIM(switches))
return switches[index];
}
else {
const Board::SwitchInfo switches[] = {
{SWITCH_3POS, "3POS"},
@ -247,7 +262,7 @@ const int Boards::getCapability(Board::Type board, Board::Capability capability)
case Pots:
if (IS_TARANIS_X9LITE(board))
return 1;
else if (IS_TARANIS_SMALL(board))
else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board))
return 2;
else if (IS_TARANIS_X9E(board))
return 4;
@ -302,6 +317,8 @@ const int Boards::getCapability(Board::Type board, Board::Capability capability)
return 4;
else if (IS_HORUS_OR_TARANIS(board))
return 8;
else if (IS_JUMPER_T12(board))
return 6;
else
return 7;

View file

@ -47,7 +47,8 @@ namespace Board {
BOARD_X10,
BOARD_TARANIS_XLITE,
BOARD_TARANIS_XLITES,
BOARD_TARANIS_X9LITE
BOARD_TARANIS_X9LITE,
BOARD_JUMPER_T12
};
constexpr int BOARD_TYPE_MAX = BOARD_TARANIS_X9LITE ;
@ -190,6 +191,7 @@ class Boards
#define IS_2560(board) (board==Board::BOARD_GRUVIN9X || board==Board::BOARD_MEGA2560)
#define IS_SKY9X(board) (board==Board::BOARD_SKY9X || board==Board::BOARD_9XRPRO || board==Board::BOARD_AR9X)
#define IS_9XRPRO(board) (board==Board::BOARD_9XRPRO)
#define IS_JUMPER_T12(board) (board==Board::BOARD_JUMPER_T12)
#define IS_TARANIS_XLITE(board) (board==Board::BOARD_TARANIS_XLITE || board==Board::BOARD_TARANIS_XLITES)
#define IS_TARANIS_XLITES(board) (board==Board::BOARD_TARANIS_XLITES)
#define IS_TARANIS_X7(board) (board==Board::BOARD_TARANIS_X7)

View file

@ -90,7 +90,7 @@ GeneralSettings::GeneralSettings()
// Lipo 2S
vBatWarn = 66;
vBatMin = -23; // 6.7V
vBatMax = -37; // 8.3V
vBatMax = -37; // 8.3V
}
else if (IS_TARANIS(board)) {
// NI-MH 7.2V, X9D, X9D+ and X7
@ -249,6 +249,10 @@ void GeneralSettings::setDefaultControlTypes(Board::Type board)
potConfig[0] = Board::POT_WITH_DETENT;
potConfig[1] = Board::POT_WITH_DETENT;
}
else if (IS_JUMPER_T12(board)) {
potConfig[0] = Board::POT_WITH_DETENT;
potConfig[1] = Board::POT_WITH_DETENT;
}
else {
potConfig[0] = Board::POT_WITHOUT_DETENT;
potConfig[1] = Board::POT_WITHOUT_DETENT;
@ -317,6 +321,20 @@ void GeneralSettings::convert(RadioDataConversionState & cstate)
}
}
if (IS_JUMPER_T12(cstate.toType)) {
if (IS_TARANIS_X9(cstate.fromType) || IS_HORUS(cstate.fromType)) {
strncpy(switchName[4], switchName[5], sizeof(switchName[0]));
strncpy(switchName[5], switchName[7], sizeof(switchName[0]));
}
}
else if (IS_JUMPER_T12(cstate.fromType)) {
if (IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) {
strncpy(switchName[5], switchName[4], sizeof(switchName[0]));
strncpy(switchName[7], switchName[5], sizeof(switchName[0]));
}
}
// LS and RS sliders are after 2 aux sliders on X12 and X9E
if ((IS_HORUS_X12S(cstate.toType) || IS_TARANIS_X9E(cstate.toType)) && !IS_HORUS_X12S(cstate.fromType) && !IS_TARANIS_X9E(cstate.fromType)) {
strncpy(sliderName[0], sliderName[2], sizeof(sliderName[0]));

View file

@ -35,6 +35,7 @@
#define TARANIS_XLITE_VARIANT 0x2000
#define TARANIS_XLITES_VARIANT 0x1000
#define TARANIS_X9LITE_VARIANT 0x0800
#define JUMPER_T12_VARIANT TARANIS_X7_VARIANT
#define SIMU_STOCK_VARIANTS (GVARS_VARIANT|FRSKY_VARIANT)
#define SIMU_M128_VARIANTS (M128_VARIANT|SIMU_STOCK_VARIANTS)

View file

@ -66,6 +66,8 @@ const char * OpenTxEepromInterface::getName()
return "OpenTX for MEGA2560 board";
case BOARD_GRUVIN9X:
return "OpenTX for Gruvin9x board / 9X";
case BOARD_JUMPER_T12:
return "OpenTX for Jumper T12";
case BOARD_TARANIS_X9D:
return "OpenTX for FrSky Taranis X9D";
case BOARD_TARANIS_X9DP:
@ -331,6 +333,9 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u
else if (IS_TARANIS_XLITE(board)) {
variant |= TARANIS_XLITE_VARIANT;
}
else if (IS_JUMPER_T12(board)) {
variant |= JUMPER_T12_VARIANT;
}
OpenTxGeneralData generator((GeneralSettings &)radioData.generalSettings, board, version, variant);
// generator.dump();
@ -543,7 +548,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case SoundPitch:
return 1;
case Haptic:
return (IS_2560(board) || IS_SKY9X(board) || IS_TARANIS_PLUS(board) || IS_TARANIS_SMALL(board) || IS_TARANIS_X9E(board) || IS_HORUS(board) || id.contains("haptic"));
return (IS_2560(board) || IS_SKY9X(board) || IS_TARANIS_PLUS(board) || IS_TARANIS_SMALL(board) || IS_TARANIS_X9E(board) || IS_HORUS(board) || IS_JUMPER_T12(board) || id.contains("haptic"));
case ModelTrainerEnable:
if (IS_HORUS_OR_TARANIS(board))
return 1;
@ -552,7 +557,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case MaxVolume:
return (IS_ARM(board) ? 23 : 7);
case MaxContrast:
if (IS_TARANIS_SMALL(board))
if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board))
return 30;
else
return 45;
@ -644,7 +649,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case LcdWidth:
if (IS_HORUS(board))
return 480;
else if (IS_TARANIS_SMALL(board))
else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board))
return 128;
else if (IS_TARANIS(board))
return 212;
@ -658,7 +663,7 @@ int OpenTxFirmware::getCapability(::Capability capability)
case LcdDepth:
if (IS_HORUS(board))
return 16;
else if (IS_TARANIS_SMALL(board))
else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board))
return 1;
else if (IS_TARANIS(board))
return 4;
@ -708,6 +713,8 @@ int OpenTxFirmware::getCapability(::Capability capability)
return TARANIS_XLITES_VARIANT;
else if (IS_TARANIS_XLITE(board))
return TARANIS_XLITE_VARIANT;
else if (IS_JUMPER_T12(board))
return JUMPER_T12_VARIANT;
else
return 0;
case MavlinkTelemetry:
@ -973,6 +980,11 @@ bool OpenTxEepromInterface::checkVariant(unsigned int version, unsigned int vari
variantError = true;
}
}
else if (IS_JUMPER_T12(board)) {
if (variant != JUMPER_T12_VARIANT) {
variantError = true;
}
}
if (variantError) {
qWarning() << " wrong variant (" << variant << ")";
@ -1242,6 +1254,17 @@ void registerOpenTxFirmwares()
firmware->addOption("pcbdev", Firmware::tr("Use ONLY with first DEV pcb version"));
registerOpenTxFirmware(firmware);
/* Jumper T12 board */
firmware = new OpenTxFirmware("opentx-t12", QCoreApplication::translate("Firmware", "Jumper T12"), BOARD_JUMPER_T12);
addOpenTxCommonOptions(firmware);
firmware->addOption("noheli", Firmware::tr("Disable HELI menu and cyclic mix support"));
firmware->addOption("nogvars", Firmware::tr("Disable Global variables"));
firmware->addOption("lua", Firmware::tr("Enable Lua custom scripts screen"));
firmware->addOption("luac", Firmware::tr("Enable Lua compiler"));
firmware->addOption("crossfire", Firmware::tr("Support for Crossfire TX Module"));
addOpenTxFontOptions(firmware);
registerOpenTxFirmware(firmware);
/* 9XR-Pro */
firmware = new OpenTxFirmware("opentx-9xrpro", Firmware::tr("Turnigy 9XR-PRO"), BOARD_9XRPRO);
addOpenTxArm9xOptions(firmware, false);

View file

@ -615,6 +615,19 @@ RawSource RawSource::convert(RadioDataConversionState & cstate)
index = 5; // SH to SH
}
}
else if (IS_JUMPER_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_HORUS(cstate.fromType))) {
// No SE and SG on T12 board
if (index == 4 || index == 6) {
index = 3; // SG and SE to SD
evt = RadioDataConversionState::EVT_CVRT;
}
else if (index == 5) {
index = 4; // SF to SF
}
else if (index == 7) {
index = 5; // SH to SH
}
}
// Compensate for SE and SG on X9/Horus board if converting from X7
else if ((IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) && IS_TARANIS_X7(cstate.fromType)) {
if (index == 4) {
@ -624,6 +637,22 @@ RawSource RawSource::convert(RadioDataConversionState & cstate)
index = 7; // SH to SH
}
}
else if ((IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) && IS_JUMPER_T12(cstate.fromType)) {
if (index == 4) {
index = 5; // SF to SF
}
else if (index == 5) {
index = 7; // SH to SH
}
}
else if ((IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) && IS_JUMPER_T12(cstate.fromType)) {
if (index == 4) {
index = 5; // SF to SF
}
else if (index == 5) {
index = 7; // SH to SH
}
}
} // SOURCE_TYPE_SWITCH
// final validation (we do not pass model to isAvailable() because we don't know what has or hasn't been converted)

View file

@ -208,6 +208,20 @@ RawSwitch RawSwitch::convert(RadioDataConversionState & cstate)
delta = 6; // SH to SH
}
}
else if (IS_JUMPER_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_HORUS(cstate.fromType))) {
if (srcIdx == 4 || srcIdx == 5) {
delta = 3; // SE to SD & SF to SF
if (srcIdx == 4)
evt = RadioDataConversionState::EVT_CVRT;
}
else if (srcIdx == 6) {
delta = 9; // SG to SD
evt = RadioDataConversionState::EVT_CVRT;
}
else if (srcIdx == 7) {
delta = 6; // SH to SH
}
}
// Compensate for SE and SG on X9/Horus board if converting from X7
else if ((IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) && IS_TARANIS_X7(cstate.fromType)) {
if (srcIdx == 4) {
@ -217,6 +231,14 @@ RawSwitch RawSwitch::convert(RadioDataConversionState & cstate)
delta = -6; // SH to SH
}
}
else if ((IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) && IS_JUMPER_T12(cstate.fromType)) {
if (srcIdx == 4) {
delta = -3; // SF to SF
}
else if (srcIdx == 5) {
delta = -6; // SH to SH
}
}
if (index < 0) {
delta = -delta; // invert for !switch

View file

@ -41,6 +41,14 @@ void HardwarePanel::setupSwitchType(int index, QLabel * label, AutoLineEdit * na
label->setText("SH");
}
}
if (IS_JUMPER_T12(board)) {
if (index == 4) {
label->setText("SG");
}
else if (index == 5) {
label->setText("SH");
}
}
}
else {
label->hide();
@ -157,7 +165,7 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings
ui->txCurrentCalibrationLabel->hide();
}
if (IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board)|| IS_TARANIS_X9E(board) || IS_HORUS(board)) {
if (IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board)|| IS_TARANIS_X9E(board) || IS_HORUS(board) || IS_JUMPER_T12(board)) {
ui->bluetoothMode->addItem(tr("OFF"), 0);
if (IS_TARANIS_X9E(board)) {
ui->bluetoothMode->addItem(tr("Enabled"), 1);

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View file

@ -11,6 +11,7 @@ set(simulation_SRCS
simulateduiwidgetX9E.cpp
simulateduiwidgetX10.cpp
simulateduiwidgetX12.cpp
simulateduiwidgetJumperT12.cpp
simulatorinterface.cpp
simulatormainwindow.cpp
simulatorstartupdialog.cpp
@ -32,6 +33,7 @@ set(simulation_UIS
simulateduiwidgetX9E.ui
simulateduiwidgetX10.ui
simulateduiwidgetX12.ui
simulateduiwidgetJumperT12.ui
simulatormainwindow.ui
simulatorstartupdialog.ui
simulatorwidget.ui

View file

@ -111,6 +111,7 @@ namespace Ui {
class SimulatedUIWidgetX9E;
class SimulatedUIWidgetX10;
class SimulatedUIWidgetX12;
class SimulatedUIWidgetJumperT12;
}
class SimulatedUIWidget9X: public SimulatedUIWidget
@ -213,4 +214,16 @@ class SimulatedUIWidgetX12: public SimulatedUIWidget
Ui::SimulatedUIWidgetX12 * ui;
};
class SimulatedUIWidgetJumperT12: public SimulatedUIWidget
{
Q_OBJECT
public:
explicit SimulatedUIWidgetJumperT12(SimulatorInterface * simulator, QWidget * parent = NULL);
virtual ~SimulatedUIWidgetJumperT12();
private:
Ui::SimulatedUIWidgetJumperT12 * ui;
};
#endif // SIMULATEDUIWIDGET_H

View file

@ -0,0 +1,61 @@
#include "simulateduiwidget.h"
#include "ui_simulateduiwidgetJumperT12.h"
// NOTE: RadioUiAction(NUMBER,...): NUMBER relates to enum EnumKeys in the specific board.h
SimulatedUIWidgetJumperT12::SimulatedUIWidgetJumperT12(SimulatorInterface *simulator, QWidget * parent):
SimulatedUIWidget(simulator, parent),
ui(new Ui::SimulatedUIWidgetJumperT12)
{
RadioUiAction * act;
QPolygon polygon;
ui->setupUi(this);
act = new RadioUiAction(3, QList<int>() << Qt::Key_Up << Qt::Key_PageUp, SIMU_STR_HLP_KEYS_GO_UP, SIMU_STR_HLP_ACT_UP);
addRadioWidget(ui->rightbuttons->addArea(QRect(69, 11, 60, 25), "JumperT12/right_up.png", act));
act = new RadioUiAction(2, QList<int>() << Qt::Key_Down << Qt::Key_PageDown, SIMU_STR_HLP_KEYS_GO_DN, SIMU_STR_HLP_ACT_DN);
addRadioWidget(ui->rightbuttons->addArea(QRect(61, 115, 60, 25), "JumperT12/right_down.png", act));
act = new RadioUiAction(4, QList<int>() << Qt::Key_Right << Qt::Key_Plus, SIMU_STR_HLP_KEY_RGT % "|" % SIMU_STR_HLP_KEY_PLS, SIMU_STR_HLP_ACT_PLS);
addRadioWidget(ui->rightbuttons->addArea(QRect(109, 53, 30, 40), "JumperT12/right_right.png", act));
act = new RadioUiAction(5, QList<int>() << Qt::Key_Left << Qt::Key_Minus, SIMU_STR_HLP_KEY_LFT % "|" % SIMU_STR_HLP_KEY_MIN, SIMU_STR_HLP_ACT_MIN);
addRadioWidget(ui->rightbuttons->addArea(QRect(49, 62, 30, 40), "JumperT12/right_left.png", act));
m_mouseMidClickAction = new RadioUiAction(1, QList<int>() << Qt::Key_Enter << Qt::Key_Return, SIMU_STR_HLP_KEYS_ACTIVATE, SIMU_STR_HLP_ACT_ENT);
addRadioWidget(ui->leftbuttons->addArea(QRect(21, 30, 60, 25), "JumperT12/left_ent.png", m_mouseMidClickAction));
act = new RadioUiAction(0, QList<int>() << Qt::Key_Delete << Qt::Key_Escape << Qt::Key_Backspace, SIMU_STR_HLP_KEYS_EXIT, SIMU_STR_HLP_ACT_EXIT);
addRadioWidget(ui->leftbuttons->addArea(QRect(21, 80, 60, 60), "JumperT12/left_exit.png", act));
addRadioWidget(ui->leftbuttons->addArea(QRect(9, 154, 30, 30), "JumperT12/left_scrnshot.png", m_screenshotAction));
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);
}
SimulatedUIWidgetJumperT12::~SimulatedUIWidgetJumperT12()
{
delete ui;
}

View file

@ -0,0 +1,258 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SimulatedUIWidgetJumperT12</class>
<widget class="QWidget" name="SimulatedUIWidgetJumperT12">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>570</width>
<height>208</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>570</width>
<height>208</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>570</width>
<height>208</height>
</size>
</property>
<property name="windowTitle">
<string notr="true">Jumper T12 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="5" 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>
<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="1" column="2" rowspan="4">
<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>157</width>
<height>186</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>157</width>
<height>186</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background:url(:/images/simulator/JumperT12/JumperT12-right.png)</string>
</property>
</widget>
</item>
<item row="1" column="0" rowspan="4">
<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>157</width>
<height>186</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>157</width>
<height>186</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background:url(:/images/simulator/JumperT12/JumperT12-left.png);</string>
</property>
</widget>
</item>
<item row="4" 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>256</width>
<height>10</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>256</width>
<height>10</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background:url(:/images/simulator/JumperT12/bottom.png)</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QWidget" name="top" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>256</width>
<height>48</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>256</width>
<height>48</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background:url(:/images/simulator/JumperT12/JumperT12-top.png)</string>
</property>
</widget>
</item>
<item row="3" 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>
</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

@ -91,6 +91,9 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato
case Board::BOARD_X10:
radioUiWidget = new SimulatedUIWidgetX10(simulator, this);
break;
case Board::BOARD_JUMPER_T12:
radioUiWidget = new SimulatedUIWidgetJumperT12(simulator, this);
break;
default:
radioUiWidget = new SimulatedUIWidget9X(simulator, this);
break;

View file

@ -26,6 +26,7 @@ build:
cd $(BUILDDIR); cmake $(COMMON_OPTIONS) $(STM32_OPTIONS) -DPCB=X9D+ ../ ; make libsimulator
cd $(BUILDDIR); cmake $(COMMON_OPTIONS) $(STM32_OPTIONS) -DPCB=X9E ../ ; make libsimulator
cd $(BUILDDIR); cmake $(COMMON_OPTIONS) $(STM32_OPTIONS) -DPCB=X12S ../ ; make libsimulator
cd $(BUILDDIR); cmake $(COMMON_OPTIONS) $(STM32_OPTIONS) -DPCB=JUMPERT12 ../ ; make libsimulator
make -C $(BUILDDIR) companion22 simulator22

View file

@ -180,24 +180,24 @@ enum BeeperMode {
};
#if defined(PCBTARANIS) || defined(PCBHORUS)
enum ModuleIndex {
INTERNAL_MODULE,
EXTERNAL_MODULE,
SPORT_MODULE,
};
enum TrainerMode {
TRAINER_MODE_MASTER_TRAINER_JACK,
TRAINER_MODE_SLAVE,
enum ModuleIndex {
INTERNAL_MODULE,
EXTERNAL_MODULE,
SPORT_MODULE,
};
enum TrainerMode {
TRAINER_MODE_MASTER_TRAINER_JACK,
TRAINER_MODE_SLAVE,
#if defined(PCBTARANIS)
TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE,
TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE,
TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE,
TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE,
#endif
TRAINER_MODE_MASTER_BATTERY_COMPARTMENT,
TRAINER_MODE_MASTER_BATTERY_COMPARTMENT,
#if defined(BLUETOOTH)
TRAINER_MODE_MASTER_BLUETOOTH,
TRAINER_MODE_SLAVE_BLUETOOTH,
TRAINER_MODE_MASTER_BLUETOOTH,
TRAINER_MODE_SLAVE_BLUETOOTH,
#endif
};
};
#elif defined(PCBSKY9X)
enum ModuleIndex {
EXTERNAL_MODULE,
@ -324,7 +324,7 @@ enum TelemetryUnit {
#endif
#if defined(PCBTARANIS)
#define MAX_TELEM_SCRIPT_INPUTS 8
#define MAX_TELEM_SCRIPT_INPUTS 8
#endif
enum TelemetryScreenType {
@ -657,9 +657,12 @@ enum MixSources {
#if defined(PCBHORUS) || defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBX7)
MIXSRC_SH, LUA_EXPORT("sh", "Switch H")
#endif
#if defined(PCBX7)
#if defined(RADIO_X7)
MIXSRC_SI, LUA_EXPORT("si", "Switch I")
MIXSRC_SJ, LUA_EXPORT("sj", "Switch J")
#elif defined(RADIO_T12) // keep switches for eeprom compatibity, but hide them
MIXSRC_SI,
MIXSRC_SJ,
#endif
#if defined(PCBX9E)
MIXSRC_SI, LUA_EXPORT("si", "Switch I")
@ -842,4 +845,4 @@ enum BluetoothModes {
#define PXX2_LEN_RX_NAME 8
#define PXX2_MAX_RECEIVERS_PER_MODULE 3
#endif // _DATACONSTANTS_H_
#endif // _DATACONSTANTS_H_

View file

@ -27,7 +27,7 @@
#define MENUS_SCROLLBAR_WIDTH 0
#if defined(PCBX7) || defined(PCBX9LITE)
#if defined(NAVIGATION_X7)
#define HEADER_LINE 0
#define HEADER_LINE_COLUMNS
#else
@ -156,7 +156,7 @@ void title(const char * s);
#define MENU_TAB(...) const uint8_t mstate_tab[] = __VA_ARGS__
#if defined(PCBX7) || defined(PCBX9LITE)
#if defined(NAVIGATION_X7)
#define MENU_CHECK(tab, menu, lines_count) \
check(event, menu, tab, DIM(tab), mstate_tab, DIM(mstate_tab)-1, lines_count)
#else
@ -169,7 +169,7 @@ void title(const char * s);
MENU_CHECK(tab, menu, lines_count); \
TITLE(title)
#if defined(PCBX7) || defined(PCBX9LITE)
#if defined(NAVIGATION_X7)
#define SIMPLE_MENU_NOTITLE(tab, menu, lines_count) \
check_simple(event, menu, tab, DIM(tab), lines_count);
#define SUBMENU_NOTITLE(lines_count, ...) \

View file

@ -76,10 +76,9 @@ void menuModelSelect(event_t event)
event = EVT_ENTRY_UP;
}
event_t _event_ = (IS_ROTARY_BREAK(event) || IS_ROTARY_LONG(event) ? 0 : event);
if ((s_copyMode && EVT_KEY_MASK(event) == KEY_EXIT) || event == EVT_KEY_BREAK(KEY_EXIT)) {
_event_ -= KEY_EXIT;
event_t _event_ = event;
if ((s_copyMode && EVT_KEY_MASK(event) == KEY_EXIT) || event == EVT_KEY_BREAK(KEY_EXIT) || IS_ROTARY_BREAK(event) || IS_ROTARY_LONG(event)) {
_event_ = 0;
}
int8_t oldSub = menuVerticalPosition;
@ -198,7 +197,7 @@ void menuModelSelect(event_t event)
}
break;
#if defined(PCBX7) || defined(PCBX9LITE)
#if defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_PAGE):
chainMenu(menuTabModel[DIM(menuTabModel)-1]);
killEvents(event);
@ -230,7 +229,7 @@ void menuModelSelect(event_t event)
#endif
#endif
#if defined(PCBX7) || defined(PCBX9LITE)
#if defined(NAVIGATION_X7)
case EVT_ROTARY_LEFT:
case EVT_ROTARY_RIGHT:
#endif
@ -271,7 +270,7 @@ void menuModelSelect(event_t event)
lcdDrawNumber(17*FW, 0, reusableBuffer.modelsel.eepromfree, RIGHT);
#endif
#if defined(PCBX7) || defined(PCBX9LITE)
#if defined(NAVIGATION_X7)
drawScreenIndex(MENU_MODEL_SELECT, DIM(menuTabModel), 0);
#elif defined(ROTARY_ENCODER_NAVIGATION)
drawScreenIndex(MENU_MODEL_SELECT, DIM(menuTabModel), (sub == g_eeGeneral.currModel) ? ((IS_ROTARY_ENCODER_NAVIGATION_ENABLE() && s_editMode < 0) ? INVERS|BLINK : INVERS) : 0);

View file

@ -77,7 +77,7 @@ enum MenuModelSetupItems {
ITEM_MODEL_SETUP_BEEP_CENTER,
ITEM_MODEL_SETUP_USE_GLOBAL_FUNCTIONS,
ITEM_MODEL_SETUP_REGISTRATION_ID,
#if defined(PCBTARANIS)
#if defined(HARDWARE_INTERNAL_MODULE)
ITEM_MODEL_SETUP_INTERNAL_MODULE_LABEL,
ITEM_MODEL_SETUP_INTERNAL_MODULE_MODE,
ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS,
@ -154,13 +154,14 @@ enum MenuModelSetupItems {
#define IF_PXX2_MODULE(module, xxx) (isModulePXX2(module) ? (uint8_t)(xxx) : HIDDEN_ROW)
#define IF_NOT_PXX2_MODULE(module, xxx) (isModulePXX2(module) ? HIDDEN_ROW : (uint8_t)(xxx))
#if defined(PCBTARANIS)
#if defined(HARDWARE_INTERNAL_MODULE)
#define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE)
#define CURRENT_RECEIVER_EDITED(k) (k - (k >= ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL ? ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_1 : ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_1))
#elif defined(PCBSKY9X)
#define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_SETUP_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE)
#else
#define CURRENT_MODULE_EDITED(k) (EXTERNAL_MODULE)
#define CURRENT_RECEIVER_EDITED(k) (k - ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_1)
#endif
#if defined(PCBXLITE)
@ -511,6 +512,24 @@ void onBluetoothConnectMenu(const char * result)
}
#endif
#if defined(HARDWARE_INTERNAL_MODULE)
#define INTERNAL_MODULE_ROWS \
LABEL(InternalModule), \
INTERNAL_MODULE_MODE_ROWS, \
INTERNAL_MODULE_CHANNELS_ROWS, \
IF_NOT_PXX2_MODULE(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1)), \
IF_PXX2_MODULE(INTERNAL_MODULE, 0), \
ANTENNA_ROW \
IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), \
IF_PXX2_MODULE(INTERNAL_MODULE, 1), \
IF_PXX2_MODULE(INTERNAL_MODULE, 0), \
IF_PXX2_MODULE(INTERNAL_MODULE, 0), \
IF_PXX2_MODULE(INTERNAL_MODULE, 0), \
IF_PXX2_MODULE(INTERNAL_MODULE, 0),
#else
#define INTERNAL_MODULE_ROWS
#endif
void menuModelSetup(event_t event)
{
#if defined(EXTERNAL_ANTENNA)
@ -549,18 +568,7 @@ void menuModelSetup(event_t event)
uint8_t((isDefaultModelRegistrationID() || (warningText && popupFunc == runPopupRegister)) ? HIDDEN_ROW : READONLY_ROW), // Registration ID
LABEL(InternalModule),
INTERNAL_MODULE_MODE_ROWS, // module mode (PXX(2) / None)
INTERNAL_MODULE_CHANNELS_ROWS, // Channels min and count
IF_NOT_PXX2_MODULE(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1)),
IF_PXX2_MODULE(INTERNAL_MODULE, 0), // RxNum
ANTENNA_ROW
IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Failsafe
IF_PXX2_MODULE(INTERNAL_MODULE, 1), // Range check and Register buttons
IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Module options
IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Receiver 1
IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Receiver 2
IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Receiver 3
INTERNAL_MODULE_ROWS
LABEL(ExternalModule),
EXTERNAL_MODULE_MODE_ROWS,
@ -1250,7 +1258,7 @@ void menuModelSetup(event_t event)
break;
#endif
#if defined(PCBTARANIS)
#if defined(HARDWARE_INTERNAL_MODULE)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS:
#endif
#if defined(PCBSKY9X)
@ -1452,7 +1460,9 @@ void menuModelSetup(event_t event)
case ITEM_MODEL_SETUP_EXTRA_MODULE_BIND:
#endif
#if defined(PCBTARANIS)
#if defined(HARDWARE_INTERNAL_MODULE)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_NPXX2_BIND:
#endif
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NPXX2_BIND:
#endif
{
@ -1620,7 +1630,7 @@ void menuModelSetup(event_t event)
}
#endif
#if defined(PCBTARANIS)
#if defined(HARDWARE_INTERNAL_MODULE)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_FAILSAFE:
#endif
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_FAILSAFE: {
@ -1862,7 +1872,7 @@ void menuModelSetup(event_t event)
// some field just finished being edited
if (old_editMode > 0 && s_editMode == 0) {
switch(menuVerticalPosition) {
#if defined(PCBTARANIS)
#if defined(HARDWARE_INTERNAL_MODULE)
case ITEM_MODEL_SETUP_INTERNAL_MODULE_NPXX2_BIND:
case ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM:
if (menuHorizontalPosition == 0)

View file

@ -38,65 +38,44 @@ void menuRadioDiagKeys(event_t event)
{
SIMPLE_SUBMENU(STR_MENU_RADIO_SWITCHES, 1);
lcdDrawText(14*FW, MENU_HEADER_HEIGHT+2*FH, STR_VTRIM);
lcdDrawText(14*FW, MENU_HEADER_HEIGHT + 1, STR_VTRIM);
for (uint8_t i=0; i<9; i++) {
coord_t y;
if (i < NUM_TRIMS_KEYS) {
y = MENU_HEADER_HEIGHT + FH*3 + FH*(i/2);
y = MENU_HEADER_HEIGHT + 1 + FH + FH*(i/2);
if (i&1) lcdDraw1bitBitmap(14*FW, y, sticks, i/2, 0);
displayKeyState(i&1? 20*FW : 18*FW, y, TRM_BASE+i);
}
if (i < TRM_BASE) {
#if defined(PCBX7) || defined(PCBX9LITE)
y = MENU_HEADER_HEIGHT + FH + FH*i;
if (i >= 2) {
// hide PLUS and MINUS virtual buttons
lcdDrawTextAtIndex(0, y, STR_VKEYS, (TRM_BASE-1-i), 0);
displayKeyState(5*FW+4, y, KEY_MENU+(TRM_BASE-1-i));
}
#elif defined(PCBXLITE)
y = MENU_HEADER_HEIGHT + FH*i;
lcdDrawTextAtIndex(0, y, STR_VKEYS, (TRM_BASE-1-i), 0);
displayKeyState(5*FW+2, y, KEY_SHIFT+(TRM_BASE-1-i));
#else
y = MENU_HEADER_HEIGHT + FH + FH*i;
lcdDrawTextAtIndex(0, y, STR_VKEYS, (TRM_BASE-1-i), 0);
displayKeyState(5*FW+2, y, KEY_MENU+(TRM_BASE-1-i));
#endif
if (i <= KEY_MAX) {
y = MENU_HEADER_HEIGHT + 1 + FH*i;
lcdDrawTextAtIndex(0, y, STR_VKEYS, i, 0);
displayKeyState(5*FW+2, y, i);
}
#if defined(PCBTARANIS)
if (i < NUM_SWITCHES) {
if (SWITCH_EXISTS(i)) {
getvalue_t val = getValue(MIXSRC_FIRST_SWITCH+i);
getvalue_t sw = ((val < 0) ? 3*i+1 : ((val == 0) ? 3*i+2 : 3*i+3));
drawSwitch(8*FW+4, y, sw, 0);
}
}
#else
#if defined(PCBSKY9X)
if (i != SW_ID0) {
y = MENU_HEADER_HEIGHT +i*FH - 2*FH;
drawSwitch(8*FW, y, i+1, 0);
displaySwitchState(11*FW+2, y, i);
}
#else
if (i < NUM_SWITCHES) {
if (SWITCH_EXISTS(i)) {
y = MENU_HEADER_HEIGHT + 1 + FH*i;
getvalue_t val = getValue(MIXSRC_FIRST_SWITCH+i);
getvalue_t sw = ((val < 0) ? 3*i+1 : ((val == 0) ? 3*i+2 : 3*i+3));
drawSwitch(8*FW+4, y, sw, 0);
}
}
#endif
}
#if defined(ROTARY_ENCODER_NAVIGATION)
#if defined(PCBX7) || defined(PCBX9LITE)
coord_t y = MENU_HEADER_HEIGHT + FH;
coord_t x = 6*FW+3;
lcdDrawTextAtIndex(0, MENU_HEADER_HEIGHT + FH , STR_VRENCODERS, 0, 0);
lcdDrawNumber(x, y, rotencValue, RIGHT);
#else
coord_t y = MENU_HEADER_HEIGHT;
coord_t x = 19*FW;
lcdDrawTextAtIndex(14*FW, y, STR_VRENCODERS, 0, 0);
lcdDrawNumber(x, y, rotencValue, LEFT);
coord_t y = MENU_HEADER_HEIGHT + 1 + FH*KEY_COUNT;
lcdDrawText(0, y, STR_ROTARY_ENCODER);
lcdDrawNumber(5*FW+FWNUM+2, y, rotencValue, RIGHT);
#endif
#endif
}

View file

@ -147,7 +147,11 @@ enum MenuRadioHardwareItems {
#endif
#if NUM_SWITCHES == 8
#if defined(RADIO_T12)
#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|HIDDEN_ROW, NAVIGATION_LINE_BY_LINE|HIDDEN_ROW
#else
#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
#endif
#elif NUM_SWITCHES == 6
#define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1
#elif NUM_SWITCHES == 5

View file

@ -365,7 +365,7 @@ void menuRadioSetup(event_t event)
SLIDER_5POS(y, g_eeGeneral.hapticStrength, STR_HAPTICSTRENGTH, event, attr);
break;
#endif
#if defined(GYRO)
case ITEM_SETUP_GYRO_LABEL:
lcdDrawTextAlignedLeft(y, STR_GYRO_LABEL);
@ -395,7 +395,7 @@ void menuRadioSetup(event_t event)
}
break;
#endif
case ITEM_SETUP_CONTRAST:
lcdDrawTextAlignedLeft(y, STR_CONTRAST);
lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.contrast, attr|LEFT);

View file

@ -22,7 +22,7 @@
#include "opentx.h"
// TODO duplicated code
#if defined(PCBX7) || defined(PCBX9E) || defined(PCBX9LITE)
#if defined(ROTARY_ENCODER_NAVIGATION)
#define EVT_KEY_NEXT_LINE EVT_ROTARY_RIGHT
#define EVT_KEY_PREVIOUS_LINE EVT_ROTARY_LEFT
#else

View file

@ -2,7 +2,7 @@
* Copyright (C) OpenTX
*
* Based on code named
* th9x - http://code.google.com/p/th9x
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
@ -42,7 +42,7 @@ enum AboutScreens {
#define ABOUT_X 2
#define ABOUT_INDENT 4
#if defined(PCBX7)
#if defined(NAVIGATION_X7)
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_LONG(KEY_PAGE)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE)
#else

View file

@ -227,7 +227,7 @@ void displayVoltageOrAlarm()
#define displayVoltageOrAlarm() displayBattVoltage()
#endif
#if defined(PCBX7) || defined(PCBX9LITE)
#if defined(NAVIGATION_X7)
#define EVT_KEY_CONTEXT_MENU EVT_KEY_LONG(KEY_ENTER)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE)
#define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT
@ -235,7 +235,7 @@ void displayVoltageOrAlarm()
#define EVT_KEY_MODEL_MENU EVT_KEY_BREAK(KEY_MENU)
#define EVT_KEY_GENERAL_MENU EVT_KEY_LONG(KEY_MENU)
#define EVT_KEY_TELEMETRY EVT_KEY_LONG(KEY_PAGE)
#elif defined(PCBXLITE)
#elif defined(NAVIGATION_XLITE)
#define EVT_KEY_CONTEXT_MENU EVT_KEY_LONG(KEY_ENTER)
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_UP)
#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_DOWN)

View file

@ -31,14 +31,14 @@ void menuStatisticsView(event_t event)
switch (event) {
case EVT_KEY_FIRST(KEY_UP):
#if defined(PCBX7)
#if defined(NAVIGATION_X7)
case EVT_KEY_BREAK(KEY_PAGE):
#endif
chainMenu(menuStatisticsDebug);
break;
case EVT_KEY_FIRST(KEY_DOWN):
#if defined(PCBX7)
#if defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_PAGE):
killEvents(event);
chainMenu(menuStatisticsDebug2);
@ -136,14 +136,14 @@ void menuStatisticsDebug(event_t event)
case EVT_KEY_FIRST(KEY_UP):
#if defined(PCBX7)
#if defined(NAVIGATION_X7)
case EVT_KEY_BREAK(KEY_PAGE):
chainMenu(menuStatisticsDebug2);
return;
#endif
case EVT_KEY_FIRST(KEY_DOWN):
#if defined(PCBX7)
#if defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_PAGE):
#endif
killEvents(event);
@ -250,14 +250,14 @@ void menuStatisticsDebug2(event_t event)
break;
case EVT_KEY_FIRST(KEY_UP):
#if defined(PCBX7)
#if defined(NAVIGATION_X7)
case EVT_KEY_BREAK(KEY_PAGE):
#endif
chainMenu(menuStatisticsView);
return;
case EVT_KEY_FIRST(KEY_DOWN):
#if defined(PCBX7)
#if defined(NAVIGATION_X7)
case EVT_KEY_LONG(KEY_PAGE):
#endif
killEvents(event);

View file

@ -216,7 +216,7 @@ enum NavigationDirection {
#define decrTelemetryScreen() direction = up
#define incrTelemetryScreen() direction = down
#if defined(PCBXLITE)
#if defined(NAVIGATION_XLITE)
#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_LONG(KEY_LEFT)
#define EVT_KEY_NEXT_VIEW EVT_KEY_LONG(KEY_RIGHT)
#elif defined(PCBX7)

View file

@ -30,21 +30,36 @@ void menuRadioDiagKeys(event_t event)
{
SIMPLE_SUBMENU(STR_MENU_RADIO_SWITCHES, 1);
lcdDrawText(14*FW, MENU_HEADER_HEIGHT+2*FH, STR_VTRIM);
lcdDrawText(14*FW, MENU_HEADER_HEIGHT + 1, STR_VTRIM);
for (uint8_t i=0; i<9; i++) {
coord_t y;
if (i<8) {
y = MENU_HEADER_HEIGHT + FH*3 + FH*(i/2);
if (i < NUM_TRIMS_KEYS) {
y = MENU_HEADER_HEIGHT + 1 + FH + FH*(i/2);
if (i&1) lcdDraw1bitBitmap(14*FW, y, sticks, i/2, 0);
displayKeyState(i&1? 20*FW : 18*FW, y, TRM_BASE+i);
}
if (i<6) {
y = i*FH+MENU_HEADER_HEIGHT+FH;
if (i <= KEY_MAX) {
y = MENU_HEADER_HEIGHT + 1 + FH*i;
lcdDrawTextAtIndex(0, y, STR_VKEYS, (5-i), 0);
displayKeyState(5*FW+2, y, KEY_MENU+(5-i));
displayKeyState(5*FW+2, y, i);
}
if (i < NUM_SWITCHES) {
if (SWITCH_EXISTS(i)) {
y = MENU_HEADER_HEIGHT + 1 + FH*i;
getvalue_t val = getValue(MIXSRC_FIRST_SWITCH+i);
getvalue_t sw = ((val < 0) ? 3*i+1 : ((val == 0) ? 3*i+2 : 3*i+3));
drawSwitch(8*FW+4, y, sw, 0);
}
}
}
#if defined(ROTARY_ENCODER_NAVIGATION)
coord_t y = MENU_HEADER_HEIGHT + 1 + FH*KEY_COUNT;
lcdDrawText(0, y, STR_ROTARY_ENCODER);
lcdDrawNumber(5*FW+FWNUM+2, y, rotencValue, RIGHT);
#endif
}

View file

@ -33,6 +33,9 @@ set(SRC
gui/navigation/common.cpp
)
string(TOUPPER ${NAVIGATION_TYPE} NAVIGATION_TYPE)
add_definitions(-DNAVIGATION_${NAVIGATION_TYPE})
include_directories(gui gui/${GUI_DIR})
if(GUI_DIR STREQUAL 128x64 OR GUI_DIR STREQUAL 212x64)

View file

@ -269,7 +269,7 @@ void menuRadioSdManager(event_t _event)
menuVerticalOffset = reusableBuffer.sdManager.offset;
break;
#if defined(PCBX9) || defined(PCBX7) // TODO NO_MENU_KEY
#if defined(PCBX9) || defined(RADIO_X7) // TODO NO_MENU_KEY
case EVT_KEY_LONG(KEY_MENU):
if (SD_CARD_PRESENT() && !READ_ONLY() && s_editMode == 0) {
killEvents(_event);

View file

@ -94,7 +94,7 @@ void readTextFile(int & lines_count)
}
}
#if defined(PCBX7) || defined(PCBX9E)
#if defined(ROTARY_ENCODER_NAVIGATION)
#define EVT_KEY_NEXT_LINE EVT_ROTARY_RIGHT
#define EVT_KEY_PREVIOUS_LINE EVT_ROTARY_LEFT
#else

View file

@ -29,6 +29,15 @@ horzpos_t menuHorizontalPosition;
int8_t checkIncDec_Ret;
#if defined(RADIO_T12)
#define DBLKEYS_PRESSED_RGT_LFT(in) ((in & (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_LEFT)) == (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_LEFT))
// set to 0
#define DBLKEYS_PRESSED_UP_DWN(in) ((in & (KEYS_GPIO_PIN_UP + KEYS_GPIO_PIN_DOWN)) == (KEYS_GPIO_PIN_UP + KEYS_GPIO_PIN_DOWN))
// set to max
#define DBLKEYS_PRESSED_RGT_UP(in) ((in & (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_UP)) == (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_UP))
// set to min
#define DBLKEYS_PRESSED_LFT_DWN(in) ((in & (KEYS_GPIO_PIN_LEFT + KEYS_GPIO_PIN_DOWN)) == (KEYS_GPIO_PIN_LEFT + KEYS_GPIO_PIN_DOWN))
#else
// invert the value
#define DBLKEYS_PRESSED_RGT_LFT(in) ((in & ((1<<KEY_SHIFT) + (1<<KEY_UP))) == ((1<<KEY_SHIFT) + (1<<KEY_UP)))
// set to 0
@ -37,6 +46,7 @@ int8_t checkIncDec_Ret;
#define DBLKEYS_PRESSED_RGT_UP(in) ((in & ((1<<KEY_SHIFT) + (1<<KEY_RIGHT))) == ((1<<KEY_SHIFT) + (1<<KEY_RIGHT)))
// set to min
#define DBLKEYS_PRESSED_LFT_DWN(in) ((in & ((1<<KEY_SHIFT) + (1<<KEY_LEFT))) == ((1<<KEY_SHIFT) + (1<<KEY_LEFT)))
#endif
INIT_STOPS(stops100, 3, -100, 0, 100)
INIT_STOPS(stops1000, 3, -1000, 0, 1000)

View file

@ -35,11 +35,12 @@ set(LUA_INCLUDES_STM32F4
if(PYTHONINTERP_FOUND)
add_lua_export_target(x9lite ${LUA_INCLUDES_STM32F2} -DPCBTARANIS -DPCBX9LITE -DPCBX9)
add_lua_export_target(x7 ${LUA_INCLUDES_STM32F2} -DPCBTARANIS -DPCBX7)
add_lua_export_target(x7 ${LUA_INCLUDES_STM32F2} -DPCBTARANIS -DPCBX7 -DRADIO_X7)
add_lua_export_target(xlite ${LUA_INCLUDES_STM32F2} -DPCBTARANIS -DPCBXLITE)
add_lua_export_target(xlites ${LUA_INCLUDES_STM32F2} -DPCBTARANIS -DPCBXLITES -DPCBXLITE -DGYRO)
add_lua_export_target(x9d ${LUA_INCLUDES_STM32F2} -DPCBTARANIS -DPCBX9D -DPCBX9)
add_lua_export_target(x9e ${LUA_INCLUDES_STM32F4} -DPCBTARANIS -DPCBX9E -DPCBX9 -DSTM32F40_41xxx)
add_lua_export_target(x10 ${LUA_INCLUDES_STM32F4} -DPCBHORUS -DPCBX10 -DSTM32F40_41xxx)
add_lua_export_target(x12s ${LUA_INCLUDES_STM32F4} -DPCBHORUS -DPCBX12S -DSTM32F40_41xxx)
add_lua_export_target(t12 ${LUA_INCLUDES_STM32F2} -DPCBTARANIS -DPCBX7 -DRADIO_T12)
endif()

View file

@ -31,8 +31,10 @@
#include "lua/lua_exports_x10.inc"
#elif defined(PCBX9E)
#include "lua/lua_exports_x9e.inc"
#elif defined(PCBX7)
#elif defined(RADIO_X7)
#include "lua/lua_exports_x7.inc"
#elif defined(RADIO_T12)
#include "lua/lua_exports_t12.inc"
#elif defined(PCBX9LITE)
#include "lua/lua_exports_x9lite.inc"
#elif defined(PCBXLITES)
@ -1528,6 +1530,26 @@ const luaR_value_entry opentxConstants[] = {
{ "FORCE", FORCE },
{ "ERASE", ERASE },
{ "ROUND", ROUND },
#elif defined(RADIO_T12)
{ "EVT_DOWN_FIRST", EVT_KEY_FIRST(KEY_DOWN) },
{ "EVT_UP_FIRST", EVT_KEY_FIRST(KEY_UP) },
{ "EVT_LEFT_FIRST", EVT_KEY_FIRST(KEY_LEFT) },
{ "EVT_RIGHT_FIRST", EVT_KEY_FIRST(KEY_RIGHT) },
{ "EVT_DOWN_BREAK", EVT_KEY_BREAK(KEY_DOWN) },
{ "EVT_UP_BREAK", EVT_KEY_BREAK(KEY_UP) },
{ "EVT_LEFT_BREAK", EVT_KEY_BREAK(KEY_LEFT) },
{ "EVT_RIGHT_BREAK", EVT_KEY_BREAK(KEY_RIGHT) },
{ "EVT_DOWN_LONG", EVT_KEY_LONG(KEY_DOWN) },
{ "EVT_UP_LONG", EVT_KEY_LONG(KEY_UP) },
{ "EVT_LEFT_LONG", EVT_KEY_LONG(KEY_LEFT) },
{ "EVT_RIGHT_LONG", EVT_KEY_LONG(KEY_RIGHT) },
{ "EVT_DOWN_REPT", EVT_KEY_REPT(KEY_DOWN) },
{ "EVT_UP_REPT", EVT_KEY_REPT(KEY_UP) },
{ "EVT_LEFT_REPT", EVT_KEY_REPT(KEY_LEFT) },
{ "EVT_RIGHT_REPT", EVT_KEY_REPT(KEY_RIGHT) },
{ "FORCE", FORCE },
{ "ERASE", ERASE },
{ "ROUND", ROUND },
#elif defined(PCBTARANIS)
{ "EVT_MENU_BREAK", EVT_KEY_BREAK(KEY_MENU) },
{ "EVT_MENU_LONG", EVT_KEY_LONG(KEY_MENU) },

View file

@ -637,7 +637,7 @@ bool luaLoadFunctionScript(uint8_t index, uint8_t ref)
{
if ((ref >= SCRIPT_GFUNC_FIRST) && g_model.noGlobalFunctions)
return false;
CustomFunctionData & fn = (ref < SCRIPT_GFUNC_FIRST ? g_model.customFn[index] : g_eeGeneral.customFn[index]);
if (fn.func == FUNC_PLAY_SCRIPT && ZEXIST(fn.play.name)) {
@ -883,7 +883,7 @@ void luaDoOneRunStandalone(event_t evt)
standaloneScript.state = SCRIPT_NOFILE;
luaState = INTERPRETER_RELOAD_PERMANENT_SCRIPTS;
}
#if !defined(PCBHORUS) && !defined(PCBXLITE)
#if defined(KEYS_GPIO_REG_MENU)
// TODO find another key and add a #define
else if (evt == EVT_KEY_LONG(KEY_MENU)) {
killEvents(evt);

View file

@ -155,11 +155,9 @@ extern uint16_t maxLuaInterval;
extern uint16_t maxLuaDuration;
extern uint8_t instructionsPercent;
#if defined(PCBXLITE)
#define IS_MASKABLE(key) ((key) != KEY_EXIT && (key) != KEY_ENTER)
#elif defined(PCBTARANIS)
#if defined(KEYS_GPIO_REG_PAGE)
#define IS_MASKABLE(key) ((key) != KEY_EXIT && (key) != KEY_ENTER && ((luaState & INTERPRETER_RUNNING_STANDALONE_SCRIPT) || (key) != KEY_PAGE))
#elif defined(PCBHORUS)
#else
#define IS_MASKABLE(key) ((key) != KEY_EXIT && (key) != KEY_ENTER)
#endif
struct LuaField {

View file

@ -253,8 +253,10 @@ void generalDefault()
g_eeGeneral.switchConfig = (SWITCH_TOGGLE << 10) + (SWITCH_TOGGLE << 8) + (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0);
#elif defined(PCBXLITE)
g_eeGeneral.switchConfig = (SWITCH_2POS << 6) + (SWITCH_2POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0);
#elif defined(PCBX7)
#elif defined(RADIO_X7)
g_eeGeneral.switchConfig = 0x000006ff; // 4x3POS, 1x2POS, 1xTOGGLE
#elif defined(RADIO_T12)
g_eeGeneral.switchConfig = (SWITCH_2POS << 10) + (SWITCH_2POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0);
#elif defined(PCBX9LITE)
g_eeGeneral.switchConfig = (SWITCH_TOGGLE << 8) + (SWITCH_2POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0);
#elif defined(PCBTARANIS) || defined(PCBHORUS)
@ -470,11 +472,14 @@ void modelDefault(uint8_t id)
}
#endif
#if defined(PCBTARANIS) || defined(PCBHORUS)
#if defined(HARDWARE_INTERNAL_MODULE)
g_model.moduleData[INTERNAL_MODULE].type = IS_PXX2_INTERNAL_ENABLED() ? MODULE_TYPE_ACCESS_ISRM : MODULE_TYPE_PXX_XJT;
g_model.moduleData[INTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(INTERNAL_MODULE);
#elif defined(PCBSKY9X)
g_model.moduleData[EXTERNAL_MODULE].type = MODULE_TYPE_PPM;
#elif defined(RADIO_T12)
g_model.moduleData[EXTERNAL_MODULE].type = MODULE_TYPE_NONE;
g_model.moduleData[EXTERNAL_MODULE].type = MODULE_TYPE_MULTIMODULE;
#endif
#if defined(PCBXLITE)

View file

@ -131,7 +131,8 @@ const char * getBasename(const char * path);
#define OTX_FOURCC 0x3B78746F // otx for Taranis X-Lite S
#elif defined(PCBXLITE)
#define OTX_FOURCC 0x3978746F // otx for Taranis X-Lite
#elif defined(PCBX7)
#define O9X_FOURCC 0x3978396F // o9x for Taranis X-Lite
#elif defined(RADIO_X7)
#define OTX_FOURCC 0x3678746F // otx for Taranis X7
#elif defined(PCBX9LITE)
#define OTX_FOURCC 0x3C78746F // otx for Taranis X9-Lite
@ -139,6 +140,10 @@ const char * getBasename(const char * path);
#define OTX_FOURCC 0x3378746F // otx for Taranis X9D
#elif defined(PCBSKY9X)
#define OTX_FOURCC 0x3278746F // otx for sky9x
#define O9X_FOURCC 0x3278396F // o9x for sky9x
#elif defined(RADIO_T12)
#define OTX_FOURCC 0x3D78746F // otx for Jumper T12
#define O9X_FOURCC 0x3D78396F // o9x for Jumper T12
#endif
bool isFileAvailable(const char * filename, bool exclDir = false);

View file

@ -250,8 +250,10 @@ void Open9xSim::updateKeysAndSwitches(bool start)
KEY_Down, KEY_DOWN,
KEY_Right, KEY_RIGHT,
KEY_Left, KEY_LEFT,
#elif defined(PCBXLITE)
#elif defined(PCBXLITE) || defined(RADIO_T12)
#if defined(KEYS_GPIO_REG_SHIFT)
KEY_Shift_L, KEY_SHIFT,
#endif
KEY_Return, KEY_ENTER,
KEY_BackSpace, KEY_EXIT,
KEY_Right, KEY_RIGHT,

View file

@ -272,7 +272,11 @@ char * getSwitchString(char * dest, swsrc_t idx)
if (swinfo.quot >= 5)
*s++ = 'H' + swinfo.quot - 5;
else if (swinfo.quot == 4)
#if defined(RADIO_T12)
*s++ = 'G';
#else
*s++ = 'F';
#endif
else
*s++ = 'A'+swinfo.quot;
#else

View file

@ -85,7 +85,7 @@ set(BOOTLOADER_SRC
bin_files.cpp
)
if(PCB STREQUAL X12S OR PCB STREQUAL X10 OR PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL X9LITE)
if(PCB STREQUAL X12S OR PCB STREQUAL X10 OR PCB STREQUAL X9E OR (PCB STREQUAL X7 AND NOT (PCBREV STREQUAL T12)) OR PCB STREQUAL X9LITE)
set(BOOTLOADER_SRC
${BOOTLOADER_SRC}
../../../../../targets/common/arm/stm32/rotary_encoder_driver.cpp

View file

@ -1,7 +1,7 @@
option(DISK_CACHE "Enable SD card disk cache" YES)
option(UNEXPECTED_SHUTDOWN "Enable the Unexpected Shutdown screen" YES)
option(PXX1 "PXX1 protocol support" ON)
option(PXX2 "PXX2 protocol support" ON)
option(PXX2 "PXX2 protocol support" OFF)
set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)")
set(CPU_TYPE STM32F4)

View file

@ -208,6 +208,13 @@ void simuSetKey(uint8_t key, bool state)
KEY_CASE(KEY_LEFT, KEYS_GPIO_REG_LEFT, KEYS_GPIO_PIN_LEFT)
KEY_CASE(KEY_UP, KEYS_GPIO_REG_UP, KEYS_GPIO_PIN_UP)
KEY_CASE(KEY_DOWN, KEYS_GPIO_REG_DOWN, KEYS_GPIO_PIN_DOWN)
#elif defined(RADIO_T12)
KEY_CASE(KEY_EXIT, KEYS_GPIO_REG_EXIT, KEYS_GPIO_PIN_EXIT)
KEY_CASE(KEY_ENTER, KEYS_GPIO_REG_ENTER, KEYS_GPIO_PIN_ENTER)
KEY_CASE(KEY_RIGHT, KEYS_GPIO_REG_RIGHT, KEYS_GPIO_PIN_RIGHT)
KEY_CASE(KEY_LEFT, KEYS_GPIO_REG_LEFT, KEYS_GPIO_PIN_LEFT)
KEY_CASE(KEY_UP, KEYS_GPIO_REG_UP, KEYS_GPIO_PIN_UP)
KEY_CASE(KEY_DOWN, KEYS_GPIO_REG_DOWN, KEYS_GPIO_PIN_DOWN)
#elif defined(PCBTARANIS)
KEY_CASE(KEY_MENU, KEYS_GPIO_REG_MENU, KEYS_GPIO_PIN_MENU)
KEY_CASE(KEY_EXIT, KEYS_GPIO_REG_EXIT, KEYS_GPIO_PIN_EXIT)

View file

@ -63,6 +63,9 @@ enum EnumKeys
KEY_RIGHT,
KEY_LEFT,
KEY_COUNT,
KEY_MAX = KEY_COUNT - 1,
TRM_BASE,
TRM_LH_DWN = TRM_BASE,
TRM_LH_UP,

View file

@ -4,7 +4,7 @@ option(INTERNAL_MODULE_PPM "Support for PPM internal module hack" OFF)
option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module replacement" OFF)
option(USEHORUSBT "X9E BT module replaced by Horus BT module" OFF)
option(PXX1 "PXX1 protocol support" ON)
option(PXX2 "PXX2 protocol support" ON)
option(PXX2 "PXX2 protocol support" OFF)
if(PCB STREQUAL X9E)
set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)")
@ -74,13 +74,22 @@ elseif(PCB STREQUAL X7)
set(CPU_TYPE_FULL STM32F205xE) # for size report
set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld)
set(HAPTIC YES)
set(LUA_EXPORT lua_export_x7)
set(FLAVOUR x7)
if(PCBREV STREQUAL T12)
set(LUA_EXPORT lua_export_t12)
set(FLAVOUR t12)
set(NAVIGATION_TYPE xlite)
set(MULTIMODULE ON)
add_definitions(-DRADIO_T12)
else()
set(LUA_EXPORT lua_export_x7)
set(FLAVOUR x7)
set(NAVIGATION_TYPE x7)
add_definitions(-DRADIO_X7)
endif()
add_definitions(-DPCBX7 -DSOFTWARE_VOLUME)
add_definitions(-DEEPROM_VARIANT=0x4000)
add_definitions(-DPWR_BUTTON_${PWR_BUTTON})
set(GUI_DIR 128x64)
set(NAVIGATION_TYPE x7)
set(BITMAPS_TARGET 9x_bitmaps)
set(FONTS_TARGET 9x_fonts_1bit)
set(LCD_DRIVER lcd_driver_spi.cpp)
@ -98,7 +107,7 @@ elseif(PCB STREQUAL X9LITE)
add_definitions(-DBOARD_NAME="x9lite")
add_definitions(-DPCBX9LITE -DPCBX9 -DSOFTWARE_VOLUME)
add_definitions(-DEEPROM_VARIANT=0x0800)
add_definitions(-DPWR_BUTTON_${PWR_BUTTON})
set(PXX2 ON)
set(GUI_DIR 128x64)
set(NAVIGATION_TYPE x7)
set(BITMAPS_TARGET 9x_bitmaps)
@ -144,6 +153,7 @@ elseif(PCB STREQUAL XLITES)
set(LCD_DRIVER lcd_driver_spi.cpp)
set(GVAR_SCREEN model_gvars.cpp)
set(STATUS_LEDS YES)
set(PXX2 ON)
endif()
if(PCB STREQUAL XLITES)
@ -185,7 +195,7 @@ if(NOT PCB STREQUAL XLITE)
)
endif()
if(PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL X9LITE)
if(PCB STREQUAL X9E OR (PCB STREQUAL X7 AND NOT (PCBREV STREQUAL T12)) OR PCB STREQUAL X9LITE)
set(TARGET_SRC
${TARGET_SRC}
../common/arm/stm32/rotary_encoder_driver.cpp

View file

@ -94,6 +94,13 @@ extern "C" {
}
#endif
#if defined(PCBX9E) || defined(RADIO_X7) || defined(PCBX9LITE)
// Rotary Encoder driver
#define ROTARY_ENCODER_NAVIGATION
void rotaryEncoderInit(void);
void rotaryEncoderCheck(void);
#endif
#define FLASHSIZE 0x80000
#define BOOTLOADER_SIZE 0x8000
#define FIRMWARE_ADDRESS 0x08000000
@ -184,7 +191,11 @@ uint32_t isBootloaderStart(const uint8_t * buffer);
#define EXTERNAL_MODULE_OFF() EXTERNAL_MODULE_PWR_OFF()
#endif
#if defined(RADIO_T12)
#define IS_INTERNAL_MODULE_ON() false
#else
#define IS_INTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) == Bit_SET)
#endif
void init_ppm(uint8_t module);
void disable_ppm(uint8_t module);
@ -263,24 +274,45 @@ int sbusGetByte(uint8_t * byte);
// Keys driver
enum EnumKeys
{
#if defined(PCBXLITE)
#if defined(KEYS_GPIO_REG_SHIFT)
KEY_SHIFT,
#else
#endif
#if defined(KEYS_GPIO_REG_MENU)
KEY_MENU,
#endif
KEY_EXIT,
KEY_ENTER,
#if defined(PCBXLITE)
#if defined(KEYS_GPIO_REG_DOWN)
KEY_DOWN,
KEY_UP,
#endif
#if defined(KEYS_GPIO_REG_RIGHT)
KEY_RIGHT,
KEY_LEFT,
#else
#endif
#if defined(KEYS_GPIO_REG_PAGE)
KEY_PAGE,
#endif
#if defined(KEYS_GPIO_REG_PLUS)
KEY_PLUS,
KEY_MINUS,
#endif
KEY_COUNT,
KEY_MAX = KEY_COUNT - 1,
#if defined(ROTARY_ENCODER_NAVIGATION)
KEY_PLUS,
KEY_MINUS,
#endif
TRM_BASE,
TRM_LH_DWN = TRM_BASE,
TRM_LH_UP,
@ -300,7 +332,7 @@ enum EnumKeys
#define KEY_DOWN KEY_PLUS
#define KEY_RIGHT KEY_PLUS
#define KEY_LEFT KEY_MINUS
#elif defined(PCBXLITE)
#elif defined(NAVIGATION_XLITE)
#define KEY_PLUS KEY_RIGHT
#define KEY_MINUS KEY_LEFT
#else
@ -435,13 +467,6 @@ uint32_t readTrims(void);
#define TRIMS_PRESSED() (readTrims())
#define KEYS_PRESSED() (readKeys())
#if defined(PCBX9E) || defined(PCBX7) || defined(PCBX9LITE)
// Rotary Encoder driver
#define ROTARY_ENCODER_NAVIGATION
void rotaryEncoderInit(void);
void rotaryEncoderCheck(void);
#endif
// WDT driver
#define WDTO_500MS 500
#if defined(WATCHDOG_DISABLED) || defined(SIMU)

View file

@ -46,7 +46,20 @@
#define KEYS_GPIO_PIN_LEFT GPIO_Pin_12 // PE.12
#define KEYS_GPIO_REG_RIGHT GPIOE->IDR
#define KEYS_GPIO_PIN_RIGHT GPIO_Pin_13 // PE.13
#elif defined(PCBX7)
#elif defined(RADIO_T12)
#define KEYS_GPIO_REG_EXIT GPIOD->IDR
#define KEYS_GPIO_PIN_EXIT GPIO_Pin_2 // PD.02
#define KEYS_GPIO_REG_ENTER GPIOE->IDR
#define KEYS_GPIO_PIN_ENTER GPIO_Pin_10 // PE.10
#define KEYS_GPIO_REG_UP GPIOE->IDR
#define KEYS_GPIO_PIN_UP GPIO_Pin_9 // PE.09
#define KEYS_GPIO_REG_DOWN GPIOE->IDR
#define KEYS_GPIO_PIN_DOWN GPIO_Pin_11 // PE.11
#define KEYS_GPIO_REG_LEFT GPIOD->IDR
#define KEYS_GPIO_PIN_LEFT GPIO_Pin_7 // PD.07
#define KEYS_GPIO_REG_RIGHT GPIOD->IDR
#define KEYS_GPIO_PIN_RIGHT GPIO_Pin_3 // PD.03
#elif defined(RADIO_X7)
#define KEYS_GPIO_REG_PAGE GPIOD->IDR
#define KEYS_GPIO_PIN_PAGE GPIO_Pin_3 // PD.03
#define KEYS_GPIO_REG_MENU GPIOD->IDR
@ -92,7 +105,7 @@
#define ROTARY_ENCODER_EXTI_PortSource EXTI_PortSourceGPIOD
#define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource12
#define ROTARY_ENCODER_EXTI_PinSource2 EXTI_PinSource13
#elif defined(PCBX7)
#elif defined(RADIO_X7)
#define ROTARY_ENCODER_GPIO GPIOE
#define ROTARY_ENCODER_GPIO_PIN_A GPIO_Pin_9 // PE.09
#define ROTARY_ENCODER_GPIO_PIN_B GPIO_Pin_11 // PE.11
@ -121,7 +134,7 @@
#endif
// This is for SIMU: reuse rotary encoder pins to map UP and DOWN keyboard keys
#if defined(SIMU) && (defined(PCBX9E) || defined(PCBX7) || defined(PCBX9LITE))
#if defined(SIMU) && defined(ROTARY_ENCODER_NAVIGATION)
#define KEYS_GPIO_REG_PLUS ROTARY_ENCODER_GPIO->IDR
#define KEYS_GPIO_PIN_PLUS ROTARY_ENCODER_GPIO_PIN_A
#define KEYS_GPIO_REG_MINUS ROTARY_ENCODER_GPIO->IDR
@ -353,8 +366,11 @@
#define SWITCHES_GPIO_PIN_G_H GPIO_Pin_3 // PF.03
#define SWITCHES_GPIO_REG_G_L GPIOF->IDR
#define SWITCHES_GPIO_PIN_G_L GPIO_Pin_4 // PF.04
#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE)
#elif defined(RADIO_X7) || defined(PCBXLITE) || defined(PCBX9LITE)
// no SWG
#elif defined(RADIO_T12)
#define SWITCHES_GPIO_REG_G GPIOE->IDR
#define SWITCHES_GPIO_PIN_G GPIO_Pin_14 // PE.14
#else
#define SWITCHES_GPIO_REG_G_H GPIOE->IDR
#define SWITCHES_GPIO_PIN_G_H GPIO_Pin_9 // PE.09
@ -457,7 +473,13 @@
#define KEYS_GPIOB_PINS (GPIO_Pin_0 | GPIO_Pin_1 | 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)
#elif defined(PCBX7)
#elif defined(RADIO_T12)
#define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE)
#define KEYS_GPIOA_PINS SWITCHES_GPIO_PIN_B_H
#define KEYS_GPIOC_PINS (TRIMS_GPIO_PIN_LHR | TRIMS_GPIO_PIN_RVD | TRIMS_GPIO_PIN_RVU)
#define KEYS_GPIOD_PINS (TRIMS_GPIO_PIN_LHL | KEYS_GPIO_PIN_EXIT | KEYS_GPIO_PIN_LEFT | KEYS_GPIO_PIN_RIGHT | SWITCHES_GPIO_PIN_C_L | SWITCHES_GPIO_PIN_H)
#define KEYS_GPIOE_PINS (KEYS_GPIO_PIN_UP | KEYS_GPIO_PIN_DOWN | KEYS_GPIO_PIN_ENTER | TRIMS_GPIO_PIN_RHR | TRIMS_GPIO_PIN_RHL | TRIMS_GPIO_PIN_LVD | TRIMS_GPIO_PIN_LVU | SWITCHES_GPIO_PIN_C_H | SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_D_H | SWITCHES_GPIO_PIN_B_L | SWITCHES_GPIO_PIN_A_L | SWITCHES_GPIO_PIN_A_H | SWITCHES_GPIO_PIN_G)
#elif defined(RADIO_X7)
#define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE)
#define KEYS_GPIOA_PINS SWITCHES_GPIO_PIN_B_H
#define KEYS_GPIOC_PINS (TRIMS_GPIO_PIN_LHR | TRIMS_GPIO_PIN_RVD | TRIMS_GPIO_PIN_RVU | SWITCHES_GPIO_PIN_I | SWITCHES_GPIO_PIN_J)
@ -701,7 +723,9 @@
#endif
// Internal Module
#define HARDWARE_INTERNAL_MODULE
#if !defined(RADIO_T12)
#define HARDWARE_INTERNAL_MODULE
#endif
#if !(defined(PCBXLITES) && !defined(PCBX9LITE))
#define INTERNAL_MODULE_PXX1
#endif
@ -739,7 +763,7 @@
// #define INTMODULE_TIMER_IRQn TIM3_IRQn
// #define INTMODULE_TIMER_IRQHandler TIM3_IRQHandler
// #define INTMODULE_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
#elif defined(PCBX9E) || defined(PCBX9DP) || defined(PCBX7)
#elif defined(PCBX9E) || defined(PCBX9DP) || defined(RADIO_X7)
#define INTMODULE_PULSES
#define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2)
#define INTMODULE_RCC_APB1Periph 0
@ -759,6 +783,27 @@
#define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream5_IRQHandler
#define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF5
#define INTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#elif defined(RADIO_T12)
//left here is somebody will mod the radio for internal module
#define INTMODULE_PULSES
#define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2)
#define INTMODULE_RCC_APB1Periph 0
#define INTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM1
#define INTMODULE_PWR_GPIO GPIOC
#define INTMODULE_PWR_GPIO_PIN GPIO_Pin_6 // JUMPER INT PC.06 //X7 INT is PC.06
#define INTMODULE_TX_GPIO GPIOA
#define INTMODULE_TX_GPIO_PIN GPIO_Pin_7 // JUMPER INT PA.07 //X7 INT is PA.10
#define INTMODULE_TX_GPIO_PinSource GPIO_PinSource10
#define INTMODULE_TIMER TIM1
#define INTMODULE_TIMER_CC_IRQn TIM1_CC_IRQn
#define INTMODULE_TIMER_CC_IRQHandler TIM1_CC_IRQHandler
#define INTMODULE_TX_GPIO_AF GPIO_AF_TIM1
#define INTMODULE_DMA_CHANNEL DMA_Channel_6
#define INTMODULE_DMA_STREAM DMA2_Stream5
#define INTMODULE_DMA_STREAM_IRQn DMA2_Stream5_IRQn
#define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream5_IRQHandler
#define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF5
#define INTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
#else
#define INTMODULE_PULSES
#define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
@ -823,6 +868,30 @@
#define EXTMODULE_USART_DMA_CHANNEL DMA_Channel_5
#define EXTMODULE_USART_DMA_STREAM DMA2_Stream6
#define EXTMODULE_USART_DMA_STREAM_IRQn DMA2_Stream6_IRQn
#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)
#else
#define EXTMODULE_PULSES
#define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2)
@ -947,11 +1016,11 @@
#define TELEMETRY_DIR_GPIO GPIOD
#define TELEMETRY_DIR_GPIO_PIN GPIO_Pin_4 // PD.04
#if defined(PCBXLITE) || defined(PCBX9LITE)
#define TELEMETRY_DIR_OUTPUT() TELEMETRY_DIR_GPIO->BSRRH = TELEMETRY_DIR_GPIO_PIN
#define TELEMETRY_DIR_INPUT() TELEMETRY_DIR_GPIO->BSRRL = TELEMETRY_DIR_GPIO_PIN
#define TELEMETRY_DIR_OUTPUT() TELEMETRY_DIR_GPIO->BSRRH = TELEMETRY_DIR_GPIO_PIN
#define TELEMETRY_DIR_INPUT() TELEMETRY_DIR_GPIO->BSRRL = TELEMETRY_DIR_GPIO_PIN
#else
#define TELEMETRY_DIR_OUTPUT() TELEMETRY_DIR_GPIO->BSRRL = TELEMETRY_DIR_GPIO_PIN
#define TELEMETRY_DIR_INPUT() TELEMETRY_DIR_GPIO->BSRRH = TELEMETRY_DIR_GPIO_PIN
#define TELEMETRY_DIR_OUTPUT() TELEMETRY_DIR_GPIO->BSRRL = TELEMETRY_DIR_GPIO_PIN
#define TELEMETRY_DIR_INPUT() TELEMETRY_DIR_GPIO->BSRRH = TELEMETRY_DIR_GPIO_PIN
#endif
#define TELEMETRY_GPIO GPIOD
#define TELEMETRY_TX_GPIO_PIN GPIO_Pin_5 // PD.05
@ -1399,4 +1468,4 @@
#define TIMER_2MHz_RCC_APB1Periph RCC_APB1Periph_TIM7
#define TIMER_2MHz_TIMER TIM7
#endif // _HAL_H_
#endif // _HAL_H_

View file

@ -2,7 +2,7 @@
* Copyright (C) OpenTX
*
* Based on code named
* th9x - http://code.google.com/p/th9x
* th9x - http://code.google.com/p/th9x
* er9x - http://code.google.com/p/er9x
* gruvin9x - http://code.google.com/p/gruvin9x
*
@ -20,7 +20,11 @@
#include "opentx.h"
#define LCD_CONTRAST_OFFSET 160
#if defined(RADIO_T12)
#define LCD_CONTRAST_OFFSET -10
#else
#define LCD_CONTRAST_OFFSET 160
#endif
#define RESET_WAIT_DELAY_MS 300 // Wait time after LCD reset before first command
#define WAIT_FOR_DMA_END() do { } while (lcd_busy)
@ -61,9 +65,9 @@ void lcdHardwareInit()
LCD_SPI->CR2 = 0;
LCD_SPI->CR1 |= SPI_CR1_MSTR; // Make sure in case SSM/SSI needed to be set first
LCD_SPI->CR1 |= SPI_CR1_SPE;
LCD_NCS_HIGH();
GPIO_InitStructure.GPIO_Pin = LCD_NCS_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
@ -81,7 +85,7 @@ void lcdHardwareInit()
GPIO_InitStructure.GPIO_Pin = LCD_CLK_GPIO_PIN | LCD_MOSI_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(LCD_SPI_GPIO, &GPIO_InitStructure);
GPIO_PinAFConfig(LCD_SPI_GPIO, LCD_MOSI_GPIO_PinSource, LCD_GPIO_AF);
GPIO_PinAFConfig(LCD_SPI_GPIO, LCD_CLK_GPIO_PinSource, LCD_GPIO_AF);
@ -103,6 +107,20 @@ void lcdHardwareInit()
#if LCD_W == 128
void lcdStart()
{
#if defined(RADIO_T12)
// Jumper has the screen inverted.
lcdWriteCommand(0xe2); // (14) Soft reset
lcdWriteCommand(0xa0); // Set seg
lcdWriteCommand(0xc8); // Set com
lcdWriteCommand(0xf8); // Set booster
lcdWriteCommand(0x00); // 5x
lcdWriteCommand(0xa3); // Set bias=1/6
lcdWriteCommand(0x22); // Set internal rb/ra=5.0
lcdWriteCommand(0x2f); // All built-in power circuits on
lcdWriteCommand(0x24); // Set contrast
lcdWriteCommand(0x36); // Set Vop
lcdWriteCommand(0xa6); // Set display mode
#else
lcdWriteCommand(0xe2); // (14) Soft reset
lcdWriteCommand(0xa1); // Set seg
lcdWriteCommand(0xc0); // Set com
@ -114,6 +132,7 @@ void lcdStart()
lcdWriteCommand(0x81); // Set contrast
lcdWriteCommand(0x36); // Set Vop
lcdWriteCommand(0xa6); // Set display mode
#endif
}
#else
void lcdStart()
@ -155,7 +174,7 @@ void lcdWriteAddress(uint8_t x, uint8_t y)
{
lcdWriteCommand(x & 0x0F); // Set Column Address LSB CA[3:0]
lcdWriteCommand((x>>4) | 0x10); // Set Column Address MSB CA[7:4]
lcdWriteCommand((y&0x0F) | 0x60); // Set Row Address LSB RA [3:0]
lcdWriteCommand(((y>>4) & 0x0F) | 0x70); // Set Row Address MSB RA [7:4]
}
@ -181,8 +200,10 @@ void lcdRefresh(bool wait)
for (uint8_t y=0; y < 8; y++, p+=LCD_W) {
lcdWriteCommand(0x10); // Column addr 0
lcdWriteCommand(0xB0 | y); // Page addr y
#if !defined(RADIO_T12)
lcdWriteCommand(0x04);
#endif
LCD_NCS_LOW();
LCD_A0_HIGH();
@ -192,7 +213,7 @@ void lcdRefresh(bool wait)
LCD_DMA_Stream->M0AR = (uint32_t)p;
LCD_DMA_Stream->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA & TC interrupts
LCD_SPI->CR2 |= SPI_CR2_TXDMAEN;
WAIT_FOR_DMA_END();
LCD_NCS_HIGH();
@ -204,7 +225,7 @@ void lcdRefresh(bool wait)
lcd_busy = true;
lcdWriteAddress(0, 0);
LCD_NCS_LOW();
LCD_A0_HIGH();
@ -300,7 +321,7 @@ void lcdInitFinish()
The longer initialization time seems to only be needed for regular Taranis,
the Taranis Plus (9XE) has been tested to work without any problems at -18 deg Celsius.
Therefore the delay for T+ is lower.
If radio is reset by watchdog or boot-loader the wait is skipped, but the LCD
is initialized in any case.
@ -316,7 +337,7 @@ void lcdInitFinish()
delay_ms(RESET_WAIT_DELAY_MS);
#endif
}
lcdStart();
lcdWriteCommand(0xAF); // dc2=1, IC into exit SLEEP MODE, dc3=1 gray=ON, dc4=1 Green Enhanc mode disabled
delay_ms(20); // needed for internal DC-DC converter startup
@ -331,7 +352,7 @@ void lcdSetRefVolt(uint8_t val)
#if LCD_W != 128
WAIT_FOR_DMA_END();
#endif
lcdWriteCommand(0x81); // Set Vop
lcdWriteCommand(val+LCD_CONTRAST_OFFSET); // 0-255
}

View file

@ -416,6 +416,7 @@ const char STR_GLOBAL_VAR[] = TR_GLOBAL_VAR;
const char STR_OWN[] = TR_OWN;
const char STR_DATE[] = TR_DATE;
const char STR_CHANNELS_MONITOR[] = TR_CHANNELS_MONITOR;
const char STR_ROTARY_ENCODER[] = TR_ROTARY_ENCODER;
const char STR_MIXERS_MONITOR[] = TR_MIXERS_MONITOR;
const char STR_PATH_TOO_LONG[] = TR_PATH_TOO_LONG;
const char STR_VIEW_TEXT[] = TR_VIEW_TEXT;

View file

@ -597,6 +597,7 @@ extern const char STR_GVARS[];
extern const char STR_GLOBAL_VAR[];
extern const char STR_OWN[];
extern const char STR_DATE[];
extern const char STR_ROTARY_ENCODER[];
extern const char STR_CHANNELS_MONITOR[];
extern const char STR_MIXERS_MONITOR[];
extern const char STR_PATH_TOO_LONG[];

View file

@ -359,6 +359,9 @@
#if defined(PCBHORUS)
#define LEN_VKEYS "\006"
#define TR_VKEYS "Menu\0 ""Exit\0 ""Enter\0""Nahoru""Dolů\0 ""Vpravo""Vlevo"
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Mínus"

View file

@ -377,14 +377,17 @@
#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0"
#if defined(PCBHORUS)
#define LEN_VKEYS "\006"
#define TR_VKEYS "Menu\0 ""Exit\0 ""Enter\0""Up\0 ""Down\0 ""Right\0""Left"
#define LEN_VKEYS "\006"
#define TR_VKEYS "Menu\0 ""Exit\0 ""Enter\0""Up\0 ""Down\0 ""Right\0""Left"
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
#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""Down\0""Up\0 ""Right""Left\0"
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0"
#endif
#define LEN_VRENCODERS "\003"

View file

@ -365,6 +365,9 @@
#elif defined(PCBXLITE)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Shift""Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
@ -884,7 +887,7 @@
#define TR_OWN "Own"
#define TR_DATE "Date"
#define TR_MONTHS { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }
#define TR_ROTARY_ENCODER "R.Encs"
#define TR_ROTARY_ENCODER "R.E."
#define TR_CHANNELS_MONITOR "CHANNELS MONITOR"
#define TR_MIXERS_MONITOR "MIXERS MONITOR"
#define TR_PATH_TOO_LONG "Path too long"

View file

@ -374,8 +374,22 @@
#define LEN_VSWASHTYPE "\004"
#define TR_VSWASHTYPE "---\0""120\0""120X""140\0""90\0"
#define LEN_VKEYS "\005"
#define TR_VKEYS TR("Menu\0""Salir""Abajo""Arrib""Dcha.""Izqd.", "Menu\0""Salir""Enter""Pgna.""Mas\0 ""Menos")
#if defined(PCBHORUS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Up\0 ""Down\0""Right""Left\0"
#elif defined(PCBXLITE)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Shift""Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\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""Down\0""Up\0 ""Right""Left\0"
#endif
#define LEN_VRENCODERS "\003"
#define TR_VRENCODERS "REa""REb"
@ -893,7 +907,7 @@
#define TR_OWN "Propio"
#define TR_DATE "Fecha"
#define TR_MONTHS { "Jan", "Fev", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }
#define TR_ROTARY_ENCODER "R.Encs"
#define TR_ROTARY_ENCODER "R.E."
#define TR_CHANNELS_MONITOR "MONITOR CANALES"
#define TR_MIXERS_MONITOR "MIXERS MONITOR"
#define TR_PATH_TOO_LONG "Path too long"

View file

@ -374,8 +374,22 @@
#define LEN_VSWASHTYPE "\004"
#define TR_VSWASHTYPE "---\0""120\0""120X""140\0""90\0"
#define LEN_VKEYS "\005"
#define TR_VKEYS TR("Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0", "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus")
#if defined(PCBHORUS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Up\0 ""Down\0""Right""Left\0"
#elif defined(PCBXLITE)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Shift""Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\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""Down\0""Up\0 ""Right""Left\0"
#endif
#define LEN_VRENCODERS "\003"
#define TR_VRENCODERS "REa""REb"
@ -886,7 +900,7 @@
#define TR_OWN "Own"
#define TR_DATE "Date"
#define TR_MONTHS { "Jan", "Fev", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }
#define TR_ROTARY_ENCODER "R.Encs"
#define TR_ROTARY_ENCODER "R.E."
#define TR_CHANNELS_MONITOR "CHANNELS MONITOR"
#define TR_MIXERS_MONITOR "MIXERS MONITOR"
#define TR_PATH_TOO_LONG "Path too long"

View file

@ -382,6 +382,9 @@
#elif defined(PCBXLITE)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Shift""Exit\0""Enter""Bas\0 ""Haut\0""Droit""Gauch"
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Moins"

View file

@ -376,8 +376,22 @@
#define LEN_VSWASHTYPE "\004"
#define TR_VSWASHTYPE "---\0""120\0""120X""140\0""90\0"
#define LEN_VKEYS "\005"
#define TR_VKEYS TR("Menù\0""EXIT\0""DN\0 ""UP\0 ""SX\0 ""DX\0 ", "Menu\0""Esci\0""Enter""Pag.\0""Più\0 ""Meno")
#if defined(PCBHORUS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Up\0 ""Down\0""Right""Left\0"
#elif defined(PCBXLITE)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Shift""Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\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""Down\0""Up\0 ""Right""Left\0"
#endif
#define LEN_VRENCODERS "\003"
#define TR_VRENCODERS "REa""REb"
@ -887,7 +901,7 @@
#define TR_OWN "Fase"
#define TR_DATE "Data"
#define TR_MONTHS { "Jan", "Fev", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }
#define TR_ROTARY_ENCODER "R.Encs"
#define TR_ROTARY_ENCODER "R.E."
#define TR_CHANNELS_MONITOR "MONITOR CANALI"
#define TR_MIXERS_MONITOR "MONITOR MIXER"
#define TR_PATH_TOO_LONG "Path troppo lungo"

View file

@ -362,14 +362,17 @@
#define TR_VSWASHTYPE "---\0""120\0""120X""140\0""90\0"
#if defined(PCBHORUS)
#define LEN_VKEYS "\006"
#define TR_VKEYS "Menu\0 ""Exit\0 ""Enter\0""Up\0 ""Down\0 ""Right\0""Left"
#define LEN_VKEYS "\006"
#define TR_VKEYS "Menu\0 ""Exit\0 ""Enter\0""Up\0 ""Down\0 ""Right\0""Left"
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
#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""Down\0""Up\0 ""Right""Left\0"
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Down\0""Up\0 ""Right""Left\0"
#endif
#define LEN_VRENCODERS "\003"

View file

@ -377,8 +377,22 @@
#define LEN_VSWASHTYPE "\004"
#define TR_VSWASHTYPE "---\0""120\0""120X""140\0""90\0"
#define LEN_VKEYS "\005"
#define TR_VKEYS TR("Menu\0""Exit\0""Dół \0""Góra\0""Prawo""Lewo\0", "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus")
#if defined(PCBHORUS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Up\0 ""Down\0""Right""Left\0"
#elif defined(PCBXLITE)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Shift""Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\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""Down\0""Up\0 ""Right""Left\0"
#endif
#define LEN_VRENCODERS "\003"
#define TR_VRENCODERS "REa""REb"
@ -887,7 +901,7 @@
#define TR_OWN "Własność"
#define TR_DATE "Data"
#define TR_MONTHS { "Jan", "Fev", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }
#define TR_ROTARY_ENCODER "R.Encs"
#define TR_ROTARY_ENCODER "R.E."
#define TR_CHANNELS_MONITOR "MONITOR KANAŁÓW"
#define TR_MIXERS_MONITOR "MONITOR MIKSER"
#define TR_PATH_TOO_LONG "Ścieżka za długa"

View file

@ -891,7 +891,7 @@
#define TR_OWN "Propr."
#define TR_DATE "Data"
#define TR_MONTHS { "Jan", "Fev", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }
#define TR_ROTARY_ENCODER "R.Encs"
#define TR_ROTARY_ENCODER "R.E."
#define TR_CHANNELS_MONITOR "CHANNELS MONITOR"
#define TR_MIXERS_MONITOR "MIXERS MONITOR"
#define TR_PATH_TOO_LONG "Path too long"

View file

@ -375,14 +375,17 @@
#define TR_VSWASHTYPE "--- ""120 ""120X""140 ""90\0 "
#if defined(PCBHORUS)
#define LEN_VKEYS "\006"
#define TR_VKEYS "Menu\0 ""Exit\0 ""Enter\0""Upp\0 ""Ned\0 ""Höger\0""Vänst"
#define LEN_VKEYS "\006"
#define TR_VKEYS "Menu\0 ""Exit\0 ""Enter\0""Upp\0 ""Ned\0 ""Höger\0""Vänst"
#elif defined(RADIO_T12)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Exit\0""Enter""Down\0""Up\0 ""Right""Left\0"
#elif defined(PCBTARANIS)
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Enter""Page\0""Plus\0""Minus"
#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"
#define LEN_VKEYS "\005"
#define TR_VKEYS "Menu\0""Exit\0""Ned\0 ""Upp\0 ""Höger""Vänst"
#endif
#define LEN_VRENCODERS "\003"

View file

@ -44,9 +44,12 @@
#elif defined(PCBXLITE)
#define TR_POTS_VSRCRAW "\310S1\0""\310S2\0"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0"
#elif defined(PCBX7)
#elif defined(RADIO_X7)
#define TR_POTS_VSRCRAW "\310S1\0""\310S2\0"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0""\312SI\0""\312SJ\0"
#elif defined(RADIO_T12)
#define TR_POTS_VSRCRAW "\310S1\0""\310S2\0"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0"
#elif defined(PCBX9LITE)
#define TR_POTS_VSRCRAW "\310S1\0"
#define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0"

View file

@ -121,6 +121,14 @@ elif options[optcount] == "x12s":
maxsize = 2 * 1024 * 1024
board = BOARD_HORUS
board_family = BOARD_FAMILY_ARM
elif options[optcount] == "t12":
command_options["PCB"] = "X7"
command_options["PCBREV"] = "T12"
command_options["MULTI_SPORT"] = "ON"
firmware_options = options_taranis_x9dp
maxsize = 65536 * 8
board = BOARD_TARANIS
board_family = BOARD_FAMILY_ARM
else:
exit(INVALID_BOARD)

View file

@ -177,6 +177,15 @@ if [[ " X12S HORUS ALL " =~ " ${FLAVOR} " ]] ; then
make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS}
fi
if [[ " T12 ALL " =~ " ${FLAVOR} " ]] ; then
# OpenTX on T12
rm -rf *
cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=T12 -DHELI=YES -DGVARS=YES ${SRCDIR}
make -j${CORES} ${FIRMARE_TARGET}
make -j${CORES} libsimulator
make -j${CORES} gtests ; ./gtests ${TEST_OPTIONS}
fi
if [[ " DEFAULT ALL " =~ " ${FLAVOR} " ]] ; then
# Companion
rm -rf *